Spade

Mini Shell

Directory:~$ /home/lmsyaran/public_html/css/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/public_html/css/system.zip

PKRn�[9�f^��css/adminlist.cssnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/* Common CSS for adminlist grids */

html, body {
	background-color: #F0F0F0;
	color: ButtonText;
	font-family: Tahoma, Verdana, sans-serif !important;
	margin: 0 !important;
	padding: 0 !important;
}

table.adminlist {
	width: 99%;
	border-spacing: 1px;
	background-color: #f3f3f3;
	color: #666;
	font-size: 11px;
}

table.adminlist td,
table.adminlist th {
	padding: 4px !important;
	font-size: 11px;
}

table.adminlist thead th {
	text-align: center;
	background: #f7f7f7;
	color: #666;
	border-bottom: 1px solid #CCC;
	border-left: 1px solid #fff;
}

table.adminlist thead th.left {
	text-align: left;
}

table.adminlist thead a:hover {
	text-decoration: none;
}

table.adminlist thead th img {
	vertical-align: middle;
	padding-left: 3px;
}

table.adminlist tbody th {
	font-weight: bold;
}

table.adminlist th a img {
	border: 0;
}

table.adminlist tbody tr {
	background-color: #fff;
	text-align: left;
}

table.adminlist tbody tr.row0:hover td,
table.adminlist tbody tr.row1:hover td {
	background-color: #e8f6fe;
}

table.adminlist tbody tr td {
	background: #fff;
	border: 1px solid #fff;
}

table.adminlist tbody tr.row1 td {
	background: #f0f0f0;
	border-top: 1px solid #FFF;
}

table.adminlist tfoot tr {
	text-align: center;
	color: #333;
}

table.adminlist tfoot td,table.adminlist tfoot th {
	background-color: #f7f7f7;
	border-top: 1px solid #999;
	text-align: center;
}

table.adminlist td.order {
	text-align: center;
	white-space: nowrap;
	width: 200px;
}

table.adminlist td.order span {
	float: left;
	width: 20px;
	text-align: center;
	background-repeat: no-repeat;
	height: 13px;
}

table.adminlist .pagination {
	display: inline-block;
	padding: 0;
	margin: 0 auto;
}

/* Tree indentation & nesting - Up to 10 levels deep so don't go
crazy :) */
table.adminlist td.indent-4		{ padding-left: 4px; }
table.adminlist td.indent-19	{ padding-left: 19px; }
table.adminlist td.indent-34	{ padding-left: 34px; }
table.adminlist td.indent-49	{ padding-left: 49px; }
table.adminlist td.indent-64	{ padding-left: 64px; }
table.adminlist td.indent-79	{ padding-left: 79px; }
table.adminlist td.indent-94	{ padding-left: 94px; }
table.adminlist td.indent-109	{ padding-left: 109px; }
table.adminlist td.indent-124	{ padding-left: 124px; }
table.adminlist td.indent-139	{ padding-left: 139px; }

table.adminlist tr td.btns a {
	text-decoration: underline;
}

/* added Angie */

/* Filter Form */
fieldset ol,
ol#property-values {
	margin: 0;
	padding: 0;
}

fieldset li,
ol#property-values li {
	list-style: none;
	margin: 0;
	padding: 5px;
}

fieldset.filter {
	border: 0;
	margin: 0;
	padding: 0 0 5px;
}

fieldset.filter ol {
	border: 0;
	list-style: none;
	margin: 0;
	padding: 5px 0 0;
}

fieldset.filter ol li {
	float: left;
	padding: 0 5px 0 0;
}

fieldset.filter ol li fieldset {
	border: 0;
	margin: 0;
	padding: 0;
}

fieldset.filter .left {
	float: left;
	width: auto;
	margin: 0;
	text-align: left;
}

fieldset.filter .left label {
	float: left;
	padding: 2px;
}

fieldset.filter .right {
	float: right;
}

fieldset#buttonbar {
	border: 0;
	text-align: right;
}

fieldset#buttonbar ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

fieldset#buttonbar li {
	margin: 0;
	padding: 5px;
}

button {
	margin-top: 4px;
	background: #fff;
	border: 1px solid #ccc;
	text-decoration: none;
}

button:hover {
	cursor: pointer;
	background: #E8F6FE;
	text-decoration: none;
	border: 1px solid #aaa;
}

fieldset input,
fieldset textarea,
fieldset select,
fieldset img {
	float: left;
	width: auto;
	margin: 5px 5px 5px 0;
	font-size: 11px !important;
}

.list-footer div.limit {
	float: left;
	line-height: 22px;
	margin: 0 10px;
}

.list-footer div.limit select#limit {
	width: 50px;
}

/* ++++++++++++++  pagination  ++++++++++++++ */

.list-footer {
	margin: 10px 0;
	padding: 10px 0 10px 0;
	text-align: center;
}

table .list-footer ul {
	list-style-type: none;
	margin: 0 !important;
	padding: 0;
	text-align: left;
	border: solid 0 #ccc;
	float: left;
}

.list-footer li {
	display: inline;
	padding: 2px 5px !important;
	text-align: left;
	border: solid 0 #eee;
	margin: 0 2px;
	font-size: 11px;
}

.list-footer li.pagination-start,
.list-footer li.pagination-next,
.list-footer li.pagination-end,
.list-footer li.pagination-prev {
	border: 0;
}

.list-footer li.pagination-start ,
.list-footer li.pagination-start span {
	padding: 4px;
}

p.counter {
	font-weight: bold;
}
PKRn�[̇�;;css/calendar-jos.cssnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/* The main calendar widget.  DIV containing a table. */
div.calendar {
	position: relative;
	z-index: 10000;
	width: 226px;
}

.calendar, .calendar table {
	border: 1px solid #cccccc;
	font-size: 11px;
	color: #000;
	cursor: default;
	background: #efefef;
	font-family: arial,verdana,sans-serif;
}

/* Header part -- contains navigation buttons and day names. */

.calendar .button { /* "<<", "<",
">", ">>" buttons have this class */
	text-align: center;    /* They are the navigation buttons */
	padding: 2px;          /* Make the buttons seem like they're pressing
*/
}

.calendar thead .title { /* This holds the current "month, year"
*/
	font-weight: bold;      /* Pressing it will take you to the current date
*/
	text-align: center;
	background: #333333;
	color: #ffffff;
	padding: 2px;
}

.calendar thead .headrow { /* Row <TR> containing navigation buttons
*/
	background: #dedede;
	color: #000;
}

.calendar thead .name { /* Cells <TD> containing the day names */
	border-bottom: 1px solid #cccccc;
	padding: 2px;
	text-align: center;
	color: #000;
}

.calendar thead .weekend { /* How a weekend day name shows in header */
	color: #999;
}

.calendar thead .hilite { /* How do the buttons in header appear when hover
*/
	background: #bbbbbb;
	color: #000000;
	border: 1px solid #cccccc;
	padding: 1px;
}

.calendar thead .active { /* Active (pressed) buttons in header */
	background: #c77;
	padding: 2px 0px 0px 2px;
}

.calendar thead .daynames { /* Row <TR> containing the day names */
	background: #dddddd;
}

/* The body part -- contains all the days in month. */

.calendar tbody .day { /* Cells <TD> containing month days dates */
	width: 2em;
	text-align: right;
	padding: 2px 4px 2px 2px;
}

.calendar table .wn {
	padding: 2px 3px 2px 2px;
	border-right: 1px solid #cccccc;
	background: #dddddd;
}

.calendar tbody .rowhilite td {
	background: #666666;
	color: #ffffff;
}

.calendar tbody .rowhilite td.wn {
	background: #666666;
	color: #ffffff;
}

.calendar tbody td.active { /* Active (pressed) cells <TD> */
	background: #000000;
	color: #ffffff;
}

.calendar tbody td.weekend { /* Cells showing weekend days */
	color: #999;
}

.calendar tbody td.selected { /* Cell showing today date */
	font-weight: bold;
	background: #000000;
	color: #ffffff;
}

.calendar tbody td.hilite { /* Hovered cells <TD> */
	background: #999999;
	color: #ffffff;
}

.calendar tbody td.today {
	font-weight: bold;
}

.calendar tbody .disabled {
	color: #999;
}

.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
	visibility: hidden;
}

.calendar tbody .emptyrow { /* Empty row (some months need less than 6
rows) */
	display: none;
}

/* The footer part -- status bar and "Close" button */

.calendar tfoot .footrow { /* The <TR> in footer (only one right now)
*/
	text-align: center;
	background: #cccccc;
	color: #000;
}

.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
	border-top: 1px solid #cccccc;
	background: #efefef;
	color: #000000;
}

.calendar tfoot .hilite { /* Hover style for buttons in footer */
	background: #666666;
	border: 1px solid #f40;
	padding: 1px;
}

.calendar tfoot .active { /* Active (pressed) style for buttons in footer
*/
	background: #999999;
	padding: 2px 0px 0px 2px;
}

/* Combo boxes (menus that display months/years for direct selection) */

.combo {
	position: absolute;
	display: none;
	top: 0px;
	left: 0px;
	width: 4em;
	cursor: default;
	border: 1px solid #655;
	background: #ffffff;
	color: #000;
	font-size: smaller;
}

.combo .label {
	width: 100%;
	text-align: center;
}

.combo .hilite {
	background: #fc8;
}

.combo .active {
	border-top: 1px solid #cccccc;
	border-bottom: 1px solid #cccccc;
	background: #efefef;
	font-weight: bold;
}
PKRn�[XI���css/fields/calendar-rtl.cssnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */
 .js-calendar {
	box-shadow: 0 0 15px 4px rgba(0,0,0,.15) !important;
 }
.calendar-container {
	float: left;
	min-width: 160px;
	padding: 0;
	list-style: none;
	border-radius: 5px;
	background-color: #ffffff !important;
	z-index: 1100 !important;
}
.calendar-container table {
	table-layout: fixed;
	max-width: 262px;
	border-radius: 5px;
	background-color: #ffffff !important;
	z-index: 1100 !important;
}
/* The main calendar widget.  DIV containing a table. */
div.calendar-container table th, .calendar-container table td {
	padding: 8px 0;
	line-height: 1.1em;
	text-align: center;
}

div.calendar-container table body td {
	line-height: 2em;
}

div.calendar-container table td.title { /* This holds the current
"month, year" */
	vertical-align: middle;
	text-align: center;
}

.calendar-container table thead td.headrow { /* Row <TR> containing
navigation buttons */
	background: #fff;
	color: #000;
}

.calendar-container table thead td.name { /* Cells <TD> containing
the day names */
	border-bottom: 1px solid #fff;
	text-align: center;
	color: #000;
}

.calendar-container table thead td.weekend { /* How a weekend day name
shows in header */
	color: #999;
}

/* The body part -- contains all the days in month. */

.calendar-container table tbody td.day { /* Cells <TD> containing
month days dates */
	text-align: right;
}

.calendar-container table tbody td.wn {
	background: #fff;
}

.calendar-container table tbody td.weekend { /* Cells showing weekend days
*/
	color: #999;
}

.calendar-container table tbody td.hilite { /* Hovered cells <TD> */
	background: #999999;
	color: #ffffff;
}

.calendar-container table tbody td.day {
	border: 0;
	cursor : pointer;
	font-size: 12px;
	min-width: 38px;
}

.calendar-container table tbody td.day.wn {
	text-align: center;
	background-color: #f4f4f4;
}

.calendar-container table tbody td.day.selected { /* Cell showing today
date */
	background: #3071a9;
	color: #fff;
	border: 0;
}

.calendar-container table tbody td.today {
	position: relative;
	height: 100%;
	width: auto;
	font-weight: bold;
}
.calendar-container table tbody td.today:after {
	position: absolute;
	bottom: 3px;
	left: 3px;
	right: 3px;
	content: "";
	height: 3px;
	border-radius: 1.5px;
	background-color: #46a546;
}
.calendar-container table tbody td.today.selected:after {
	background-color: #fff;
}

.calendar-container table tbody td.day:hover {
	cursor: pointer;
	background: #3d8fd7;
	color: #fff;
}
.calendar-container table tbody td.day:hover:after {
	background-color: #fff;
}

.calendar-container table tbody .disabled {
	color: #999;
	background-color: #fafafa;
}

.calendar-container table tbody .emptycell { /* Empty cells (the best is to
hide them) */
	visibility: hidden;
}

.calendar-container table tbody .emptyrow { /* Empty row (some months need
less than 6 rows) */
	display: none;
}

.buttons-wrapper {
	padding: 5px 5px;
}
a.js-btn.btn.btn-exit, a.js-btn.btn.btn-today, a.js-btn.btn.btn-clear {
	cursor: pointer;
	text-decoration: none;
	min-width: 60px;
}
.calendar-container .calendar-head-row td {
	padding: 4px 0 !important;
}
.calendar-container .day-name {
	font-size: 0.7rem;
	font-weight: bold;
}
.calendar-container .time td {
	padding: 8px 8px 8px 0;
}
.time .time-title {
	background-image: url("data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdlJREFUeNqklUsohFEUx7/5kgWGjEcRJULJSmJhITQLr8UoFko2k2SDLGZD2SglJcXOxo6Fx0ayUt4jWXgNG2rIwsgMJZPn/+o/dRvfa8yp33zfPfecM+e795x7bYqxtIAaUA2KgA3cgn3gBcsgrMQg3eAAfJtwBYa0Atg0dAugg+/3YAUcgkvqCkAVcIIy6raBCwT0/mRdymYG5Bt8VQoYBe+0Pwdpik6mwuAVNMawbJXgmr7e6FVokzKt1XBOZnYuneB54Jn+w/LEMZXTOo65nN80yNxNmyBIF4o6Ku6AXccpmzbzJstyQbs+FT/1VC6CFyU+mePTqbIBhBwp8csGn8UqO0qIz8AhstNBk8BP4As4RGCVyk8LgUVVlFvIXFXZ+4qUuZY8gn6W1QmYBKkadklM9PfLJriTYxYyEYFXpZp3s8Yj0kv9mhi0cuCTlsVMuqRWbpL0Xuo8YpAotaQnhgoQSzEAMjhuZoywfMb0UCmyKP1HmSXzJBQxpqIn9zhxA0piCJoFdqXu/bOpmeCMBiF+ZoJJ0E7gp0/AKCF71M1xCkZ4NRWSCjAIdiQ7v9UlHAcPUdfQh1QJEd7ArOg0K1dTRHJAO2hg8zhoH2IVbYElvaPgR4ABAFM/gtHnpJfxAAAAAElFTkSuQmCC");
	background-repeat: no-repeat;
	background-position: center; 
}

PKRn�[q>�I��css/fields/calendar.cssnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */
 .js-calendar {
	box-shadow: 0 0 15px 4px rgba(0,0,0,.15) !important;
 }
.calendar-container {
	float: left;
	min-width: 160px;
	padding: 0;
	list-style: none;
	border-radius: 5px;
	background-color: #ffffff !important;
	z-index: 1100 !important;
}
.calendar-container table {
	table-layout: fixed;
	max-width: 262px;
	border-radius: 5px;
	background-color: #ffffff !important;
	z-index: 1100 !important;
}
/* The main calendar widget.  DIV containing a table. */
div.calendar-container table th, .calendar-container table td {
	padding: 8px 0;
	line-height: 1.1em;
	text-align: center;
}

div.calendar-container table body td {
	line-height: 2em;
}

div.calendar-container table td.title { /* This holds the current
"month, year" */
	vertical-align: middle;
	text-align: center;
}

.calendar-container table thead td.headrow { /* Row <TR> containing
navigation buttons */
	background: #fff;
	color: #000;
}

.calendar-container table thead td.name { /* Cells <TD> containing
the day names */
	border-bottom: 1px solid #fff;
	text-align: center;
	color: #000;
}

.calendar-container table thead td.weekend { /* How a weekend day name
shows in header */
	color: #999;
}

/* The body part -- contains all the days in month. */

.calendar-container table tbody td.day { /* Cells <TD> containing
month days dates */
	text-align: right;
}

.calendar-container table tbody td.wn {
	background: #fff;
}

.calendar-container table tbody td.weekend { /* Cells showing weekend days
*/
	color: #999;
}

.calendar-container table tbody td.hilite { /* Hovered cells <TD> */
	background: #999999;
	color: #ffffff;
}

.calendar-container table tbody td.day {
	border: 0;
	cursor : pointer;
	font-size: 12px;
	min-width: 38px;
}

.calendar-container table tbody td.day.wn {
	text-align: center;
	background-color: #f4f4f4;
}

.calendar-container table tbody td.day.selected { /* Cell showing today
date */
	background: #3071a9;
	color: #fff;
	border: 0;
}

.calendar-container table tbody td.today {
	position: relative;
	height: 100%;
	width: auto;
	font-weight: bold;
}
.calendar-container table tbody td.today:after {
	position: absolute;
	bottom: 3px;
	left: 3px;
	right: 3px;
	content: "";
	height: 3px;
	border-radius: 1.5px;
	background-color: #46a546;
}
.calendar-container table tbody td.today.selected:after {
	background-color: #fff;
}

.calendar-container table tbody td.day:hover {
	cursor: pointer;
	background: #3d8fd7;
	color: #fff;
}
.calendar-container table tbody td.day:hover:after {
	background-color: #fff;
}

.calendar-container table tbody .disabled {
	color: #999;
	background-color: #fafafa;
}

.calendar-container table tbody .emptycell { /* Empty cells (the best is to
hide them) */
	visibility: hidden;
}

.calendar-container table tbody .emptyrow { /* Empty row (some months need
less than 6 rows) */
	display: none;
}
.buttons-wrapper {
	padding: 5px 5px;
}
a.js-btn.btn.btn-exit, a.js-btn.btn.btn-today, a.js-btn.btn.btn-clear {
	cursor: pointer;
	text-decoration: none;
	min-width: 60px;
}
.calendar-container .calendar-head-row td {
    padding: 4px 0 !important;
}
.calendar-container .day-name {
	font-size: 0.7rem;
	font-weight: bold;
}
.calendar-container .time td {
	padding: 8px 0 8px 8px;
}
.time .time-title {
	background-image: url("data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdlJREFUeNqklUsohFEUx7/5kgWGjEcRJULJSmJhITQLr8UoFko2k2SDLGZD2SglJcXOxo6Fx0ayUt4jWXgNG2rIwsgMJZPn/+o/dRvfa8yp33zfPfecM+e795x7bYqxtIAaUA2KgA3cgn3gBcsgrMQg3eAAfJtwBYa0Atg0dAugg+/3YAUcgkvqCkAVcIIy6raBCwT0/mRdymYG5Bt8VQoYBe+0Pwdpik6mwuAVNMawbJXgmr7e6FVokzKt1XBOZnYuneB54Jn+w/LEMZXTOo65nN80yNxNmyBIF4o6Ku6AXccpmzbzJstyQbs+FT/1VC6CFyU+mePTqbIBhBwp8csGn8UqO0qIz8AhstNBk8BP4As4RGCVyk8LgUVVlFvIXFXZ+4qUuZY8gn6W1QmYBKkadklM9PfLJriTYxYyEYFXpZp3s8Yj0kv9mhi0cuCTlsVMuqRWbpL0Xuo8YpAotaQnhgoQSzEAMjhuZoywfMb0UCmyKP1HmSXzJBQxpqIn9zhxA0piCJoFdqXu/bOpmeCMBiF+ZoJJ0E7gp0/AKCF71M1xCkZ4NRWSCjAIdiQ7v9UlHAcPUdfQh1QJEd7ArOg0K1dTRHJAO2hg8zhoH2IVbYElvaPgR4ABAFM/gtHnpJfxAAAAAElFTkSuQmCC");
	background-repeat: no-repeat;
	background-position: center; 
}

PKRn�[�M�css/frontediting.cssnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/* Module edit in front-end */

.jmoddiv.jmodinside {
    position: relative;
    top: 0;
    left: 0;
}
.btn.jmodedit
{
    z-index: 1001;
    display: block;
    position: absolute;
    top: 0;
    right: 0;
}
html[dir=rtl] .btn.jmodedit
{
    right: auto;
    left: 0;
}

/* Menu edit in front-end */

.btn.jfedit-menu
{
    z-index: 1002;
    display: block;
}
PKRn�[|�$��css/jquery.Jcrop.min.cssnu�[���/*!
Jcrop.min.css v2.0.4 - build: 20151117
 *  Copyright 2008-2015 Tapmodo Interactive LLC
 *  Free software under MIT License
 **/

.jcrop-active{direction:ltr;text-align:left;box-sizing:border-box;-ms-touch-action:none}.jcrop-dragging{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.jcrop-selection{z-index:2}.jcrop-selection.jcrop-current{z-index:4}.jcrop-border{background:#fff
url(Jcrop.gif);line-height:1px!important;font-size:0!important;overflow:hidden;position:absolute;filter:alpha(opacity=50)!important;opacity:.5!important}.jcrop-border.ord-w,.jcrop-border.ord-e,.jcrop-border.ord-n{top:0}.jcrop-border.ord-n,.jcrop-border.ord-s{width:100%;height:1px!important}.jcrop-border.ord-w,.jcrop-border.ord-e{height:100%;width:1px!important}.jcrop-border.ord-e{right:-1px}.jcrop-border.ord-n{top:-1px}.jcrop-border.ord-w{left:-1px}.jcrop-border.ord-s{bottom:-1px}.jcrop-selection{position:absolute}.jcrop-box{z-index:2;display:block;background:0
0;border:0;padding:0;margin:0;font-size:0}.jcrop-box:hover{background:0
0}.jcrop-box:active{background:0 0}.jcrop-box:focus{outline:1px
rgba(128,128,128,.65)
dotted}.jcrop-active,.jcrop-box{position:relative}.jcrop-box{width:100%;height:100%;cursor:move}.jcrop-handle{z-index:4;background-color:rgba(49,28,28,.58);border:1px
#eee
solid;width:9px;height:9px;font-size:0;position:absolute;filter:alpha(opacity=80)!important;opacity:.8!important}.jcrop-handle.ord-n{left:50%;margin-left:-5px;margin-top:-5px;top:0;cursor:n-resize}.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-5px;margin-left:-5px;cursor:s-resize}.jcrop-handle.ord-e{margin-right:-5px;margin-top:-5px;right:0;top:50%;cursor:e-resize}.jcrop-handle.ord-w{left:0;margin-left:-5px;margin-top:-5px;top:50%;cursor:w-resize}.jcrop-handle.ord-nw{left:0;margin-left:-5px;margin-top:-5px;top:0;cursor:nw-resize}.jcrop-handle.ord-ne{margin-right:-5px;margin-top:-5px;right:0;top:0;cursor:ne-resize}.jcrop-handle.ord-se{bottom:0;margin-bottom:-5px;margin-right:-5px;right:0;cursor:se-resize}.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-5px;margin-left:-5px;cursor:sw-resize}.jcrop-touch
.jcrop-handle{z-index:4;background-color:rgba(49,28,28,.58);border:1px #eee
solid;width:18px;height:18px;font-size:0;position:absolute;filter:alpha(opacity=80)!important;opacity:.8!important}.jcrop-touch
.jcrop-handle.ord-n{left:50%;margin-left:-10px;margin-top:-10px;top:0;cursor:n-resize}.jcrop-touch
.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-10px;margin-left:-10px;cursor:s-resize}.jcrop-touch
.jcrop-handle.ord-e{margin-right:-10px;margin-top:-10px;right:0;top:50%;cursor:e-resize}.jcrop-touch
.jcrop-handle.ord-w{left:0;margin-left:-10px;margin-top:-10px;top:50%;cursor:w-resize}.jcrop-touch
.jcrop-handle.ord-nw{left:0;margin-left:-10px;margin-top:-10px;top:0;cursor:nw-resize}.jcrop-touch
.jcrop-handle.ord-ne{margin-right:-10px;margin-top:-10px;right:0;top:0;cursor:ne-resize}.jcrop-touch
.jcrop-handle.ord-se{bottom:0;margin-bottom:-10px;margin-right:-10px;right:0;cursor:se-resize}.jcrop-touch
.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-10px;margin-left:-10px;cursor:sw-resize}.jcrop-dragbar{font-size:0;position:absolute}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:9px!important;width:100%}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{top:0;height:100%;width:9px!important}.jcrop-dragbar.ord-n{margin-top:-5px;cursor:n-resize;top:0}.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-5px;cursor:s-resize}.jcrop-dragbar.ord-e{margin-right:-5px;right:0;cursor:e-resize}.jcrop-dragbar.ord-w{margin-left:-5px;cursor:w-resize}.jcrop-shades{position:relative;top:0;left:0}.jcrop-shades
div{cursor:crosshair}.jcrop-noresize .jcrop-dragbar,.jcrop-noresize
.jcrop-handle{display:none}.jcrop-selection.jcrop-nodrag
.jcrop-box,.jcrop-nodrag .jcrop-shades div{cursor:default}.jcrop-light
.jcrop-border{background:#fff;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-light
.jcrop-handle{background-color:#000;border-color:#fff}.jcrop-dark
.jcrop-border{background:#000;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-dark
.jcrop-handle{background-color:#fff;border-color:#000}.solid-line
.jcrop-border{background:#fff}.jcrop-thumb{position:absolute;overflow:hidden;z-index:5}.jcrop-active
img,.jcrop-thumb img,.jcrop-thumb
canvas{min-width:none;min-height:none;max-width:none;max-height:none}.jcrop-hl-active
.jcrop-border{filter:alpha(opacity=20)!important;opacity:.2!important}.jcrop-hl-active
.jcrop-handle{filter:alpha(opacity=10)!important;opacity:.1!important}.jcrop-hl-active
.jcrop-selection:hover{}.jcrop-hl-active .jcrop-selection:hover
.jcrop-border{background-color:#ccc;filter:alpha(opacity=50)!important;opacity:.5!important}.jcrop-hl-active
.jcrop-selection.jcrop-current .jcrop-border{background:gray
url(Jcrop.gif);opacity:.35!important;filter:alpha(opacity=35)!important}.jcrop-hl-active
.jcrop-selection.jcrop-current
.jcrop-handle{filter:alpha(opacity=30)!important;opacity:.3!important}.jcrop-hl-active
.jcrop-selection.jcrop-focus
.jcrop-border{background:url(Jcrop.gif);opacity:.65!important;filter:alpha(opacity=65)!important}.jcrop-hl-active
.jcrop-selection.jcrop-focus
.jcrop-handle{filter:alpha(opacity=60)!important;opacity:.6!important}button.jcrop-box{background:0
0}PKRn�[_V�M��
css/modal.cssnu�[���/**
 * SqueezeBox - Expandable Lightbox
 *
 * Allows to open various content as modal,
 * centered and animated box.
 *
 * @version		1.3
 *
 * @license		MIT-style license
 * @author		Harald Kirschner <mail [at] digitarald.de>
 * @author		Rouven Weßling <me [at] rouvenwessling.de>
 * @copyright	Author
 */

#sbox-overlay {
	position: fixed;
	background-color: #000;
	left: 0px;
	top: 0px;
}

#sbox-window {
	position: absolute;
	background-color: #fff;
	text-align: left;
	overflow: visible;
	padding: 10px;
	/* invalid values, but looks smoother! */
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

#sbox-window[aria-hidden=true],
#sbox-overlay[aria-hidden=true] {
	display: none;
}

#sbox-btn-close {
	position: absolute;
	width: 30px;
	height: 30px;
	right: -15px;
	top: -15px;
	background: url(../images/modal/closebox.png) no-repeat center;
	border: none;
}

.sbox-loading #sbox-content {
	background-image: url(../images/modal/spinner.gif);
	background-repeat: no-repeat;
	background-position: center;
}

#sbox-content {
	clear: both;
	overflow: auto;
	background-color: #fff;
	height: 100%;
	width: 100%;
}

.sbox-content-image#sbox-content {
	overflow: visible;
}

#sbox-image {
	display: block;
}

.sbox-content-image img {
	display: block;
	width: 100%;
	height: 100%;
}

.sbox-content-iframe#sbox-content {
	overflow: visible;
}

/* Hides scrollbars */
.body-overlayed {
	overflow: hidden;
}

/* Hides flash (Firefox problem) and selects (IE) */
.body-overlayed embed, .body-overlayed object, .body-overlayed select {
	visibility: hidden;
}

#sbox-window embed, #sbox-window object, #sbox-window select {
	visibility: visible;
}

/* Shadows */
#sbox-window.shadow {
	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.7);
	-moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.7);
	box-shadow: 0 0 10px rgba(0, 0, 0, 0.7);
}

.sbox-bg {
	position: absolute;
	width: 33px;
	height: 40px;
}

.sbox-bg-n {
	left: 0;
	top: -40px;
	width: 100%;
	background: url(../images/modal/bg_n.png) repeat-x;
}
.sbox-bg-ne {
	right: -33px;
	top: -40px;
	background: url(../images/modal/bg_ne.png) no-repeat;
}
.sbox-bg-e {
	right: -33px;
	top: 0;
	height: 100%;
	background: url(../images/modal/bg_e.png) repeat-y;
}
.sbox-bg-se {
	right: -33px;
	bottom: -40px;
	background: url(../images/modal/bg_se.png) no-repeat;
}
.sbox-bg-s {
	left: 0;
	bottom: -40px;
	width: 100%;
	background: url(../images/modal/bg_s.png) repeat-x;
}
.sbox-bg-sw {
	left: -33px;
	bottom: -40px;
	background: url(../images/modal/bg_sw.png) no-repeat;
}
.sbox-bg-w {
	left: -33px;
	top: 0;
	height: 100%;
	background: url(../images/modal/bg_w.png) repeat-y;
}
.sbox-bg-nw {
	left: -33px;
	top: -40px;
	background: url(../images/modal/bg_nw.png) no-repeat;
}
@media (max-width: 979px) {
	#sbox-btn-close {
		right: -10px;
		top: -10px;
	}
}
@media (max-device-width: 979px) {
	#sbox-content {
		-webkit-overflow-scrolling: touch;
	}
	#sbox-content.sbox-content-iframe {
		overflow: scroll;
		-webkit-overflow-scrolling: touch;
	}
}
PKRn�[�����css/mootree.cssnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

.mooTree_node {
	font-family: Verdana, Arial, Helvetica;
	font-size: 10px;
	white-space: nowrap;
}

.mooTree_text {
	padding-top: 3px;
	height: 15px;
	cursor: pointer;
}

.mooTree_img {
	float: left;
	width: 18px;
	height: 18px;
	overflow: hidden;
}

.mooTree_selected	 {
	background-color: #ffc;
	font-weight: bold;
}
PKRn�[6&���css/mootree_rtl.cssnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

.mooTree_img {
	float: right;
}PKRn�[au� ��css/system.cssnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/* System Messages */
#system-message {
	margin-bottom: 10px;
	padding: 0;
}

#system-message > dt {
	font-weight: bold;
	display: none;
}

#system-message > dd {
	margin: 0;
	font-weight: bold;
	text-indent: 30px;
}

#system-message > dd > ul {
	color: #0055BB;
	background-position: 4px top;
	background-repeat: no-repeat;
	margin-bottom: 10px;
	list-style: none;
	padding: 10px;
	border-top: 3px solid #84A7DB;
	border-bottom: 3px solid #84A7DB;
}

#system-message > dd > ul > li {
	line-height: 1.5em;
}

/* System Standard Messages */
#system-message > .message > ul {
	background-color: #C3D2E5;
	background-image: url(../images/notice-info.png);
}

/* System Error Messages */
#system-message > .error > ul,
#system-message > .warning > ul,
#system-message > .notice > ul {
	color: #c00;
}

#system-message > .error > ul {
	background-color: #E6C0C0;
	background-image: url(../images/notice-alert.png);
	border-color: #DE7A7B;
}

/* System Warning Messages */
#system-message > .warning > ul {
	background-color: #E6C8A6;
	background-image: url(../images/notice-note.png);
	border-color: #FFBB00;
}

/* System Notice Messages */
#system-message > .notice > ul {
	background-color: #EFE7B8;
	background-image: url(../images/notice-note.png);
	border-color: #F0DC7E;
}
PKRn�[�k\kkimages/arrow.pngnu�[����PNG


IHDR		o�GtRNS���7X}
IDATxc��)�€O�p�Av98"]��%��n�H�aIEND�B`�PKRn�[vK�[[images/arrow_rtl.pngnu�[����PNG


IHDR		�"IDAT�c`�)������`
p*BV@�ID�	��>�(!x��IEND�B`�PKRn�[C�t2[[images/blank.pngnu�[����PNG


IHDREMإ��tRNS���IDATxc��?G"k�5��|���R�IEND�B`�PKRn�[s)X:PPimages/calendar.pngnu�[����PNG


IHDR�aIDATx����I���}�c۶K��b�rl뿈�۶}w��ۙ�,�U���L�&+���O'Cm�����?jnP���he�"Gf�-];
@�޹vr�!��]�<Zp9q�0����<���w��ף�{���`�@�l~FB|�����Wi>�|L�?�H�H���<y�|
P!�%E�ӳa�ݧ[�<�8�rXu�>���aݡ������/�}1�(Vy��f�������ݟ�!��d�H
�;7��Ξ�(:��!�����ʔ(�m;���',���=0Bpq㱇~4�C�
���(�ō��p<�/��6�OJ������́�P�HQ�ߺ�5��e�m�r�9)�$�F}AIHsl���p��-,,��~�+
b���sҒb�J��X�0�!4��E�3����u�M�q���\������S��c��W�!T,�ĿO�R"O<7�{E��.�y����圴��S��!�I#�}S�\�ђ��������[���
��A�3f�vIIEND�B`�PKRn�[Wdt���images/checked_out.pngnu�[����PNG


IHDR�aMIDATxc�	H�-�0u�����_�r���n�Dj.J�1w����F�����̂e+׼_�b�{
_����|����Y���
+֬�|��x5�lX�b� �.WQ�2����	�0y�
]������vN�������2m�y��7̜9���_�0c��/�����U�����d��G�����c����*��?o���G��	�%�m��t��V��:�6`O:A*ZqP\��P��߿����K�O�:����3�/_������96�
PPQ3�IJ��cמ����9�߾�����_�i��Qq���s�BgI��IEND�B`�PKRn�[����images/edit.pngnu�[����PNG


IHDR٬tRNS����/�]IDATx����0��������Ň���b1,.F��������`08_�ᆵ��;��u�����d�Ǐ����
a�喐�a"j�B3��&cg8�pB����Kf���po�����0�o���������fkB�X���ݱrv���KL_1M��퐧#�^"|����]�v���
V�xo��u'�j�	:_�q���hyoph���k�RZg���"1�x��?e�'�>]�*�ZEK�0/�qg������.�9Ka����=0Bzê�I���|"@����r��\B����-\N�c)����2#���H�%�
H/Ֆ���V�B��oi���$�W�˖��<�����οDY7��IEND�B`�PKTn�[��images/edit_unpublished.pngnu�[����PNG


IHDRO#+QtRNS�<��IDATx��5x[1`-�-���i)����R\������f�g�r�rMr�i�e�aN��{����t��G_�,�e2Z�t��D%�g4�#��ł;Fwu���a����;��d�ը�k�Ύq�[�/����J1�b����x��,�)�Pc��^ܓ��u�E5ti�~�|���[^k�n�$Y��ǯe�o��.�h��o�����^�
���$��T�c�38涐�?%���xT3�&��~Y�mW�ǰ�E)����Jx�5$�&S"m/�P_���q�B��Nx,c2�����W6�ZR�5��ajk)�~\���k��U�%UK�G���g
�$w�:��?W��H�ҟ�ԅ���)M��i�4����N�]p�����)b�����[��mcy�a�ng���)D1���:�ܣλ���m�HW���o��29�����q�@��P�c�%w�\m�����PY͟IEND�B`�PKUn�[�;�images/emailButton.pngnu�[����PNG


IHDR��h6tRNS���7X}�IDATxc�O"�����???�4c������߷_�<y��Ϋ�����������÷?/>����קD�.�X4�,|ڴ����ן�<|��ڳ@����5`ṷ�
���u�/�l�0�y�����e�����N����O@��s�C���y�O��|�]�q����T˦��IEND�B`�PKUn�[^p����images/icon-16-logout.pngnu�[����PNG


IHDR�ajIDATx��r,�s��7�m۶��#�{�8Ũ[��;϶�z=N�����=SMd��㇕��h�DK4���-Q@c�;�Q]&*�bꃁj��(sa��K���y�?%&	��(	
[��d.��}���Y�����ku+�I�o��>��c�����<��Ce
���Dor�2��u���U�\������X��6��,5�2U<�8OK|y5nj]p�*�>�W�^��R��ظ'^ܚ�dY�M�����MV��o��
߇W��K�[�NR�6�T�֓Tx(�������3�j<��������	�wĘH�X$��x�l8N�;�����%e}��l��?�uhpis1]IEND�B`�PKUn�[�ߤ�99images/icon_error.gifnu�[���GIF87a��H�L�eP�f�3�++�������
��:9�p9�dz�97��>$��*'�
�^�:4��?����&�E?�^*��������,@��'��b�f3�M6Aetmc��H�@3�P�2@hB��5il�CnG:V&���Q�2�	��x4���QaM�mY�"y4?W|Bf"=��	C@E��D@FHKxMdf�ILMQ
wj5�5r"v.x3Y~
w�X�[
L5�4f:�>�?"sB�<>����
����"!;PKUn�[e�QYYimages/indent.pngnu�[����PNG


IHDR		�Y�tRNS�[�"�IDATxc���Z���:�N�5ȏ�IEND�B`�PKUn�[lh��__images/indent1.pngnu�[����PNG


IHDR		�Y�tRNS�[�"�IDATxc������`�RJ6J�1���IEND�B`�PKUn�[�h��__images/indent2.pngnu�[����PNG


IHDR		�Y�tRNS�[�"�IDATxc���
����0�8I=�2IEND�B`�PKUn�[x�ԙaaimages/indent3.pngnu�[����PNG


IHDR		�Y�tRNS�[�"�IDATxc����1X@�l
Y�Jq�}��IEND�B`�PKUn�[�x[[images/indent4.pngnu�[����PNG


IHDR		�Y�tRNS�[�"�IDATxc����Y@�l
��L];u$�IEND�B`�PKUn�[�x[[images/indent5.pngnu�[����PNG


IHDR		�Y�tRNS�[�"�IDATxc����Y@�l
��L];u$�IEND�B`�PKUn�[E�ib��images/livemarks-rtl.pngnu�[����PNG


IHDR�aJIDATx��S��F��I�w���k۶��Z�z�m?ն��Fm۶}�$�Lm�_<��s��������;����(nɜ�@�����i�/�KG�ύ�e���e]��:p<p%8�
/I'=D�P5H:��஋��X�9��{�$���z�|��L>@��={0F������璉E�m�n��'��{܉]?������7�+Q����{���/P�W�0��)�F8�}�W�Gu�m"YI>
��R��q�M.��}����l��%p����iQ�S�G݅R���K�_��4�m�}��Sp�f�7bV��O�H<7��wQ�(𤢠cg2�����1�\���;w�D~�4I
%�!�Se�[��h�J�n3"�#|��X���$�+!����ϣ�P���G�*d#�x�^NUD#Ѿ
eW(J�Ux���^��Є�T�)���m��d�د�!
;��w6��G��H�!0�>�W�11>~]�����Sh����e�ҭ��zO�	���7���J�X
�\_���π�yJ����>x?^��?��t@j"w�KjK
����F��p#��d��IEND�B`�PKUn�[�G$��images/livemarks.pngnu�[����PNG


IHDR�aIIDATx���k�Ŷ�Bl'�ضm۶m۶m���o^��*{s�z9�g)�?!�My�ئ�za�o�
���NO�����D$.
b������d86�zy��	�=���	ߝmoV�o�k�����dV�C_!rk�lo��l���JDn��u�mPD$�"���&h���X��;�rs^l���!��y�akRÆ4�PD��.�"�*��S`���̤-N�cV����
�eo7"W�ի2�	:,R�I	��
�C|�4'pNb^�-A��>kK��^��L�N`NB�������.��I�O��q�@]��"��2�	�L��6%A��8H�0�A�T\��&x���>�s�2�	Z	�8!x��(��U�#�[���o�O�p���/���2�	Z�jj�I�ay@��h�)8_���]mϫ�}�X޴�\�Lx;
=�����G�|t��M��e��ś&�	M{;���]B��#H	"z
澩�M*�_�gh�혉uq�.���W^���NM�_�4@��"���^p��Uc��H�M佡�:Q��|�i,�J��J̧�*�"�~@Y���?�G!XR
��z�IEND�B`�PKUn�[VA�\\images/modal/bg_e.pngnu�[����PNG


IHDR!�A�#IDATxcd0g`b�����I����
��h�R��T�IEND�B`�PKUn�[Hg�%aaimages/modal/bg_n.pngnu�[����PNG


IHDR(��X�(IDATxcb`db`�!F	c0A�0�g
��2��0��0�_����M�IEND�B`�PKUn�[�-vTTimages/modal/bg_ne.pngnu�[����PNG


IHDR!(��[,IDATx�ՋnQ��}�7V{=d�?d��л����*��B�A�d,��]$�x�i���D��i(0@0�!p���4D@�B��le("��A�D��+#��D��?��y���Zs���9
����H�"� p�� �eA�0��/�i��̂
�ad��s*"`0��q#�1WM��^+R.��g�/��،�
Fho,X*���U�r�:/��2���A������G�F`{�8��	��ͤ�]\|fD�@��q���wI�}~Z�O���F�vIEND�B`�PKUn�[_��GGimages/modal/bg_nw.pngnu�[����PNG


IHDR!(��[,IDATx��	n�@Cѡ&�?r�
;߰
'm�ꉒ�ӏ�O�ƴpN�>L(=O����5h^�)t>���(E�kD���`��LL��'&�}�9�
�z�"�>��Y���(2PF��:Fj�S@���
�M��
����:�B"3��0R��~|�M�^
M��p���A�D�{��ݑ�1\��}��g��pi���7�}�HD�z%�c�A�)Q�����f��?ʵvۄp�c���"B�`B�?�q|�.�IEND�B`�PKUn�[r���``images/modal/bg_s.pngnu�[����PNG


IHDR!��	4'IDAT[c`0fb`fb�F�PI��#q�!q���b�0�Cu�s�IEND�B`�PKUn�[W��PPimages/modal/bg_se.pngnu�[����PNG


IHDR!!��
�IDATx��n�P�����+�]Y�*���c{i7�X�0ُmG�ٽ
��z,+�1��d�U���u�/l��s/��ݞ3��
�P�rlL����#��Fx
F��(�PŠ:�/�Y�F`:Rx�{�2��"6	�{����?�/�0�G�2�l���A�{s�8
����=�R��v�l�Gc
����,�~N���.���
�"Ty苘�辈7�pǀ[�m�����̿��"8fX�"��(}�^ަp�o��"�z+��$�<�Ž�?(R���O<IEND�B`�PKUn�[@iU..images/modal/bg_sw.pngnu�[����PNG


IHDR!!��
��IDATx^���
�"��v7.�G��J|��%~U��{�s�vW��۹�8�pe��l��U��V���������B�8��\$�brD�(=��"�wg�:
�5�ӧ`H<�!ē4"b�-�ҍ�r�e���#�d`�r#�9Ԍ�|#<��H�W��B�u� �P�A3b7�)�0�P��_N�b������K�&)hc&�a&�_�8�91g�Rf�AY�#b���v�B}9O"�2��IEND�B`�PKUn�[�{�WWimages/modal/bg_w.pngnu�[����PNG


IHDR!�A�IDAT[cd`d�F4���̂��H���?�:�G�LIEND�B`�PKUn�[��8images/modal/closebox.pngnu�[����PNG


IHDR�9f)�IDATx���$[����j�����gm۶m۶�{�l۶mmm^Nw�1��	����n�@�@M7m�����4�����ter7-����Cd��΋:��7cq����U���%L�����Q���D��GZ�D�j��=/�*޷������	a���6�5�4���N���z��~���{KvjI\�#������&e�;�
���yO�A���8o���'Ǘ%)�0��jl�7���&zԗl���>"�M�Ia�X�K\�R�z���[��Ɋ&T��v���q�P���KD܂N=@|*�����%܄X�Ҁ?�va]r�M'���.�wt$�6�e
�����%zvkB&�`��ͦ�ѝ��Nt�LϷ�v7��4��ܬ�jd��菧Q�X>[�%m@?�;D��i�6�LF��;	���
�T�@�ã�N ��_[�@G�/����Ļܶ����
@�D�U�ZB�ֺ���(�}��o.B4��b�;L_C���q#�p�����c(E�#.�C��D�ꢿP��	}�I�z���*,W���F$��~Qk�־�%^�yX��e#V�ț��sDKՔj��U��6o0҇�_��x��ǎ������n��*��%�\��n�L�ى�#�6�G�\���5?�-�ٜN�z�?��E?�G%AA��s��Y�e��9�����Nߍ��,^~=�bix�3�5����';]����`(����a�@ij讓��'���`��M/s�};1]�!.F�J"��+�Q�ͻ��ψ���}�u������珇��>�A_�WR,$��9���r�/>�:��W_��b'�8�v�5�P$�}1k��pE����?�������Z�p����!��ؙ�|t�0�
l����A�^��f��3�9C,���
W��bN돑��ɬ����)F:G�^q:�3B9%Y���R�b䳕��P�kkm���@�#L0�jbK�^>1�ӊ�iB����0��=�IEND�B`�PKUn�[���!!images/modal/spinner.gifnu�[���GIF89a�?


%%%666DDDLLLTTT[[[dddlllttt{{{������������������������������������������������������������������������������������������������������������������������������������������������������������!�NETSCAPE2.0!�?,�����n
��RC�~o�Y-1����J��eF�$�v1_oa��SFr��29?,	8:BS".J#EJ')C-W7"#
,W6C.&>K,�C9!;K
6?>$�'75-8)�+b1)#/(?5)�?:>!?!4W1/?
>8�K>�?$�:IBA!�?,
X��p��$zD�+��!=�3�����~/�T))@B�X�r
��C	Ȅ����	w6D(>IB$0�B1�D3,�?:%�A!�?,Q��pXi�B��c~6CY[@~�g#�l���A������PT:ȆE�~'�F�D2:C<7
>B.%HMC"3�1WBA!�?,
O����L�H�,�M?ܢ��U2?
4B0%Y���*@~7�j��P�/D�~���<I�G��.
�j�?HA!�?,Z�����	���T��
�#���6��%����%,�V$G��0 =ݣ�
����][

w-w"{?>JH).{?(<{�?A!�?,P��o�Y	�_);^d��O�X�ʱ8"��$�
g�r�)�12��D��b8
?*=B1f.�f6^A!�?,

O��p��ňB,C�w�ȅ���FU!�2�d�2��1A�H�ߢ�x�$-������

@~-X=?	?(D�0D
	=?NCA!�?,
V��pH̸��S
ɼ�>�SH�T.��YB8dDA��6����
)h��B�	d���+�h	?	?,C"+?=2"C=a�<?:DA!�?,Q��p��
�X��?��XS�'��HL!��
6Ԥ�Ӱ~�_�H)@�Z�J �?
0P'??
>5qG>7BOGA!�?,
N��0�	�BE�p
!�C�zZS+�䞞_�`�����~�ꩠ�8V�H�(?4G.M??6zG_?HA!�?,
U����3��ȟ�!B�_��vѣ��u
�SV1 FY�꓾M
ݘ�]>�Z�X*�X
"/I8??PG/)??8i$>?A!�?,S����W��W���O�\~AWP�~(�9�Fñ6�j�s�|�G��
!
5!'7?&*?0)#C:?!C1/?
A;PKUn�[2Gs%%images/mooRainbow/blank.gifnu�[���GIF89ap!�,@D;PKUn�[�+��\\!images/mooRainbow/moor_arrows.gifnu�[���GIF89a)	����nmo!�,)	@-T.���|B���F�\�op�ց�$�i������r�9���^�p�;PKUn�[�[rCC#images/mooRainbow/moor_boverlay.pngnu�[����PNG


IHDR�{`�
IDATx�؁@@����V�m���O�e�3k����`�tx�/��
+�Xx�G
V�������p7V�
`�X�4�@���g����@
�@ �@
�@�������@@���@��g V@8qb
@!�X�����@�X7n��7V�
�+��
��p��
@G �@��7V�
�+��
��p��
@G �@��p��
@G �@��p��
@ |�3+ ���+ �@ �@ �@
�@o&��/��@�4>��h�X7�q`
��
��`���c�0^�X�
�`�x������%v�IEND�B`�PKUn�[�zg�PP!images/mooRainbow/moor_cursor.gifnu�[���GIF89a�������!�,!��i�X�F�����	_("`7���i��@Y�;PKUn�[L�����!images/mooRainbow/moor_slider.pngnu�[����PNG


IHDR��hIDATx�˹	@0s�����j5~Ig$�c�4M�4M�v�'��L:�i��i�f=s�1M�4M�4�9?��<;�i��i�f=O�1M�4M�4�9?�<�1M�4M�4��Ԩu�'��IEND�B`�PKVn�[��.���#images/mooRainbow/moor_woverlay.pngnu�[����PNG


IHDR�{`��IDATxb����?*F�PIL�B�(�����¤IWI�̈́|C.��c	3F�1�]:`
�o���JCx                       
           
�������������������������������������������
                                     
  
0��)�:�IEND�B`�PKXn�[��n4��images/mootree.gifnu�[���GIF89a��}����@�����Y��␐����sss��ཽ��̦غ{��=U������͑ɭx��z��������L�oI����Š��ޤ˄�ڹ���|���ҕ��η�u�ٝzg@���Ծ�������Ҷ|��^�Ε��昹u�כ��ǿ�_�vQ����К��E���q]5��ū�T��6Ѳs��Y�����}ؼ�����ȋ�wB����ٮ����ǝg�߿�j�灛�I���Ʋ����Å�����洰W���ˬk�ċ�۟��R�ԗ��`�zT�Ħca+��<�������넄����ַx�׽Ӵuťd۽~ư���S����ħkvb:�zH�����sM�}X��E������|hA�Ϫ���ɬq���`n+��B���Wm.!�XMP
DataXMP�?xpacke                                                          
                 
                            
?xpacket
end="w"?>!�},�@��}��}����������������������������������	$�	_�����$���������������‚���������a�wf"@Rv�N^^,��,^N�����،����������^�X(���AnἜ@�o�	o'��a�"�D+jܘq�"+BN�c�
 	9�
D*���I�$J��:��ɓ�ΞBtQp��6k�Us��^4�+'(��8H�8P�G)Ӟ�<�T$l���:u$2d���3��~h����=�m`���غ�+���Ihu&X̸�$ƍCN��d�a)]��h��&�Q�(�a�mxZ�V���	����n"��iF�-O�L�g��$����p��_��7��	�'�.��%R���4"ڞ�4
���١����t����;L�pⲍ4�����*A���GPD�S-���F�
��
)�aX}����}f����8�J��ڋ/�(��b��E�|8:7���aŐVLQ�I+<�jp�LDy$I�8̎����"��	p��#`����[vy&�h��f�f~Ĝ>`Q�i�4�B��g~j�	RĜ@�ygs0R�d�9&bX2�@]�R�$�
@���b�榏t�i�RJI����)��dPƬ:�Q�
c��Rj�c�}�J��T�j���6bj�>�d��4���22���<2�٪:ɵ�tk-��>���A
�d��
��{�T栫��f��n"�V�/�ኈ�_|��%B��sZ�'���7�f��G�0���g%�!�#����7�SĔr9�|\gl�&����[�l�cd����&T��L��
S�a�΂
�R).���1'�E�!GyD=5Ѣ��6�G�H�`�f(�B(D���$N�N�q�r3���i1�x�m_�8ځ;PKXn�[9��

images/mootree_loader.gifnu�[���GIF89a���������������|||���!�NETSCAPE2.0!�
�,@D8��n�)(�����qSw�
fL8�a�r���Bw	Qj��$�a�|��c�E.��X����!�
,>pHa��xD��!�%lc!!,{���t>y�@��h*J�F�Ci|�@�z�M#!�
,88�#�pC���h}�݀w4[�
�Q,'
(D(δ��R;�D��8��& �D�W$!�
,
9p�I��(���&��q�}�	�e,\���xl�'���(���"
�஗!�
,=�I�5Kq�-��
�x@�FQz�a�C
�a�D|��7�ɂ#A���E���	D
&K�!�
,98�p��2H��hu_�Z�9����,�&���‚�W���Px#�ox��CL�;PKXn�[ч��images/new.pngnu�[����PNG


IHDR�a�IDATxڽ�!!F�wZ/�T���xq#�����H�9��̩8�ŝySL���11nk4|`zg���R}�,�R@Ġ��_`(<M�YZ���/�O��
β���#A+?u�d"߼\	�1��赪��e��|��(�T�\�/#>�DZ�O-�Bı&�q,��(.PH��ؼ��ĮF5��nD�E�
5�
�����d�T�*���p��6?�_��1��QIEND�B`�PKXn�[�Y�^^images/notice-alert.pngnu�[����PNG


IHDRV�g%IDATxՖ5�WE�7р������w��W�R�L�>̜�����Ff�ɝ���~k��-�{���\:��Y"_E�p�W�������Ϋ�{>��@%�y��^^sŀ#O��M&ۦɁ�z�7_���g􀀷_)�y�E`�E��l��q7��c$*O0�M͙h)=(�f��Qh[z��`�U|8Ņ��x8V����!=�*�%�;޼�^ց{ct�C�{N��3J�m*�5F��5َ[��=CY�5I�o����k#�K�h����8��1H�|]iq8�qq���\��\���4�Smr�8O5W�v(g0�h]�;��p�˜Nip��Ntڊ�������~箑�O��4�!�&4�I����	���H�$�(�@LյT�����R����L�Q��h�R��"/�S_Gz4�D9�Ê��T�$+���$+�k���@9��J���S7���&E��'�c�,���I|��t_�ٺ?��2{��!ۂ϶�vb7��2ٟ`����Έ��+%���UaW����v15��!�{s���(�M!e_ؒ�)���S���
���K�&�����'��8�Kh��*�P�<�r/�X�2A��]�<�K�s�Ԗm����0�%+F,j:bQ\��i�XP��EA5���aV@�찀yi+�,��bV�mL�Ü��2t>i��.�h�ݑ������1#f�m���cf�*�3#n��hρ�)�Gt���Ӄ�����o���[J෰�G��#a-�"���B:C����|_��8��~���J�
���ҙ�	�i���;<�pH�X�IEND�B`�PKXn�[�g�j��images/notice-download.pngnu�[����PNG


IHDRV�g�IDATx��,GƯcg�3���El�I1V),���8�6�m�;>b�.�K�nfY)�����g���z(��5?}�(�hĪ���߰��+�W�y�{�>d�<c�@"N1~�#z���e��Hg�7v�~�@:X������Z{�+��k�p�^������,
���a�谎i"�5Xk9�n
�]��S���!�MEtpf�a�)C<5qd��8үc.�J��]p�׿}�ۖ�$�l�~���
y�Yޭc!ZE���ȅ)��S7Ы�EvI.G!�&����ߡ�:���Ҽ-�0�s8u�L����(e[#OZ�t8�j�H7�B_���٪�,�lm26�p�V'��nʅ���/m6@6ϳ��
��z
N(rb���N�x}�^H������mu�
�ΠT)�Ke�_�'�f�ʆT
��Q�u�:3+��&�:�MJW�PWj��l}���B�x/z?܍�_􁶲�Y1��a�N�eԥ��[E�"���F�N���O<����|fV�,��AXj�/Q'Y���1D�#X�oM���˯�RG'���,]j�,�ۥ�ns�u���S,n�����ݙTx]�
Pj���̘��e�t��I��TJ��Di.�E��lb��F;T[_�2!f���\6)i�'�Z��a�60ߕ��ہ��b���P*)X3w
f/ϊ���Z�	��l�n�=	9�s&�_�
�N�J�cGk6pl���.��T{�;�N���B��A�W
�%AʖA���Zۺ��&H�}/��
�s�!���1r�1�R鵝Kgq���U)�UX%KMt|R��y��J'����q�x��\+�	Q�ԉ�'��
���أgeR�>�价W(�a�^f!T���Y��TL!�A�ܶ�@f��y$�S$8
��,k�;�����:��IEND�B`�PKXn�[�|sFRRimages/notice-info.pngnu�[����PNG


IHDRV�gIDATx���RSg�WN$4����K�%p	�x\B9�A���19�)A��B���
EGQN��c�cg�?o׷�)!;�f�Y߷ֻ�;{�M_#)|��C�7��p��X����Q���3~˃c\�x��"�ɘǣ�����h4�`��fވ�>�}by&��#h���o��/a\�yߎ��2v
k��Q
�x6��
=a�~(�wi����@��0�&���i�gi`�0�#��W�:/nط��؏��a�=���3�=���5ѓ5Z��@Ùw]�X�Z2z�@=�d��:��d�5ы�T�y`_d�����m��w��V�kԾ��Q�н�V�D/A˻`����$eǎ�Rf��{�kԩk@�l�5΃�@-�\���poA۵%�eӶW�����Y��u6
"��m8f��0r�»lں�r�tgH���K���%8'sw
Y���L��=l�̰N��������i5FMkP��2?Y��wF�H0�M��T���5��oK6����8�@�@u��\J|R�"�%���6����]o�Q���^��
C�>�jg@
�i��%�L�����꧈��O��9b�ٴs*F۰(�
�7瑖����{���Τ��ֿ���`z�yPwc���|�|8n<|��jfE?%���
��_��O�9����)~��Mm+
Ǵ�D��k��L�䘲fTOC[5��~J��r��8Y�'A�r�*]��i�+峏RF�d�X����l�J}p<^N0uV�|�����@��D=�sL�P���^�0;�i٘Um�����l�/l�9�񺭷�]m����>꣏F�Ǧ)�R9�}�
��>P��G�lF�[ށm�${/��G�N�P>s�*��	QɠD�"�[S솹�&{t%�l�]m�2m����ڵ.���XXod=�E=FE�V��(l�QA+����p��S�K��d�t�5�{f���3�
�g�g��F+��	0�6�p���{q���i
�A���E"��Jy�9)�>��1�X��H�5�Ŀ~��M�PIEND�B`�PKXn�[iA�/images/notice-note.pngnu�[����PNG


IHDRV�g�IDATx����@���9G���#p��`�m�%������,�}]��i:7�~x��`ŭ��]qpGҼ�p�nGnJ�ܥ�ޖ.�/Ѹ!�]T����u\���<\g�ћ\|K|�S+^N!|�E��C�
��rI�+�./J�����@�E�
t�*?ϡ|J�P�y:+���")
���Ŗ�1A�)<�"t��i3��(�HO��e�pB������ѳ���I�N1z�����CQ�<Q@N|�8D�E����h�l=**z4�1Q���q��AD̅�[
���{F4+��/����w���⓹蠩4N�}#�;Յ*z
r0�!q��	�B?�w9&���蘃�dš�0Y;ʅ�	[}T�;��F%@8�z�X;5��yvt��3k�0�����g�s���q�a�l�C��>����sUt�Έ�IQ�Y
*=���nT�./fP���%>�{�qWuF�݂���F41�9�q��v�[��[����
7<���ʼ�ٟ6w��ѽ��}�����ޙ�H����/Ya?��w��#hC��c~�>�C�����yL���;�%`�fn����>�|}�a����U�/3Z�Ό�{4�z;JF��Nr�w����ũA*n�

|Nm���o�u���,��p�k�
�ݎF�{�ijA�t����y�7h��3|��uf8`�g8ð���ᯤ�_�[x�̋IEND�B`�PKXn�[�+g_QQimages/no_indent.pngnu�[����PNG


IHDR7n�$tRNS���
IDATxch��L��IEND�B`�PKXn�[���?��images/pdf_button.pngnu�[����PNG


IHDR��h6tRNS���7X}7IDATx���~DQ��c��n��q�M�����>�m۶m�(���\���]E�R���kF:�Z�JK{:;��;X?�����FFg���srr211�O2>.E�������[�}�unj�Ȥ��m�	'eee�D��
gpx�O��	���`L��[���H���6]T��%������6�*վ���^�Vgg�9)*��o���F#
�����RS�BCwu:�X~i��F���EG�,.���b��,(�����H��V]]�Aݧa>��RX���������,\�=�?߯tℜV%M
�IEND�B`�PKXn�[#
����images/printButton.pngnu�[����PNG


IHDR(-S?PLTE����ݾ�Ϣ���NNN���������kkk�����������������N����������/���O̫gtRNS@��fSIDATx^��G�0EA�Kz��Y#}R���x���Ax�60_
Cబg�#����E�a���8k�)
�F��P��ȥG�k�IEND�B`�PKXn�[;��images/rating_star.pngnu�[����PNG


IHDR	";0LtRNS���7X}�IDATxu��AA��8Z�:@�2�������%"�}y�뷾coH�s~~^(*����x�Ͷ���iZ8�k+�����f�!��S�E�����X�>]__Ñ
:��x�yJ�<�P�8�
��M�,��ё���'�_l��ns�_�བྷ�!|����m�4P�0a�\�^�������
P^H�">�����/�7`��g�,��)��IEND�B`�PKXn�[���images/rating_star_blank.pngnu�[����PNG


IHDR	�2��tRNS�[�"�[IDATx5Ƶ�0���af�CM�c�;u�_u���/@�U���V�MC�O�==J2���\+ҩ�vi�T�m¼q��d��W*�|����YD�VH6�>�IEND�B`�PKXn�[�8�t��images/sort0.pngnu�[����PNG


IHDR��(�tRNS�[�"�PIDATxc����p����pvӤSϠ�%��_��S'�?�6���vө��.~�k�_�~�Γ'@��M�]�~�ɇ�v!Z[m�JC�IEND�B`�PKXn�[Q�Kՠ�images/sort1.pngnu�[����PNG


IHDR��(�tRNS�[�"�YIDATxc���U�755��=�(޶t�����d�w��������6�����0���c�>������~�����	��C����m�/���IEND�B`�PKXn�[��mmimages/sort_asc.pngnu�[����PNG


IHDRs;tRNSv��8&IDATxc@))��9)(�(2�)`�CBe
`S�P���K��>e�IEND�B`�PKXn�[�uhhimages/sort_desc.pngnu�[����PNG


IHDRVu\�/IDAT(�cHII�O
f
E10��r)�s16���rgಁ$
�uQމYD�IEND�B`�PKXn�[F��ggimages/sort_none.pngnu�[����PNG


IHDRVu\�.IDAT(�c` ����LJA�$
 L�+H��y�h
�yD�1~�,d�q���]��IEND�B`�PKXn�[AW�d��images/tooltip.pngnu�[����PNG


IHDR�a�IDATx}�+̬0�+��Xd%��r%v%Y[�Db����J�J�ʕ����f�'����L_
��[��o}��]@�{_qS��zIBܱ�P��~>Xw��	����+��Y�$F"n�
����'@��
��Ѝ�b�;��
<)�$>J=c����A9��>�����z3-1o��ܔ�jfFP��Z�b�|Å�
�?Ն�{���1�G�۶s)
a?���PO����T~�f�v��D��
�E�(ړ�$�		խ����J�#cDB��x�Gx�lP��'?��K]��8T���
T�OL		}�>���(�-�{���
b�/���A�ݨk򕷄6�ebf�$��j`
I
�o7�63�c��'�B!�M���ϝE,}��	U�Tڡ2�Q.,���+��Qѱ�IEND�B`�PKXn�[���images/weblink.pngnu�[����PNG


IHDR�a�IDATxu�p�X���vT=۶m���l۶m۶Y۶;���o�=S�?�%9I~���v��a�5��ߌ?�:���S9�:�U�B#�/��c<�F;q��RӴ[����Ͼ9X��`��uh�
W�����jxZ�?^-���Tϼ�5�4.ۤHn�e�}E�ؤ��Au'>X.dzҤ�Z7��bRv���8.�gr߱�G��r��]l%��sC7���qYo٤�F�]?��d�3u�"�CO8�9��w�kd҅h���00TF��Ňc_r�!�w�`��X&���\��a�D{8����|.�Sv���f����R#C79�x���xR�͚�ʏ�#���7�O�F���q��Q$b���7�t�gYF�%6�]�J��t�o��j�e�ny_ƺ*^�‡xA���c5�~`��X�������L�[j�a0�%j��筪�$pL'A��>�k��q#���S����tTz����q�CV��JV��!Y�
���1��/��w%�I��Ȇn3ߙ�^���[���H�9όw1�29X���!�br�;��G&�Ba��(�����E���7�w}O�S8�B�0H�"���d�����,�!g/
]{��@�N�ɏ�/��Y�Xfp�ijN=�M,�i ��"
�R�Q�P��%SG��벢w�i/�����>s��g�z�B��%��Jj�/�4JE����f�uS�^9C��Jۖ<��L.���?mkIEND�B`�PKXn�[L��]]$js/associations-edit-uncompressed.jsnu�[���/**
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license     GNU General Public License version 2 or later; see
LICENSE.txt
 */

/**
 * Edit Associations javascript behavior
 *
 * Used for editing associations in the backend.
 *
 * @package  Joomla
 * @since    3.7.0
 */

window.hideAssociation = function(formControl, languageCode)
{
	jQuery('#associations .control-group').each(function()
	{
		// Current selected language. Hide it.
		if (jQuery(this).find('.control-label
label').attr('for').replace(new RegExp('_id$'),
'') == formControl + '_associations_' +
languageCode.replace('-', '_'))
		{
			jQuery(this).hide();
		}
	});
}

window.showAssociationMessage = function()
{
	jQuery('#associations .control-group').hide();
	jQuery('#associations').prepend('<div
id="associations-notice" class="alert
alert-info">' +
Joomla.JText._('JGLOBAL_ASSOC_NOT_POSSIBLE') +
'</div>');
}

	/**
	 * Inject associations into other association fields
	 *
	 * This function is called whenever the Ajax request within
propagateAssociation() completes successfully.
	 * Its purpose is to inject the associations which have been returned in
the Ajax response into the other
	 * association fields in the form.
	 * It does this by invoking the various callback functions of those
association fields (i.e. the function which
	 * gets called whenever the administrator selects an association via the
modal), and passing the appropriate
	 * associated record details.
	 *
	 * @param   js object   result                  The response from the Ajax
request.
	 *                                              Its structure is that
generated by the JResponseJson class,
	 *                                              with the data field
containing the associations
	 * @param   string      fieldPrefix             The stem of the html ids
for the elements comprising the modal field
	 * @param   string      callbackFunctionPrefix  The name of the callback
function which the modal window uses to set the
	 *                                              selected item as the
association, but minus the language tag at the end
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	Joomla.injectAssociations = function(result, callbackFunctionPrefix)
	{
		var functionName;

		if (result.success)
		{
			if (result.data.length !== 0)
			{
				for (var lang in result.data)
				{
					functionName = callbackFunctionPrefix +
lang.replace("-","_");

					window[functionName](result.data[lang].id, result.data[lang].title,
result.data[lang].catid, null, null, lang);
				}
			}

			if (result.message)
			{
				Joomla.renderMessages({"notice":[result.message]});
			}
		}
		else
		{
			Joomla.renderMessages({"warning":[(Joomla.JText._('JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED'))]});
		}
	}

	/**
	 * Propagate associations from this field into other association fields
	 *
	 * This function is called whenever an administrator populates an
association (in the association modal field)
	 * and then clicks on the Propagate button.
	 * The purpose of this function is to find what other records (if any) are
associated with the one which the
	 * administrator has selected, and populate the other association fields
with these records. (Otherwise, if the
	 * administrator just clicks on Save without clicking on Propagate, those
other associations will be deleted).
	 * It does this by finding the id of the selected associated record (from
a hidden field) and makes an Ajax call
	 * to the server to find the other associations, also passing up the
language of the record currently being edited,
	 * as it should be excluded.
	 * Once it has received from the server the other associations it calls
injectAssociations to inject them into
	 * the other association fields within the form.
	 *
	 * @param   string  fieldPrefix             The stem of the html ids for
the elements comprising the modal field
	 * @param   string  callbackFunctionPrefix  The name of the callback
function which the modal window uses to set the
	 *                                            selected item as the
association, but minus the language tag at the end
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	Joomla.propagateAssociation = function(fieldPrefix,
callbackFunctionPrefix)
	{
		// Find the id of the record which has been set as an assocation
		var assocId = jQuery("#" + fieldPrefix +
"_id").val();

		// Find the language of the record being edited
		var currentLang =
jQuery('#jform_language').find(":selected").val();

		// Find the token so that it can be sent in the Ajax request as well
		var token = Joomla.getOptions('csrf.token', '');

		// Find the action url associated with the form - we need to add the
token to this
		var url =
jQuery("form[name='adminForm']").attr("action");
		url += '&' + token + '=1';

		jQuery.ajax(
		{
			url:  url,
			data: { task: "ajax.fetchAssociations", format:
"json", assocId: assocId, excludeLang: currentLang },

			success: function(result, status, xhr) {
Joomla.injectAssociations(result, callbackFunctionPrefix); },

			error: function() {
Joomla.renderMessages({"warning":[(Joomla.JText._('JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED'))]});
},
		});

		return false;
	}

!(function()
{
	jQuery(document).ready(function($)
	{
		var associationsEditOptions =
Joomla.getOptions('system.associations.edit'), formControl =
associationsEditOptions.formControl || 'jform';

		// Hide the associations tab if needed.
		if (associationsEditOptions.hidden == 1)
		{
			window.showAssociationMessage();
		}
		// Hide only the associations for the current language.
		else
		{
			window.hideAssociation(formControl, $('#' + formControl +
'_language').val());
		}

		// When changing the language.
		$('#' + formControl +
'_language').on('change', function(event)
		{
			// Remove message if any.
			Joomla.removeMessages();
			$('#associations-notice').remove();

			var existsAssociations = false;

			// For each language, remove the associations, ie, empty the
associations fields and reset the buttons to Select/Create.
			$('#associations .control-group').each(function()
			{
				var languageCode = $(this).find('.control-label
label').attr('for').replace('_id',
'').replace('jform_associations_', '');

				// Show the association fields.
				$(this).show();

				// Check if there was an association selected for this language.
				if (!existsAssociations && $('#' + formControl +
'_associations_' + languageCode + '_id').val() !==
'')
				{
					existsAssociations = true;
				}

				// Call the modal clear button.
				$('#' + formControl + '_associations_' +
languageCode + '_clear').click();
			});

			// If associations existed, send a warning to the user.
			if (existsAssociations)
			{
				Joomla.renderMessages({warning:
[Joomla.JText._('JGLOBAL_ASSOCIATIONS_RESET_WARNING')]});
			}

			var selectedLanguage = $(this).val();

			// If the selected language is All hide the fields and add a message.
			if (selectedLanguage == '*')
			{
				window.showAssociationMessage();
			}
			// Else show the associations fields/buttons and hide the current
selected language.
			else
			{
				window.hideAssociation(formControl, selectedLanguage);
			}
		});
	});
})(window, document, Joomla);
PKXn�[%nhGGjs/associations-edit.jsnu�[���window.hideAssociation=function(o,a){jQuery("#associations
.control-group").each(function(){jQuery(this).find(".control-label
label").attr("for").replace(new
RegExp("_id$"),"")==o+"_associations_"+a.replace("-","_")&&jQuery(this).hide()})},window.showAssociationMessage=function(){jQuery("#associations
.control-group").hide(),jQuery("#associations").prepend('<div
id="associations-notice" class="alert
alert-info">'+Joomla.JText._("JGLOBAL_ASSOC_NOT_POSSIBLE")+"</div>")},Joomla.injectAssociations=function(o,a){var
s;if(o.success){if(0!==o.data.length)for(var e in
o.data)s=a+e.replace("-","_"),window[s](o.data[e].id,o.data[e].title,o.data[e].catid,null,null,e);o.message&&Joomla.renderMessages({notice:[o.message]})}else
Joomla.renderMessages({warning:[Joomla.JText._("JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED")]})},Joomla.propagateAssociation=function(o,a){var
s=jQuery("#"+o+"_id").val(),e=jQuery("#jform_language").find(":selected").val(),i=Joomla.getOptions("csrf.token",""),n=jQuery("form[name='adminForm']").attr("action");return
n+="&"+i+"=1",jQuery.ajax({url:n,data:{task:"ajax.fetchAssociations",format:"json",assocId:s,excludeLang:e},success:function(o,s,e){Joomla.injectAssociations(o,a)},error:function(){Joomla.renderMessages({warning:[Joomla.JText._("JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED")]})}}),!1},window,document,Joomla,jQuery(document).ready(function(o){var
a=Joomla.getOptions("system.associations.edit"),s=a.formControl||"jform";1==a.hidden?window.showAssociationMessage():window.hideAssociation(s,o("#"+s+"_language").val()),o("#"+s+"_language").on("change",function(a){Joomla.removeMessages(),o("#associations-notice").remove();var
e=!1;o("#associations .control-group").each(function(){var
a=o(this).find(".control-label
label").attr("for").replace("_id","").replace("jform_associations_","");o(this).show(),e||""===o("#"+s+"_associations_"+a+"_id").val()||(e=!0),o("#"+s+"_associations_"+a+"_clear").click()}),e&&Joomla.renderMessages({warning:[Joomla.JText._("JGLOBAL_ASSOCIATIONS_RESET_WARNING")]});var
i=o(this).val();"*"==i?window.showAssociationMessage():window.hideAssociation(s,i)})});
PKXn�[
��##!js/calendar-setup-uncompressed.jsnu�[���/*  Copyright
Mihai Bazon, 2002, 2003  |  http://dynarch.com/mishoo/
 *
---------------------------------------------------------------------------
 *
 * The DHTML Calendar
 *
 * Details and latest version at:
 * http://dynarch.com/mishoo/calendar.epl
 *
 * This script is distributed under the GNU Lesser General Public License.
 * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
 *
 * This file defines helper functions for setting up the calendar.  They
are
 * intended to help non-programmers get a working calendar on their site
 * quickly.  This script should not be seen as part of the calendar.  It
just
 * shows you what one can do with the calendar, while in the same time
 * providing a quick and simple method for setting it up.  If you need
 * exhaustive customization of the calendar creation process feel free to
 * modify this code to suit your needs (this is recommended and much better
 * than modifying calendar.js itself).
 */

/**
 *  This function "patches" an input field (or other element) to
use a calendar
 *  widget for date selection.
 *
 *  The "params" is a single object that can have the following
properties:
 *
 *    prop. name   | description
 * 
-------------------------------------------------------------------------------------------------
 *   inputField    | the ID of an input field to store the date
 *   displayArea   | the ID of a DIV or other element to show the date
 *   button        | ID of a button or other element that will trigger the
calendar
 *   eventName     | event that will trigger the calendar, without the
"on" prefix (default: "click")
 *   ifFormat      | date format that will be stored in the input field
 *   daFormat      | the date format that will be used to display the date
in displayArea
 *   singleClick   | (true/false) whether the calendar is in single click
mode or not (default: true)
 *   firstDay      | numeric: 0 to 6.  "0" means display Sunday
first, "1" means display Monday first, etc.
 *   align         | alignment (default: "Br"); if you don't
know what's this see the calendar documentation
 *   range         | array with 2 elements.  Default: [1900, 2999] -- the
range of years available
 *   weekNumbers   | (true/false) if it's true (default) the calendar
will display week numbers
 *   flat          | null or element ID; if not null the calendar will be a
flat calendar having the parent with the given ID
 *   flatCallback  | function that receives a JS Date object and returns an
URL to point the browser to (for flat calendar)
 *   disableFunc   | function that receives a JS Date object and should
return true if that date has to be disabled in the calendar
 *   onSelect      | function that gets called when a date is selected. 
You don't _have_ to supply this (the default is generally okay)
 *   onClose       | function that gets called when the calendar is closed.
 [default]
 *   onUpdate      | function that gets called after the date is updated in
the input field.  Receives a reference to the calendar.
 *   date          | the date that the calendar will be initially displayed
to
 *   showsTime     | default: false; if true the calendar will include a
time selector
 *   timeFormat    | the time format; can be "12" or
"24", default is "12"
 *   electric      | if true (default) then given fields/date areas are
updated for each move; otherwise they're updated only on close
 *   step          | configures the step of the years in drop-down boxes;
default: 2
 *   position      | configures the calendar absolute position; default:
null
 *   cache         | if "true" (but default: "false")
it will reuse the same calendar object, where possible
 *   showOthers    | if "true" (but default: "false")
it will show days from other months too
 *
 *  None of them is required, they all have default values.  However, if
you
 *  pass none of "inputField", "displayArea" or
"button" you'll get a warning
 *  saying "nothing to setup".
 */
Calendar.setup = function (params) {
	function param_default(pname, def) { if (typeof params[pname] ==
"undefined") { params[pname] = def; } };

	param_default("inputField",      null);
	param_default("displayArea",     null);
	param_default("button",          null);
	param_default("eventName",       "click");
	param_default("ifFormat",        "%Y/%m/%d");
	param_default("daFormat",        "%Y/%m/%d");
	param_default("singleClick",     true);
	param_default("disableFunc",     null);
	param_default("dateStatusFunc", 
params["disableFunc"]);	// takes precedence if both are defined
	param_default("dateTooltipFunc", null);
	param_default("dateText",        null);
	param_default("firstDay",        null);
	param_default("align",           "Br");
	param_default("range",           [1900, 2999]);
	param_default("weekNumbers",     true);
	param_default("flat",            null);
	param_default("flatCallback",    null);
	param_default("onSelect",        null);
	param_default("onClose",         null);
	param_default("onUpdate",        null);
	param_default("date",            null);
	param_default("showsTime",       false);
	param_default("timeFormat",      "24");
	param_default("electric",        true);
	param_default("step",            2);
	param_default("position",        null);
	param_default("cache",           false);
	param_default("showOthers",      false);
	param_default("multiple",        null);

	var tmp = ["inputField", "displayArea",
"button"];
	for (var i in tmp) {
		if (typeof params[tmp[i]] == "string") {
			params[tmp[i]] = document.getElementById(params[tmp[i]]);
		}
	}
	if (!(params.flat || params.multiple || params.inputField ||
params.displayArea || params.button)) {
		alert("Calendar.setup:\n  Nothing to setup (no fields found). 
Please check your code");
		return false;
	}

	function onSelect(cal) {
		var p = cal.params;
		var update = (cal.dateClicked || p.electric);
		if (update && p.inputField) {
			p.inputField.value = cal.date.print(p.ifFormat);
			if (typeof p.inputField.onchange == "function")
				p.inputField.onchange();
		}
		if (update && p.displayArea)
			p.displayArea.innerHTML = cal.date.print(p.daFormat);
		if (update && typeof p.onUpdate == "function")
			p.onUpdate(cal);
		if (update && p.flat) {
			if (typeof p.flatCallback == "function")
				p.flatCallback(cal);
		}
		if (update && p.singleClick && cal.dateClicked)
			cal.callCloseHandler();
	};

	if (params.flat != null) {
		if (typeof params.flat == "string")
			params.flat = document.getElementById(params.flat);
		if (!params.flat) {
			alert("Calendar.setup:\n  Flat specified but can't find
parent.");
			return false;
		}
		var cal = new Calendar(params.firstDay, params.date, params.onSelect ||
onSelect);
		cal.setDateToolTipHandler(params.dateTooltipFunc);
		cal.showsOtherMonths = params.showOthers;
		cal.showsTime = params.showsTime;
		cal.time24 = (params.timeFormat == "24");
		cal.params = params;
		cal.weekNumbers = params.weekNumbers;
		cal.setRange(params.range[0], params.range[1]);
		cal.setDateStatusHandler(params.dateStatusFunc);
		cal.getDateText = params.dateText;
		if (params.ifFormat) {
			cal.setDateFormat(params.ifFormat);
		}
		if (params.inputField && typeof params.inputField.value ==
"string") {
			cal.parseDate(params.inputField.value);
		}
		cal.create(params.flat);
		cal.show();
		return false;
	}

	var triggerEl = params.button || params.displayArea || params.inputField;
	triggerEl["on" + params.eventName] = function() {
		var dateEl = params.inputField || params.displayArea;
		var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
		var mustCreate = false;
		var cal = window.calendar;
		if (dateEl)
			params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
		if (!(cal && params.cache)) {
			window.calendar = cal = new Calendar(params.firstDay,
							     params.date,
							     params.onSelect || onSelect,
							     params.onClose || function(cal) { cal.hide(); });
			cal.setDateToolTipHandler(params.dateTooltipFunc);
			cal.showsTime = params.showsTime;
			cal.time24 = (params.timeFormat == "24");
			cal.weekNumbers = params.weekNumbers;
			mustCreate = true;
		} else {
			if (params.date)
				cal.setDate(params.date);
			cal.hide();
		}
		if (params.multiple) {
			cal.multiple = {};
			for (var i = params.multiple.length; --i >= 0;) {
				var d = params.multiple[i];
				var ds = d.print("%Y%m%d");
				cal.multiple[ds] = d;
			}
		}
		cal.showsOtherMonths = params.showOthers;
		cal.yearStep = params.step;
		cal.setRange(params.range[0], params.range[1]);
		cal.params = params;
		cal.setDateStatusHandler(params.dateStatusFunc);
		cal.getDateText = params.dateText;
		cal.setDateFormat(dateFmt);
		if (mustCreate)
			cal.create();
		cal.refresh();
		if (!params.position)
			cal.showAtElement(params.button || params.displayArea ||
params.inputField, params.align);
		else
			cal.showAt(params.position[0], params.position[1]);
		return false;
	};

	return cal;
};
PKXn�[��js/calendar-setup.jsnu�[���Calendar.setup=function(g){function
f(h,i){if(typeof
g[h]=="undefined"){g[h]=i}}f("inputField",null);f("displayArea",null);f("button",null);f("eventName","click");f("ifFormat","%Y/%m/%d");f("daFormat","%Y/%m/%d");f("singleClick",true);f("disableFunc",null);f("dateStatusFunc",g.disableFunc);f("dateTooltipFunc",null);f("dateText",null);f("firstDay",null);f("align","Br");f("range",[1900,2999]);f("weekNumbers",true);f("flat",null);f("flatCallback",null);f("onSelect",null);f("onClose",null);f("onUpdate",null);f("date",null);f("showsTime",false);f("timeFormat","24");f("electric",true);f("step",2);f("position",null);f("cache",false);f("showOthers",false);f("multiple",null);var
c=["inputField","displayArea","button"];for(var
b in c){if(typeof
g[c[b]]=="string"){g[c[b]]=document.getElementById(g[c[b]])}}if(!(g.flat||g.multiple||g.inputField||g.displayArea||g.button)){alert("Calendar.setup:\n
 Nothing to setup (no fields found).  Please check your code");return
false}function a(i){var h=i.params;var
j=(i.dateClicked||h.electric);if(j&&h.inputField){h.inputField.value=i.date.print(h.ifFormat);if(typeof
h.inputField.onchange=="function"){h.inputField.onchange()}}if(j&&h.displayArea){h.displayArea.innerHTML=i.date.print(h.daFormat)}if(j&&typeof
h.onUpdate=="function"){h.onUpdate(i)}if(j&&h.flat){if(typeof
h.flatCallback=="function"){h.flatCallback(i)}}if(j&&h.singleClick&&i.dateClicked){i.callCloseHandler()}}if(g.flat!=null){if(typeof
g.flat=="string"){g.flat=document.getElementById(g.flat)}if(!g.flat){alert("Calendar.setup:\n
 Flat specified but can't find parent.");return false}var e=new
Calendar(g.firstDay,g.date,g.onSelect||a);e.setDateToolTipHandler(g.dateTooltipFunc);e.showsOtherMonths=g.showOthers;e.showsTime=g.showsTime;e.time24=(g.timeFormat=="24");e.params=g;e.weekNumbers=g.weekNumbers;e.setRange(g.range[0],g.range[1]);e.setDateStatusHandler(g.dateStatusFunc);e.getDateText=g.dateText;if(g.ifFormat){e.setDateFormat(g.ifFormat)}if(g.inputField&&typeof
g.inputField.value=="string"){e.parseDate(g.inputField.value)}e.create(g.flat);e.show();return
false}var
d=g.button||g.displayArea||g.inputField;d["on"+g.eventName]=function(){var
h=g.inputField||g.displayArea;var k=g.inputField?g.ifFormat:g.daFormat;var
o=false;var
m=window.calendar;if(h){g.date=Date.parseDate(h.value||h.innerHTML,k)}if(!(m&&g.cache)){window.calendar=m=new
Calendar(g.firstDay,g.date,g.onSelect||a,g.onClose||function(i){i.hide()});m.setDateToolTipHandler(g.dateTooltipFunc);m.showsTime=g.showsTime;m.time24=(g.timeFormat=="24");m.weekNumbers=g.weekNumbers;o=true}else{if(g.date){m.setDate(g.date)}m.hide()}if(g.multiple){m.multiple={};for(var
j=g.multiple.length;--j>=0;){var n=g.multiple[j];var
l=n.print("%Y%m%d");m.multiple[l]=n}}m.showsOtherMonths=g.showOthers;m.yearStep=g.step;m.setRange(g.range[0],g.range[1]);m.params=g;m.setDateStatusHandler(g.dateStatusFunc);m.getDateText=g.dateText;m.setDateFormat(k);if(o){m.create()}m.refresh();if(!g.position){m.showAtElement(g.button||g.displayArea||g.inputField,g.align)}else{m.showAt(g.position[0],g.position[1])}return
false};return
e};PKXn�[1���js/calendar-uncompressed.jsnu�[���/*
 Copyright Mihai Bazon, 2002-2005  |  www.bazon.net/mishoo
 * -----------------------------------------------------------
 *
 * The DHTML Calendar, version 1.0 "It is happening again"
 *
 * Details and latest version at:
 * www.dynarch.com/projects/calendar
 *
 * This script is developed by Dynarch.com.  Visit us at www.dynarch.com.
 *
 * This script is distributed under the GNU Lesser General Public License.
 * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
 */

/** The Calendar object constructor. */
Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
	// member variables
	this.activeDiv = null;
	this.currentDateEl = null;
	this.getDateStatus = null;
	this.getDateToolTip = null;
	this.getDateText = null;
	this.timeout = null;
	this.onSelected = onSelected || null;
	this.onClose = onClose || null;
	this.dragging = false;
	this.hidden = false;
	this.minYear = 1970;
	this.maxYear = 2050;
	this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
	this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
	this.isPopup = true;
	this.weekNumbers = true;
	this.firstDayOfWeek = typeof firstDayOfWeek == "number" ?
firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc.
	this.showsOtherMonths = false;
	this.dateStr = dateStr;
	this.ar_days = null;
	this.showsTime = false;
	this.time24 = true;
	this.yearStep = 2;
	this.hiliteToday = true;
	this.multiple = null;
	// HTML elements
	this.table = null;
	this.element = null;
	this.tbody = null;
	this.firstdayname = null;
	// Combo boxes
	this.monthsCombo = null;
	this.yearsCombo = null;
	this.hilitedMonth = null;
	this.activeMonth = null;
	this.hilitedYear = null;
	this.activeYear = null;
	// Information
	this.dateClicked = false;

	// one-time initializations
	if (typeof Calendar._SDN == "undefined") {
		// table of short day names
		if (typeof Calendar._SDN_len == "undefined")
			Calendar._SDN_len = 3;
		var ar = new Array();
		for (var i = 8; i > 0;) {
			ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
		}
		Calendar._SDN = ar;
		// table of short month names
		if (typeof Calendar._SMN_len == "undefined")
			Calendar._SMN_len = 3;
		ar = new Array();
		for (var i = 12; i > 0;) {
			ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len);
		}
		Calendar._SMN = ar;
	}
};

// ** constants

/// "static", needed for event handlers.
Calendar._C = null;

/// detect a special case of "web browser"
Calendar.is_ie = ( /msie/i.test(navigator.userAgent) &&
		   !/opera/i.test(navigator.userAgent) );

Calendar.is_ie5 = ( Calendar.is_ie && /msie
5\.0/i.test(navigator.userAgent) );

/// detect Opera browser
Calendar.is_opera = /opera/i.test(navigator.userAgent);

/// detect KHTML-based browsers
Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);

// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a
separate
//        library, at some point.

Calendar.getAbsolutePos = function(el) {
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);
	if (is_div && el.scrollLeft)
		SL = el.scrollLeft;
	if (is_div && el.scrollTop)
		ST = el.scrollTop;
	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
	if (el.offsetParent) {
		var tmp = this.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};

Calendar.isRelated = function (el, evt) {
	var related = evt.relatedTarget;
	if (!related) {
		var type = evt.type;
		if (type == "mouseover") {
			related = evt.fromElement;
		} else if (type == "mouseout") {
			related = evt.toElement;
		}
	}
	while (related) {
		if (related == el) {
			return true;
		}
		related = related.parentNode;
	}
	return false;
};

Calendar.removeClass = function(el, className) {
	if (!(el && el.className)) {
		return;
	}
	var cls = el.className.split(" ");
	var ar = new Array();
	for (var i = cls.length; i > 0;) {
		if (cls[--i] != className) {
			ar[ar.length] = cls[i];
		}
	}
	el.className = ar.join(" ");
};

Calendar.addClass = function(el, className) {
	Calendar.removeClass(el, className);
	el.className += " " + className;
};

// FIXME: the following 2 functions totally suck, are useless and should be
replaced immediately.
Calendar.getElement = function(ev) {
	var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget;
	while (f.nodeType != 1 || /^div$/i.test(f.tagName))
		f = f.parentNode;
	return f;
};

Calendar.getTargetElement = function(ev) {
	var f = Calendar.is_ie ? window.event.srcElement : ev.target;
	while (f.nodeType != 1)
		f = f.parentNode;
	return f;
};

Calendar.stopEvent = function(ev) {
	ev || (ev = window.event);
	if (Calendar.is_ie) {
		ev.cancelBubble = true;
		ev.returnValue = false;
	} else {
		ev.preventDefault();
		ev.stopPropagation();
	}
	return false;
};

Calendar.addEvent = function(el, evname, func) {
	if (el.attachEvent) { // IE
		el.attachEvent("on" + evname, func);
	} else if (el.addEventListener) { // Gecko / W3C
		el.addEventListener(evname, func, true);
	} else {
		el["on" + evname] = func;
	}
};

Calendar.removeEvent = function(el, evname, func) {
	if (el.detachEvent) { // IE
		el.detachEvent("on" + evname, func);
	} else if (el.removeEventListener) { // Gecko / W3C
		el.removeEventListener(evname, func, true);
	} else {
		el["on" + evname] = null;
	}
};

Calendar.createElement = function(type, parent) {
	var el = null;
	if (document.createElementNS) {
		// use the XHTML namespace; IE won't normally get here unless
		// _they_ "fix" the DOM2 implementation.
		el = document.createElementNS("http://www.w3.org/1999/xhtml",
type);
	} else {
		el = document.createElement(type);
	}
	if (typeof parent != "undefined") {
		parent.appendChild(el);
	}
	return el;
};

// END: UTILITY FUNCTIONS

// BEGIN: CALENDAR STATIC FUNCTIONS

/** Internal -- adds a set of events to make some element behave like a
button. */
Calendar._add_evs = function(el) {
	with (Calendar) {
		addEvent(el, "mouseover", dayMouseOver);
		addEvent(el, "mousedown", dayMouseDown);
		addEvent(el, "mouseout", dayMouseOut);
		if (is_ie) {
			addEvent(el, "dblclick", dayMouseDblClick);
			el.setAttribute("unselectable", true);
		}
	}
};

Calendar.findMonth = function(el) {
	if (typeof el.month != "undefined") {
		return el;
	} else if (typeof el.parentNode.month != "undefined") {
		return el.parentNode;
	}
	return null;
};

Calendar.findYear = function(el) {
	if (typeof el.year != "undefined") {
		return el;
	} else if (typeof el.parentNode.year != "undefined") {
		return el.parentNode;
	}
	return null;
};

Calendar.showMonthsCombo = function () {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	var cal = cal;
	var cd = cal.activeDiv;
	var mc = cal.monthsCombo;
	if (cal.hilitedMonth) {
		Calendar.removeClass(cal.hilitedMonth, "hilite");
	}
	if (cal.activeMonth) {
		Calendar.removeClass(cal.activeMonth, "active");
	}
	var mon =
cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
	Calendar.addClass(mon, "active");
	cal.activeMonth = mon;
	var s = mc.style;
	s.display = "block";
	if (cd.navtype < 0)
		s.left = cd.offsetLeft + "px";
	else {
		var mcw = mc.offsetWidth;
		if (typeof mcw == "undefined")
			// Konqueror brain-dead techniques
			mcw = 50;
		s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px";
	}
	s.top = (cd.offsetTop + cd.offsetHeight) + "px";
};

Calendar.showYearsCombo = function (fwd) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	var cal = cal;
	var cd = cal.activeDiv;
	var yc = cal.yearsCombo;
	if (cal.hilitedYear) {
		Calendar.removeClass(cal.hilitedYear, "hilite");
	}
	if (cal.activeYear) {
		Calendar.removeClass(cal.activeYear, "active");
	}
	cal.activeYear = null;
	var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
	var yr = yc.firstChild;
	var show = false;
	for (var i = 12; i > 0; --i) {
		if (Y >= cal.minYear && Y <= cal.maxYear) {
			yr.innerHTML = Y;
			yr.year = Y;
			yr.style.display = "block";
			show = true;
		} else {
			yr.style.display = "none";
		}
		yr = yr.nextSibling;
		Y += fwd ? cal.yearStep : -cal.yearStep;
	}
	if (show) {
		var s = yc.style;
		s.display = "block";
		if (cd.navtype < 0)
			s.left = cd.offsetLeft + "px";
		else {
			var ycw = yc.offsetWidth;
			if (typeof ycw == "undefined")
				// Konqueror brain-dead techniques
				ycw = 50;
			s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px";
		}
		s.top = (cd.offsetTop + cd.offsetHeight) + "px";
	}
};

// event handlers

Calendar.tableMouseUp = function(ev) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	if (cal.timeout) {
		clearTimeout(cal.timeout);
	}
	var el = cal.activeDiv;
	if (!el) {
		return false;
	}
	var target = Calendar.getTargetElement(ev);
	ev || (ev = window.event);
	Calendar.removeClass(el, "active");
	if (target == el || target.parentNode == el) {
		Calendar.cellClick(el, ev);
	}
	var mon = Calendar.findMonth(target);
	var date = null;
	if (mon) {
		date = new Date(cal.date);
		if (mon.month != date.getMonth()) {
			date.setMonth(mon.month);
			cal.setDate(date);
			cal.dateClicked = false;
			cal.callHandler();
		}
	} else {
		var year = Calendar.findYear(target);
		if (year) {
			date = new Date(cal.date);
			if (year.year != date.getFullYear()) {
				date.setFullYear(year.year);
				cal.setDate(date);
				cal.dateClicked = false;
				cal.callHandler();
			}
		}
	}
	with (Calendar) {
		removeEvent(document, "mouseup", tableMouseUp);
		removeEvent(document, "mouseover", tableMouseOver);
		removeEvent(document, "mousemove", tableMouseOver);
		cal._hideCombos();
		_C = null;
		return stopEvent(ev);
	}
};

Calendar.tableMouseOver = function (ev) {
	var cal = Calendar._C;
	if (!cal) {
		return;
	}
	var el = cal.activeDiv;
	var target = Calendar.getTargetElement(ev);
	if (target == el || target.parentNode == el) {
		Calendar.addClass(el, "hilite active");
		Calendar.addClass(el.parentNode, "rowhilite");
	} else {
		if (typeof el.navtype == "undefined" || (el.navtype != 50
&& (el.navtype == 0 || Math.abs(el.navtype) > 2)))
			Calendar.removeClass(el, "active");
		Calendar.removeClass(el, "hilite");
		Calendar.removeClass(el.parentNode, "rowhilite");
	}
	ev || (ev = window.event);
	if (el.navtype == 50 && target != el) {
		var pos = Calendar.getAbsolutePos(el);
		var w = el.offsetWidth;
		var x = ev.clientX;
		var dx;
		var decrease = true;
		if (x > pos.x + w) {
			dx = x - pos.x - w;
			decrease = false;
		} else
			dx = pos.x - x;

		if (dx < 0) dx = 0;
		var range = el._range;
		var current = el._current;
		var count = Math.floor(dx / 10) % range.length;
		for (var i = range.length; --i >= 0;)
			if (range[i] == current)
				break;
		while (count-- > 0)
			if (decrease) {
				if (--i < 0)
					i = range.length - 1;
			} else if ( ++i >= range.length )
				i = 0;
		var newval = range[i];
		el.innerHTML = newval;

		cal.onUpdateTime();
	}
	var mon = Calendar.findMonth(target);
	if (mon) {
		if (mon.month != cal.date.getMonth()) {
			if (cal.hilitedMonth) {
				Calendar.removeClass(cal.hilitedMonth, "hilite");
			}
			Calendar.addClass(mon, "hilite");
			cal.hilitedMonth = mon;
		} else if (cal.hilitedMonth) {
			Calendar.removeClass(cal.hilitedMonth, "hilite");
		}
	} else {
		if (cal.hilitedMonth) {
			Calendar.removeClass(cal.hilitedMonth, "hilite");
		}
		var year = Calendar.findYear(target);
		if (year) {
			if (year.year != cal.date.getFullYear()) {
				if (cal.hilitedYear) {
					Calendar.removeClass(cal.hilitedYear, "hilite");
				}
				Calendar.addClass(year, "hilite");
				cal.hilitedYear = year;
			} else if (cal.hilitedYear) {
				Calendar.removeClass(cal.hilitedYear, "hilite");
			}
		} else if (cal.hilitedYear) {
			Calendar.removeClass(cal.hilitedYear, "hilite");
		}
	}
	return Calendar.stopEvent(ev);
};

Calendar.tableMouseDown = function (ev) {
	if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
		return Calendar.stopEvent(ev);
	}
};

Calendar.calDragIt = function (ev) {
	var cal = Calendar._C;
	if (!(cal && cal.dragging)) {
		return false;
	}
	var posX;
	var posY;
	if (Calendar.is_ie) {
		posY = window.event.clientY + document.body.scrollTop;
		posX = window.event.clientX + document.body.scrollLeft;
	} else {
		posX = ev.pageX;
		posY = ev.pageY;
	}
	cal.hideShowCovered();
	var st = cal.element.style;
	st.left = (posX - cal.xOffs) + "px";
	st.top = (posY - cal.yOffs) + "px";
	return Calendar.stopEvent(ev);
};

Calendar.calDragEnd = function (ev) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	cal.dragging = false;
	with (Calendar) {
		removeEvent(document, "mousemove", calDragIt);
		removeEvent(document, "mouseup", calDragEnd);
		tableMouseUp(ev);
	}
	cal.hideShowCovered();
};

Calendar.dayMouseDown = function(ev) {
	var el = Calendar.getElement(ev);
	if (el.disabled) {
		return false;
	}
	var cal = el.calendar;
	cal.activeDiv = el;
	Calendar._C = cal;
	if (el.navtype != 300) with (Calendar) {
		if (el.navtype == 50) {
			el._current = el.innerHTML;
			addEvent(document, "mousemove", tableMouseOver);
		} else
			addEvent(document, Calendar.is_ie5 ? "mousemove" :
"mouseover", tableMouseOver);
		addClass(el, "hilite active");
		addEvent(document, "mouseup", tableMouseUp);
	} else if (cal.isPopup) {
		cal._dragStart(ev);
	}
	if (el.navtype == -1 || el.navtype == 1) {
		if (cal.timeout) clearTimeout(cal.timeout);
		cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
	} else if (el.navtype == -2 || el.navtype == 2) {
		if (cal.timeout) clearTimeout(cal.timeout);
		cal.timeout = setTimeout((el.navtype > 0) ?
"Calendar.showYearsCombo(true)" :
"Calendar.showYearsCombo(false)", 250);
	} else {
		cal.timeout = null;
	}
	return Calendar.stopEvent(ev);
};

Calendar.dayMouseDblClick = function(ev) {
	Calendar.cellClick(Calendar.getElement(ev), ev || window.event);
	if (Calendar.is_ie) {
		document.selection.empty();
	}
};

Calendar.dayMouseOver = function(ev) {
	var el = Calendar.getElement(ev);
	if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
		return false;
	}
	if (el.ttip) {
		if (el.ttip.substr(0, 1) == "_") {
			el.ttip = el.caldate.print(el.calendar.ttDateFormat) +
el.ttip.substr(1);
		}
		el.calendar.tooltips.innerHTML = el.ttip;
	}
	if (el.navtype != 300) {
		Calendar.addClass(el, "hilite");
		if (el.caldate) {
			Calendar.addClass(el.parentNode, "rowhilite");
			var cal = el.calendar;
			if (cal && cal.getDateToolTip) {
				var d = el.caldate;
				window.status = d;
				el.title = cal.getDateToolTip(d, d.getFullYear(), d.getMonth(),
d.getDate());
			}
		}
	}
	return Calendar.stopEvent(ev);
};

Calendar.dayMouseOut = function(ev) {
	with (Calendar) {
		var el = getElement(ev);
		if (isRelated(el, ev) || _C || el.disabled)
			return false;
		removeClass(el, "hilite");
		if (el.caldate)
			removeClass(el.parentNode, "rowhilite");
		if (el.calendar)
			el.calendar.tooltips.innerHTML = _TT["SEL_DATE"];
		// return stopEvent(ev);
	}
};

/**
 *  A generic "click" handler :) handles all types of buttons
defined in this
 *  calendar.
 */
Calendar.cellClick = function(el, ev) {
	var cal = el.calendar;
	var closing = false;
	var newdate = false;
	var date = null;
	if (typeof el.navtype == "undefined") {
		if (cal.currentDateEl) {
			Calendar.removeClass(cal.currentDateEl, "selected");
			Calendar.addClass(el, "selected");
			closing = (cal.currentDateEl == el);
			if (!closing) {
				cal.currentDateEl = el;
			}
		}
		cal.date.setDateOnly(el.caldate);
		date = cal.date;
		var other_month = !(cal.dateClicked = !el.otherMonth);
		if (!other_month && !cal.currentDateEl && cal.multiple)
			cal._toggleMultipleDate(new Date(date));
		else
			newdate = !el.disabled;
		// a date was clicked
		if (other_month)
			cal._init(cal.firstDayOfWeek, date);
	} else {
		if (el.navtype == 200) {
			Calendar.removeClass(el, "hilite");
			cal.callCloseHandler();
			return;
		}
		date = new Date(cal.date);
		if (el.navtype == 0)
			date.setDateOnly(new Date()); // TODAY
		// unless "today" was clicked, we assume no date was clicked so
		// the selected handler will know not to close the calenar when
		// in single-click mode.
		// cal.dateClicked = (el.navtype == 0);
		cal.dateClicked = false;
		var year = date.getFullYear();
		var mon = date.getMonth();
		function setMonth(m) {
			var day = date.getDate();
			var max = date.getMonthDays(m);
			if (day > max) {
				date.setDate(max);
			}
			date.setMonth(m);
		};
		switch (el.navtype) {
		    case 400:
			Calendar.removeClass(el, "hilite");
			var text = Calendar._TT["ABOUT"];
			if (typeof text != "undefined") {
				text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] :
"";
			} else {
				// FIXME: this should be removed as soon as lang files get updated!
				text = "Help and about box text is not translated into this
language.\n" +
					"If you know this language and you feel generous please
update\n" +
					"the corresponding file in \"lang\" subdir to match
calendar-en.js\n" +
					"and send it back to <mihai_bazon@yahoo.com> to get it into
the distribution  ;-)\n\n" +
					"Thank you!\n" +
					"http://dynarch.com/mishoo/calendar.epl\n";
			}
			alert(text);
			return;
		    case -2:
			if (year > cal.minYear) {
				date.setFullYear(year - 1);
			}
			break;
		    case -1:
			if (mon > 0) {
				setMonth(mon - 1);
			} else if (year-- > cal.minYear) {
				date.setFullYear(year);
				setMonth(11);
			}
			break;
		    case 1:
			if (mon < 11) {
				setMonth(mon + 1);
			} else if (year < cal.maxYear) {
				date.setFullYear(year + 1);
				setMonth(0);
			}
			break;
		    case 2:
			if (year < cal.maxYear) {
				date.setFullYear(year + 1);
			}
			break;
		    case 100:
			cal.setFirstDayOfWeek(el.fdow);
			return;
		    case 50:
			var range = el._range;
			var current = el.innerHTML;
			for (var i = range.length; --i >= 0;)
				if (range[i] == current)
					break;
			if (ev && ev.shiftKey) {
				if (--i < 0)
					i = range.length - 1;
			} else if ( ++i >= range.length )
				i = 0;
			var newval = range[i];
			el.innerHTML = newval;
			cal.onUpdateTime();
			return;
		    case 0:
			// TODAY will bring us here
			if ((typeof cal.getDateStatus == "function") &&
			    cal.getDateStatus(date, date.getFullYear(), date.getMonth(),
date.getDate())) {
				return false;
			}
			break;
		}
		if (!date.equalsTo(cal.date)) {
			cal.setDate(date);
			newdate = true;
		} else if (el.navtype == 0)
			newdate = closing = true;
	}
	if (newdate) {
		ev && cal.callHandler();
	}
	if (closing) {
		Calendar.removeClass(el, "hilite");
		ev && cal.callCloseHandler();
	}
};

// END: CALENDAR STATIC FUNCTIONS

// BEGIN: CALENDAR OBJECT FUNCTIONS

/**
 *  This function creates the calendar inside the given parent.  If _par is
 *  null than it creates a popup calendar inside the BODY element.  If _par
is
 *  an element, be it BODY, then it creates a non-popup calendar (still
 *  hidden).  Some properties need to be set before calling this function.
 */
Calendar.prototype.create = function (_par) {
	var parent = null;
	if (! _par) {
		// default parent is the document body, in which case we create
		// a popup calendar.
		parent = document.getElementsByTagName("body")[0];
		this.isPopup = true;
	} else {
		parent = _par;
		this.isPopup = false;
	}
	this.date = this.dateStr ? new Date(this.dateStr) : new Date();

	var table = Calendar.createElement("table");
	this.table = table;
	table.cellSpacing = 0;
	table.cellPadding = 0;
	table.calendar = this;
	Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);

	var div = Calendar.createElement("div");
	this.element = div;
	div.className = "calendar";
	if (this.isPopup) {
		div.style.position = "absolute";
		div.style.display = "none";
	}
	div.appendChild(table);

	var thead = Calendar.createElement("thead", table);
	var cell = null;
	var row = null;

	var cal = this;
	var hh = function (text, cs, navtype) {
		cell = Calendar.createElement("td", row);
		cell.colSpan = cs;
		cell.className = "button";
		if (navtype != 0 && Math.abs(navtype) <= 2)
			cell.className += " nav";
		Calendar._add_evs(cell);
		cell.calendar = cal;
		cell.navtype = navtype;
		cell.innerHTML = "<div unselectable='on'>" +
text + "</div>";
		return cell;
	};

	row = Calendar.createElement("tr", thead);
	var title_length = 6;
	(this.isPopup) && --title_length;
	(this.weekNumbers) && ++title_length;

	hh("?", 1, 400).ttip = Calendar._TT["INFO"];
	this.title = hh("", title_length, 300);
	this.title.className = "title";
	if (this.isPopup) {
		this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
		this.title.style.cursor = "move";
		hh("&#x00d7;", 1, 200).ttip =
Calendar._TT["CLOSE"];
	}

	row = Calendar.createElement("tr", thead);
	row.className = "headrow";

	this._nav_py = hh("&#x00ab;", 1, -2);
	this._nav_py.ttip = Calendar._TT["PREV_YEAR"];

	this._nav_pm = hh("&#x2039;", 1, -1);
	this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];

	this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 :
3, 0);
	this._nav_now.ttip = Calendar._TT["GO_TODAY"];

	this._nav_nm = hh("&#x203a;", 1, 1);
	this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];

	this._nav_ny = hh("&#x00bb;", 1, 2);
	this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];

	// day names
	row = Calendar.createElement("tr", thead);
	row.className = "daynames";
	if (this.weekNumbers) {
		cell = Calendar.createElement("td", row);
		cell.className = "name wn";
		cell.innerHTML = Calendar._TT["WK"];
	}
	for (var i = 7; i > 0; --i) {
		cell = Calendar.createElement("td", row);
		if (!i) {
			cell.navtype = 100;
			cell.calendar = this;
			Calendar._add_evs(cell);
		}
	}
	this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling :
row.firstChild;
	this._displayWeekdays();

	var tbody = Calendar.createElement("tbody", table);
	this.tbody = tbody;

	for (i = 6; i > 0; --i) {
		row = Calendar.createElement("tr", tbody);
		if (this.weekNumbers) {
			cell = Calendar.createElement("td", row);
		}
		for (var j = 7; j > 0; --j) {
			cell = Calendar.createElement("td", row);
			cell.calendar = this;
			Calendar._add_evs(cell);
		}
	}

	if (this.showsTime) {
		row = Calendar.createElement("tr", tbody);
		row.className = "time";

		cell = Calendar.createElement("td", row);
		cell.className = "time";
		cell.colSpan = 2;
		cell.innerHTML = Calendar._TT["TIME"] ||
"&#160;";

		cell = Calendar.createElement("td", row);
		cell.className = "time";
		cell.colSpan = this.weekNumbers ? 4 : 3;

		(function(){
			function makeTimePart(className, init, range_start, range_end) {
				var part = Calendar.createElement("span", cell);
				part.className = className;
				part.innerHTML = init;
				part.calendar = cal;
				part.ttip = Calendar._TT["TIME_PART"];
				part.navtype = 50;
				part._range = [];
				if (typeof range_start != "number")
					part._range = range_start;
				else {
					for (var i = range_start; i <= range_end; ++i) {
						var txt;
						if (i < 10 && range_end >= 10) txt = '0' + i;
						else txt = '' + i;
						part._range[part._range.length] = txt;
					}
				}
				Calendar._add_evs(part);
				return part;
			};
			var hrs = cal.date.getHours();
			var mins = cal.date.getMinutes();
			var t12 = !cal.time24;
			var pm = (hrs > 12);
			if (t12 && pm) hrs -= 12;
			var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
			var span = Calendar.createElement("span", cell);
			span.innerHTML = ":";
			span.className = "colon";
			var M = makeTimePart("minute", mins, 0, 59);
			var AP = null;
			cell = Calendar.createElement("td", row);
			cell.className = "time";
			cell.colSpan = 2;
			if (t12)
				AP = makeTimePart("ampm", pm ? "pm" :
"am", ["am", "pm"]);
			else
				cell.innerHTML = "&#160;";

			cal.onSetTime = function() {
				var pm, hrs = this.date.getHours(),
					mins = this.date.getMinutes();
				if (t12) {
					pm = (hrs >= 12);
					if (pm) hrs -= 12;
					if (hrs == 0) hrs = 12;
					AP.innerHTML = pm ? "pm" : "am";
				}
				H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
				M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
			};

			cal.onUpdateTime = function() {
				var date = this.date;
				var h = parseInt(H.innerHTML, 10);
				if (t12) {
					if (/pm/i.test(AP.innerHTML) && h < 12)
						h += 12;
					else if (/am/i.test(AP.innerHTML) && h == 12)
						h = 0;
				}
				var d = date.getDate();
				var m = date.getMonth();
				var y = date.getFullYear();
				date.setHours(h);
				date.setMinutes(parseInt(M.innerHTML, 10));
				date.setFullYear(y);
				date.setMonth(m);
				date.setDate(d);
				this.dateClicked = false;
				this.callHandler();
			};
		})();
	} else {
		this.onSetTime = this.onUpdateTime = function() {};
	}

	var tfoot = Calendar.createElement("tfoot", table);

	row = Calendar.createElement("tr", tfoot);
	row.className = "footrow";

	cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7,
300);
	cell.className = "ttip";
	if (this.isPopup) {
		cell.ttip = Calendar._TT["DRAG_TO_MOVE"];
		cell.style.cursor = "move";
	}
	this.tooltips = cell;

	div = Calendar.createElement("div", this.element);
	this.monthsCombo = div;
	div.className = "combo";
	for (i = 0; i < Calendar._MN.length; ++i) {
		var mn = Calendar.createElement("div");
		mn.className = Calendar.is_ie ? "label-IEfix" :
"label";
		mn.month = i;
		mn.innerHTML = Calendar._SMN[i];
		div.appendChild(mn);
	}

	div = Calendar.createElement("div", this.element);
	this.yearsCombo = div;
	div.className = "combo";
	for (i = 12; i > 0; --i) {
		var yr = Calendar.createElement("div");
		yr.className = Calendar.is_ie ? "label-IEfix" :
"label";
		div.appendChild(yr);
	}

	this._init(this.firstDayOfWeek, this.date);
	parent.appendChild(this.element);
};

/** keyboard navigation, only for popup calendars */
Calendar._keyEvent = function(ev) {
	var cal = window._dynarch_popupCalendar;
	if (!cal || cal.multiple)
		return false;
	(Calendar.is_ie) && (ev = window.event);
	var act = (Calendar.is_ie || ev.type == "keypress"),
		K = ev.keyCode;
	if (ev.ctrlKey) {
		switch (K) {
		    case 37: // KEY left
			act && Calendar.cellClick(cal._nav_pm);
			break;
		    case 38: // KEY up
			act && Calendar.cellClick(cal._nav_py);
			break;
		    case 39: // KEY right
			act && Calendar.cellClick(cal._nav_nm);
			break;
		    case 40: // KEY down
			act && Calendar.cellClick(cal._nav_ny);
			break;
		    default:
			return false;
		}
	} else switch (K) {
	    case 32: // KEY space (now)
		Calendar.cellClick(cal._nav_now);
		break;
	    case 27: // KEY esc
		act && cal.callCloseHandler();
		break;
	    case 37: // KEY left
	    case 38: // KEY up
	    case 39: // KEY right
	    case 40: // KEY down
		if (act) {
			var prev, x, y, ne, el, step;
			prev = K == 37 || K == 38;
			step = (K == 37 || K == 39) ? 1 : 7;
			function setVars() {
				el = cal.currentDateEl;
				var p = el.pos;
				x = p & 15;
				y = p >> 4;
				ne = cal.ar_days[y][x];
			};setVars();
			function prevMonth() {
				var date = new Date(cal.date);
				date.setDate(date.getDate() - step);
				cal.setDate(date);
			};
			function nextMonth() {
				var date = new Date(cal.date);
				date.setDate(date.getDate() + step);
				cal.setDate(date);
			};
			while (1) {
				switch (K) {
				    case 37: // KEY left
					if (--x >= 0)
						ne = cal.ar_days[y][x];
					else {
						x = 6;
						K = 38;
						continue;
					}
					break;
				    case 38: // KEY up
					if (--y >= 0)
						ne = cal.ar_days[y][x];
					else {
						prevMonth();
						setVars();
					}
					break;
				    case 39: // KEY right
					if (++x < 7)
						ne = cal.ar_days[y][x];
					else {
						x = 0;
						K = 40;
						continue;
					}
					break;
				    case 40: // KEY down
					if (++y < cal.ar_days.length)
						ne = cal.ar_days[y][x];
					else {
						nextMonth();
						setVars();
					}
					break;
				}
				break;
			}
			if (ne) {
				if (!ne.disabled)
					Calendar.cellClick(ne);
				else if (prev)
					prevMonth();
				else
					nextMonth();
			}
		}
		break;
	    case 13: // KEY enter
		if (act)
			Calendar.cellClick(cal.currentDateEl, ev);
		break;
	    default:
		return false;
	}
	return Calendar.stopEvent(ev);
};

/**
 *  (RE)Initializes the calendar to the given date and firstDayOfWeek
 */
Calendar.prototype._init = function (firstDayOfWeek, date) {
	var today = new Date(),
		TY = today.getFullYear(),
		TM = today.getMonth(),
		TD = today.getDate();
	this.table.style.visibility = "hidden";
	var year = date.getFullYear();
	if (year < this.minYear) {
		year = this.minYear;
		date.setFullYear(year);
	} else if (year > this.maxYear) {
		year = this.maxYear;
		date.setFullYear(year);
	}
	this.firstDayOfWeek = firstDayOfWeek;
	this.date = new Date(date);
	var month = date.getMonth();
	var mday = date.getDate();
	var no_days = date.getMonthDays();

	// calendar voodoo for computing the first day that would actually be
	// displayed in the calendar, even if it's from the previous month.
	// WARNING: this is magic. ;-)
	date.setDate(1);
	var day1 = (date.getDay() - this.firstDayOfWeek) % 7;
	if (day1 < 0)
		day1 += 7;
	date.setDate(-day1);
	date.setDate(date.getDate() + 1);

	var row = this.tbody.firstChild;
	var MN = Calendar._SMN[month];
	var ar_days = this.ar_days = new Array();
	var weekend = Calendar._TT["WEEKEND"];
	var dates = this.multiple ? (this.datesCells = {}) : null;
	for (var i = 0; i < 6; ++i, row = row.nextSibling) {
		var cell = row.firstChild;
		if (this.weekNumbers) {
			cell.className = "day wn";
			cell.innerHTML = date.getWeekNumber();
			cell = cell.nextSibling;
		}
		row.className = "daysrow";
		var hasdays = false, iday, dpos = ar_days[i] = [];
		for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday
+ 1)) {
			iday = date.getDate();
			var wday = date.getDay();
			cell.className = "day";
			cell.pos = i << 4 | j;
			dpos[j] = cell;
			var current_month = (date.getMonth() == month);
			if (!current_month) {
				if (this.showsOtherMonths) {
					cell.className += " othermonth";
					cell.otherMonth = true;
				} else {
					cell.className = "emptycell";
					cell.innerHTML = "&#160;";
					cell.disabled = true;
					continue;
				}
			} else {
				cell.otherMonth = false;
				hasdays = true;
			}
			cell.disabled = false;
			cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday;
			if (dates)
				dates[date.print("%Y%m%d")] = cell;
			if (this.getDateStatus) {
				var status = this.getDateStatus(date, year, month, iday);
				if (status === true) {
					cell.className += " disabled";
					cell.disabled = true;
				} else {
					if (/disabled/i.test(status))
						cell.disabled = true;
					cell.className += " " + status;
				}
			}
			if (!cell.disabled) {
				cell.caldate = new Date(date);
				cell.ttip = "_";
				if (!this.multiple && current_month
				    && iday == mday && this.hiliteToday) {
					cell.className += " selected";
					this.currentDateEl = cell;
				}
				if (date.getFullYear() == TY &&
				    date.getMonth() == TM &&
				    iday == TD) {
					cell.className += " today";
					cell.ttip += Calendar._TT["PART_TODAY"];
				}
				if (weekend.indexOf(wday.toString()) != -1)
					cell.className += cell.otherMonth ? " oweekend" : "
weekend";
			}
		}
		if (!(hasdays || this.showsOtherMonths))
			row.className = "emptyrow";
	}
	this.title.innerHTML = Calendar._MN[month] + ", " + year;
	this.onSetTime();
	this.table.style.visibility = "visible";
	this._initMultipleDates();
	// PROFILE
	// this.tooltips.innerHTML = "Generated in " + ((new Date()) -
today) + " ms";
};

Calendar.prototype._initMultipleDates = function() {
	if (this.multiple) {
		for (var i in this.multiple) {
			var cell = this.datesCells[i];
			var d = this.multiple[i];
			if (!d)
				continue;
			if (cell)
				cell.className += " selected";
		}
	}
};

Calendar.prototype._toggleMultipleDate = function(date) {
	if (this.multiple) {
		var ds = date.print("%Y%m%d");
		var cell = this.datesCells[ds];
		if (cell) {
			var d = this.multiple[ds];
			if (!d) {
				Calendar.addClass(cell, "selected");
				this.multiple[ds] = date;
			} else {
				Calendar.removeClass(cell, "selected");
				delete this.multiple[ds];
			}
		}
	}
};

Calendar.prototype.setDateToolTipHandler = function (unaryFunction) {
	this.getDateToolTip = unaryFunction;
};

/**
 *  Calls _init function above for going to a certain date (but only if the
 *  date is different than the currently selected one).
 */
Calendar.prototype.setDate = function (date) {
	if (!date.equalsTo(this.date)) {
		this._init(this.firstDayOfWeek, date);
	}
};

/**
 *  Refreshes the calendar.  Useful if the "disabledHandler"
function is
 *  dynamic, meaning that the list of disabled date can change at runtime.
 *  Just * call this function if you think that the list of disabled dates
 *  should * change.
 */
Calendar.prototype.refresh = function () {
	this._init(this.firstDayOfWeek, this.date);
};

/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1
for Monday, etc.). */
Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) {
	this._init(firstDayOfWeek, this.date);
	this._displayWeekdays();
};

/**
 *  Allows customization of what dates are enabled.  The
"unaryFunction"
 *  parameter must be a function object that receives the date (as a JS
Date
 *  object) and returns a boolean value.  If the returned value is true
then
 *  the passed date will be marked as disabled.
 */
Calendar.prototype.setDateStatusHandler =
Calendar.prototype.setDisabledHandler = function (unaryFunction) {
	this.getDateStatus = unaryFunction;
};

/** Customization of allowed year range for the calendar. */
Calendar.prototype.setRange = function (a, z) {
	this.minYear = a;
	this.maxYear = z;
};

/** Calls the first user handler (selectedHandler). */
Calendar.prototype.callHandler = function () {
	if (this.onSelected) {
		this.onSelected(this, this.date.print(this.dateFormat));
	}
};

/** Calls the second user handler (closeHandler). */
Calendar.prototype.callCloseHandler = function () {
	if (this.onClose) {
		this.onClose(this);
	}
	this.hideShowCovered();
};

/** Removes the calendar object from the DOM tree and destroys it. */
Calendar.prototype.destroy = function () {
	var el = this.element.parentNode;
	el.removeChild(this.element);
	Calendar._C = null;
	window._dynarch_popupCalendar = null;
};

/**
 *  Moves the calendar element to a different section in the DOM tree
(changes
 *  its parent).
 */
Calendar.prototype.reparent = function (new_parent) {
	var el = this.element;
	el.parentNode.removeChild(el);
	new_parent.appendChild(el);
};

// This gets called when the user presses a mouse button anywhere in the
// document, if the calendar is shown.  If the click was outside the open
// calendar this function closes it.
Calendar._checkCalendar = function(ev) {
	var calendar = window._dynarch_popupCalendar;
	if (!calendar) {
		return false;
	}
	var el = Calendar.is_ie ? Calendar.getElement(ev) :
Calendar.getTargetElement(ev);
	for (; el != null && el != calendar.element; el = el.parentNode);
	if (el == null) {
		// calls closeHandler which should hide the calendar.
		window._dynarch_popupCalendar.callCloseHandler();
		return Calendar.stopEvent(ev);
	}
};

/** Shows the calendar. */
Calendar.prototype.show = function () {
	var rows = this.table.getElementsByTagName("tr");
	for (var i = rows.length; i > 0;) {
		var row = rows[--i];
		Calendar.removeClass(row, "rowhilite");
		var cells = row.getElementsByTagName("td");
		for (var j = cells.length; j > 0;) {
			var cell = cells[--j];
			Calendar.removeClass(cell, "hilite");
			Calendar.removeClass(cell, "active");
		}
	}
	this.element.style.display = "block";
	this.hidden = false;
	if (this.isPopup) {
		window._dynarch_popupCalendar = this;
		Calendar.addEvent(document, "keydown", Calendar._keyEvent);
		Calendar.addEvent(document, "keypress", Calendar._keyEvent);
		Calendar.addEvent(document, "mousedown",
Calendar._checkCalendar);
	}
	this.hideShowCovered();
};

/**
 *  Hides the calendar.  Also removes any "hilite" from the class
of any TD
 *  element.
 */
Calendar.prototype.hide = function () {
	if (this.isPopup) {
		Calendar.removeEvent(document, "keydown", Calendar._keyEvent);
		Calendar.removeEvent(document, "keypress", Calendar._keyEvent);
		Calendar.removeEvent(document, "mousedown",
Calendar._checkCalendar);
	}
	this.element.style.display = "none";
	this.hidden = true;
	this.hideShowCovered();
};

/**
 *  Shows the calendar at a given absolute position (beware that, depending
on
 *  the calendar element style -- position property -- this might be
relative
 *  to the parent's containing rectangle).
 */
Calendar.prototype.showAt = function (x, y) {
	var s = this.element.style;
	s.left = x + "px";
	s.top = y + "px";
	this.show();
};

/** Shows the calendar near a given element. */
Calendar.prototype.showAtElement = function (el, opts) {
	var self = this;
	var p = Calendar.getAbsolutePos(el);
	if (!opts || typeof opts != "string") {
		this.showAt(p.x, p.y + el.offsetHeight);
		return true;
	}
	function fixPosition(box) {
		if (box.x < 0)
			box.x = 0;
		if (box.y < 0)
			box.y = 0;
		var cp = document.createElement("div");
		var s = cp.style;
		s.position = "absolute";
		s.right = s.bottom = s.width = s.height = "0px";
		document.body.appendChild(cp);
		var br = Calendar.getAbsolutePos(cp);
		document.body.removeChild(cp);
		if (Calendar.is_ie) {
			br.y += document.body.scrollTop;
			br.x += document.body.scrollLeft;
			br.y += (document.documentElement &&
document.documentElement.scrollTop) || document.body.scrollTop;
			br.x += (document.documentElement &&
document.documentElement.scrollLeft) || document.body.scrollLeft;
		} else {
			br.y += window.scrollY;
			br.x += window.scrollX;
		}
		var tmp = box.x + box.width - br.x;
		if (tmp > 0) box.x -= tmp;
		tmp = box.y + box.height - br.y;
		if (tmp > 0) box.y -= tmp;
	};
	this.element.style.display = "block";
	Calendar.continuation_for_the_khtml_browser = function() {
		var w = self.element.offsetWidth;
		var h = self.element.offsetHeight;
		self.element.style.display = "none";
		var valign = opts.substr(0, 1);
		var halign = "l";
		if (opts.length > 1) {
			halign = opts.substr(1, 1);
		}
		// vertical alignment
		switch (valign) {
		    case "T": p.y -= h; break;
		    case "B": p.y += el.offsetHeight; break;
		    case "C": p.y += (el.offsetHeight - h) / 2; break;
		    case "t": p.y += el.offsetHeight - h; break;
		    case "b": break; // already there
		}
		// horizontal alignment
		switch (halign) {
		    case "L": p.x -= w; break;
		    case "R": p.x += el.offsetWidth; break;
		    case "C": p.x += (el.offsetWidth - w) / 2; break;
		    case "l": p.x += el.offsetWidth - w; break;
		    case "r": break; // already there
		}
		p.width = w;
		p.height = h + 40;
		self.monthsCombo.style.display = "none";
		fixPosition(p);
		self.showAt(p.x, p.y);
	};
	if (Calendar.is_khtml)
		setTimeout("Calendar.continuation_for_the_khtml_browser()",
10);
	else
		Calendar.continuation_for_the_khtml_browser();
};

/** Customizes the date format. */
Calendar.prototype.setDateFormat = function (str) {
	this.dateFormat = str;
};

/** Customizes the tooltip date format. */
Calendar.prototype.setTtDateFormat = function (str) {
	this.ttDateFormat = str;
};

/**
 *  Tries to identify the date represented in a string.  If successful it
also
 *  calls this.setDate which moves the calendar to the given date.
 */
Calendar.prototype.parseDate = function(str, fmt) {
	if (!fmt)
		fmt = this.dateFormat;
	this.setDate(Date.parseDate(str, fmt));
};

Calendar.prototype.hideShowCovered = function () {
	if (!Calendar.is_ie && !Calendar.is_opera)
		return;
	function getVisib(obj){
		var value = obj.style.visibility;
		if (!value) {
			if (document.defaultView && typeof
(document.defaultView.getComputedStyle) == "function") { //
Gecko, W3C
				if (!Calendar.is_khtml)
					value = document.defaultView.
						getComputedStyle(obj,
"").getPropertyValue("visibility");
				else
					value = '';
			} else if (obj.currentStyle) { // IE
				value = obj.currentStyle.visibility;
			} else
				value = '';
		}
		return value;
	};

	var tags = new Array("applet", "iframe",
"select");
	var el = this.element;

	var p = Calendar.getAbsolutePos(el);
	var EX1 = p.x;
	var EX2 = el.offsetWidth + EX1;
	var EY1 = p.y;
	var EY2 = el.offsetHeight + EY1;

	for (var k = tags.length; k > 0; ) {
		var ar = document.getElementsByTagName(tags[--k]);
		var cc = null;

		for (var i = ar.length; i > 0;) {
			cc = ar[--i];

			p = Calendar.getAbsolutePos(cc);
			var CX1 = p.x;
			var CX2 = cc.offsetWidth + CX1;
			var CY1 = p.y;
			var CY2 = cc.offsetHeight + CY1;

			if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) ||
(CY2 < EY1)) {
				if (!cc.__msh_save_visibility) {
					cc.__msh_save_visibility = getVisib(cc);
				}
				cc.style.visibility = cc.__msh_save_visibility;
			} else {
				if (!cc.__msh_save_visibility) {
					cc.__msh_save_visibility = getVisib(cc);
				}
				cc.style.visibility = "hidden";
			}
		}
	}
};

/** Internal function; it displays the bar with the names of the weekday.
*/
Calendar.prototype._displayWeekdays = function () {
	var fdow = this.firstDayOfWeek;
	var cell = this.firstdayname;
	var weekend = Calendar._TT["WEEKEND"];
	for (var i = 0; i < 7; ++i) {
		cell.className = "day name";
		var realday = (i + fdow) % 7;
		if (i) {
			cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s",
Calendar._DN[realday]);
			cell.navtype = 100;
			cell.calendar = this;
			cell.fdow = realday;
			Calendar._add_evs(cell);
		}
		if (weekend.indexOf(realday.toString()) != -1) {
			Calendar.addClass(cell, "weekend");
		}
		cell.innerHTML = Calendar._SDN[(i + fdow) % 7];
		cell = cell.nextSibling;
	}
};

/** Internal function.  Hides all combo boxes that might be displayed. */
Calendar.prototype._hideCombos = function () {
	this.monthsCombo.style.display = "none";
	this.yearsCombo.style.display = "none";
};

/** Internal function.  Starts dragging the element. */
Calendar.prototype._dragStart = function (ev) {
	if (this.dragging) {
		return;
	}
	this.dragging = true;
	var posX;
	var posY;
	if (Calendar.is_ie) {
		posY = window.event.clientY + document.body.scrollTop;
		posX = window.event.clientX + document.body.scrollLeft;
	} else {
		posY = ev.clientY + window.scrollY;
		posX = ev.clientX + window.scrollX;
	}
	var st = this.element.style;
	this.xOffs = posX - parseInt(st.left);
	this.yOffs = posY - parseInt(st.top);
	with (Calendar) {
		addEvent(document, "mousemove", calDragIt);
		addEvent(document, "mouseup", calDragEnd);
	}
};

// BEGIN: DATE OBJECT PATCHES

/** Adds the number of days array to the Date object. */
Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

/** Constants used for time computations */
Date.SECOND = 1000 /* milliseconds */;
Date.MINUTE = 60 * Date.SECOND;
Date.HOUR   = 60 * Date.MINUTE;
Date.DAY    = 24 * Date.HOUR;
Date.WEEK   =  7 * Date.DAY;

Date.parseDate = function(str, fmt) {
	var today = new Date();
	var y = 0;
	var m = -1;
	var d = 0;
	var a = str.split(/\W+/);
	var b = fmt.match(/%./g);
	var i = 0, j = 0;
	var hr = 0;
	var min = 0;
	for (i = 0; i < a.length; ++i) {
		if (!a[i])
			continue;
		switch (b[i]) {
		    case "%d":
		    case "%e":
			d = parseInt(a[i], 10);
			break;

		    case "%m":
			m = parseInt(a[i], 10) - 1;
			break;

		    case "%Y":
		    case "%y":
			y = parseInt(a[i], 10);
			(y < 100) && (y += (y > 29) ? 1900 : 2000);
			break;

		    case "%b":
		    case "%B":
			for (j = 0; j < 12; ++j) {
				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() ==
a[i].toLowerCase()) { m = j; break; }
			}
			break;

		    case "%H":
		    case "%I":
		    case "%k":
		    case "%l":
			hr = parseInt(a[i], 10);
			break;

		    case "%P":
		    case "%p":
			if (/pm/i.test(a[i]) && hr < 12)
				hr += 12;
			else if (/am/i.test(a[i]) && hr >= 12)
				hr -= 12;
			break;

		    case "%M":
			min = parseInt(a[i], 10);
			break;
		}
	}
	if (isNaN(y)) y = today.getFullYear();
	if (isNaN(m)) m = today.getMonth();
	if (isNaN(d)) d = today.getDate();
	if (isNaN(hr)) hr = today.getHours();
	if (isNaN(min)) min = today.getMinutes();
	if (y != 0 && m != -1 && d != 0)
		return new Date(y, m, d, hr, min, 0);
	y = 0; m = -1; d = 0;
	for (i = 0; i < a.length; ++i) {
		if (a[i].search(/[a-zA-Z]+/) != -1) {
			var t = -1;
			for (j = 0; j < 12; ++j) {
				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() ==
a[i].toLowerCase()) { t = j; break; }
			}
			if (t != -1) {
				if (m != -1) {
					d = m+1;
				}
				m = t;
			}
		} else if (parseInt(a[i], 10) <= 12 && m == -1) {
			m = a[i]-1;
		} else if (parseInt(a[i], 10) > 31 && y == 0) {
			y = parseInt(a[i], 10);
			(y < 100) && (y += (y > 29) ? 1900 : 2000);
		} else if (d == 0) {
			d = a[i];
		}
	}
	if (y == 0)
		y = today.getFullYear();
	if (m != -1 && d != 0)
		return new Date(y, m, d, hr, min, 0);
	return today;
};

/** Returns the number of days in the current month */
Date.prototype.getMonthDays = function(month) {
	var year = this.getFullYear();
	if (typeof month == "undefined") {
		month = this.getMonth();
	}
	if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400))))
&& month == 1) {
		return 29;
	} else {
		return Date._MD[month];
	}
};

/** Returns the number of day in the year. */
Date.prototype.getDayOfYear = function() {
	var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0,
0, 0);
	var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
	var time = now - then;
	return Math.floor(time / Date.DAY);
};

/** Returns the number of the week in year, as defined in ISO 8601. */
Date.prototype.getWeekNumber = function() {
	var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0,
0, 0);
	var DoW = d.getDay();
	d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
	var ms = d.valueOf(); // GMT
	d.setMonth(0);
	d.setDate(4); // Thu in Week 1
	return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
};

/** Checks date and time equality */
Date.prototype.equalsTo = function(date) {
	return ((this.getFullYear() == date.getFullYear()) &&
		(this.getMonth() == date.getMonth()) &&
		(this.getDate() == date.getDate()) &&
		(this.getHours() == date.getHours()) &&
		(this.getMinutes() == date.getMinutes()));
};

/** Set only the year, month, date parts (keep existing time) */
Date.prototype.setDateOnly = function(date) {
	var tmp = new Date(date);
	this.setDate(1);
	this.setFullYear(tmp.getFullYear());
	this.setMonth(tmp.getMonth());
	this.setDate(tmp.getDate());
};

/** Prints the date in a string according to the given format. */
Date.prototype.print = function (str) {
	var m = this.getMonth();
	var d = this.getDate();
	var y = this.getFullYear();
	var wn = this.getWeekNumber();
	var w = this.getDay();
	var s = {};
	var hr = this.getHours();
	var pm = (hr >= 12);
	var ir = (pm) ? (hr - 12) : hr;
	var dy = this.getDayOfYear();
	if (ir == 0)
		ir = 12;
	var min = this.getMinutes();
	var sec = this.getSeconds();
	s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME:
I18N]
	s["%A"] = Calendar._DN[w]; // full weekday name
	s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME:
I18N]
	s["%B"] = Calendar._MN[m]; // full month name
	// FIXME: %c : preferred date and time representation for the current
locale
	s["%C"] = 1 + Math.floor(y / 100); // the century number
	s["%d"] = (d < 10) ? ("0" + d) : d; // the day of
the month (range 01 to 31)
	s["%e"] = d; // the day of the month (range 1 to 31)
	// FIXME: %D : american date style: %m/%d/%y
	// FIXME: %E, %F, %G, %g, %h (man strftime)
	s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour,
range 00 to 23 (24h format)
	s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour,
range 01 to 12 (12h format)
	s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy)
: ("0" + dy)) : dy; // day of the year (range 001 to 366)
	s["%k"] = hr;		// hour, range 0 to 23 (24h format)
	s["%l"] = ir;		// hour, range 1 to 12 (12h format)
	s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); //
month, range 01 to 12
	s["%M"] = (min < 10) ? ("0" + min) : min; //
minute, range 00 to 59
	s["%n"] = "\n";		// a newline character
	s["%p"] = pm ? "PM" : "AM";
	s["%P"] = pm ? "pm" : "am";
	// FIXME: %r : the time in am/pm notation %I:%M:%S %p
	// FIXME: %R : the time in 24-hour notation %H:%M
	s["%s"] = Math.floor(this.getTime() / 1000);
	s["%S"] = (sec < 10) ? ("0" + sec) : sec; //
seconds, range 00 to 59
	s["%t"] = "\t";		// a tab character
	// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
	s["%U"] = s["%W"] = s["%V"] = (wn < 10) ?
("0" + wn) : wn;
	s["%u"] = w + 1;	// the day of the week (range 1 to 7, 1 = MON)
	s["%w"] = w;		// the day of the week (range 0 to 6, 0 = SUN)
	// FIXME: %x : preferred date representation for the current locale
without the time
	// FIXME: %X : preferred time representation for the current locale
without the date
	s["%y"] = ('' + y).substr(2, 2); // year without the
century (range 00 to 99)
	s["%Y"] = y;		// year with the century
	s["%%"] = "%";		// a literal '%' character

	var re = /%./g;
	if (!Calendar.is_ie5 && !Calendar.is_khtml)
		return str.replace(re, function (par) { return s[par] || par; });

	var a = str.match(re);
	for (var i = 0; i < a.length; i++) {
		var tmp = s[a[i]];
		if (tmp) {
			re = new RegExp(a[i], 'g');
			str = str.replace(re, tmp);
		}
	}

	return str;
};

// END: DATE OBJECT PATCHES


// global object that remembers the calendar
window._dynarch_popupCalendar = null;
PKXn�[Q
�vvjs/calendar.jsnu�[���Calendar=function(d,c,f,a){this.activeDiv=null;this.currentDateEl=null;this.getDateStatus=null;this.getDateToolTip=null;this.getDateText=null;this.timeout=null;this.onSelected=f||null;this.onClose=a||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT.DEF_DATE_FORMAT;this.ttDateFormat=Calendar._TT.TT_DATE_FORMAT;this.isPopup=true;this.weekNumbers=true;this.firstDayOfWeek=typeof
d=="number"?d:Calendar._FD;this.showsOtherMonths=false;this.dateStr=c;this.ar_days=null;this.showsTime=false;this.time24=true;this.yearStep=2;this.hiliteToday=true;this.multiple=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(typeof
Calendar._SDN=="undefined"){if(typeof
Calendar._SDN_len=="undefined"){Calendar._SDN_len=3}var b=new
Array();for(var
e=8;e>0;){b[--e]=Calendar._DN[e].substr(0,Calendar._SDN_len)}Calendar._SDN=b;if(typeof
Calendar._SMN_len=="undefined"){Calendar._SMN_len=3}b=new
Array();for(var
e=12;e>0;){b[--e]=Calendar._MN[e].substr(0,Calendar._SMN_len)}Calendar._SMN=b}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar.is_ie5=(Calendar.is_ie&&/msie
5\.0/i.test(navigator.userAgent));Calendar.is_opera=/opera/i.test(navigator.userAgent);Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos=function(e){var
a=0,d=0;var
c=/^div$/i.test(e.tagName);if(c&&e.scrollLeft){a=e.scrollLeft}if(c&&e.scrollTop){d=e.scrollTop}var
f={x:e.offsetLeft-a,y:e.offsetTop-d};if(e.offsetParent){var
b=this.getAbsolutePos(e.offsetParent);f.x+=b.x;f.y+=b.y}return
f};Calendar.isRelated=function(c,a){var d=a.relatedTarget;if(!d){var
b=a.type;if(b=="mouseover"){d=a.fromElement}else{if(b=="mouseout"){d=a.toElement}}}while(d){if(d==c){return
true}d=d.parentNode}return
false};Calendar.removeClass=function(e,d){if(!(e&&e.className)){return}var
a=e.className.split(" ");var b=new Array();for(var
c=a.length;c>0;){if(a[--c]!=d){b[b.length]=a[c]}}e.className=b.join("
")};Calendar.addClass=function(b,a){Calendar.removeClass(b,a);b.className+="
"+a};Calendar.getElement=function(a){var
b=Calendar.is_ie?window.event.srcElement:a.currentTarget;while(b.nodeType!=1||/^div$/i.test(b.tagName)){b=b.parentNode}return
b};Calendar.getTargetElement=function(a){var
b=Calendar.is_ie?window.event.srcElement:a.target;while(b.nodeType!=1){b=b.parentNode}return
b};Calendar.stopEvent=function(a){a||(a=window.event);if(Calendar.is_ie){a.cancelBubble=true;a.returnValue=false}else{a.preventDefault();a.stopPropagation()}return
false};Calendar.addEvent=function(a,c,b){if(a.attachEvent){a.attachEvent("on"+c,b)}else{if(a.addEventListener){a.addEventListener(c,b,true)}else{a["on"+c]=b}}};Calendar.removeEvent=function(a,c,b){if(a.detachEvent){a.detachEvent("on"+c,b)}else{if(a.removeEventListener){a.removeEventListener(c,b,true)}else{a["on"+c]=null}}};Calendar.createElement=function(c,b){var
a=null;if(document.createElementNS){a=document.createElementNS("http://www.w3.org/1999/xhtml",c)}else{a=document.createElement(c)}if(typeof
b!="undefined"){b.appendChild(a)}return
a};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true)}}};Calendar.findMonth=function(a){if(typeof
a.month!="undefined"){return a}else{if(typeof
a.parentNode.month!="undefined"){return a.parentNode}}return
null};Calendar.findYear=function(a){if(typeof
a.year!="undefined"){return a}else{if(typeof
a.parentNode.year!="undefined"){return a.parentNode}}return
null};Calendar.showMonthsCombo=function(){var e=Calendar._C;if(!e){return
false}var e=e;var f=e.activeDiv;var
d=e.monthsCombo;if(e.hilitedMonth){Calendar.removeClass(e.hilitedMonth,"hilite")}if(e.activeMonth){Calendar.removeClass(e.activeMonth,"active")}var
c=e.monthsCombo.getElementsByTagName("div")[e.date.getMonth()];Calendar.addClass(c,"active");e.activeMonth=c;var
b=d.style;b.display="block";if(f.navtype<0){b.left=f.offsetLeft+"px"}else{var
a=d.offsetWidth;if(typeof
a=="undefined"){a=50}b.left=(f.offsetLeft+f.offsetWidth-a)+"px"}b.top=(f.offsetTop+f.offsetHeight)+"px"};Calendar.showYearsCombo=function(d){var
a=Calendar._C;if(!a){return false}var a=a;var c=a.activeDiv;var
f=a.yearsCombo;if(a.hilitedYear){Calendar.removeClass(a.hilitedYear,"hilite")}if(a.activeYear){Calendar.removeClass(a.activeYear,"active")}a.activeYear=null;var
b=a.date.getFullYear()+(d?1:-1);var j=f.firstChild;var h=false;for(var
e=12;e>0;--e){if(b>=a.minYear&&b<=a.maxYear){j.innerHTML=b;j.year=b;j.style.display="block";h=true}else{j.style.display="none"}j=j.nextSibling;b+=d?a.yearStep:-a.yearStep}if(h){var
k=f.style;k.display="block";if(c.navtype<0){k.left=c.offsetLeft+"px"}else{var
g=f.offsetWidth;if(typeof
g=="undefined"){g=50}k.left=(c.offsetLeft+c.offsetWidth-g)+"px"}k.top=(c.offsetTop+c.offsetHeight)+"px"}};Calendar.tableMouseUp=function(ev){var
cal=Calendar._C;if(!cal){return
false}if(cal.timeout){clearTimeout(cal.timeout)}var
el=cal.activeDiv;if(!el){return false}var
target=Calendar.getTargetElement(ev);ev||(ev=window.event);Calendar.removeClass(el,"active");if(target==el||target.parentNode==el){Calendar.cellClick(el,ev)}var
mon=Calendar.findMonth(target);var date=null;if(mon){date=new
Date(cal.date);if(mon.month!=date.getMonth()){date.setMonth(mon.month);cal.setDate(date);cal.dateClicked=false;cal.callHandler()}}else{var
year=Calendar.findYear(target);if(year){date=new
Date(cal.date);if(year.year!=date.getFullYear()){date.setFullYear(year.year);cal.setDate(date);cal.dateClicked=false;cal.callHandler()}}}with(Calendar){removeEvent(document,"mouseup",tableMouseUp);removeEvent(document,"mouseover",tableMouseOver);removeEvent(document,"mousemove",tableMouseOver);cal._hideCombos();_C=null;return
stopEvent(ev)}};Calendar.tableMouseOver=function(n){var
a=Calendar._C;if(!a){return}var c=a.activeDiv;var
j=Calendar.getTargetElement(n);if(j==c||j.parentNode==c){Calendar.addClass(c,"hilite
active");Calendar.addClass(c.parentNode,"rowhilite")}else{if(typeof
c.navtype=="undefined"||(c.navtype!=50&&(c.navtype==0||Math.abs(c.navtype)>2))){Calendar.removeClass(c,"active")}Calendar.removeClass(c,"hilite");Calendar.removeClass(c.parentNode,"rowhilite")}n||(n=window.event);if(c.navtype==50&&j!=c){var
m=Calendar.getAbsolutePos(c);var p=c.offsetWidth;var o=n.clientX;var q;var
l=true;if(o>m.x+p){q=o-m.x-p;l=false}else{q=m.x-o}if(q<0){q=0}var
f=c._range;var h=c._current;var g=Math.floor(q/10)%f.length;for(var
e=f.length;--e>=0;){if(f[e]==h){break}}while(g-->0){if(l){if(--e<0){e=f.length-1}}else{if(++e>=f.length){e=0}}}var
b=f[e];c.innerHTML=b;a.onUpdateTime()}var
d=Calendar.findMonth(j);if(d){if(d.month!=a.date.getMonth()){if(a.hilitedMonth){Calendar.removeClass(a.hilitedMonth,"hilite")}Calendar.addClass(d,"hilite");a.hilitedMonth=d}else{if(a.hilitedMonth){Calendar.removeClass(a.hilitedMonth,"hilite")}}}else{if(a.hilitedMonth){Calendar.removeClass(a.hilitedMonth,"hilite")}var
k=Calendar.findYear(j);if(k){if(k.year!=a.date.getFullYear()){if(a.hilitedYear){Calendar.removeClass(a.hilitedYear,"hilite")}Calendar.addClass(k,"hilite");a.hilitedYear=k}else{if(a.hilitedYear){Calendar.removeClass(a.hilitedYear,"hilite")}}}else{if(a.hilitedYear){Calendar.removeClass(a.hilitedYear,"hilite")}}}return
Calendar.stopEvent(n)};Calendar.tableMouseDown=function(a){if(Calendar.getTargetElement(a)==Calendar.getElement(a)){return
Calendar.stopEvent(a)}};Calendar.calDragIt=function(b){var
c=Calendar._C;if(!(c&&c.dragging)){return false}var e;var
d;if(Calendar.is_ie){d=window.event.clientY+document.body.scrollTop;e=window.event.clientX+document.body.scrollLeft}else{e=b.pageX;d=b.pageY}c.hideShowCovered();var
a=c.element.style;a.left=(e-c.xOffs)+"px";a.top=(d-c.yOffs)+"px";return
Calendar.stopEvent(b)};Calendar.calDragEnd=function(ev){var
cal=Calendar._C;if(!cal){return
false}cal.dragging=false;with(Calendar){removeEvent(document,"mousemove",calDragIt);removeEvent(document,"mouseup",calDragEnd);tableMouseUp(ev)}cal.hideShowCovered()};Calendar.dayMouseDown=function(ev){var
el=Calendar.getElement(ev);if(el.disabled){return false}var
cal=el.calendar;cal.activeDiv=el;Calendar._C=cal;if(el.navtype!=300){with(Calendar){if(el.navtype==50){el._current=el.innerHTML;addEvent(document,"mousemove",tableMouseOver)}else{addEvent(document,Calendar.is_ie5?"mousemove":"mouseover",tableMouseOver)}addClass(el,"hilite
active");addEvent(document,"mouseup",tableMouseUp)}}else{if(cal.isPopup){cal._dragStart(ev)}}if(el.navtype==-1||el.navtype==1){if(cal.timeout){clearTimeout(cal.timeout)}cal.timeout=setTimeout("Calendar.showMonthsCombo()",250)}else{if(el.navtype==-2||el.navtype==2){if(cal.timeout){clearTimeout(cal.timeout)}cal.timeout=setTimeout((el.navtype>0)?"Calendar.showYearsCombo(true)":"Calendar.showYearsCombo(false)",250)}else{cal.timeout=null}}return
Calendar.stopEvent(ev)};Calendar.dayMouseDblClick=function(a){Calendar.cellClick(Calendar.getElement(a),a||window.event);if(Calendar.is_ie){document.selection.empty()}};Calendar.dayMouseOver=function(b){var
a=Calendar.getElement(b);if(Calendar.isRelated(a,b)||Calendar._C||a.disabled){return
false}if(a.ttip){if(a.ttip.substr(0,1)=="_"){a.ttip=a.caldate.print(a.calendar.ttDateFormat)+a.ttip.substr(1)}a.calendar.tooltips.innerHTML=a.ttip}if(a.navtype!=300){Calendar.addClass(a,"hilite");if(a.caldate){Calendar.addClass(a.parentNode,"rowhilite");var
c=a.calendar;if(c&&c.getDateToolTip){var
e=a.caldate;window.status=e;a.title=c.getDateToolTip(e,e.getFullYear(),e.getMonth(),e.getDate())}}}return
Calendar.stopEvent(b)};Calendar.dayMouseOut=function(ev){with(Calendar){var
el=getElement(ev);if(isRelated(el,ev)||_C||el.disabled){return
false}removeClass(el,"hilite");if(el.caldate){removeClass(el.parentNode,"rowhilite")}if(el.calendar){el.calendar.tooltips.innerHTML=_TT.SEL_DATE}}};Calendar.cellClick=function(e,o){var
c=e.calendar;var h=false;var l=false;var f=null;if(typeof
e.navtype=="undefined"){if(c.currentDateEl){Calendar.removeClass(c.currentDateEl,"selected");Calendar.addClass(e,"selected");h=(c.currentDateEl==e);if(!h){c.currentDateEl=e}}c.date.setDateOnly(e.caldate);f=c.date;var
b=!(c.dateClicked=!e.otherMonth);if(!b&&!c.currentDateEl&&c.multiple){c._toggleMultipleDate(new
Date(f))}else{l=!e.disabled}if(b){c._init(c.firstDayOfWeek,f)}}else{if(e.navtype==200){Calendar.removeClass(e,"hilite");c.callCloseHandler();return}f=new
Date(c.date);if(e.navtype==0){f.setDateOnly(new
Date())}c.dateClicked=false;var n=f.getFullYear();var
g=f.getMonth();function a(q){var r=f.getDate();var
i=f.getMonthDays(q);if(r>i){f.setDate(i)}f.setMonth(q)}switch(e.navtype){case
400:Calendar.removeClass(e,"hilite");var
p=Calendar._TT.ABOUT;if(typeof
p!="undefined"){p+=c.showsTime?Calendar._TT.ABOUT_TIME:""}else{p='Help
and about box text is not translated into this language.\nIf you know this
language and you feel generous please update\nthe corresponding file in
"lang" subdir to match calendar-en.js\nand send it back to
<mihai_bazon@yahoo.com> to get it into the distribution  ;-)\n\nThank
you!\nhttp://dynarch.com/mishoo/calendar.epl\n'}alert(p);return;case
-2:if(n>c.minYear){f.setFullYear(n-1)}break;case
-1:if(g>0){a(g-1)}else{if(n-->c.minYear){f.setFullYear(n);a(11)}}break;case
1:if(g<11){a(g+1)}else{if(n<c.maxYear){f.setFullYear(n+1);a(0)}}break;case
2:if(n<c.maxYear){f.setFullYear(n+1)}break;case
100:c.setFirstDayOfWeek(e.fdow);return;case 50:var k=e._range;var
m=e.innerHTML;for(var
j=k.length;--j>=0;){if(k[j]==m){break}}if(o&&o.shiftKey){if(--j<0){j=k.length-1}}else{if(++j>=k.length){j=0}}var
d=k[j];e.innerHTML=d;c.onUpdateTime();return;case 0:if((typeof
c.getDateStatus=="function")&&c.getDateStatus(f,f.getFullYear(),f.getMonth(),f.getDate())){return
false}break}if(!f.equalsTo(c.date)){c.setDate(f);l=true}else{if(e.navtype==0){l=h=true}}}if(l){o&&c.callHandler()}if(h){Calendar.removeClass(e,"hilite");o&&c.callCloseHandler()}};Calendar.prototype.create=function(n){var
m=null;if(!n){m=document.getElementsByTagName("body")[0];this.isPopup=true}else{m=n;this.isPopup=false}this.date=this.dateStr?new
Date(this.dateStr):new Date();var
q=Calendar.createElement("table");this.table=q;q.cellSpacing=0;q.cellPadding=0;q.calendar=this;Calendar.addEvent(q,"mousedown",Calendar.tableMouseDown);var
a=Calendar.createElement("div");this.element=a;a.className="calendar";if(this.isPopup){a.style.position="absolute";a.style.display="none"}a.appendChild(q);var
k=Calendar.createElement("thead",q);var o=null;var r=null;var
b=this;var
e=function(s,j,i){o=Calendar.createElement("td",r);o.colSpan=j;o.className="button";if(i!=0&&Math.abs(i)<=2){o.className+="
nav"}Calendar._add_evs(o);o.calendar=b;o.navtype=i;o.innerHTML="<div
unselectable='on'>"+s+"</div>";return
o};r=Calendar.createElement("tr",k);var
c=6;(this.isPopup)&&--c;(this.weekNumbers)&&++c;e("?",1,400).ttip=Calendar._TT.INFO;this.title=e("",c,300);this.title.className="title";if(this.isPopup){this.title.ttip=Calendar._TT.DRAG_TO_MOVE;this.title.style.cursor="move";e("&#x00d7;",1,200).ttip=Calendar._TT.CLOSE}r=Calendar.createElement("tr",k);r.className="headrow";this._nav_py=e("&#x00ab;",1,-2);this._nav_py.ttip=Calendar._TT.PREV_YEAR;this._nav_pm=e("&#x2039;",1,-1);this._nav_pm.ttip=Calendar._TT.PREV_MONTH;this._nav_now=e(Calendar._TT.TODAY,this.weekNumbers?4:3,0);this._nav_now.ttip=Calendar._TT.GO_TODAY;this._nav_nm=e("&#x203a;",1,1);this._nav_nm.ttip=Calendar._TT.NEXT_MONTH;this._nav_ny=e("&#x00bb;",1,2);this._nav_ny.ttip=Calendar._TT.NEXT_YEAR;r=Calendar.createElement("tr",k);r.className="daynames";if(this.weekNumbers){o=Calendar.createElement("td",r);o.className="name
wn";o.innerHTML=Calendar._TT.WK}for(var
h=7;h>0;--h){o=Calendar.createElement("td",r);if(!h){o.navtype=100;o.calendar=this;Calendar._add_evs(o)}}this.firstdayname=(this.weekNumbers)?r.firstChild.nextSibling:r.firstChild;this._displayWeekdays();var
g=Calendar.createElement("tbody",q);this.tbody=g;for(h=6;h>0;--h){r=Calendar.createElement("tr",g);if(this.weekNumbers){o=Calendar.createElement("td",r)}for(var
f=7;f>0;--f){o=Calendar.createElement("td",r);o.calendar=this;Calendar._add_evs(o)}}if(this.showsTime){r=Calendar.createElement("tr",g);r.className="time";o=Calendar.createElement("td",r);o.className="time";o.colSpan=2;o.innerHTML=Calendar._TT.TIME||"&#160;";o=Calendar.createElement("td",r);o.className="time";o.colSpan=this.weekNumbers?4:3;(function(){function
t(C,E,D,F){var
A=Calendar.createElement("span",o);A.className=C;A.innerHTML=E;A.calendar=b;A.ttip=Calendar._TT.TIME_PART;A.navtype=50;A._range=[];if(typeof
D!="number"){A._range=D}else{for(var B=D;B<=F;++B){var
z;if(B<10&&F>=10){z="0"+B}else{z=""+B}A._range[A._range.length]=z}}Calendar._add_evs(A);return
A}var x=b.date.getHours();var i=b.date.getMinutes();var y=!b.time24;var
j=(x>12);if(y&&j){x-=12}var
v=t("hour",x,y?1:0,y?12:23);var
u=Calendar.createElement("span",o);u.innerHTML=":";u.className="colon";var
s=t("minute",i,0,59);var
w=null;o=Calendar.createElement("td",r);o.className="time";o.colSpan=2;if(y){w=t("ampm",j?"pm":"am",["am","pm"])}else{o.innerHTML="&#160;"}b.onSetTime=function(){var
A,z=this.date.getHours(),B=this.date.getMinutes();if(y){A=(z>=12);if(A){z-=12}if(z==0){z=12}w.innerHTML=A?"pm":"am"}v.innerHTML=(z<10)?("0"+z):z;s.innerHTML=(B<10)?("0"+B):B};b.onUpdateTime=function(){var
A=this.date;var
B=parseInt(v.innerHTML,10);if(y){if(/pm/i.test(w.innerHTML)&&B<12){B+=12}else{if(/am/i.test(w.innerHTML)&&B==12){B=0}}}var
C=A.getDate();var z=A.getMonth();var
D=A.getFullYear();A.setHours(B);A.setMinutes(parseInt(s.innerHTML,10));A.setFullYear(D);A.setMonth(z);A.setDate(C);this.dateClicked=false;this.callHandler()}})()}else{this.onSetTime=this.onUpdateTime=function(){}}var
l=Calendar.createElement("tfoot",q);r=Calendar.createElement("tr",l);r.className="footrow";o=e(Calendar._TT.SEL_DATE,this.weekNumbers?8:7,300);o.className="ttip";if(this.isPopup){o.ttip=Calendar._TT.DRAG_TO_MOVE;o.style.cursor="move"}this.tooltips=o;a=Calendar.createElement("div",this.element);this.monthsCombo=a;a.className="combo";for(h=0;h<Calendar._MN.length;++h){var
d=Calendar.createElement("div");d.className=Calendar.is_ie?"label-IEfix":"label";d.month=h;d.innerHTML=Calendar._SMN[h];a.appendChild(d)}a=Calendar.createElement("div",this.element);this.yearsCombo=a;a.className="combo";for(h=12;h>0;--h){var
p=Calendar.createElement("div");p.className=Calendar.is_ie?"label-IEfix":"label";a.appendChild(p)}this._init(this.firstDayOfWeek,this.date);m.appendChild(this.element)};Calendar._keyEvent=function(k){var
a=window._dynarch_popupCalendar;if(!a||a.multiple){return
false}(Calendar.is_ie)&&(k=window.event);var
i=(Calendar.is_ie||k.type=="keypress"),l=k.keyCode;if(k.ctrlKey){switch(l){case
37:i&&Calendar.cellClick(a._nav_pm);break;case
38:i&&Calendar.cellClick(a._nav_py);break;case
39:i&&Calendar.cellClick(a._nav_nm);break;case
40:i&&Calendar.cellClick(a._nav_ny);break;default:return
false}}else{switch(l){case 32:Calendar.cellClick(a._nav_now);break;case
27:i&&a.callCloseHandler();break;case 37:case 38:case 39:case
40:if(i){var e,m,j,g,c,d;e=l==37||l==38;d=(l==37||l==39)?1:7;function
b(){c=a.currentDateEl;var
n=c.pos;m=n&15;j=n>>4;g=a.ar_days[j][m]}b();function f(){var
n=new Date(a.date);n.setDate(n.getDate()-d);a.setDate(n)}function h(){var
n=new
Date(a.date);n.setDate(n.getDate()+d);a.setDate(n)}while(1){switch(l){case
37:if(--m>=0){g=a.ar_days[j][m]}else{m=6;l=38;continue}break;case
38:if(--j>=0){g=a.ar_days[j][m]}else{f();b()}break;case
39:if(++m<7){g=a.ar_days[j][m]}else{m=0;l=40;continue}break;case
40:if(++j<a.ar_days.length){g=a.ar_days[j][m]}else{h();b()}break}break}if(g){if(!g.disabled){Calendar.cellClick(g)}else{if(e){f()}else{h()}}}}break;case
13:if(i){Calendar.cellClick(a.currentDateEl,k)}break;default:return
false}}return
Calendar.stopEvent(k)};Calendar.prototype._init=function(m,w){var v=new
Date(),q=v.getFullYear(),y=v.getMonth(),b=v.getDate();this.table.style.visibility="hidden";var
h=w.getFullYear();if(h<this.minYear){h=this.minYear;w.setFullYear(h)}else{if(h>this.maxYear){h=this.maxYear;w.setFullYear(h)}}this.firstDayOfWeek=m;this.date=new
Date(w);var x=w.getMonth();var A=w.getDate();var
z=w.getMonthDays();w.setDate(1);var
r=(w.getDay()-this.firstDayOfWeek)%7;if(r<0){r+=7}w.setDate(-r);w.setDate(w.getDate()+1);var
e=this.tbody.firstChild;var k=Calendar._SMN[x];var o=this.ar_days=new
Array();var n=Calendar._TT.WEEKEND;var
d=this.multiple?(this.datesCells={}):null;for(var
t=0;t<6;++t,e=e.nextSibling){var
a=e.firstChild;if(this.weekNumbers){a.className="day
wn";a.innerHTML=w.getWeekNumber();a=a.nextSibling}e.className="daysrow";var
u=false,f,c=o[t]=[];for(var
s=0;s<7;++s,a=a.nextSibling,w.setDate(f+1)){f=w.getDate();var
g=w.getDay();a.className="day";a.pos=t<<4|s;c[s]=a;var
l=(w.getMonth()==x);if(!l){if(this.showsOtherMonths){a.className+="
othermonth";a.otherMonth=true}else{a.className="emptycell";a.innerHTML="&#160;";a.disabled=true;continue}}else{a.otherMonth=false;u=true}a.disabled=false;a.innerHTML=this.getDateText?this.getDateText(w,f):f;if(d){d[w.print("%Y%m%d")]=a}if(this.getDateStatus){var
p=this.getDateStatus(w,h,x,f);if(p===true){a.className+="
disabled";a.disabled=true}else{if(/disabled/i.test(p)){a.disabled=true}a.className+="
"+p}}if(!a.disabled){a.caldate=new
Date(w);a.ttip="_";if(!this.multiple&&l&&f==A&&this.hiliteToday){a.className+="
selected";this.currentDateEl=a}if(w.getFullYear()==q&&w.getMonth()==y&&f==b){a.className+="
today";a.ttip+=Calendar._TT.PART_TODAY}if(n.indexOf(g.toString())!=-1){a.className+=a.otherMonth?"
oweekend":"
weekend"}}}if(!(u||this.showsOtherMonths)){e.className="emptyrow"}}this.title.innerHTML=Calendar._MN[x]+",
"+h;this.onSetTime();this.table.style.visibility="visible";this._initMultipleDates()};Calendar.prototype._initMultipleDates=function(){if(this.multiple){for(var
b in this.multiple){var a=this.datesCells[b];var
c=this.multiple[b];if(!c){continue}if(a){a.className+="
selected"}}}};Calendar.prototype._toggleMultipleDate=function(b){if(this.multiple){var
c=b.print("%Y%m%d");var a=this.datesCells[c];if(a){var
e=this.multiple[c];if(!e){Calendar.addClass(a,"selected");this.multiple[c]=b}else{Calendar.removeClass(a,"selected");delete
this.multiple[c]}}}};Calendar.prototype.setDateToolTipHandler=function(a){this.getDateToolTip=a};Calendar.prototype.setDate=function(a){if(!a.equalsTo(this.date)){this._init(this.firstDayOfWeek,a)}};Calendar.prototype.refresh=function(){this._init(this.firstDayOfWeek,this.date)};Calendar.prototype.setFirstDayOfWeek=function(a){this._init(a,this.date);this._displayWeekdays()};Calendar.prototype.setDateStatusHandler=Calendar.prototype.setDisabledHandler=function(a){this.getDateStatus=a};Calendar.prototype.setRange=function(b,c){this.minYear=b;this.maxYear=c};Calendar.prototype.callHandler=function(){if(this.onSelected){this.onSelected(this,this.date.print(this.dateFormat))}};Calendar.prototype.callCloseHandler=function(){if(this.onClose){this.onClose(this)}this.hideShowCovered()};Calendar.prototype.destroy=function(){var
a=this.element.parentNode;a.removeChild(this.element);Calendar._C=null;window._dynarch_popupCalendar=null};Calendar.prototype.reparent=function(b){var
a=this.element;a.parentNode.removeChild(a);b.appendChild(a)};Calendar._checkCalendar=function(b){var
c=window._dynarch_popupCalendar;if(!c){return false}var
a=Calendar.is_ie?Calendar.getElement(b):Calendar.getTargetElement(b);for(;a!=null&&a!=c.element;a=a.parentNode){}if(a==null){window._dynarch_popupCalendar.callCloseHandler();return
Calendar.stopEvent(b)}};Calendar.prototype.show=function(){var
e=this.table.getElementsByTagName("tr");for(var
d=e.length;d>0;){var
f=e[--d];Calendar.removeClass(f,"rowhilite");var
c=f.getElementsByTagName("td");for(var b=c.length;b>0;){var
a=c[--b];Calendar.removeClass(a,"hilite");Calendar.removeClass(a,"active")}}this.element.style.display="block";this.hidden=false;if(this.isPopup){window._dynarch_popupCalendar=this;Calendar.addEvent(document,"keydown",Calendar._keyEvent);Calendar.addEvent(document,"keypress",Calendar._keyEvent);Calendar.addEvent(document,"mousedown",Calendar._checkCalendar)}this.hideShowCovered()};Calendar.prototype.hide=function(){if(this.isPopup){Calendar.removeEvent(document,"keydown",Calendar._keyEvent);Calendar.removeEvent(document,"keypress",Calendar._keyEvent);Calendar.removeEvent(document,"mousedown",Calendar._checkCalendar)}this.element.style.display="none";this.hidden=true;this.hideShowCovered()};Calendar.prototype.showAt=function(a,c){var
b=this.element.style;b.left=a+"px";b.top=c+"px";this.show()};Calendar.prototype.showAtElement=function(c,d){var
a=this;var e=Calendar.getAbsolutePos(c);if(!d||typeof
d!="string"){this.showAt(e.x,e.y+c.offsetHeight);return
true}function b(i){if(i.x<0){i.x=0}if(i.y<0){i.y=0}var
j=document.createElement("div");var
h=j.style;h.position="absolute";h.right=h.bottom=h.width=h.height="0px";document.body.appendChild(j);var
g=Calendar.getAbsolutePos(j);document.body.removeChild(j);if(Calendar.is_ie){g.y+=(document.documentElement&&document.documentElement.scrollTop)||document.body.scrollTop;g.x+=(document.documentElement&&document.documentElement.scrollLeft)||document.body.scrollLeft}else{g.y+=window.scrollY;g.x+=window.scrollX}var
f=i.x+i.width-g.x;if(f>0){i.x-=f}f=i.y+i.height-g.y;if(f>0){i.y-=f}}this.element.style.display="block";Calendar.continuation_for_the_khtml_browser=function(){var
f=a.element.offsetWidth;var
i=a.element.offsetHeight;a.element.style.display="none";var
g=d.substr(0,1);var
j="l";if(d.length>1){j=d.substr(1,1)}switch(g){case"T":e.y-=i;break;case"B":e.y+=c.offsetHeight;break;case"C":e.y+=(c.offsetHeight-i)/2;break;case"t":e.y+=c.offsetHeight-i;break;case"b":break}switch(j){case"L":e.x-=f;break;case"R":e.x+=c.offsetWidth;break;case"C":e.x+=(c.offsetWidth-f)/2;break;case"l":e.x+=c.offsetWidth-f;break;case"r":break}e.width=f;e.height=i+40;a.monthsCombo.style.display="none";b(e);a.showAt(e.x,e.y)};if(Calendar.is_khtml){setTimeout("Calendar.continuation_for_the_khtml_browser()",10)}else{Calendar.continuation_for_the_khtml_browser()}};Calendar.prototype.setDateFormat=function(a){this.dateFormat=a};Calendar.prototype.setTtDateFormat=function(a){this.ttDateFormat=a};Calendar.prototype.parseDate=function(b,a){if(!a){a=this.dateFormat}this.setDate(Date.parseDate(b,a))};Calendar.prototype.hideShowCovered=function(){if(!Calendar.is_ie&&!Calendar.is_opera){return}function
b(k){var
i=k.style.visibility;if(!i){if(document.defaultView&&typeof(document.defaultView.getComputedStyle)=="function"){if(!Calendar.is_khtml){i=document.defaultView.getComputedStyle(k,"").getPropertyValue("visibility")}else{i=""}}else{if(k.currentStyle){i=k.currentStyle.visibility}else{i=""}}}return
i}var s=new
Array("applet","iframe","select");var
c=this.element;var a=Calendar.getAbsolutePos(c);var f=a.x;var
d=c.offsetWidth+f;var r=a.y;var q=c.offsetHeight+r;for(var
h=s.length;h>0;){var g=document.getElementsByTagName(s[--h]);var
e=null;for(var
l=g.length;l>0;){e=g[--l];a=Calendar.getAbsolutePos(e);var o=a.x;var
n=e.offsetWidth+o;var m=a.y;var
j=e.offsetHeight+m;if(this.hidden||(o>d)||(n<f)||(m>q)||(j<r)){if(!e.__msh_save_visibility){e.__msh_save_visibility=b(e)}e.style.visibility=e.__msh_save_visibility}else{if(!e.__msh_save_visibility){e.__msh_save_visibility=b(e)}e.style.visibility="hidden"}}}};Calendar.prototype._displayWeekdays=function(){var
b=this.firstDayOfWeek;var a=this.firstdayname;var
d=Calendar._TT.WEEKEND;for(var c=0;c<7;++c){a.className="day
name";var
e=(c+b)%7;if(c){a.ttip=Calendar._TT.DAY_FIRST.replace("%s",Calendar._DN[e]);a.navtype=100;a.calendar=this;a.fdow=e;Calendar._add_evs(a)}if(d.indexOf(e.toString())!=-1){Calendar.addClass(a,"weekend")}a.innerHTML=Calendar._SDN[(c+b)%7];a=a.nextSibling}};Calendar.prototype._hideCombos=function(){this.monthsCombo.style.display="none";this.yearsCombo.style.display="none"};Calendar.prototype._dragStart=function(ev){if(this.dragging){return}this.dragging=true;var
posX;var
posY;if(Calendar.is_ie){posY=window.event.clientY+document.body.scrollTop;posX=window.event.clientX+document.body.scrollLeft}else{posY=ev.clientY+window.scrollY;posX=ev.clientX+window.scrollX}var
st=this.element.style;this.xOffs=posX-parseInt(st.left);this.yOffs=posY-parseInt(st.top);with(Calendar){addEvent(document,"mousemove",calDragIt);addEvent(document,"mouseup",calDragEnd)}};Date._MD=new
Array(31,28,31,30,31,30,31,31,30,31,30,31);Date.SECOND=1000;Date.MINUTE=60*Date.SECOND;Date.HOUR=60*Date.MINUTE;Date.DAY=24*Date.HOUR;Date.WEEK=7*Date.DAY;Date.parseDate=function(l,c){var
n=new Date();var o=0;var e=-1;var k=0;var q=l.split(/\W+/);var
p=c.match(/%./g);var h=0,g=0;var r=0;var
f=0;for(h=0;h<q.length;++h){if(!q[h]){continue}switch(p[h]){case"%d":case"%e":k=parseInt(q[h],10);break;case"%m":e=parseInt(q[h],10)-1;break;case"%Y":case"%y":o=parseInt(q[h],10);(o<100)&&(o+=(o>29)?1900:2000);break;case"%b":case"%B":for(g=0;g<12;++g){if(Calendar._MN[g].substr(0,q[h].length).toLowerCase()==q[h].toLowerCase()){e=g;break}}break;case"%H":case"%I":case"%k":case"%l":r=parseInt(q[h],10);break;case"%P":case"%p":if(/pm/i.test(q[h])&&r<12){r+=12}else{if(/am/i.test(q[h])&&r>=12){r-=12}}break;case"%M":f=parseInt(q[h],10);break}}if(isNaN(o)){o=n.getFullYear()}if(isNaN(e)){e=n.getMonth()}if(isNaN(k)){k=n.getDate()}if(isNaN(r)){r=n.getHours()}if(isNaN(f)){f=n.getMinutes()}if(o!=0&&e!=-1&&k!=0){return
new
Date(o,e,k,r,f,0)}o=0;e=-1;k=0;for(h=0;h<q.length;++h){if(q[h].search(/[a-zA-Z]+/)!=-1){var
s=-1;for(g=0;g<12;++g){if(Calendar._MN[g].substr(0,q[h].length).toLowerCase()==q[h].toLowerCase()){s=g;break}}if(s!=-1){if(e!=-1){k=e+1}e=s}}else{if(parseInt(q[h],10)<=12&&e==-1){e=q[h]-1}else{if(parseInt(q[h],10)>31&&o==0){o=parseInt(q[h],10);(o<100)&&(o+=(o>29)?1900:2000)}else{if(k==0){k=q[h]}}}}}if(o==0){o=n.getFullYear()}if(e!=-1&&k!=0){return
new Date(o,e,k,r,f,0)}return n};Date.prototype.getMonthDays=function(b){var
a=this.getFullYear();if(typeof
b=="undefined"){b=this.getMonth()}if(((0==(a%4))&&((0!=(a%100))||(0==(a%400))))&&b==1){return
29}else{return Date._MD[b]}};Date.prototype.getDayOfYear=function(){var
a=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var
c=new Date(this.getFullYear(),0,0,0,0,0);var b=a-c;return
Math.floor(b/Date.DAY)};Date.prototype.getWeekNumber=function(){var c=new
Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var
b=c.getDay();c.setDate(c.getDate()-(b+6)%7+3);var
a=c.valueOf();c.setMonth(0);c.setDate(4);return
Math.round((a-c.valueOf())/(7*86400000))+1};Date.prototype.equalsTo=function(a){return((this.getFullYear()==a.getFullYear())&&(this.getMonth()==a.getMonth())&&(this.getDate()==a.getDate())&&(this.getHours()==a.getHours())&&(this.getMinutes()==a.getMinutes()))};Date.prototype.setDateOnly=function(a){var
b=new
Date(a);this.setDate(1);this.setFullYear(b.getFullYear());this.setMonth(b.getMonth());this.setDate(b.getDate())};Date.prototype.print=function(l){var
b=this.getMonth();var k=this.getDate();var n=this.getFullYear();var
p=this.getWeekNumber();var q=this.getDay();var v={};var
r=this.getHours();var c=(r>=12);var h=(c)?(r-12):r;var
u=this.getDayOfYear();if(h==0){h=12}var e=this.getMinutes();var
j=this.getSeconds();v["%a"]=Calendar._SDN[q];v["%A"]=Calendar._DN[q];v["%b"]=Calendar._SMN[b];v["%B"]=Calendar._MN[b];v["%C"]=1+Math.floor(n/100);v["%d"]=(k<10)?("0"+k):k;v["%e"]=k;v["%H"]=(r<10)?("0"+r):r;v["%I"]=(h<10)?("0"+h):h;v["%j"]=(u<100)?((u<10)?("00"+u):("0"+u)):u;v["%k"]=r;v["%l"]=h;v["%m"]=(b<9)?("0"+(1+b)):(1+b);v["%M"]=(e<10)?("0"+e):e;v["%n"]="\n";v["%p"]=c?"PM":"AM";v["%P"]=c?"pm":"am";v["%s"]=Math.floor(this.getTime()/1000);v["%S"]=(j<10)?("0"+j):j;v["%t"]="\t";v["%U"]=v["%W"]=v["%V"]=(p<10)?("0"+p):p;v["%u"]=q+1;v["%w"]=q;v["%y"]=(""+n).substr(2,2);v["%Y"]=n;v["%%"]="%";var
t=/%./g;if(!Calendar.is_ie5&&!Calendar.is_khtml){return
l.replace(t,function(a){return v[a]||a})}var o=l.match(t);for(var
g=0;g<o.length;g++){var f=v[o[g]];if(f){t=new
RegExp(o[g],"g");l=l.replace(t,f)}}return
l};window._dynarch_popupCalendar=null;PKYn�[�
��>>js/caption-uncompressed.jsnu�[���/**
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license     GNU General Public License version 2 or later; see
LICENSE.txt
 */

/**
 * JCaption javascript behavior
 *
 * Used for displaying image captions
 *
 * @package     Joomla
 * @since       1.5
 * @version  1.0
 */
var JCaption = function(_selector) {
    var $, selector,
    
    initialize = function(_selector) {
        $ = jQuery.noConflict();
        selector = _selector;
        $(selector).each(function(index, el) {
            createCaption(el);
        })
    },
    
    createCaption = function(element) {
        var $el = $(element), 
        caption = $el.attr('title'),
        width = $el.attr("width") || element.width,
        align = $el.attr("align") || $el.css("float")
|| element.style.styleFloat || "none",
        $p = $('<p/>', {
            "text" : caption,
            "class" : selector.replace('.',
'_')
        }),
        $container = $('<div/>', {
            "class" : selector.replace('.',
'_') + " " + align,
            "css" : {
                "float" : align,
                "width" : width
            }
        });
        $el.before($container);
        $container.append($el);
        if (caption !== "") {
            $container.append($p);
        }
    }
    initialize(_selector);
}
PKYn�[����
js/caption.jsnu�[���/*
        GNU General Public License version 2 or later; see LICENSE.txt
*/
var JCaption=function(c){var
e,b,a=function(f){e=jQuery.noConflict();b=f;e(b).each(function(g,h){d(h)})},d=function(i){var
h=e(i),f=h.attr("title"),j=h.attr("width")||i.width,l=h.attr("align")||h.css("float")||i.style.styleFloat||"none",g=e("<p/>",{text:f,"class":b.replace(".","_")}),k=e("<div/>",{"class":b.replace(".","_")+"
"+l,css:{"float":l,width:j}});h.before(k);k.append(h);if(f!==""){k.append(g)}};a(c)};
PKZn�[�82��js/color-field-adv-init.jsnu�[���jQuery(function
($){
	initMinicolors();
	$('body').on('subform-row-add', initMinicolors);

	function initMinicolors(event, container)
	{
		container = container || document;

		$(container).find('.minicolors').each(function() {
			var $this = $(this);
			var format = $this.data('validate') === 'color' ?
'hex' : $this.data('format') || 'hex';

			$this.minicolors({
				control: $this.data('control') || 'hue',
				format: format === 'rgba' ? 'rgb' : format,
				keywords: $this.data('keywords') || '',
				opacity: format === 'rgba',
				position: $this.data('position') || 'default',
				theme: $this.data('theme') || 'bootstrap',
			});
		});
	}
});
PKZn�[u����js/color-field-adv-init.min.jsnu�[���jQuery((function(o){function
a(a,t){t=t||document,o(t).find(".minicolors").each((function(){var
a=o(this),t="color"===a.data("validate")?"hex":a.data("format")||"hex";a.minicolors({control:a.data("control")||"hue",format:"rgba"===t?"rgb":t,keywords:a.data("keywords")||"",opacity:"rgba"===t,position:a.data("position")||"default",theme:a.data("theme")||"bootstrap"})}))}a(),o("body").on("subform-row-add",a)}));

PKZn�[`�^
��js/color-field-init.jsnu�[���jQuery(document).ready(function
($){
	$('select.simplecolors').simplecolors();

	$(document).on('subform-row-add', function(event, row){
		$(row).find('select.simplecolors').simplecolors();
	});
});
PKZn�[�c8���js/color-field-init.min.jsnu�[���jQuery(document).ready(function($){$("select.simplecolors").simplecolors();$(document).on("subform-row-add",function(event,row){$(row).find("select.simplecolors").simplecolors()})});PKZn�[h}�*��js/combobox-uncompressed.jsnu�[���/**
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license     GNU General Public License version 2 or later; see
LICENSE.txt
 */

/**
 * Unobtrusive transformation for combobox
 *
 *
 * @package		Joomla.Framework
 * @subpackage	Forms
 */

(function($,document,undefined)
{
	var combobox = function(options, elem)
	{
		var self = {},

		init = function(options, elem)
		{
			self.$elem = $(elem);
			self.options = $.extend({}, $.fn.ComboTransform.options, options);
			self.$input = $(elem).find('input[type="text"]');
			self.$dropBtnDiv = $(elem).find('div.btn-group');
			self.$dropBtn =
self.$dropBtnDiv.find('[type="button"]');
			self.$dropDown = $(elem).find('ul.dropdown-menu'),
			self.$dropDownOptions = self.$dropDown.find('li a');
			self.$dropDown.isEmpty = false;
			self.$dropBtn.isClicked = false;
			render();

			addEventHandlers();
		},

		render = function()
		{
			// Align dropdown correctly
			var inputWidth = self.$elem.width(),
				btnWidth = self.$dropBtnDiv.width(),
				totalWidth = inputWidth - 3,
				dropDownLeft = -inputWidth + btnWidth,
				dropDownWidth = self.$dropDown.width();

			dropDownWidth < totalWidth ?
self.$dropDown.width(totalWidth+'px') : null;
			self.$dropDown.css('left',dropDownLeft+'px');
			self.$dropDown.css('max-height','150px');
			self.$dropDown.css('overflow-y','scroll');
			self.$dropDown.css('left',dropDownLeft+'px');
		},

		addEventHandlers = function()
		{
			self.$input.bind('focus', drop);
			self.$input.bind('blur', pick);

			if(self.options.updateList)
			{
				self.$input.bind('keyup', updateList);
			}

			self.$dropDown.on('mouseenter',function() {
				highlight('clear');
				self.$input.unbind('blur', pick);
			});
			self.$dropDown.on('mouseleave',function(event) {
				self.$input.bind('blur', pick);
			});

			self.$dropBtn.on('click', focusCombo);

			self.$dropDown.find('li').on('click', updateCombo);
			self.$dropDown.find('li a').on('mouseenter',
function(){
				$(this).addClass('hover');
				self.$currHovered = $(this);
			});
			self.$dropDown.find('li a').on('mouseleave',
function(){
				$(this).removeClass('hover');
			});
		},

		drop = function()
		{
			if(!self.$dropDown.isEmpty)
			{
				var dropDownHeight = self.$dropDown.height(),
					inputClientHeight = self.$input[0].clientHeight,
					inputHeight = self.$input.height(),
					dropDownTop = -(inputHeight + dropDownHeight);

				// Drop it in viewable area
				self.$dropDown.css('top','100%');

				self.$elem.addClass('nav-hover');
				self.$dropBtnDiv.addClass('open');

				if(!inViewport(self.$dropDown))
				{
					self.$dropDown.css('top',dropDownTop+'px');
				}

				// Prevent form submit on enter press
				self.$input.bind('keypress keydown keyup', preventSubmit);
			}
		},

		pick = function()
		{
			self.$elem.removeClass('nav-hover');
			self.$dropBtnDiv.removeClass('open');

			if(self.$dropBtn.isClicked)
			{
				self.$dropBtn.isClicked = false;
				self.$dropDown.isEmpty = true;
			}

			highlight('clear');

			self.$input.unbind('keypress keydown keyup', preventSubmit);
		},

		focusCombo = function()
		{
			var $options = self.$dropDownOptions;
			$options.show();
			self.$dropBtn.isClicked = self.$dropDown.isEmpty;
			self.$dropDown.isEmpty = false;
			self.$input.focus();
		},

		updateCombo = function(event)
		{
			var selectedOption = $(event.target).text();
			self.$input.val(selectedOption);
			pick();
			return false;
		},

		updateList = function(event)
		{
			var keycode = event && (event.keycode || event.which);
			keycode = event.ctrlKey || event.altKey ? -1 : keycode;

			if ((keycode > 47 && keycode < 59) || (keycode > 62
&& keycode < 127) || keycode == 32  || keycode == 8)
			{
				var text = self.$input.val().toLowerCase(),
					$options = self.$dropDownOptions,
					hiddenOptions = 0,
					moveHilighter = false;
				$options.each(function()
				{
					 if(this.innerHTML.toLowerCase().indexOf(text) == 0)
					 {
					 	$(this).show();
					 }
					 else
					 {
					 	$(this).hide();
					 	if($(this).hasClass('hover'))
					 	{
					 		moveHilighter = true;
					 	}

					 	hiddenOptions++;
					 }
				});

				if(hiddenOptions == $options.length)
				{
					self.$dropDown.isEmpty = true;
					pick();
				}
				else
				{
					self.$dropDown.isEmpty = false;
					if(moveHilighter)
					{
						highlight("clear");
					}
					drop();
				}
			}
			else if(!self.$dropDown.isEmpty)
			{
				// Change selected option in list
				if(keycode == 38)
				{
					highlight("prev");
				}
				else if(keycode == 40)
				{
					highlight("next");
				}
				else if(keycode == 13 && self.$currHovered != null)
				{
					self.$input.val(self.$currHovered.html());
					pick();
				}
			}
		},

		highlight = function(newHighlight)
		{
			if(newHighlight == "next" || newHighlight == "prev")
			{
				var $visibleOptions =
self.$dropDownOptions.filter(':visible'),
					$currHovered = $visibleOptions.filter('.hover'),
					index = $visibleOptions.index($currHovered),
					$optionToHover;

				// Change selected option in list
				if(newHighlight == "prev")
				{
					index = index == -1 ? $visibleOptions.length -1 :  index - 1;
				}
				else
				{
					index = index == $visibleOptions.length - 1 ? 0 : index + 1;
				}

				if($currHovered.length != 0)
				{
					$currHovered.removeClass('hover');
				}

				$optionToHover = $visibleOptions.eq(index);
				self.$currHovered = $optionToHover;
				self.$currHovered.addClass('hover');

				scrollTo(self.$dropDown, self.$currHovered);
			}
			else if(newHighlight == "clear")
			{
				self.$currHovered != null ?
self.$currHovered.removeClass('hover') : null;
				self.$currHovered = null;
			}
		},

		// Helper functions
		inViewport = function(el)
		{
		    var rect = el[0].getBoundingClientRect();
		    return (
		        rect.top >= 0 &&
		        rect.left >= 0 &&
		        rect.bottom <= (window.innerHeight ||
document.documentElement.clientHeight) && /*or $(window).height()
*/
		        rect.right <= (window.innerWidth ||
document.documentElement.clientWidth) /*or $(window).width() */
		        );
		},

		scrollTo = function(p, e)
		{
			z = p[0].getBoundingClientRect();
			r = e[0].getBoundingClientRect();

			if(!(r.top >= z.top && r.left >= z.left &&
(r.top+r.height) <= (z.top+z.height)))
			{
				var value = r.top - z.top + p.scrollTop();
				p.scrollTop(value);
			}
		},

		preventSubmit = function(event)
		{
			if(event.keyCode == 13)
			{
				event.preventDefault();
			}
		};

		init(options, elem);
	};
	$.fn.ComboTransform = function(options)
	{
		return this.each(function(){
			combobox(options, this);
		});
	};

	$.fn.ComboTransform.options = {
		updateList : true
	};

	$(function()
	{
		$('div.combobox').ComboTransform({updateList : true});
	});
})(jQuery,document);
PKZn�[�heM�
�
js/combobox.jsnu�[���(function(e,t,n){var
i=function(n,i){var
s={},o=function(t,n){s.$elem=e(n);s.options=e.extend({},e.fn.ComboTransform.options,t);s.$input=e(n).find('input[type="text"]');s.$dropBtnDiv=e(n).find("div.btn-group");s.$dropBtn=s.$dropBtnDiv.find('[type="button"]');s.$dropDown=e(n).find("ul.dropdown-menu"),s.$dropDownOptions=s.$dropDown.find("li
a");s.$dropDown.isEmpty=false;s.$dropBtn.isClicked=false;u();a()},u=function(){var
e=s.$elem.width(),t=s.$dropBtnDiv.width(),n=e-3,r=-e+t,i=s.$dropDown.width();i<n?s.$dropDown.width(n+"px"):null;s.$dropDown.css("left",r+"px");s.$dropDown.css("max-height","150px");s.$dropDown.css("overflow-y","scroll");s.$dropDown.css("left",r+"px")},a=function(){s.$input.bind("focus",f);s.$input.bind("blur",l);if(s.options.updateList){s.$input.bind("keyup",p)}s.$dropDown.on("mouseenter",function(){d("clear");s.$input.unbind("blur",l)});s.$dropDown.on("mouseleave",function(e){s.$input.bind("blur",l)});s.$dropBtn.on("click",c);s.$dropDown.find("li").on("click",h);s.$dropDown.find("li
a").on("mouseenter",function(){e(this).addClass("hover");s.$currHovered=e(this)});s.$dropDown.find("li
a").on("mouseleave",function(){e(this).removeClass("hover")})},f=function(){if(!s.$dropDown.isEmpty){var
e=s.$dropDown.height(),t=s.$input[0].clientHeight,n=s.$input.height(),r=-(n+e);s.$dropDown.css("top","100%");s.$elem.addClass("nav-hover");s.$dropBtnDiv.addClass("open");if(!v(s.$dropDown)){s.$dropDown.css("top",r+"px")}s.$input.bind("keypress
keydown
keyup",g)}},l=function(){s.$elem.removeClass("nav-hover");s.$dropBtnDiv.removeClass("open");if(s.$dropBtn.isClicked){s.$dropBtn.isClicked=false;s.$dropDown.isEmpty=true}d("clear");s.$input.unbind("keypress
keydown keyup",g)},c=function(){var
e=s.$dropDownOptions;e.show();s.$dropBtn.isClicked=s.$dropDown.isEmpty;s.$dropDown.isEmpty=false;s.$input.focus()},h=function(t){var
n=e(t.target).text();s.$input.val(n);l();return false},p=function(t){var
n=t&&(t.keycode||t.which);n=t.ctrlKey||t.altKey?-1:n;if(n>47&&n<59||n>62&&n<127||n==32||n==8){var
r=s.$input.val().toLowerCase(),i=s.$dropDownOptions,o=0,u=false;i.each(function(){if(this.innerHTML.toLowerCase().indexOf(r)==0){e(this).show()}else{e(this).hide();if(e(this).hasClass("hover")){u=true}o++}});if(o==i.length){s.$dropDown.isEmpty=true;l()}else{s.$dropDown.isEmpty=false;if(u){d("clear")}f()}}else
if(!s.$dropDown.isEmpty){if(n==38){d("prev")}else
if(n==40){d("next")}else
if(n==13&&s.$currHovered!=null){s.$input.val(s.$currHovered.html());l()}}},d=function(e){if(e=="next"||e=="prev"){var
t=s.$dropDownOptions.filter(":visible"),n=t.filter(".hover"),r=t.index(n),i;if(e=="prev"){r=r==-1?t.length-1:r-1}else{r=r==t.length-1?0:r+1}if(n.length!=0){n.removeClass("hover")}i=t.eq(r);s.$currHovered=i;s.$currHovered.addClass("hover");m(s.$dropDown,s.$currHovered)}else
if(e=="clear"){s.$currHovered!=null?s.$currHovered.removeClass("hover"):null;s.$currHovered=null}},v=function(e){var
n=e[0].getBoundingClientRect();return
n.top>=0&&n.left>=0&&n.bottom<=(window.innerHeight||t.documentElement.clientHeight)&&n.right<=(window.innerWidth||t.documentElement.clientWidth)},m=function(e,t){z=e[0].getBoundingClientRect();r=t[0].getBoundingClientRect();if(!(r.top>=z.top&&r.left>=z.left&&r.top+r.height<=z.top+z.height)){var
n=r.top-z.top+e.scrollTop();e.scrollTop(n)}},g=function(e){if(e.keyCode==13){e.preventDefault()}};o(n,i)};e.fn.ComboTransform=function(e){return
this.each(function(){i(e,this)})};e.fn.ComboTransform.options={updateList:true};e(function(){e("div.combobox").ComboTransform({updateList:true})})})(jQuery,document)
PKZn�[�V�mmjs/core-uncompressed.jsnu�[���/**
 * @copyright  Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// Only define the Joomla namespace if not defined.
Joomla = window.Joomla || {};

// Only define editors if not defined
Joomla.editors = Joomla.editors || {};

// An object to hold each editor instance on page, only define if not
defined.
Joomla.editors.instances = Joomla.editors.instances || {
	/**
	 * *****************************************************************
	 * All Editors MUST register, per instance, the following callbacks:
	 * *****************************************************************
	 *
	 * getValue         Type  Function  Should return the complete data from
the editor
	 *                                  Example: function () { return
this.element.value; }
	 * setValue         Type  Function  Should replace the complete data of
the editor
	 *                                  Example: function (text) { return
this.element.value = text; }
	 * getSelection     Type  Function  Should return the selected text from
the editor
	 *                                  Example: function () { return
this.selectedText; }
	 * replaceSelection Type  Function  Should replace the selected text of
the editor
	 *                                  If nothing selected, will insert the
data at the cursor
	 *                                  Example: function (text) { return
insertAtCursor(this.element, text); }
	 *
	 * USAGE (assuming that jform_articletext is the textarea id)
	 * {
	 *   To get the current editor value:
	 *     
Joomla.editors.instances['jform_articletext'].getValue();
	 *   To set the current editor value:
	 *     
Joomla.editors.instances['jform_articletext'].setValue('Joomla!
rocks');
	 *   To replace(selection) or insert a value at  the current editor
cursor:
	 *      replaceSelection:
Joomla.editors.instances['jform_articletext'].replaceSelection('Joomla!
rocks')
	 * }
	 *
	 * *********************************************************
	 * ANY INTERACTION WITH THE EDITORS SHOULD USE THE ABOVE API
	 * *********************************************************
	 *
	 * jInsertEditorText() @deprecated 4.0
	 */
};

(function( Joomla, document ) {
	"use strict";

	/**
	 * Generic submit form
	 *
	 * @param  {String}  task      The given task
	 * @param  {node}    form      The form element
	 * @param  {bool}    validate  The form element
	 *
	 * @returns  {void}
	 */
	Joomla.submitform = function(task, form, validate) {

		if (!form) {
			form = document.getElementById('adminForm');
		}

		if (task) {
			form.task.value = task;
		}

		// Toggle HTML5 validation
		form.noValidate = !validate;

		if (!validate) {
			form.setAttribute('novalidate', '');
		} else if ( form.hasAttribute('novalidate') ) {
			form.removeAttribute('novalidate');
		}

		// Submit the form.
		// Create the input type="submit"
		var button = document.createElement('input');
		button.style.display = 'none';
		button.type = 'submit';

		// Append it and click it
		form.appendChild(button).click();

		// If "submit" was prevented, make sure we don't get a
build up of buttons
		form.removeChild(button);
	};

	/**
	 * Default function. Can be overriden by the component to add custom logic
	 *
	 * @param  {bool}  task  The given task
	 *
	 * @returns {void}
	 */
	Joomla.submitbutton = function( pressbutton ) {
		Joomla.submitform( pressbutton );
	};

	/**
	 * Custom behavior for JavaScript I18N
	 *
	 * @type {{}}
	 *
	 * Allows you to call Joomla.Text._() to get a translated JavaScript
string pushed in with Text::script() in Joomla.
	 */
	Joomla.Text = {
		strings:   {},

		/**
		 * Translates a string into the current language.
		 *
		 * @param {String} key   The string to translate
		 * @param {String} def   Default string
		 *
		 * @returns {String}
		 */
		'_': function( key, def ) {

			// Check for new strings in the optionsStorage, and load them
			var newStrings = Joomla.getOptions('joomla.jtext');
			if ( newStrings ) {
				this.load(newStrings);

				// Clean up the optionsStorage from useless data
				Joomla.loadOptions({'joomla.jtext': null});
			}

			def = def === undefined ? '' : def;
			key = key.toUpperCase();

			return this.strings[ key ] !== undefined ? this.strings[ key ] : def;
		},

		/**
		 * Load new strings in to Joomla.JText
		 *
		 * @param {Object} object  Object with new strings
		 * @returns {Joomla.JText}
		 */
		load: function( object ) {
			for ( var key in object ) {
				if (!object.hasOwnProperty(key)) continue;
				this.strings[ key.toUpperCase() ] = object[ key ];
			}

			return this;
		}
	};

	/**
	 * Proxy old Joomla.JText to Joomla.Text
	 *
	 * @deprecated 5.0 Use Joomla.Text
	 */
	Joomla.JText = Joomla.Text;

	/**
	 * Joomla options storage
	 *
	 * @type {{}}
	 *
	 * @since 3.7.0
	 */
	Joomla.optionsStorage = Joomla.optionsStorage || null;

	/**
	 * Get script(s) options
	 *
	 * @param  {String}  key  Name in Storage
	 * @param  {mixed}   def  Default value if nothing found
	 *
	 * @return {mixed}
	 *
	 * @since 3.7.0
	 */
	Joomla.getOptions = function( key, def ) {
		// Load options if they not exists
		if (!Joomla.optionsStorage) {
			Joomla.loadOptions();
		}

		return Joomla.optionsStorage[key] !== undefined ?
Joomla.optionsStorage[key] : def;
	};

	/**
	 * Load new options from given options object or from Element
	 *
	 * @param  {Object|undefined}  options  The options object to load. Eg
{"com_foobar" : {"option1": 1, "option2": 2}}
	 *
	 * @since 3.7.0
	 */
	Joomla.loadOptions = function( options ) {
		// Load form the script container
		if (!options) {
			var elements =
document.querySelectorAll('.joomla-script-options.new'),
			    str, element, option, counter = 0;

			for (var i = 0, l = elements.length; i < l; i++) {
				element = elements[i];
				str     = element.text || element.textContent;
				option  = JSON.parse(str);

				if (option) {
					Joomla.loadOptions(option);
					counter++;
				}

				element.className = element.className.replace(' new', '
loaded');
			}

			if (counter) {
				return;
			}
		}

		// Initial loading
		if (!Joomla.optionsStorage) {
			Joomla.optionsStorage = options || {};
		}
		// Merge with existing
		else if ( options ) {
			for (var p in options) {
				if (options.hasOwnProperty(p)) {
					Joomla.optionsStorage[p] = options[p];
				}
			}
		}
	};

	/**
	 * Method to replace all request tokens on the page with a new one.
	 *
	 * @param {String}  newToken  The token
	 *
	 * Used in Joomla Installation
	 */
	Joomla.replaceTokens = function( newToken ) {
		if (!/^[0-9A-F]{32}$/i.test(newToken)) { return; }

		var els = document.getElementsByTagName( 'input' ),
		    i, el, n;

		for ( i = 0, n = els.length; i < n; i++ ) {
			el = els[i];

			if ( el.type == 'hidden' && el.value == '1'
&& el.name.length == 32 ) {
				el.name = newToken;
			}
		}
	};

	/**
	 * USED IN:
administrator/components/com_banners/views/client/tmpl/default.php
	 * Actually, probably not used anywhere. Can we deprecate in favor of
<input type="email">?
	 *
	 * Verifies if the string is in a valid email format
	 *
	 * @param  {string}  text  The text for validation
	 *
	 * @return {boolean}
	 *
	 * @deprecated  4.0 No replacement. Use formvalidator
	 */
	Joomla.isEmail = function( text ) {
		console.warn('Joomla.isEmail() is deprecated, use the formvalidator
instead');

		var regex =
/^[\w.!#$%&’*+\/=?^`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9-]{2,})+$/i;
		return regex.test( text );
	};

	/**
	 * USED IN: all list forms.
	 *
	 * Toggles the check state of a group of boxes
	 *
	 * Checkboxes must have an id attribute in the form cb0, cb1...
	 *
	 * @param   {mixed}   checkbox  The number of box to 'check',
for a checkbox element
	 * @param   {string}  stub      An alternative field name
	 *
	 * @return  {boolean}
	 */
	Joomla.checkAll = function( checkbox, stub ) {
		if (!checkbox.form) return false;

		stub = stub ? stub : 'cb';

		var c = 0,
		    i, e, n;

		for ( i = 0, n = checkbox.form.elements.length; i < n; i++ ) {
			e = checkbox.form.elements[ i ];

			if ( e.type == checkbox.type && e.id.indexOf( stub ) === 0 ) {
				e.checked = checkbox.checked;
				c += e.checked ? 1 : 0;
			}
		}

		if ( checkbox.form.boxchecked ) {
			checkbox.form.boxchecked.value = c;
		}

		return true;
	};

	/**
	 * Render messages send via JSON
	 * Used by some javascripts such as validate.js
	 *
	 * @param   {object}  messages    JavaScript object containing the
messages to render. Example:
	 *                              var messages = {
	 *                                  "message": ["Message
one", "Message two"],
	 *                                  "error": ["Error
one", "Error two"]
	 *                              };
	 * @return  {void}
	 */
	Joomla.renderMessages = function( messages ) {
		Joomla.removeMessages();

		var messageContainer = document.getElementById(
'system-message-container' ),
		    type, typeMessages, messagesBox, title, titleWrapper, i,
messageWrapper, alertClass;

		for ( type in messages ) {
			if ( !messages.hasOwnProperty( type ) ) { continue; }
			// Array of messages of this type
			typeMessages = messages[ type ];

			// Create the alert box
			messagesBox = document.createElement( 'div' );

			// Message class
			alertClass = (type === 'notice') ? 'alert-info' :
'alert-' + type;
			alertClass = (type === 'message') ? 'alert-success'
: alertClass;
			alertClass = (type === 'error') ? 'alert-error
alert-danger' : alertClass;

			messagesBox.className = 'alert ' + alertClass;

			// Close button
			var buttonWrapper = document.createElement( 'button' );
			buttonWrapper.setAttribute('type', 'button');
			buttonWrapper.setAttribute('data-dismiss', 'alert');
			buttonWrapper.className = 'close';
			buttonWrapper.innerHTML = '×';
			messagesBox.appendChild( buttonWrapper );

			// Title
			title = Joomla.JText._( type );

			// Skip titles with untranslated strings
			if ( typeof title != 'undefined' ) {
				titleWrapper = document.createElement( 'h4' );
				titleWrapper.className = 'alert-heading';
				titleWrapper.innerHTML = Joomla.JText._( type );
				messagesBox.appendChild( titleWrapper );
			}

			// Add messages to the message box
			for ( i = typeMessages.length - 1; i >= 0; i-- ) {
				messageWrapper = document.createElement( 'div' );
				messageWrapper.innerHTML = typeMessages[ i ];
				messagesBox.appendChild( messageWrapper );
			}

			messageContainer.appendChild( messagesBox );
		}
	};

	/**
	 * Remove messages
	 *
	 * @return  {void}
	 */
	Joomla.removeMessages = function() {
		var messageContainer = document.getElementById(
'system-message-container' );

		// Empty container with a while for Chrome performance issues
		while ( messageContainer.firstChild ) messageContainer.removeChild(
messageContainer.firstChild );

		// Fix Chrome bug not updating element height
		messageContainer.style.display = 'none';
		messageContainer.offsetHeight;
		messageContainer.style.display = '';
	};

	/**
	 * Treat AJAX errors.
	 * Used by some javascripts such as sendtestmail.js and permissions.js
	 *
	 * @param   {object}  xhr         XHR object.
	 * @param   {string}  textStatus  Type of error that occurred.
	 * @param   {string}  error       Textual portion of the HTTP status.
	 *
	 * @return  {object}  JavaScript object containing the system error
message.
	 *
	 * @since  3.6.0
	 */
	Joomla.ajaxErrorsMessages = function( xhr, textStatus, error ) {
		var msg = {};

		// For jQuery jqXHR
		if (textStatus === 'parsererror')
		{
			// Html entity encode.
			var encodedJson = xhr.responseText.trim();

			var buf = [];
			for (var i = encodedJson.length-1; i >= 0; i--) {
				buf.unshift( [ '&#', encodedJson[i].charCodeAt(),
';' ].join('') );
			}

			encodedJson = buf.join('');

			msg.error = [
Joomla.JText._('JLIB_JS_AJAX_ERROR_PARSE').replace('%s',
encodedJson) ];
		}
		else if (textStatus === 'nocontent')
		{
			msg.error = [ Joomla.JText._('JLIB_JS_AJAX_ERROR_NO_CONTENT')
];
		}
		else if (textStatus === 'timeout')
		{
			msg.error = [ Joomla.JText._('JLIB_JS_AJAX_ERROR_TIMEOUT') ];
		}
		else if (textStatus === 'abort')
		{
			msg.error = [
Joomla.JText._('JLIB_JS_AJAX_ERROR_CONNECTION_ABORT') ];
		}
		// For vannila XHR
		else if (xhr.responseJSON && xhr.responseJSON.message)
		{
			msg.error = [
Joomla.JText._('JLIB_JS_AJAX_ERROR_OTHER').replace('%s',
xhr.status) + ' <em>' + xhr.responseJSON.message +
'</em>' ];
		}
		else if (xhr.statusText)
		{
			msg.error = [
Joomla.JText._('JLIB_JS_AJAX_ERROR_OTHER').replace('%s',
xhr.status) + ' <em>' + xhr.statusText +
'</em>' ];
		}
		else
		{
			msg.error = [
Joomla.JText._('JLIB_JS_AJAX_ERROR_OTHER').replace('%s',
xhr.status) ];
		}

		return msg;
	};

	/**
	 * USED IN:
administrator/components/com_cache/views/cache/tmpl/default.php
	 *
administrator/components/com_installer/views/discover/tmpl/default_item.php
	 *
administrator/components/com_installer/views/update/tmpl/default_item.php
	 * administrator/components/com_languages/helpers/html/languages.php
	 * libraries/joomla/html/html/grid.php
	 *
	 * @param  {boolean}  isitchecked  Flag for checked
	 * @param  {node}     form         The form
	 *
	 * @return  {void}
	 */
	Joomla.isChecked = function( isitchecked, form ) {
		if ( typeof form  === 'undefined' ) {
			form = document.getElementById( 'adminForm' );
		}

		form.boxchecked.value = isitchecked ? parseInt(form.boxchecked.value) + 1
: parseInt(form.boxchecked.value) - 1;

		// If we don't have a checkall-toggle, done.
		if ( !form.elements[ 'checkall-toggle' ] ) return;

		// Toggle main toggle checkbox depending on checkbox selection
		var c = true, i, e, n;

		for ( i = 0, n = form.elements.length; i < n; i++ ) {
			e = form.elements[ i ];

			if ( e.type == 'checkbox' && e.name !=
'checkall-toggle' && !e.checked ) {
				c = false;
				break;
			}
		}

		form.elements[ 'checkall-toggle' ].checked = c;
	};

	/**
	 * USED IN: libraries/joomla/html/toolbar/button/help.php
	 *
	 * Pops up a new window in the middle of the screen
	 *
	 * @deprecated  4.0 No replacement
	 */
	Joomla.popupWindow = function( mypage, myname, w, h, scroll ) {
		console.warn('Joomla.popupWindow() is deprecated without a
replacement!');

		var winl = ( screen.width - w ) / 2,
		    wint = ( screen.height - h ) / 2,
		    winprops = 'height=' + h +
			    ',width=' + w +
			    ',top=' + wint +
			    ',left=' + winl +
			    ',scrollbars=' + scroll +
			    ',resizable';

		window.open( mypage, myname, winprops )
			.window.focus();
	};

	/**
	 * USED IN: libraries/joomla/html/html/grid.php
	 * In other words, on any reorderable table
	 *
	 * @param  {string}  order  The order value
	 * @param  {string}  dir    The direction
	 * @param  {string}  task   The task
	 * @param  {node}    form   The form
	 *
	 * return  {void}
	 */
	Joomla.tableOrdering = function( order, dir, task, form ) {
		if ( typeof form  === 'undefined' ) {
			form = document.getElementById( 'adminForm' );
		}

		form.filter_order.value = order;
		form.filter_order_Dir.value = dir;
		Joomla.submitform( task, form );
	};

	/**
	 * USED IN:
administrator/components/com_modules/views/module/tmpl/default.php
	 *
	 * Writes a dynamically generated list
	 *
	 * @param string
	 *          The parameters to insert into the <select> tag
	 * @param array
	 *          A javascript array of list options in the form
[key,value,text]
	 * @param string
	 *          The key to display for the initial state of the list
	 * @param string
	 *          The original key that was selected
	 * @param string
	 *          The original item value that was selected
	 * @param string
	 *          The elem where the list will be written
	 *
	 * @deprecated  4.0 No replacement
	 */
	window.writeDynaList = function ( selectParams, source, key, orig_key,
orig_val, element ) {
		console.warn('window.writeDynaList() is deprecated without a
replacement!');

		var select = document.createElement('select');
		var params = selectParams.split(' ');

		for (var l = 0; l < params.length; l++) {
			var par = params[l].split('=');

			// make sure the attribute / content can not be used for scripting
			if (par[0].trim().substr(0, 2).toLowerCase() === "on"
				|| par[0].trim().toLowerCase() === "href") {
				continue;
			}

			select.setAttribute(par[0], par[1].replace(/\"/g, ''));
		}

		var hasSelection = key == orig_key, i, selected, item;

		for (i = 0; i < source.length; i++) {
			item = source[i];

			if (item[0] != key) { continue; }

			selected = hasSelection ? orig_val == item[1] : i === 0;

			var el = document.createElement('option');
			el.setAttribute('value', item[1]);
			el.innerText = item[2];

			if (selected) {
				el.setAttribute('selected', 'selected');
			}

			select.appendChild(el);
		}

		if (element) {
			element.appendChild(select);
		} else {
			document.body.appendChild(select);
		}
	};

	/**
	 * USED IN:
administrator/components/com_content/views/article/view.html.php
	 * actually, probably not used anywhere.
	 *
	 * Changes a dynamically generated list
	 *
	 * @param string
	 *          The name of the list to change
	 * @param array
	 *          A javascript array of list options in the form
[key,value,text]
	 * @param string
	 *          The key to display
	 * @param string
	 *          The original key that was selected
	 * @param string
	 *          The original item value that was selected
	 *
	 * @deprecated  4.0 No replacement
	 */
	window.changeDynaList = function ( listname, source, key, orig_key,
orig_val ) {
		console.warn('window.changeDynaList() is deprecated without a
replacement!');

		var list = document.adminForm[ listname ],
		    hasSelection = key == orig_key,
		    i, x, item, opt;

		// empty the list
		while ( list.firstChild ) list.removeChild( list.firstChild );

		i = 0;

		for ( x in source ) {
			if (!source.hasOwnProperty(x)) { continue; }

			item = source[x];

			if ( item[ 0 ] != key ) { continue; }

			opt = new Option();
			opt.value = item[ 1 ];
			opt.text = item[ 2 ];

			if ( ( hasSelection && orig_val == opt.value ) || (!hasSelection
&& i === 0) ) {
				opt.selected = true;
			}

			list.options[ i++ ] = opt;
		}

		list.length = i;
	};

	/**
	 * USED IN:
administrator/components/com_menus/views/menus/tmpl/default.php
	 * Probably not used at all
	 *
	 * @param radioObj
	 * @return
	 *
	 * @deprecated  4.0 No replacement
	 */
	// return the value of the radio button that is checked
	// return an empty string if none are checked, or
	// there are no radio buttons
	window.radioGetCheckedValue = function ( radioObj ) {
		console.warn('window.radioGetCheckedValue() is deprecated without a
replacement!');

		if ( !radioObj ) { return ''; }

		var n = radioObj.length,
		    i;

		if ( n === undefined ) {
			return radioObj.checked ? radioObj.value : '';
		}

		for ( i = 0; i < n; i++ ) {
			if ( radioObj[ i ].checked ) {
				return radioObj[ i ].value;
			}
		}

		return '';
	};

	/**
	 * USED IN: administrator/components/com_users/views/mail/tmpl/default.php
	 * Let's get rid of this and kill it
	 *
	 * @param frmName
	 * @param srcListName
	 * @return
	 *
	 * @deprecated  4.0 No replacement
	 */
	window.getSelectedValue = function ( frmName, srcListName ) {
		console.warn('window.getSelectedValue() is deprecated without a
replacement!');

		var srcList = document[ frmName ][ srcListName ],
		    i = srcList.selectedIndex;

		if ( i !== null && i > -1 ) {
			return srcList.options[ i ].value;
		} else {
			return null;
		}
	};

	/**
	 * USED IN: all over :)
	 *
	 * @param id
	 * @param task
	 * @return
	 *
	 * @deprecated 4.0  Use Joomla.listItemTask() instead
	 */
	window.listItemTask = function ( id, task ) {
		console.warn('window.listItemTask() is deprecated use
Joomla.listItemTask() instead');

		return Joomla.listItemTask( id, task );
	};

	/**
	 * USED IN: all over :)
	 *
	 * @param  {string}  id    The id
	 * @param  {string}  task  The task
	 *
	 * @return {boolean}
	 */
	Joomla.listItemTask = function ( id, task ) {
		var f = document.adminForm,
		    i = 0, cbx,
		    cb = f[ id ];

		if ( !cb ) return false;

		while ( true ) {
			cbx = f[ 'cb' + i ];

			if ( !cbx ) break;

			cbx.checked = false;

			i++;
		}

		cb.checked = true;
		f.boxchecked.value = 1;
		window.submitform( task );

		return false;
	};

	/**
	 * Default function. Usually would be overriden by the component
	 *
	 * @deprecated 4.0  Use Joomla.submitbutton() instead.
	 */
	window.submitbutton = function ( pressbutton ) {
		console.warn('window.submitbutton() is deprecated use
Joomla.submitbutton() instead');

		Joomla.submitbutton( pressbutton );
	};

	/**
	 * Submit the admin form
	 *
	 * @deprecated 4.0  Use Joomla.submitform() instead.
	 */
	window.submitform = function ( pressbutton ) {
		console.warn('window.submitform() is deprecated use
Joomla.submitform() instead');

		Joomla.submitform(pressbutton);
	};

	// needed for Table Column ordering
	/**
	 * USED IN: libraries/joomla/html/html/grid.php
	 * There's a better way to do this now, can we try to kill it?
	 *
	 * @deprecated 4.0  No replacement
	 */
	window.saveorder = function ( n, task ) {
		console.warn('window.saveorder() is deprecated without a
replacement!');

		window.checkAll_button( n, task );
	};

	/**
	 * Checks all the boxes unless one is missing then it assumes it's
checked out.
	 * Weird. Probably only used by ^saveorder
	 *
	 * @param   integer  n     The total number of checkboxes expected
	 * @param   string   task  The task to perform
	 *
	 * @return  void
	 *
	 * @deprecated 4.0  No replacement
	 */
	window.checkAll_button = function ( n, task ) {
		console.warn('window.checkAll_button() is deprecated without a
replacement!');

		task = task ? task : 'saveorder';

		var j, box;

		for ( j = 0; j <= n; j++ ) {
			box = document.adminForm[ 'cb' + j ];

			if ( box ) {
				box.checked = true;
			} else {
				alert( "You cannot change the order of items, as an item in the
list is `Checked Out`" );
				return;
			}
		}

		Joomla.submitform( task );
	};

	/**
	 * Add Joomla! loading image layer.
	 *
	 * Used in:
/administrator/components/com_installer/views/languages/tmpl/default.php
	 *          /installation/template/js/installation.js
	 *
	 * @param   {String}       task           The task to do [load, show,
hide] (defaults to show).
	 * @param   {HTMLElement}  parentElement  The HTML element where we are
appending the layer (defaults to body).
	 *
	 * @return  {HTMLElement}  The HTML loading layer element.
	 *
	 * @since  3.6.0
	 *
	 * @deprecated  4.0 No direct replacement.
	 *              4.0 will introduce a web component for the loading
spinner, therefore the spinner will need to
	 *              explicitly be loaded in all relevant pages.
	 */
	Joomla.loadingLayer = function(task, parentElement) {
		// Set default values.
		task          = task || 'show';
		parentElement = parentElement || document.body;

		// Create the loading layer (hidden by default).
		if (task === 'load')
		{
			// Gets the site base path
			var systemPaths = Joomla.getOptions('system.paths') || {},
			    basePath    = systemPaths.root || '';

			var loadingDiv = document.createElement('div');

			loadingDiv.id = 'loading-logo';

			// The loading layer CSS styles are JS hardcoded so they can be used
without adding CSS.

			// Loading layer style and positioning.
			loadingDiv.style['position']              = 'fixed';
			loadingDiv.style['top']                   = '0';
			loadingDiv.style['left']                  = '0';
			loadingDiv.style['width']                 = '100%';
			loadingDiv.style['height']                = '100%';
			loadingDiv.style['opacity']               = '0.8';
			loadingDiv.style['filter']                =
'alpha(opacity=80)';
			loadingDiv.style['overflow']              =
'hidden';
			loadingDiv.style['z-index']               = '10000';
			loadingDiv.style['display']               = 'none';
			loadingDiv.style['background-color']      = '#fff';

			// Loading logo positioning.
			loadingDiv.style['background-image']      =
'url("' + basePath +
'/media/jui/images/ajax-loader.gif")';
			loadingDiv.style['background-position']   =
'center';
			loadingDiv.style['background-repeat']     =
'no-repeat';
			loadingDiv.style['background-attachment'] = 'fixed';

			parentElement.appendChild(loadingDiv);
		}
		// Show or hide the layer.
		else
		{
			if (!document.getElementById('loading-logo'))
			{
				Joomla.loadingLayer('load', parentElement);
			}

			document.getElementById('loading-logo').style['display']
= (task == 'show') ? 'block' : 'none';
		}

		return document.getElementById('loading-logo');
	};

	/**
	 * Method to Extend Objects
	 *
	 * @param  {Object}  destination
	 * @param  {Object}  source
	 *
	 * @return Object
	 */
	Joomla.extend = function (destination, source) {
		for (var p in source) {
			if (source.hasOwnProperty(p)) {
				destination[p] = source[p];
			}
		}

		return destination;
	};

	/**
	 * Method to perform AJAX request
	 *
	 * @param {Object} options   Request options:
	 * {
	 *    url:       'index.php',  // Request URL
	 *    method:    'GET',        // Request method GET (default),
POST
	 *    data:      null,         // Data to be sent, see
https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/send
	 *    perform:   true,         // Perform the request immediately, or
return XMLHttpRequest instance and perform it later
	 *    headers:   null,         // Object of custom headers, eg
{'X-Foo': 'Bar', 'X-Bar': 'Foo'}
	 *
	 *    onBefore:  function(xhr){}            // Callback on before the
request
	 *    onSuccess: function(response, xhr){}, // Callback on the request
success
	 *    onError:   function(xhr){},           // Callback on the request
error
	 * }
	 *
	 * @return XMLHttpRequest|Boolean
	 *
	 * @example
	 *
	 * 	Joomla.request({
	 *		url: 'index.php?option=com_example&view=example',
	 *		onSuccess: function(response, xhr){
	 *			console.log(response);
	 *		}
	 * 	})
	 *
	 * @see    https://developer.mozilla.org/docs/Web/API/XMLHttpRequest
	 */
	Joomla.request = function (options) {

		// Prepare the options
		options = Joomla.extend({
			url:    '',
			method: 'GET',
			data:    null,
			perform: true
		}, options);

		// Use POST for send the data
		options.method = options.data ? 'POST' :
options.method.toUpperCase();

		// Set up XMLHttpRequest instance
		try{
			var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new
ActiveXObject('MSXML2.XMLHTTP.3.0');

			xhr.open(options.method, options.url, true);

			// Set the headers
			xhr.setRequestHeader('X-Requested-With',
'XMLHttpRequest');
			xhr.setRequestHeader('X-Ajax-Engine', 'Joomla!');

			if (options.method === 'POST') {
				var token = Joomla.getOptions('csrf.token', '');

				if (token) {
					xhr.setRequestHeader('X-CSRF-Token', token);
				}

				if (!options.headers || !options.headers['Content-Type']) {
					xhr.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
				}
			}

			// Custom headers
			if (options.headers){
				for (var p in options.headers) {
					if (options.headers.hasOwnProperty(p)) {
						xhr.setRequestHeader(p, options.headers[p]);
					}
				}
			}

			xhr.onreadystatechange = function () {
				// Request not finished
				if (xhr.readyState !== 4) return;

				// Request finished and response is ready
				if (xhr.status === 200) {
					if(options.onSuccess) {
						options.onSuccess.call(window, xhr.responseText, xhr);
					}
				} else if(options.onError) {
					options.onError.call(window, xhr);
				}
			};

			// Do request
			if (options.perform) {
				if (options.onBefore && options.onBefore.call(window, xhr) ===
false) {
					// Request interrupted
					return xhr;
				}

				xhr.send(options.data);
			}

		} catch (error) {
			window.console ? console.log(error) : null;
			return false;
		}

		return xhr;
	};

}( Joomla, document ));
PKZn�[���#h"h"
js/core.jsnu�[���Joomla=window.Joomla||{},Joomla.editors=Joomla.editors||{},Joomla.editors.instances=Joomla.editors.instances||{},function(e,t){"use
strict";e.submitform=function(e,o,n){o||(o=t.getElementById("adminForm")),e&&(o.task.value=e),o.noValidate=!n,n?o.hasAttribute("novalidate")&&o.removeAttribute("novalidate"):o.setAttribute("novalidate","");var
r=t.createElement("input");r.style.display="none",r.type="submit",o.appendChild(r).click(),o.removeChild(r)},e.submitbutton=function(t){e.submitform(t)},e.Text={strings:{},_:function(t,o){var
n=e.getOptions("joomla.jtext");return
n&&(this.load(n),e.loadOptions({"joomla.jtext":null})),o=void
0===o?"":o,t=t.toUpperCase(),void
0!==this.strings[t]?this.strings[t]:o},load:function(e){for(var t in
e)e.hasOwnProperty(t)&&(this.strings[t.toUpperCase()]=e[t]);return
this}},e.JText=e.Text,e.optionsStorage=e.optionsStorage||null,e.getOptions=function(t,o){return
e.optionsStorage||e.loadOptions(),void
0!==e.optionsStorage[t]?e.optionsStorage[t]:o},e.loadOptions=function(o){if(!o){for(var
n,r,a,i=t.querySelectorAll(".joomla-script-options.new"),s=0,l=0,d=i.length;l<d;l++)n=(r=i[l]).text||r.textContent,(a=JSON.parse(n))&&(e.loadOptions(a),s++),r.className=r.className.replace("
new","
loaded");if(s)return}if(e.optionsStorage){if(o)for(var c in
o)o.hasOwnProperty(c)&&(e.optionsStorage[c]=o[c])}else
e.optionsStorage=o||{}},e.replaceTokens=function(e){if(/^[0-9A-F]{32}$/i.test(e)){var
o,n,r,a=t.getElementsByTagName("input");for(o=0,r=a.length;o<r;o++)"hidden"==(n=a[o]).type&&"1"==n.value&&32==n.name.length&&(n.name=e)}},e.isEmail=function(e){console.warn("Joomla.isEmail()
is deprecated, use the formvalidator
instead");return/^[\w.!#$%&’*+\/=?^`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9-]{2,})+$/i.test(e)},e.checkAll=function(e,t){if(!e.form)return!1;t=t||"cb";var
o,n,r,a=0;for(o=0,r=e.form.elements.length;o<r;o++)(n=e.form.elements[o]).type==e.type&&0===n.id.indexOf(t)&&(n.checked=e.checked,a+=n.checked?1:0);return
e.form.boxchecked&&(e.form.boxchecked.value=a),!0},e.renderMessages=function(o){e.removeMessages();var
n,r,a,i,s,l,d,c=t.getElementById("system-message-container");for(n
in
o)if(o.hasOwnProperty(n)){r=o[n],a=t.createElement("div"),d="notice"===n?"alert-info":"alert-"+n,d="message"===n?"alert-success":d,d="error"===n?"alert-error
alert-danger":d,a.className="alert "+d;var
u=t.createElement("button");for(u.setAttribute("type","button"),u.setAttribute("data-dismiss","alert"),u.className="close",u.innerHTML="×",a.appendChild(u),void
0!==e.JText._(n)&&((i=t.createElement("h4")).className="alert-heading",i.innerHTML=e.JText._(n),a.appendChild(i)),s=r.length-1;s>=0;s--)(l=t.createElement("div")).innerHTML=r[s],a.appendChild(l);c.appendChild(a)}},e.removeMessages=function(){for(var
e=t.getElementById("system-message-container");e.firstChild;)e.removeChild(e.firstChild);e.style.display="none",e.offsetHeight,e.style.display=""},e.ajaxErrorsMessages=function(t,o,n){var
r={};if("parsererror"===o){for(var
a=t.responseText.trim(),i=[],s=a.length-1;s>=0;s--)i.unshift(["&#",a[s].charCodeAt(),";"].join(""));a=i.join(""),r.error=[e.JText._("JLIB_JS_AJAX_ERROR_PARSE").replace("%s",a)]}else"nocontent"===o?r.error=[e.JText._("JLIB_JS_AJAX_ERROR_NO_CONTENT")]:"timeout"===o?r.error=[e.JText._("JLIB_JS_AJAX_ERROR_TIMEOUT")]:"abort"===o?r.error=[e.JText._("JLIB_JS_AJAX_ERROR_CONNECTION_ABORT")]:t.responseJSON&&t.responseJSON.message?r.error=[e.JText._("JLIB_JS_AJAX_ERROR_OTHER").replace("%s",t.status)+"
<em>"+t.responseJSON.message+"</em>"]:t.statusText?r.error=[e.JText._("JLIB_JS_AJAX_ERROR_OTHER").replace("%s",t.status)+"
<em>"+t.statusText+"</em>"]:r.error=[e.JText._("JLIB_JS_AJAX_ERROR_OTHER").replace("%s",t.status)];return
r},e.isChecked=function(e,o){if(void
0===o&&(o=t.getElementById("adminForm")),o.boxchecked.value=e?parseInt(o.boxchecked.value)+1:parseInt(o.boxchecked.value)-1,o.elements["checkall-toggle"]){var
n,r,a,i=!0;for(n=0,a=o.elements.length;n<a;n++)if("checkbox"==(r=o.elements[n]).type&&"checkall-toggle"!=r.name&&!r.checked){i=!1;break}o.elements["checkall-toggle"].checked=i}},e.popupWindow=function(e,t,o,n,r){console.warn("Joomla.popupWindow()
is deprecated without a replacement!");var
a=(screen.width-o)/2,i="height="+n+",width="+o+",top="+(screen.height-n)/2+",left="+a+",scrollbars="+r+",resizable";window.open(e,t,i).window.focus()},e.tableOrdering=function(o,n,r,a){void
0===a&&(a=t.getElementById("adminForm")),a.filter_order.value=o,a.filter_order_Dir.value=n,e.submitform(r,a)},window.writeDynaList=function(e,o,n,r,a,i){console.warn("window.writeDynaList()
is deprecated without a replacement!");for(var
s=t.createElement("select"),l=e.split("
"),d=0;d<l.length;d++){var
c=l[d].split("=");"on"!==c[0].trim().substr(0,2).toLowerCase()&&"href"!==c[0].trim().toLowerCase()&&s.setAttribute(c[0],c[1].replace(/\"/g,""))}var
u,m,p,h=n==r;for(u=0;u<o.length;u++)if((p=o[u])[0]==n){m=h?a==p[1]:0===u;var
f=t.createElement("option");f.setAttribute("value",p[1]),f.innerText=p[2],m&&f.setAttribute("selected","selected"),s.appendChild(f)}i?i.appendChild(s):t.body.appendChild(s)},window.changeDynaList=function(e,o,n,r,a){console.warn("window.changeDynaList()
is deprecated without a replacement!");for(var
i,s,l,d,c=t.adminForm[e],u=n==r;c.firstChild;)c.removeChild(c.firstChild);i=0;for(s
in o)o.hasOwnProperty(s)&&(l=o[s])[0]==n&&((d=new
Option).value=l[1],d.text=l[2],(u&&a==d.value||!u&&0===i)&&(d.selected=!0),c.options[i++]=d);c.length=i},window.radioGetCheckedValue=function(e){if(console.warn("window.radioGetCheckedValue()
is deprecated without a replacement!"),!e)return"";var
t,o=e.length;if(void 0===o)return
e.checked?e.value:"";for(t=0;t<o;t++)if(e[t].checked)return
e[t].value;return""},window.getSelectedValue=function(e,o){console.warn("window.getSelectedValue()
is deprecated without a replacement!");var
n=t[e][o],r=n.selectedIndex;return
null!==r&&r>-1?n.options[r].value:null},window.listItemTask=function(t,o){return
console.warn("window.listItemTask() is deprecated use
Joomla.listItemTask()
instead"),e.listItemTask(t,o)},e.listItemTask=function(e,o){var
n,r=t.adminForm,a=0,i=r[e];if(!i)return!1;for(;n=r["cb"+a];)n.checked=!1,a++;return
i.checked=!0,r.boxchecked.value=1,window.submitform(o),!1},window.submitbutton=function(t){console.warn("window.submitbutton()
is deprecated use Joomla.submitbutton()
instead"),e.submitbutton(t)},window.submitform=function(t){console.warn("window.submitform()
is deprecated use Joomla.submitform()
instead"),e.submitform(t)},window.saveorder=function(e,t){console.warn("window.saveorder()
is deprecated without a
replacement!"),window.checkAll_button(e,t)},window.checkAll_button=function(o,n){var
r,a;for(console.warn("window.checkAll_button() is deprecated without a
replacement!"),n=n||"saveorder",r=0;r<=o;r++){if(!(a=t.adminForm["cb"+r]))return
void alert("You cannot change the order of items, as an item in the
list is `Checked
Out`");a.checked=!0}e.submitform(n)},e.loadingLayer=function(o,n){if(o=o||"show",n=n||t.body,"load"===o){var
r=(e.getOptions("system.paths")||{}).root||"",a=t.createElement("div");a.id="loading-logo",a.style.position="fixed",a.style.top="0",a.style.left="0",a.style.width="100%",a.style.height="100%",a.style.opacity="0.8",a.style.filter="alpha(opacity=80)",a.style.overflow="hidden",a.style["z-index"]="10000",a.style.display="none",a.style["background-color"]="#fff",a.style["background-image"]='url("'+r+'/media/jui/images/ajax-loader.gif")',a.style["background-position"]="center",a.style["background-repeat"]="no-repeat",a.style["background-attachment"]="fixed",n.appendChild(a)}else
t.getElementById("loading-logo")||e.loadingLayer("load",n),t.getElementById("loading-logo").style.display="show"==o?"block":"none";return
t.getElementById("loading-logo")},e.extend=function(e,t){for(var
o in t)t.hasOwnProperty(o)&&(e[o]=t[o]);return
e},e.request=function(t){(t=e.extend({url:"",method:"GET",data:null,perform:!0},t)).method=t.data?"POST":t.method.toUpperCase();try{var
o=window.XMLHttpRequest?new XMLHttpRequest:new
ActiveXObject("MSXML2.XMLHTTP.3.0");if(o.open(t.method,t.url,!0),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.setRequestHeader("X-Ajax-Engine","Joomla!"),"POST"===t.method){var
n=e.getOptions("csrf.token","");n&&o.setRequestHeader("X-CSRF-Token",n),t.headers&&t.headers["Content-Type"]||o.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}if(t.headers)for(var
r in
t.headers)t.headers.hasOwnProperty(r)&&o.setRequestHeader(r,t.headers[r]);if(o.onreadystatechange=function(){4===o.readyState&&(200===o.status?t.onSuccess&&t.onSuccess.call(window,o.responseText,o):t.onError&&t.onError.call(window,o))},t.perform){if(t.onBefore&&!1===t.onBefore.call(window,o))return
o;o.send(t.data)}}catch(e){return
window.console&&console.log(e),!1}return
o}}(Joomla,document);PKZn�[}��nn
js/fields/calendar-locales/af.jsnu�[���window.JoomlaCalLocale =
{
	today : "Vandag",
	weekend : [0, 6],
	wk : "wk",
	time : "Tyd:",
	days : ["Sondag", "Maandag", "Dinsdag",
"Woensdag", "Donnerdag", "Vrydag",
"Saterdag"],
	shortDays : ["So", "Ma", "Di",
"Wo", "Do", "Vr", "Sa"],
	months : ["Januarie", "Februarie", "Maart",
"April", "Mei", "Junie", "Julie",
"Augustus", "September", "Oktober",
"November", "Desember"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "Mei", "Jun", "Jul",
"Aug", "Sep", "Okt", "Nov",
"Des"],
	AM : "VM",
	PM : "NM",
	am : "vm",
	pm : "nm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Sluit",
	clear: "Stoor"
};
PKZn�[��A���
js/fields/calendar-locales/ar.jsnu�[���window.JoomlaCalLocale =
{
	today : "اليوم",
	weekend : [6, 5],
	wk : "الأسبوع",
	time : "الساعة:",
	days : ["الأحد", "الإثنين",
"الثلاثاء", "الأربعاء",
"الخميس", "الجمعة",
"السبت"],
	shortDays : ["الأحد", "الإثنين",
"الثلاثاء", "الأربعاء",
"الخميس", "الجمعة",
"السبت"],
	months : ["كانون الثّاني", "شباط",
"آذار", "نيسان", "أيّار",
"حزيران", "تمّوز", "آب",
"أيلول", "تشرين الأوّل",
"تشرين الثّاني", "كانون
الأوّل"],
	shortMonths : ["كانون الثّاني",
"شباط", "آذار", "نيسان",
"أيّار", "حزيران", "تمّوز",
"آب", "أيلول", "تشرين
الأوّل", "تشرين الثّاني", "كانون
الأوّل"],
	AM : "ق‌ظ",
	PM :  "ب‌ظ",
	am : "ق‌ظ",
	pm : "ب‌ظ",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "إغلاق",
	clear: "الغاء"
};PKZn�[X��22
js/fields/calendar-locales/bg.jsnu�[���window.JoomlaCalLocale =
{
	today : "Днес",
	weekend : [0, 6],
	wk : "седм",
	time : "Време:",
	days : ["Неделя", "Понеделник",
"Вторник", "Сряда",
"Четвъртък", "Петък",
"Събота"],
	shortDays : ["Нед", "Пон", "Вт",
"Ср", "Чет", "Пет",
"Съб"],
	months : ["Януари", "Февруари",
"Март", "Април", "Май",
"Юни", "Юли", "Август",
"Септември", "Октомври",
"Ноември", "Декември"],
	shortMonths : ["Ян", "Фев", "Мар",
"Апр", "Май", "Юни",
"Юли", "Авг", "Сеп",
"Окт", "Ное", "Дек"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Затвори",
	clear: "Изчисти"
};PKZn�[���
js/fields/calendar-locales/bn.jsnu�[���window.JoomlaCalLocale =
{
	today : "আজ",
	weekend : [0, 6],
	wk : "সপ্তাহ",
	time : "সময়:",
	days : ["রবিবার", "সোমবার",
"মঙ্গলবার", "বুধবার",
"বৃহস্পতিবার",
"শুক্রবার", "শনিবার"],
	shortDays : ["রবি", "সোম",
"মঙ্গল", "বুধ",
"বৃহস্পতি", "শুক্র",
"শনি"],
	months : ["জানুয়ারি",
"ফেব্রুয়ারি", "মার্চ",
"এপ্রিল", "মে", "জুন",
"জুলাই", "আগস্ট",
"সেপ্টেম্বর",
"অক্টোবর", "নভেম্বর",
"ডিসেম্বর"],
	shortMonths : ["জানুয়ারি",
"ফেব্রুয়ারি", "মার্চ",
"এপ্রিল", "মে", "জুন",
"জুলাই", "আগস্ট",
"সেপ্টেম্বর",
"অক্টোবর", "নভেম্বর",
"ডিসেম্বর"],
	AM : "পূর্বাহ্ণ",
	PM : "অপরাহ্ন",
	am : "পূর্বাহ্ণ",
	pm : "অপরাহ্ন",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "প্রস্থান",
	clear: "সংরক্ষণ"
};PKZn�[I���ss
js/fields/calendar-locales/bs.jsnu�[���window.JoomlaCalLocale =
{
	today : "Danas",
	weekend : [0, 6],
	wk : "se",
	time : "Vrijeme:",
	days : ["Nedjelja", "Ponedjeljak", "Utorak",
"Srijeda", "Četvrtak", "Petak",
"Subota"],
	shortDays : ["Ned", "Pon", "Uto",
"Sri", "Čet", "Pet", "Sub"],
	months : ["Januar", "Februar", "Mart",
"April", "Maj", "Juni", "Juli",
"Avgust", "Septembar", "Oktobar",
"Novembar", "Decembar"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "Maj", "Jun", "Jul",
"Avg", "Sep", "Okt", "Nov",
"Dec"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Zatvori",
	clear: "Snimi"
};PKZn�[Znijj
js/fields/calendar-locales/ca.jsnu�[���window.JoomlaCalLocale =
{
	today : "Avui",
	weekend : [0, 6],
	wk : "Setm",
	time : "Hora:",
	days : ["Diumenge", "Dilluns", "Dimarts",
"Dimecres", "Dijous", "Divendres",
"Dissabte"],
	shortDays : ["Du", "Dl", "Dm",
"Dx", "Dj", "Dv", "Ds"],
	months : ["Gener", "Febrer", "Març",
"Abril", "Maig", "Juny", "Juliol",
"Agost", "Setembre", "Octubre",
"Novembre", "Desembre"],
	shortMonths : ["Gen", "Feb", "Mar",
"Abr", "Mai", "Jun", "Jul",
"Ago", "Set", "Oct", "Nov",
"Des"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Tancar",
	clear: "Desar"
};
PKZn�[��>-}}
js/fields/calendar-locales/cs.jsnu�[���window.JoomlaCalLocale =
{
	today : "dnes",
	weekend : [0, 6],
	wk : "kt",
	time : "čas:",
	days : ["neděle", "pondělí", "úterý",
"středa", "čtvrtek", "pátek",
"sobota"],
	shortDays : ["ne", "po", "út",
"st", "čt", "pá", "so"],
	months : ["leden", "únor", "březen",
"duben", "květen", "červen",
"červenec", "srpen", "září",
"říjen", "listopad", "prosinec"],
	shortMonths : ["led", "úno", "bře",
"dub", "kvě", "čen", "čec",
"srp", "zář", "říj", "lis",
"pro"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "zavřít",
	clear: "vymazat"
};PKZn�[�D�^��
js/fields/calendar-locales/cy.jsnu�[���window.JoomlaCalLocale =
{
	today : "Heddiw",
	weekend : [0, 6],
	wk : "wy",
	time : "Amser:",
	days : ["Dydd Sul", "Dydd llun", "Dydd
Mawrth", "Dydd Mercher", "Dydd Iau", "Dydd
Gwener", "Dydd Sadwrn"],
	shortDays : ["Sul", "Llun", "Maw",
"Mer", "Iau", "Gwen", "Sad"],
	months : ["Ionawr", "Chwefror", "Mawrth",
"Ebrill", "Mai", "Mehefin",
"Gorffennaf", "Awst", "Medi",
"Hydref", "Tachwedd", "Rhagfyr"],
	shortMonths : ["Ion", "Chw", "Maw",
"Ebr", "Mai", "Meh", "Gor",
"Awst", "Medi", "Hyd", "Tach",
"Rhag"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Cau",
	clear: "Clirio"
};PKZn�[w��jj
js/fields/calendar-locales/da.jsnu�[���window.JoomlaCalLocale =
{
	today : "I dag",
	weekend : [0, 6],
	wk : "uge",
	time : "Tid:",
	days : ["Søndag", "Mandag", "Tirsdag",
"Onsdag", "Torsdag", "Fredag",
"Lørdag"],
	shortDays : ["Søn", "Man", "Tir",
"Ons", "Tor", "Fre", "Lør"],
	months : ["Januar", "Februar", "Marts",
"April", "Maj", "Juni", "Juli",
"August", "September", "Oktober",
"November", "December"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "Maj", "Jun", "Jul",
"Aug", "Sep", "Okt", "Nov",
"Dec"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Luk",
	clear: "Nulstil"
};PKZn�[���448js/fields/calendar-locales/date/gregorian/date-helper.jsnu�[���!(function(Date){
	'use strict';

	/****************** Gregorian dates ********************/
	/** Constants used for time computations */
	Date.SECOND = 1000 /* milliseconds */;
	Date.MINUTE = 60 * Date.SECOND;
	Date.HOUR   = 60 * Date.MINUTE;
	Date.DAY    = 24 * Date.HOUR;
	Date.WEEK   =  7 * Date.DAY;

	/** MODIFY ONLY THE MARKED PARTS OF THE METHODS **/
	/************ START *************/
	/** INTERFACE METHODS FOR THE CALENDAR PICKER **/

	/********************** *************************/
	/**************** SETTERS ***********************/
	/********************** *************************/

	/** Sets the date for the current date without h/m/s. */
	Date.prototype.setLocalDateOnly = function (dateType, date) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			var tmp = new Date(date);
			this.setDate(1);
			this.setFullYear(tmp.getFullYear());
			this.setMonth(tmp.getMonth());
			this.setDate(tmp.getDate());
		}
	};

	/** Sets the full date for the current date. */
	Date.prototype.setLocalDate = function (dateType, d) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			return this.setDate(d);
		}
	};

	/** Sets the month for the current date. */
	Date.prototype.setLocalMonth = function (dateType, m, d) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			if (d == undefined) this.getDate();
			return this.setMonth(m);
		}
	};

	/** Sets the year for the current date. */
	Date.prototype.setOtherFullYear = function(dateType, y) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			var date = new Date(this);
			date.setFullYear(y);
			if (date.getMonth() != this.getMonth()) this.setDate(28);
			return this.setUTCFullYear(y);
		}
	};

	/** Sets the year for the current date. */
	Date.prototype.setLocalFullYear = function (dateType, y) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			var date = new Date(this);
			date.setFullYear(y);
			if (date.getMonth() != this.getMonth()) this.setDate(28);
			return this.setFullYear(y);
		}
	};

	/********************** *************************/
	/**************** GETTERS ***********************/
	/********************** *************************/

	/** The number of days per week **/
	Date.prototype.getLocalWeekDays = function (dateType, y) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return 6;
		} else {
			return 6; // 7 days per week
		}
	};

	/** Returns the year for the current date. */
	Date.prototype.getOtherFullYear = function (dateType) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			return this.getFullYear();
		}
	};

	/** Returns the year for the current date. */
	Date.prototype.getLocalFullYear = function (dateType) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			return this.getFullYear();
		}
	};

	/** Returns the month the date. */
	Date.prototype.getLocalMonth = function (dateType) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			return this.getMonth();
		}
	};

	/** Returns the date. */
	Date.prototype.getLocalDate = function (dateType) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			return this.getDate();
		}
	};

	/** Returns the number of day in the year. */
	Date.prototype.getLocalDay = function(dateType) {
		if (dateType  != 'gregorian') {
			return '';
		} else {
			return this.getDay();
		}
	};

	/** Returns the number of days in the current month */
	Date.prototype.getLocalMonthDays = function(dateType, month) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			var year = this.getFullYear();
			if (typeof month == "undefined") {
				month = this.getMonth();
			}
			if (((0 == (year%4)) && ( (0 != (year%100)) || (0 ==
(year%400)))) && month == 1) {
				return 29;
			} else {
				return [31,28,31,30,31,30,31,31,30,31,30,31][month];
			}
		}
	};

	/** Returns the week number for the current date. */
	Date.prototype.getLocalWeekNumber = function(dateType) {
		if (dateType != 'gregorian') {
			/** Modify to match the current calendar when overriding **/
			return '';
		} else {
			var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0,
0, 0);
			var DoW = d.getDay();
			d.setDate(d.getDate() - (DoW + 6) % 7 + 3);                             
       // Nearest Thu
			var ms = d.valueOf();                                                   
       // GMT
			d.setMonth(0);
			d.setDate(4);                                                           
       // Thu in Week 1
			return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
		}
	};

	/** Returns the number of day in the year. */
	Date.prototype.getLocalDayOfYear = function(dateType) {
		if (dateType  != 'gregorian') {
			return '';
		} else {
			var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(),
0, 0, 0);
			var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
			var time = now - then;
			return Math.floor(time / Date.DAY);
		}
	};

	/** Checks date and time equality */
	Date.prototype.equalsTo = function(date) {
		return ((this.getFullYear() == date.getFullYear()) &&
		(this.getMonth() == date.getMonth()) &&
		(this.getDate() == date.getDate()) &&
		(this.getHours() == date.getHours()) &&
		(this.getMinutes() == date.getMinutes()));
	};

	/** Converts foreign date to gregorian date. */
	Date.localCalToGregorian = function(y, m, d) {
		/** Modify to match the current calendar when overriding **/
		return'';
	};

	/** Converts gregorian date to foreign date. */
	Date.gregorianToLocalCal = function(y, m, d) {
		/** Modify to match the current calendar when overriding **/
		return '';
	};

	/** INTERFACE METHODS FOR THE CALENDAR PICKER **/
	/************* END **************/

	/** Method to parse a string and return a date. **/
	Date.parseFieldDate = function(str, fmt, dateType) {
		if (dateType != 'gregorian')
			str = Date.toEnglish(str);

		var today = new Date();
		var y = 0;
		var m = -1;
		var d = 0;
		var a = str.split(/\W+/);
		var b = fmt.match(/%./g);
		var i = 0, j = 0;
		var hr = 0;
		var min = 0;
		var sec = 0;
		for (i = 0; i < a.length; ++i) {
			if (!a[i])
				continue;
			switch (b[i]) {
				case "%d":
				case "%e":
					d = parseInt(a[i], 10);
					break;

				case "%m":
					m = parseInt(a[i], 10) - 1;
					break;

				case "%Y":
				case "%y":
					y = parseInt(a[i], 10);
					(y < 100) && (y += (y > 29) ? 1900 : 2000);
					break;

				case "%b":
				case "%B":
					for (j = 0; j < 12; ++j) {
						if (JoomlaCalLocale.months[j].substr(0, a[i].length).toLowerCase() ==
a[i].toLowerCase()) { m = j; break; }
					}
					break;

				case "%H":
				case "%I":
				case "%k":
				case "%l":
					hr = parseInt(a[i], 10);
					break;

				case "%P":
				case "%p":
					if (/pm/i.test(a[i]) && hr < 12)
						hr += 12;
					else if (/am/i.test(a[i]) && hr >= 12)
						hr -= 12;
					break;

				case "%M":
					min = parseInt(a[i], 10);
					break;
				case "%S":
					sec = parseInt(a[i], 10);
					break;
			}
		}
		if (isNaN(y)) y = today.getFullYear();
		if (isNaN(m)) m = today.getMonth();
		if (isNaN(d)) d = today.getDate();
		if (isNaN(hr)) hr = today.getHours();
		if (isNaN(min)) min = today.getMinutes();
		if (isNaN(sec)) sec = today.getSeconds();
		if (y != 0 && m != -1 && d != 0)
			return new Date(y, m, d, hr, min, sec);
		y = 0; m = -1; d = 0;
		for (i = 0; i < a.length; ++i) {
			if (a[i].search(/[a-zA-Z]+/) != -1) {
				var t = -1;
				for (j = 0; j < 12; ++j) {
					if (JoomlaCalLocale.months[j].substr(0, a[i].length).toLowerCase() ==
a[i].toLowerCase()) { t = j; break; }
				}
				if (t != -1) {
					if (m != -1) {
						d = m+1;
					}
					m = t;
				}
			} else if (parseInt(a[i], 10) <= 12 && m == -1) {
				m = a[i]-1;
			} else if (parseInt(a[i], 10) > 31 && y == 0) {
				y = parseInt(a[i], 10);
				(y < 100) && (y += (y > 29) ? 1900 : 2000);
			} else if (d == 0) {
				d = a[i];
			}
		}
		if (y == 0)
			y = today.getFullYear();
		if (m != -1 && d != 0)
			return new Date(y, m, d, hr, min, sec);
		return today;
	};

	/** Prints the date in a string according to the given format. */
	Date.prototype.print = function (str, dateType, translate) {
		/** Handle calendar type **/
		if (typeof dateType !== 'string') str = '';
		if (!dateType) dateType = 'gregorian';

		/** Handle wrong format **/
		if (typeof str !== 'string') str = '';
		if (!str) return '';

		if (this.getLocalDate(dateType) == 'NaN' ||
!this.getLocalDate(dateType)) return '';
		var m = this.getLocalMonth(dateType);
		var d = this.getLocalDate(dateType);
		var y = this.getLocalFullYear(dateType);
		var wn = this.getLocalWeekNumber(dateType);
		var w = this.getDay();
		var s = {};
		var hr = this.getHours();
		var pm = (hr >= 12);
		var ir = (pm) ? (hr - 12) : hr;
		var dy = this.getLocalDayOfYear(dateType);
		if (ir == 0)
			ir = 12;
		var min = this.getMinutes();
		var sec = this.getSeconds();
		s["%a"] = JoomlaCalLocale.shortDays[w];                        
                            // abbreviated weekday name
		s["%A"] = JoomlaCalLocale.days[w];                             
                            // full weekday name
		s["%b"] = JoomlaCalLocale.shortMonths[m];                      
                            // abbreviated month name
		s["%B"] = JoomlaCalLocale.months[m];                           
                            // full month name
		// FIXME: %c : preferred date and time representation for the current
locale
		s["%C"] = 1 + Math.floor(y / 100);                             
                            // the century number
		s["%d"] = (d < 10) ? ("0" + d) : d;               
                                         // the day of the month (range 01
to 31)
		s["%e"] = d;                                                   
                            // the day of the month (range 1 to 31)
		// FIXME: %D : american date style: %m/%d/%y
		// FIXME: %E, %F, %G, %g, %h (man strftime)
		s["%H"] = (hr < 10) ? ("0" + hr) : hr;            
                                         // hour, range 00 to 23 (24h
format)
		s["%I"] = (ir < 10) ? ("0" + ir) : ir;            
                                         // hour, range 01 to 12 (12h
format)
		s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy)
: ("0" + dy)) : dy;                         // day of the year
(range 001 to 366)
		s["%k"] = hr;                                                  
                            // hour, range 0 to 23 (24h format)
		s["%l"] = ir;                                                  
                            // hour, range 1 to 12 (12h format)
		s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m);        
                                         // month, range 01 to 12
		s["%M"] = (min < 10) ? ("0" + min) : min;         
                                         // minute, range 00 to 59
		s["%n"] = "\n";                                      
                                      // a newline character
		s["%p"] = pm ? JoomlaCalLocale.PM : JoomlaCalLocale.AM;
		s["%P"] = pm ? JoomlaCalLocale.pm : JoomlaCalLocale.am;
		// FIXME: %r : the time in am/pm notation %I:%M:%S %p
		// FIXME: %R : the time in 24-hour notation %H:%M
		s["%s"] = Math.floor(this.getTime() / 1000);
		s["%S"] = (sec < 10) ? ("0" + sec) : sec;         
                                         // seconds, range 00 to 59
		s["%t"] = "\t";                                      
                                      // a tab character
		// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
		s["%U"] = s["%W"] = s["%V"] = (wn < 10)
? ("0" + wn) : wn;
		s["%u"] = w + 1;                                               
                            // the day of the week (range 1 to 7, 1 = MON)
		s["%w"] = w;                                                   
                            // the day of the week (range 0 to 6, 0 = SUN)
		// FIXME: %x : preferred date representation for the current locale
without the time
		// FIXME: %X : preferred time representation for the current locale
without the date
		s["%y"] = ('' + y).substr(2, 2);                     
                                      // year without the century (range 00
to 99)
		s["%Y"] = y;                                                   
                            // year with the century
		s["%%"] = "%";                                       
                                      // a literal '%' character

		var re = /%./g;

		var tmpDate = str.replace(re, function (par) { return s[par] || par; });
		if (Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers) ===
'[object Array]' && dateType != 'gregorian'
&& translate)
			tmpDate = Date.convertNumbers(tmpDate);

		return tmpDate;
	};
})(Date);
PKZn�[��|�<js/fields/calendar-locales/date/gregorian/date-helper.min.jsnu�[���!function(t){"use
strict";t.SECOND=1e3,t.MINUTE=60*t.SECOND,t.HOUR=60*t.MINUTE,t.DAY=24*t.HOUR,t.WEEK=7*t.DAY,t.prototype.setLocalDateOnly=function(e,a){if("gregorian"!=e)return"";var
r=new
t(a);this.setDate(1),this.setFullYear(r.getFullYear()),this.setMonth(r.getMonth()),this.setDate(r.getDate())},t.prototype.setLocalDate=function(t,e){return"gregorian"!=t?"":this.setDate(e)},t.prototype.setLocalMonth=function(t,e,a){return"gregorian"!=t?"":(void
0==a&&this.getDate(),this.setMonth(e))},t.prototype.setOtherFullYear=function(e,a){if("gregorian"!=e)return"";var
r=new t(this);return
r.setFullYear(a),r.getMonth()!=this.getMonth()&&this.setDate(28),this.setUTCFullYear(a)},t.prototype.setLocalFullYear=function(e,a){if("gregorian"!=e)return"";var
r=new t(this);return
r.setFullYear(a),r.getMonth()!=this.getMonth()&&this.setDate(28),this.setFullYear(a)},t.prototype.getLocalWeekDays=function(t,e){return
6},t.prototype.getOtherFullYear=function(t){return"gregorian"!=t?"":this.getFullYear()},t.prototype.getLocalFullYear=function(t){return"gregorian"!=t?"":this.getFullYear()},t.prototype.getLocalMonth=function(t){return"gregorian"!=t?"":this.getMonth()},t.prototype.getLocalDate=function(t){return"gregorian"!=t?"":this.getDate()},t.prototype.getLocalDay=function(t){return"gregorian"!=t?"":this.getDay()},t.prototype.getLocalMonthDays=function(t,e){if("gregorian"!=t)return"";var
a=this.getFullYear();return void
0===e&&(e=this.getMonth()),0!=a%4||0==a%100&&0!=a%400||1!=e?[31,28,31,30,31,30,31,31,30,31,30,31][e]:29},t.prototype.getLocalWeekNumber=function(e){if("gregorian"!=e)return"";var
a=new
t(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0),r=a.getDay();a.setDate(a.getDate()-(r+6)%7+3);var
o=a.valueOf();return
a.setMonth(0),a.setDate(4),Math.round((o-a.valueOf())/6048e5)+1},t.prototype.getLocalDayOfYear=function(e){if("gregorian"!=e)return"";var
a=new t(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0)-new
t(this.getFullYear(),0,0,0,0,0);return
Math.floor(a/t.DAY)},t.prototype.equalsTo=function(t){return
this.getFullYear()==t.getFullYear()&&this.getMonth()==t.getMonth()&&this.getDate()==t.getDate()&&this.getHours()==t.getHours()&&this.getMinutes()==t.getMinutes()},t.localCalToGregorian=function(t,e,a){return""},t.gregorianToLocalCal=function(t,e,a){return""},t.parseFieldDate=function(e,a,r){"gregorian"!=r&&(e=t.toEnglish(e));var
o=new
t,n=0,s=-1,i=0,l=e.split(/\W+/),g=a.match(/%./g),u=0,h=0,c=0,p=0,f=0;for(u=0;u<l.length;++u)if(l[u])switch(g[u]){case"%d":case"%e":i=parseInt(l[u],10);break;case"%m":s=parseInt(l[u],10)-1;break;case"%Y":case"%y":(n=parseInt(l[u],10))<100&&(n+=n>29?1900:2e3);break;case"%b":case"%B":for(h=0;h<12;++h)if(JoomlaCalLocale.months[h].substr(0,l[u].length).toLowerCase()==l[u].toLowerCase()){s=h;break}break;case"%H":case"%I":case"%k":case"%l":c=parseInt(l[u],10);break;case"%P":case"%p":/pm/i.test(l[u])&&c<12?c+=12:/am/i.test(l[u])&&c>=12&&(c-=12);break;case"%M":p=parseInt(l[u],10);break;case"%S":f=parseInt(l[u],10)}if(isNaN(n)&&(n=o.getFullYear()),isNaN(s)&&(s=o.getMonth()),isNaN(i)&&(i=o.getDate()),isNaN(c)&&(c=o.getHours()),isNaN(p)&&(p=o.getMinutes()),isNaN(f)&&(f=o.getSeconds()),0!=n&&-1!=s&&0!=i)return
new
t(n,s,i,c,p,f);for(n=0,s=-1,i=0,u=0;u<l.length;++u)if(-1!=l[u].search(/[a-zA-Z]+/)){var
D=-1;for(h=0;h<12;++h)if(JoomlaCalLocale.months[h].substr(0,l[u].length).toLowerCase()==l[u].toLowerCase()){D=h;break}-1!=D&&(-1!=s&&(i=s+1),s=D)}else
parseInt(l[u],10)<=12&&-1==s?s=l[u]-1:parseInt(l[u],10)>31&&0==n?(n=parseInt(l[u],10))<100&&(n+=n>29?1900:2e3):0==i&&(i=l[u]);return
0==n&&(n=o.getFullYear()),-1!=s&&0!=i?new
t(n,s,i,c,p,f):o},t.prototype.print=function(e,a,r){if("string"!=typeof
a&&(e=""),a||(a="gregorian"),"string"!=typeof
e&&(e=""),!e)return"";if("NaN"==this.getLocalDate(a)||!this.getLocalDate(a))return"";var
o=this.getLocalMonth(a),n=this.getLocalDate(a),s=this.getLocalFullYear(a),i=this.getLocalWeekNumber(a),l=this.getDay(),g={},u=this.getHours(),h=u>=12,c=h?u-12:u,p=this.getLocalDayOfYear(a);0==c&&(c=12);var
f=this.getMinutes(),D=this.getSeconds();g["%a"]=JoomlaCalLocale.shortDays[l],g["%A"]=JoomlaCalLocale.days[l],g["%b"]=JoomlaCalLocale.shortMonths[o],g["%B"]=JoomlaCalLocale.months[o],g["%C"]=1+Math.floor(s/100),g["%d"]=n<10?"0"+n:n,g["%e"]=n,g["%H"]=u<10?"0"+u:u,g["%I"]=c<10?"0"+c:c,g["%j"]=p<100?p<10?"00"+p:"0"+p:p,g["%k"]=u,g["%l"]=c,g["%m"]=o<9?"0"+(1+o):1+o,g["%M"]=f<10?"0"+f:f,g["%n"]="\n",g["%p"]=h?JoomlaCalLocale.PM:JoomlaCalLocale.AM,g["%P"]=h?JoomlaCalLocale.pm:JoomlaCalLocale.am,g["%s"]=Math.floor(this.getTime()/1e3),g["%S"]=D<10?"0"+D:D,g["%t"]="\t",g["%U"]=g["%W"]=g["%V"]=i<10?"0"+i:i,g["%u"]=l+1,g["%w"]=l,g["%y"]=(""+s).substr(2,2),g["%Y"]=s,g["%%"]="%";var
L=/%./g,M=e.replace(L,function(t){return g[t]||t});return"[object
Array]"===Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers)&&"gregorian"!=a&&r&&(M=t.convertNumbers(M)),M}}(Date);
PKZn�[��5N5N5js/fields/calendar-locales/date/jalali/date-helper.jsnu�[���/**
BEGIN: DATE OBJECT PATCHES **/
/** Adds the number of days array to the Date object. */
Date.gregorian_MD = [31,28,31,30,31,30,31,31,30,31,30,31];
Date.local_MD     = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29];

/** Constants used for time computations */
Date.SECOND = 1000 /* milliseconds */;
Date.MINUTE = 60 * Date.SECOND;
Date.HOUR   = 60 * Date.MINUTE;
Date.DAY    = 24 * Date.HOUR;
Date.WEEK   =  7 * Date.DAY;

/** MODIFY ONLY THE MARKED PARTS OF THE METHODS **/
/************ START *************/
/** INTERFACE METHODS FOR THE CALENDAR PICKER **/

/********************** *************************/
/**************** SETTERS ***********************/
/********************** *************************/

/** Sets the date for the current date without h/m/s. */
Date.prototype.setLocalDateOnly = function (dateType, date) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return '';
	} else {
		var tmp = new Date(date);
		this.setDate(1);
		this.setFullYear(tmp.getFullYear());
		this.setMonth(tmp.getMonth());
		this.setDate(tmp.getDate());
	}
};

/** Sets the full date for the current date. */
Date.prototype.setLocalDate = function (dateType, d) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return this.setJalaliDate(d);
	} else {
		return this.setDate(d);
	}
};

/** Sets the month for the current date. */
Date.prototype.setLocalMonth = function (dateType, m, d) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return this.setJalaliMonth(m, d);
	} else {
		if (d == undefined) this.getDate();
		return this.setMonth(m);
	}
};

/** Sets the year for the current date. */
Date.prototype.setOtherFullYear = function(dateType, y) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		var date = new Date(this);
		date.setLocalFullYear(y);
		if (date.getLocalMonth('jalali') !=
this.getLocalMonth('jalali'))
this.setLocalDate('jalali', 29);
		return this.setLocalFullYear('jalali', y);
	} else {
		var date = new Date(this);
		date.setFullYear(y);
		if (date.getMonth() != this.getMonth()) this.setDate(28);
		return this.setUTCFullYear(y);
	}
};

/** Sets the year for the current date. */
Date.prototype.setLocalFullYear = function (dateType, y) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return this.setJalaliFullYear(y);
	} else {
		var date = new Date(this);
		date.setFullYear(y);
		if (date.getMonth() != this.getMonth()) this.setDate(28);
		return this.setFullYear(y);
	}
};

/********************** *************************/
/**************** GETTERS ***********************/
/********************** *************************/

/** The number of days per week **/
Date.prototype.getLocalWeekDays = function (dateType, y) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return 6;
	} else {
		return 6; // 7 days per week
	}
};

/** Returns the year for the current date. */
Date.prototype.getOtherFullYear = function (dateType) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return this.getJalaliFullYear();
	} else {
		return this.getFullYear();
	}
};

/** Returns the year for the current date. */
Date.prototype.getLocalFullYear = function (dateType) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return this.getJalaliFullYear();
	} else {
		return this.getFullYear();
	}
};

/** Returns the month the date. */
Date.prototype.getLocalMonth = function (dateType) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return this.getJalaliMonth();
	} else {
		return this.getMonth();
	}
};

/** Returns the date. */
Date.prototype.getLocalDate = function (dateType) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		return this.getJalaliDate();
	} else {
		return this.getDate();
	}
};

/** Returns the number of day in the year. */
Date.prototype.getLocalDay = function(dateType) {
	if (dateType  != 'gregorian') {
		return this.getJalaliDay();
	} else {
		return this.getDay();
	}
};

/** Returns the number of days in the current month */
Date.prototype.getLocalMonthDays = function(dateType, month) {
	if (dateType != 'gregorian') {
		/** Modify to match the current calendar when overriding **/
		var year = this.getLocalFullYear('jalali');
		if (typeof month == "undefined") {
			month = this.getLocalMonth('jalali');
		}
		if (((0 == (year%4)) && ( (0 != (year%100)) || (0 ==
(year%400)))) && month == 1) {
			return 29;
		} else {
			Date.local_MD[month];
		}
	} else {
		var year = this.getFullYear();
		if (typeof month == "undefined") {
			month = this.getMonth();
		}
		if (((0 == (year%4)) && ( (0 != (year%100)) || (0 ==
(year%400)))) && month == 1) {
			return 29;
		} else {
			return Date.gregorian_MD[month];
		}
	}
};

/** Returns the week number for the current date. */
Date.prototype.getLocalWeekNumber = function(dateType) {
	if (dateType != 'gregorian') {
		var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0,
0, 0);
		var DoW = d.getDay();
		d.setDate(d.getDate() - (DoW + 6) % 7 + 3);                              
      // Nearest Thu
		var ms = d.valueOf();                                                    
      // GMT
		d.setMonth(0);
		d.setDate(4);                                                            
      // Thu in Week 1
		return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
	} else {
		var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0,
0, 0);
		var DoW = d.getDay();
		d.setDate(d.getDate() - (DoW + 6) % 7 + 3);                              
      // Nearest Thu
		var ms = d.valueOf();                                                    
      // GMT
		d.setMonth(0);
		d.setDate(4);                                                            
      // Thu in Week 1
		return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
	}
};

/** Returns the number of day in the year. */
Date.prototype.getLocalDayOfYear = function(dateType) {
	if (dateType  != 'gregorian') {
		var now = new Date(this.getOtherFullYear(dateType),
this.getLocalMonth(dateType), this.getLocalDate(dateType), 0, 0, 0);
		var then = new Date(this.getOtherFullYear(dateType), 0, 0, 0, 0, 0);
		var time = now - then;
		return Math.floor(time / Date.DAY);
	} else {
		var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(),
0, 0, 0);
		var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
		var time = now - then;
		return Math.floor(time / Date.DAY);
	}
};

/** Returns the number of days in the current month */
Date.prototype.getMonthDays = function(month) {
	var year = this.getFullYear();
	if (typeof month == "undefined") {
		month = this.getMonth();
	}
	if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400))))
&& month == 1) {
		return 29;
	} else {
		if (Date.dateType != 'gregorian') {
			Date.local_MD[month];
		} else {
			return Date.gregorian_MD[month];
		}
	}
};

/** Checks date and time equality */
Date.prototype.equalsTo = function(date) {
	return ((this.getFullYear() == date.getFullYear()) &&
	(this.getMonth() == date.getMonth()) &&
	(this.getDate() == date.getDate()) &&
	(this.getHours() == date.getHours()) &&
	(this.getMinutes() == date.getMinutes()));
};

/** Converts foreign date to gregorian date. */
Date.localCalToGregorian = function(y, m, d) {
	/** Modify to match the current calendar when overriding **/
	return JalaliDate.jalaliToGregorian(y, m, d);
};

/** Converts gregorian date to foreign date. */
Date.gregorianToLocalCal = function(y, m, d) {
	/** Modify to match the current calendar when overriding **/
	return JalaliDate.gregorianToJalali(y, m, d);
};

/** Method to convert numbers from local symbols to English numbers. */
Date.numbersToIso = function(str) {
	var i, nums =[0,1,2,3,4,5,6,7,8,9];
	str = str.toString();

	if (Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers) ===
'[object Array]') {
		for (i = 0; i < nums.length; i++) {
			str = str.replace(new RegExp(JoomlaCalLocale.localLangNumbers[i],
'g'), nums[i]);
		}
	}
	return str;
};
/** INTERFACE METHODS FOR THE CALENDAR PICKER **/
/************* END **************/

/** Prints the date in a string according to the given format. */
Date.prototype.print = function (str, dateType, translate) {
	/** Handle calendar type **/
	if (typeof dateType !== 'string') str = '';
	if (!dateType) dateType = 'gregorian';

	/** Handle wrong format **/
	if (typeof str !== 'string') str = '';
	if (!str) return '';


	if (this.getLocalDate(dateType) == 'NaN' ||
!this.getLocalDate(dateType)) return '';
	var m = this.getLocalMonth(dateType);
	var d = this.getLocalDate(dateType);
	var y = this.getLocalFullYear(dateType);
	var wn = this.getLocalWeekNumber(dateType);
	var w = this.getLocalDay(dateType);
	var s = {};
	var hr = this.getHours();
	var pm = (hr >= 12);
	var ir = (pm) ? (hr - 12) : hr;
	var dy = this.getLocalDayOfYear(dateType);
	if (ir == 0)
		ir = 12;
	var min = this.getMinutes();
	var sec = this.getSeconds();
	s["%a"] = JoomlaCalLocale.shortDays[w];                         
                           // abbreviated weekday name
	s["%A"] = JoomlaCalLocale.days[w];                              
                           // full weekday name
	s["%b"] = JoomlaCalLocale.shortMonths[m];                       
                           // abbreviated month name
	s["%B"] = JoomlaCalLocale.months[m];                            
                           // full month name
	// FIXME: %c : preferred date and time representation for the current
locale
	s["%C"] = 1 + Math.floor(y / 100);                              
                           // the century number
	s["%d"] = (d < 10) ? ("0" + d) : d;                
                                        // the day of the month (range 01
to 31)
	s["%e"] = d;                                                    
                           // the day of the month (range 1 to 31)
	// FIXME: %D : american date style: %m/%d/%y
	// FIXME: %E, %F, %G, %g, %h (man strftime)
	s["%H"] = (hr < 10) ? ("0" + hr) : hr;             
                                        // hour, range 00 to 23 (24h
format)
	s["%I"] = (ir < 10) ? ("0" + ir) : ir;             
                                        // hour, range 01 to 12 (12h
format)
	s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy)
: ("0" + dy)) : dy;                         // day of the year
(range 001 to 366)
	s["%k"] = hr;                                                   
                           // hour, range 0 to 23 (24h format)
	s["%l"] = ir;                                                   
                           // hour, range 1 to 12 (12h format)
	s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m);         
                                        // month, range 01 to 12
	s["%M"] = (min < 10) ? ("0" + min) : min;          
                                        // minute, range 00 to 59
	s["%n"] = "\n";                                       
                                     // a newline character
	s["%p"] = pm ? JoomlaCalLocale.PM : JoomlaCalLocale.AM;
	s["%P"] = pm ? JoomlaCalLocale.pm : JoomlaCalLocale.am;
	// FIXME: %r : the time in am/pm notation %I:%M:%S %p
	// FIXME: %R : the time in 24-hour notation %H:%M
	s["%s"] = Math.floor(this.getTime() / 1000);
	s["%S"] = (sec < 10) ? ("0" + sec) : sec;          
                                        // seconds, range 00 to 59
	s["%t"] = "\t";                                       
                                     // a tab character
	// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
	s["%U"] = s["%W"] = s["%V"] = (wn < 10) ?
("0" + wn) : wn;
	s["%u"] = w + 1;                                                
                           // the day of the week (range 1 to 7, 1 = MON)
	s["%w"] = w;                                                    
                           // the day of the week (range 0 to 6, 0 = SUN)
	// FIXME: %x : preferred date representation for the current locale
without the time
	// FIXME: %X : preferred time representation for the current locale
without the date
	s["%y"] = ('' + y).substr(2, 2);                      
                                     // year without the century (range 00
to 99)
	s["%Y"] = y;                                                    
                           // year with the century
	s["%%"] = "%";                                        
                                     // a literal '%' character

	var re = /%./g;

	var tmpDate = str.replace(re, function (par) { return s[par] || par; });
	if (Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers) ===
'[object Array]' && translate)
		tmpDate = Date.convertNumbers(tmpDate);

	return tmpDate;
};

Date.parseFieldDate = function(str, fmt, dateType) {
	str = Date.numbersToIso(str);

	var today = new Date();
	var y = 0;
	var m = -1;
	var d = 0;
	var a = str.split(/\W+/);
	var b = fmt.match(/%./g);
	var i = 0, j = 0;
	var hr = 0;
	var min = 0;
	for (i = 0; i < a.length; ++i) {
		if (!a[i])
			continue;
		switch (b[i]) {
			case "%d":
			case "%e":
				d = parseInt(a[i], 10);
				break;

			case "%m":
				m = parseInt(a[i], 10) - 1;
				break;

			case "%Y":
			case "%y":
				y = parseInt(a[i], 10);
				(y < 100) && (y += (y > 29) ? 1900 : 2000);
				break;

			case "%b":
			case "%B":
				for (j = 0; j < 12; ++j) {
					if (dateType != 'gregorian') {
						if (JoomlaCalLocale.months[j].substr(0, a[i].length).toLowerCase() ==
a[i].toLowerCase()) { m = j; break; }
					} else {
						if (JoomlaCalLocale.months[j].substr(0, a[i].length).toLowerCase() ==
a[i].toLowerCase()) { m = j; break; }
					}
				}
				break;

			case "%H":
			case "%I":
			case "%k":
			case "%l":
				hr = parseInt(a[i], 10);
				break;

			case "%P":
			case "%p":
				if (/pm/i.test(a[i]) && hr < 12)
					hr += 12;
				else if (/am/i.test(a[i]) && hr >= 12)
					hr -= 12;
				break;

			case "%M":
				min = parseInt(a[i], 10);
				break;
			case "%S":
				sec = parseInt(a[i], 10);
				break;
		}
	}
	if (isNaN(y)) y = today.getFullYear();
	if (isNaN(m)) m = today.getMonth();
	if (isNaN(d)) d = today.getDate();
	if (isNaN(hr)) hr = today.getHours();
	if (isNaN(min)) min = today.getMinutes();
	if (y != 0 && m != -1 && d != 0)
		return new Date(y, m, d, hr, min, 0);
	y = 0; m = -1; d = 0;
	for (i = 0; i < a.length; ++i) {
		if (a[i].search(/[a-zA-Z]+/) != -1) {
			var t = -1;
			for (j = 0; j < 12; ++j) {
				if (dateType != 'gregorian') {
					if (JoomlaCalLocale.months[j].substr(0, a[i].length).toLowerCase() ==
a[i].toLowerCase()) { t = j; break; }
				} else {
					if (JoomlaCalLocale.months[j].substr(0, a[i].length).toLowerCase() ==
a[i].toLowerCase()) { t = j; break; }
				}
			}
			if (t != -1) {
				if (m != -1) {
					d = m+1;
				}
				m = t;
			}
		} else if (parseInt(a[i], 10) <= 12 && m == -1) {
			m = a[i]-1;
		} else if (parseInt(a[i], 10) > 31 && y == 0) {
			y = parseInt(a[i], 10);
			(y < 100) && (y += (y > 29) ? 1900 : 2000);
		} else if (d == 0) {
			d = a[i];
		}
	}
	if (y == 0)
		y = today.getFullYear();
	if (m != -1 && d != 0)
		return new Date(y, m, d, hr, min, 0);
	return today;
};

/*
 * JalaliJSCalendar - Jalali Extension for Date Object
 * Copyright (c) 2008 Ali Farhadi (http://farhadi.ir/)
 * Released under the terms of the GNU General Public License.
 * See the GPL for details (http://www.gnu.org/licenses/gpl.html).
 *
 * Based on code from http://farsiweb.info
 */

JalaliDate = {
	g_days_in_month: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
	j_days_in_month: [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29]
};

JalaliDate.jalaliToGregorian = function(j_y, j_m, j_d)
{
	j_y = parseInt(j_y);
	j_m = parseInt(j_m);
	j_d = parseInt(j_d);
	var jy = j_y-979;
	var jm = j_m-1;
	var jd = j_d-1;

	var j_day_no = 365*jy + parseInt(jy / 33)*8 + parseInt((jy%33+3) / 4);
	for (var i=0; i < jm; ++i) j_day_no += JalaliDate.j_days_in_month[i];

	j_day_no += jd;

	var g_day_no = j_day_no+79;

	var gy = 1600 + 400 * parseInt(g_day_no / 146097); /* 146097 = 365*400 +
400/4 - 400/100 + 400/400 */
	g_day_no = g_day_no % 146097;

	var leap = true;
	if (g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
	{
		g_day_no--;
		gy += 100*parseInt(g_day_no/  36524); /* 36524 = 365*100 + 100/4 -
100/100 */
		g_day_no = g_day_no % 36524;

		if (g_day_no >= 365)
			g_day_no++;
		else
			leap = false;
	}

	gy += 4*parseInt(g_day_no/ 1461); /* 1461 = 365*4 + 4/4 */
	g_day_no %= 1461;

	if (g_day_no >= 366) {
		leap = false;

		g_day_no--;
		gy += parseInt(g_day_no/ 365);
		g_day_no = g_day_no % 365;
	}

	for (var i = 0; g_day_no >= JalaliDate.g_days_in_month[i] + (i == 1
&& leap); i++)
		g_day_no -= JalaliDate.g_days_in_month[i] + (i == 1 && leap);
	var gm = i+1;
	var gd = g_day_no+1;

	return [gy, gm, gd];
};

JalaliDate.checkDate = function(j_y, j_m, j_d)
{
	return !(j_y < 0 || j_y > 32767 || j_m < 1 || j_m > 12 || j_d
< 1 || j_d >
	(JalaliDate.j_days_in_month[j_m-1] + (j_m == 12 &&
!((j_y-979)%33%4))));
};

JalaliDate.gregorianToJalali = function(g_y, g_m, g_d)
{
	g_y = parseInt(g_y);
	g_m = parseInt(g_m);
	g_d = parseInt(g_d);
	var gy = g_y-1600;
	var gm = g_m-1;
	var gd = g_d-1;

	var g_day_no = 365*gy+parseInt((gy+3) /
4)-parseInt((gy+99)/100)+parseInt((gy+399)/400);

	for (var i=0; i < gm; ++i)
		g_day_no += JalaliDate.g_days_in_month[i];
	if (gm>1 && ((gy%4==0 && gy%100!=0) || (gy%400==0)))
	/* leap and after Feb */
		++g_day_no;
	g_day_no += gd;

	var j_day_no = g_day_no-79;

	var j_np = parseInt(j_day_no/ 12053);
	j_day_no %= 12053;

	var jy = 979+33*j_np+4*parseInt(j_day_no/1461);

	j_day_no %= 1461;

	if (j_day_no >= 366) {
		jy += parseInt((j_day_no-1)/ 365);
		j_day_no = (j_day_no-1)%365;
	}

	for (var i = 0; i < 11 && j_day_no >=
JalaliDate.j_days_in_month[i]; ++i) {
		j_day_no -= JalaliDate.j_days_in_month[i];
	}
	var jm = i+1;
	var jd = j_day_no+1;


	return [jy, jm, jd];
};

Date.prototype.setJalaliFullYear = function(y, m, d) {
	var gd = this.getDate();
	var gm = this.getMonth();
	var gy = this.getFullYear();
	var j = JalaliDate.gregorianToJalali(gy, gm+1, gd);
	if (y < 100) y += 1300;
	j[0] = y;
	if (m != undefined) {
		if (m > 11) {
			j[0] += Math.floor(m / 12);
			m = m % 12;
		}
		j[1] = m + 1;
	}
	if (d != undefined) j[2] = d;
	var g = JalaliDate.jalaliToGregorian(j[0], j[1], j[2]);
	return this.setFullYear(g[0], g[1]-1, g[2]);
};

Date.prototype.setJalaliMonth = function(m, d) {
	var gd = this.getDate();
	var gm = this.getMonth();
	var gy = this.getFullYear();
	var j = JalaliDate.gregorianToJalali(gy, gm+1, gd);
	if (m > 11) {
		j[0] += Math.floor(m / 12);
		m = m % 12;
	}
	j[1] = m+1;
	if (d != undefined) j[2] = d;
	var g = JalaliDate.jalaliToGregorian(j[0], j[1], j[2]);
	return this.setFullYear(g[0], g[1]-1, g[2]);
};

Date.prototype.setJalaliDate = function(d) {
	var gd = this.getDate();
	var gm = this.getMonth();
	var gy = this.getFullYear();
	var j = JalaliDate.gregorianToJalali(gy, gm+1, gd);
	j[2] = d;
	var g = JalaliDate.jalaliToGregorian(j[0], j[1], j[2]);
	return this.setFullYear(g[0], g[1]-1, g[2]);
};

Date.prototype.getJalaliFullYear = function() {
	var gd = this.getDate();
	var gm = this.getMonth();
	var gy = this.getFullYear();
	var j = JalaliDate.gregorianToJalali(gy, gm+1, gd);
	return j[0];
};

Date.prototype.getJalaliMonth = function() {
	var gd = this.getDate();
	var gm = this.getMonth();
	var gy = this.getFullYear();
	var j = JalaliDate.gregorianToJalali(gy, gm+1, gd);
	return j[1]-1;
};

Date.prototype.getJalaliDate = function() {
	var gd = this.getDate();
	var gm = this.getMonth();
	var gy = this.getFullYear();
	var j = JalaliDate.gregorianToJalali(gy, gm+1, gd);
	return j[2];
};

Date.prototype.getJalaliDay = function() {
	var day = this.getDay();
	day = (day) % 7;
	return day;
};
PKZn�[�Yf$f$9js/fields/calendar-locales/date/jalali/date-helper.min.jsnu�[���Date.gregorian_MD=[31,28,31,30,31,30,31,31,30,31,30,31],Date.local_MD=[31,31,31,31,31,31,30,30,30,30,30,29],Date.SECOND=1e3,Date.MINUTE=60*Date.SECOND,Date.HOUR=60*Date.MINUTE,Date.DAY=24*Date.HOUR,Date.WEEK=7*Date.DAY,Date.prototype.setLocalDateOnly=function(t,e){if("gregorian"!=t)return"";var
a=new
Date(e);this.setDate(1),this.setFullYear(a.getFullYear()),this.setMonth(a.getMonth()),this.setDate(a.getDate())},Date.prototype.setLocalDate=function(t,e){return"gregorian"!=t?this.setJalaliDate(e):this.setDate(e)},Date.prototype.setLocalMonth=function(t,e,a){return"gregorian"!=t?this.setJalaliMonth(e,a):(void
0==a&&this.getDate(),this.setMonth(e))},Date.prototype.setOtherFullYear=function(t,e){if("gregorian"!=t)return(a=new
Date(this)).setLocalFullYear(e),a.getLocalMonth("jalali")!=this.getLocalMonth("jalali")&&this.setLocalDate("jalali",29),this.setLocalFullYear("jalali",e);var
a=new Date(this);return
a.setFullYear(e),a.getMonth()!=this.getMonth()&&this.setDate(28),this.setUTCFullYear(e)},Date.prototype.setLocalFullYear=function(t,e){if("gregorian"!=t)return
this.setJalaliFullYear(e);var a=new Date(this);return
a.setFullYear(e),a.getMonth()!=this.getMonth()&&this.setDate(28),this.setFullYear(e)},Date.prototype.getLocalWeekDays=function(t,e){return
6},Date.prototype.getOtherFullYear=function(t){return"gregorian"!=t?this.getJalaliFullYear():this.getFullYear()},Date.prototype.getLocalFullYear=function(t){return"gregorian"!=t?this.getJalaliFullYear():this.getFullYear()},Date.prototype.getLocalMonth=function(t){return"gregorian"!=t?this.getJalaliMonth():this.getMonth()},Date.prototype.getLocalDate=function(t){return"gregorian"!=t?this.getJalaliDate():this.getDate()},Date.prototype.getLocalDay=function(t){return"gregorian"!=t?this.getJalaliDay():this.getDay()},Date.prototype.getLocalMonthDays=function(t,e){if("gregorian"==t){a=this.getFullYear();return
void
0===e&&(e=this.getMonth()),0!=a%4||0==a%100&&0!=a%400||1!=e?Date.gregorian_MD[e]:29}var
a=this.getLocalFullYear("jalali");if(void
0===e&&(e=this.getLocalMonth("jalali")),0==a%4&&(0!=a%100||0==a%400)&&1==e)return
29;Date.local_MD[e]},Date.prototype.getLocalWeekNumber=function(t){if("gregorian"!=t){a=(e=new
Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0)).getDay();e.setDate(e.getDate()-(a+6)%7+3);r=e.valueOf();return
e.setMonth(0),e.setDate(4),Math.round((r-e.valueOf())/6048e5)+1}var e=new
Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0),a=e.getDay();e.setDate(e.getDate()-(a+6)%7+3);var
r=e.valueOf();return
e.setMonth(0),e.setDate(4),Math.round((r-e.valueOf())/6048e5)+1},Date.prototype.getLocalDayOfYear=function(t){if("gregorian"!=t){r=(e=new
Date(this.getOtherFullYear(t),this.getLocalMonth(t),this.getLocalDate(t),0,0,0))-(a=new
Date(this.getOtherFullYear(t),0,0,0,0,0));return Math.floor(r/Date.DAY)}var
e=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0),a=new
Date(this.getFullYear(),0,0,0,0,0),r=e-a;return
Math.floor(r/Date.DAY)},Date.prototype.getMonthDays=function(t){var
e=this.getFullYear();return void
0===t&&(t=this.getMonth()),0!=e%4||0==e%100&&0!=e%400||1!=t?"gregorian"==Date.dateType?Date.gregorian_MD[t]:void
Date.local_MD[t]:29},Date.prototype.equalsTo=function(t){return
this.getFullYear()==t.getFullYear()&&this.getMonth()==t.getMonth()&&this.getDate()==t.getDate()&&this.getHours()==t.getHours()&&this.getMinutes()==t.getMinutes()},Date.localCalToGregorian=function(t,e,a){return
JalaliDate.jalaliToGregorian(t,e,a)},Date.gregorianToLocalCal=function(t,e,a){return
JalaliDate.gregorianToJalali(t,e,a)},Date.numbersToIso=function(t){var
e,a=[0,1,2,3,4,5,6,7,8,9];if(t=t.toString(),"[object
Array]"===Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers))for(e=0;e<a.length;e++)t=t.replace(new
RegExp(JoomlaCalLocale.localLangNumbers[e],"g"),a[e]);return
t},Date.prototype.print=function(t,e,a){if("string"!=typeof
e&&(t=""),e||(e="gregorian"),"string"!=typeof
t&&(t=""),!t)return"";if("NaN"==this.getLocalDate(e)||!this.getLocalDate(e))return"";var
r=this.getLocalMonth(e),o=this.getLocalDate(e),l=this.getLocalFullYear(e),i=this.getLocalWeekNumber(e),n=this.getLocalDay(e),s={},g=this.getHours(),h=g>=12,D=h?g-12:g,u=this.getLocalDayOfYear(e);0==D&&(D=12);var
c=this.getMinutes(),p=this.getSeconds();s["%a"]=JoomlaCalLocale.shortDays[n],s["%A"]=JoomlaCalLocale.days[n],s["%b"]=JoomlaCalLocale.shortMonths[r],s["%B"]=JoomlaCalLocale.months[r],s["%C"]=1+Math.floor(l/100),s["%d"]=o<10?"0"+o:o,s["%e"]=o,s["%H"]=g<10?"0"+g:g,s["%I"]=D<10?"0"+D:D,s["%j"]=u<100?u<10?"00"+u:"0"+u:u,s["%k"]=g,s["%l"]=D,s["%m"]=r<9?"0"+(1+r):1+r,s["%M"]=c<10?"0"+c:c,s["%n"]="\n",s["%p"]=h?JoomlaCalLocale.PM:JoomlaCalLocale.AM,s["%P"]=h?JoomlaCalLocale.pm:JoomlaCalLocale.am,s["%s"]=Math.floor(this.getTime()/1e3),s["%S"]=p<10?"0"+p:p,s["%t"]="\t",s["%U"]=s["%W"]=s["%V"]=i<10?"0"+i:i,s["%u"]=n+1,s["%w"]=n,s["%y"]=(""+l).substr(2,2),s["%Y"]=l,s["%%"]="%";var
f=/%./g,M=t.replace(f,function(t){return s[t]||t});return"[object
Array]"===Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers)&&a&&(M=Date.convertNumbers(M)),M},Date.parseFieldDate=function(t,e,a){t=Date.numbersToIso(t);var
r=new
Date,o=0,l=-1,i=0,n=t.split(/\W+/),s=e.match(/%./g),g=0,h=0,D=0,u=0;for(g=0;g<n.length;++g)if(n[g])switch(s[g]){case"%d":case"%e":i=parseInt(n[g],10);break;case"%m":l=parseInt(n[g],10)-1;break;case"%Y":case"%y":(o=parseInt(n[g],10))<100&&(o+=o>29?1900:2e3);break;case"%b":case"%B":for(h=0;h<12;++h)if("gregorian"!=a){if(JoomlaCalLocale.months[h].substr(0,n[g].length).toLowerCase()==n[g].toLowerCase()){l=h;break}}else
if(JoomlaCalLocale.months[h].substr(0,n[g].length).toLowerCase()==n[g].toLowerCase()){l=h;break}break;case"%H":case"%I":case"%k":case"%l":D=parseInt(n[g],10);break;case"%P":case"%p":/pm/i.test(n[g])&&D<12?D+=12:/am/i.test(n[g])&&D>=12&&(D-=12);break;case"%M":u=parseInt(n[g],10);break;case"%S":sec=parseInt(n[g],10)}if(isNaN(o)&&(o=r.getFullYear()),isNaN(l)&&(l=r.getMonth()),isNaN(i)&&(i=r.getDate()),isNaN(D)&&(D=r.getHours()),isNaN(u)&&(u=r.getMinutes()),0!=o&&-1!=l&&0!=i)return
new
Date(o,l,i,D,u,0);for(o=0,l=-1,i=0,g=0;g<n.length;++g)if(-1!=n[g].search(/[a-zA-Z]+/)){var
c=-1;for(h=0;h<12;++h)if("gregorian"!=a){if(JoomlaCalLocale.months[h].substr(0,n[g].length).toLowerCase()==n[g].toLowerCase()){c=h;break}}else
if(JoomlaCalLocale.months[h].substr(0,n[g].length).toLowerCase()==n[g].toLowerCase()){c=h;break}-1!=c&&(-1!=l&&(i=l+1),l=c)}else
parseInt(n[g],10)<=12&&-1==l?l=n[g]-1:parseInt(n[g],10)>31&&0==o?(o=parseInt(n[g],10))<100&&(o+=o>29?1900:2e3):0==i&&(i=n[g]);return
0==o&&(o=r.getFullYear()),-1!=l&&0!=i?new
Date(o,l,i,D,u,0):r},JalaliDate={g_days_in_month:[31,28,31,30,31,30,31,31,30,31,30,31],j_days_in_month:[31,31,31,31,31,31,30,30,30,30,30,29]},JalaliDate.jalaliToGregorian=function(t,e,a){for(var
r=(t=parseInt(t))-979,o=(e=parseInt(e))-1,l=(a=parseInt(a))-1,i=365*r+8*parseInt(r/33)+parseInt((r%33+3)/4),n=0;n<o;++n)i+=JalaliDate.j_days_in_month[n];var
s=(i+=l)+79,g=1600+400*parseInt(s/146097),h=!0;(s%=146097)>=36525&&(s--,g+=100*parseInt(s/36524),(s%=36524)>=365?s++:h=!1),g+=4*parseInt(s/1461),(s%=1461)>=366&&(h=!1,s--,g+=parseInt(s/365),s%=365);for(n=0;s>=JalaliDate.g_days_in_month[n]+(1==n&&h);n++)s-=JalaliDate.g_days_in_month[n]+(1==n&&h);return[g,n+1,s+1]},JalaliDate.checkDate=function(t,e,a){return!(t<0||t>32767||e<1||e>12||a<1||a>JalaliDate.j_days_in_month[e-1]+(12==e&&!((t-979)%33%4)))},JalaliDate.gregorianToJalali=function(t,e,a){for(var
r=(t=parseInt(t))-1600,o=(e=parseInt(e))-1,l=(a=parseInt(a))-1,i=365*r+parseInt((r+3)/4)-parseInt((r+99)/100)+parseInt((r+399)/400),n=0;n<o;++n)i+=JalaliDate.g_days_in_month[n];o>1&&(r%4==0&&r%100!=0||r%400==0)&&++i;var
s=(i+=l)-79,g=parseInt(s/12053);s%=12053;var
h=979+33*g+4*parseInt(s/1461);(s%=1461)>=366&&(h+=parseInt((s-1)/365),s=(s-1)%365);for(n=0;n<11&&s>=JalaliDate.j_days_in_month[n];++n)s-=JalaliDate.j_days_in_month[n];return[h,n+1,s+1]},Date.prototype.setJalaliFullYear=function(t,e,a){var
r=this.getDate(),o=this.getMonth(),l=this.getFullYear(),i=JalaliDate.gregorianToJalali(l,o+1,r);t<100&&(t+=1300),i[0]=t,void
0!=e&&(e>11&&(i[0]+=Math.floor(e/12),e%=12),i[1]=e+1),void
0!=a&&(i[2]=a);var
n=JalaliDate.jalaliToGregorian(i[0],i[1],i[2]);return
this.setFullYear(n[0],n[1]-1,n[2])},Date.prototype.setJalaliMonth=function(t,e){var
a=this.getDate(),r=this.getMonth(),o=this.getFullYear(),l=JalaliDate.gregorianToJalali(o,r+1,a);t>11&&(l[0]+=Math.floor(t/12),t%=12),l[1]=t+1,void
0!=e&&(l[2]=e);var
i=JalaliDate.jalaliToGregorian(l[0],l[1],l[2]);return
this.setFullYear(i[0],i[1]-1,i[2])},Date.prototype.setJalaliDate=function(t){var
e=this.getDate(),a=this.getMonth(),r=this.getFullYear(),o=JalaliDate.gregorianToJalali(r,a+1,e);o[2]=t;var
l=JalaliDate.jalaliToGregorian(o[0],o[1],o[2]);return
this.setFullYear(l[0],l[1]-1,l[2])},Date.prototype.getJalaliFullYear=function(){var
t=this.getDate(),e=this.getMonth(),a=this.getFullYear();return
JalaliDate.gregorianToJalali(a,e+1,t)[0]},Date.prototype.getJalaliMonth=function(){var
t=this.getDate(),e=this.getMonth(),a=this.getFullYear();return
JalaliDate.gregorianToJalali(a,e+1,t)[1]-1},Date.prototype.getJalaliDate=function(){var
t=this.getDate(),e=this.getMonth(),a=this.getFullYear();return
JalaliDate.gregorianToJalali(a,e+1,t)[2]},Date.prototype.getJalaliDay=function(){var
t=this.getDay();return t%=7};
PKZn�[H�zz
js/fields/calendar-locales/de.jsnu�[���window.JoomlaCalLocale =
{
	today : "Heute",
	weekend : [0, 6],
	wk : "KW",
	time : "Uhrzeit:",
	days : ["Sonntag", "Montag", "Dienstag",
"Mittwoch", "Donnerstag", "Freitag",
"Samstag"],
	shortDays : ["Son", "Mon", "Die",
"Mit", "Don", "Fre", "Sam"],
	months : ["Januar", "Februar", "März",
"April", "Mai", "Juni", "Juli",
"August", "September", "Oktober",
"November", "Dezember"],
	shortMonths : ["Jan", "Feb", "Mär",
"Apr", "Mai", "Jun", "Jul",
"Aug", "Sep", "Okt", "Nov",
"Dez"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Schließen",
	clear: "Leeren"
};
PKZn�[���(��
js/fields/calendar-locales/el.jsnu�[���window.JoomlaCalLocale =
{
	today : "Σήμερα",
	weekend : [0, 6],
	wk : "εβδ.",
	time : "Ώρα:",
	days : ["Κυριακή", "Δευτέρα",
"Τρίτη", "Τετάρτη",
"Πέμπτη", "Παρασκευή",
"Σάββατο"],
	shortDays : ["Κυρ", "Δευ", "Τρι",
"Τετ", "Πεμ", "Παρ",
"Σαβ"],
	months : ["Ιανουάριος",
"Φεβρουάριος", "Μάρτιος",
"Απρίλιος", "Μάιος",
"Ιούνιος", "Ιούλιος",
"Αύγουστος", "Σεπτέμβριος",
"Οκτώβριος", "Νοέμβριος",
"Δεκέμβριος"],
	shortMonths : ["Ιαν", "Φεβ", "Μαρ",
"Απρ", "Μαϊ", "Ιουν",
"Ιουλ", "Αυγ", "Σεπ",
"Οκτ", "Νοε", "Δεκ"],
	AM : "ΠΜ",
	PM :  "ΜΜ",
	am : "πμ",
	pm : "μμ",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Κλείσιμο",
	clear: "Καθαρισμός"
};PKZn�[�%�
nn
js/fields/calendar-locales/en.jsnu�[���window.JoomlaCalLocale =
{
	today : "Today",
	weekend : [0, 6],
	wk : "wk",
	time : "Time:",
	days : ["Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday",
"Saturday"],
	shortDays : ["Sun", "Mon", "Tue",
"Wed", "Thu", "Fri", "Sat"],
	months : ["January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "May", "Jun", "Jul",
"Aug", "Sep", "Oct", "Nov",
"Dec"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Close",
	clear: "Clear"
};PKZn�[[*:�ll
js/fields/calendar-locales/es.jsnu�[���window.JoomlaCalLocale =
{
	today : "Hoy",
	weekend : [0, 6],
	wk : "Sem",
	time : "Hora:",
	days : ["Domingo", "Lunes", "Martes",
"Miércoles", "Jueves", "Viernes",
"Sábado"],
	shortDays : ["Do", "Lu", "Ma",
"Mi", "Ju", "Vi", "Sá"],
	months : ["Enero", "Febrero", "Marzo",
"Abril", "Mayo", "Junio", "Julio",
"Agosto", "Septiembre", "Octubre",
"Noviembre", "Diciembre"],
	shortMonths : ["Ene", "Feb", "Mar",
"Abr", "May", "Jun", "Jul",
"Ago", "Sep", "Oct", "Nov",
"Dic"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Cerrar",
	clear: "Limpiar"
};
PKZn�[�R�S��
js/fields/calendar-locales/eu.jsnu�[���window.JoomlaCalLocale =
{
	today : "Gaur",
	weekend : [0, 6],
	wk : "ast.",
	time : "Ordua:",
	days : ["Igandea", "Astelehena",
"Asteartea", "Asteazkena", "Osteguna",
"Ostirala", "Larunbata"],
	shortDays : ["ig.", "al.", "as.",
"az.", "og.", "or.", "lr."],
	months : ["Urtarrila", "Otsaila", "Martxoa",
"Apirila", "Maiatza", "Ekaina",
"Uztaila", "Abuztua", "Iraila",
"Urria", "Azaroa", "Abendua"],
	shortMonths : ["urt.", "ots.", "mar.",
"api.", "mai.", "eka.", "uzt.",
"abu.", "ira.", "urr.", "aza.",
"abe."],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Itxi",
	clear: "Garbitu"
};
PKZn�[|I�TT#js/fields/calendar-locales/fa-ir.jsnu�[���window.JoomlaCalLocale
= {
	today : "امروز",
	weekend : [5],
	wk : "هفته",
	time : "زمان",
	days : ["یکشنبه","دوشنبه","سه
شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
	shortDays :
["یک","دو","سه","چهار","پنج","جمعه","شنبه"],
	months :
["فروردین","اردیبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند"],
	shortMonths :
["فروردین","اردیبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند"],
	AM : "ق.ظ.",
	PM :  "ب.ظ.",
	am : "ق.ظ.",
	pm : "ب.ظ.",
	dateType : "jalali",
	minYear : 1268,
	maxYear : 1458,
	exit: "بستن",
	clear: "پاک",
	localLangNumbers:
["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"]
};PKZn�[���6��
js/fields/calendar-locales/fi.jsnu�[���window.JoomlaCalLocale =
{
	today : "Tänään",
	weekend : [0, 6],
	wk : "vk",
	time : "Aika:",
	days : ["Sunnuntai", "Maanantai", "Tiistai",
"Keskiviikko", "Torstai", "Perjantai",
"Lauantai"],
	shortDays : ["Su", "Ma", "Ti",
"Ke", "To", "Pe", "La"],
	months : ["Tammikuu", "Helmikuu",
"Maaliskuu", "Huhtikuu", "Toukokuu",
"Kesäkuu", "Heinäkuu", "Elokuu",
"Syyskuu", "Lokakuu", "Marraskuu",
"Joulukuu"],
	shortMonths : ["Tammi", "Helmi", "Maalis",
"Huhti", "Touko", "Kesä",
"Heinä", "Elo", "Syys", "Loka",
"Marras", "Joulu"],
	AM : "AP",
	PM :  "IP",
	am : "ap",
	pm : "ip",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Sulje",
	clear: "Tyhjennä"
};PKZn�[��Z
js/fields/calendar-locales/fr.jsnu�[���window.JoomlaCalLocale =
{
	today : "Aujourd'hui",
	weekend : [0, 6],
	wk : "wk",
	time : "Heure&nbsp;:",
	days : ["Dimanche", "Lundi", "Mardi",
"Mercredi", "Jeudi", "Vendredi",
"Samedi"],
	shortDays : ["Dim", "Lun", "Mar",
"Mer", "Jeu", "Ven", "Sam"],
	months : ["Janvier", "Février", "Mars",
"Avril", "Mai", "Juin", "Juillet",
"Août", "Septembre", "Octobre",
"Novembre", "Décembre"],
	shortMonths : ["Jan", "Fév", "Mar",
"Avr", "Mai", "Jui", "Juol",
"Aoû", "Sep", "Oct", "Nov",
"Déc"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Fermer",
	clear: "Effacer"
};PK[n�[~��
js/fields/calendar-locales/ga.jsnu�[���window.JoomlaCalLocale =
{
	today : "Inniu",
	weekend : [0, 6],
	wk : "7n",
	time : "Am:",
	days : ["Dé Domhnaigh", "Dé Luain", "Dé
Máirt", "Dé Céadaoin", "Déardaoin", "Dé
hAoine", "Dé Sathairn"],
	shortDays : ["Domh", "Luan", "Máirt",
"Céad", "Déar", "Aoine", "Sath"],
	months : ["Eanáir", "Feabhra", "Márta",
"Aibreán", "Bealtaine", "Meitheamh",
"Iúil", "Lúnasa", "Meán Fómhair",
"Deireadh Fómhair", "Samhain", "Nollaig"],
	shortMonths : ["Ean", "Feabh", "Márta",
"Aib", "Beal", "Meith", "Iúil",
"Lún", "MFómh", "DFómh", "Samh",
"Noll"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Dún",
	clear: "Glan"
};
PK[n�[��d��
js/fields/calendar-locales/hr.jsnu�[���window.JoomlaCalLocale =
{
	today : "Danas",
	weekend : [0, 6],
	wk : "tj",
	time : "Vrijeme:",
	days : ["Nedjelja", "Ponedjeljak", "Utorak",
"Srijeda", "Četvrtak", "Petak",
"Subota"],
	shortDays : ["Ned", "Pon", "Uto",
"Sri", "Čet", "Pet", "Sub"],
	months : ["Siječanj", "Veljača",
"Ožujak", "Travanj", "Svibanj",
"Lipanj", "Srpanj", "Kolovoz",
"Rujan", "Listopad", "Studeni",
"Prosinac"],
	shortMonths : ["Sij", "Velj", "Ožu",
"Tra", "Svi", "Lip", "Srp",
"Kol", "Ruj", "Lis", "Stu",
"Pro"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Zatvori",
	clear: "Otkaži"
};PK[n�[b/��
js/fields/calendar-locales/hu.jsnu�[���window.JoomlaCalLocale =
{
	today : "Ma",
	weekend : [0, 6],
	wk : "hét",
	time : "Időpont:",
	days : ["vasárnap", "hétfő", "kedd",
"szerda", "csütörtök", "péntek",
"szombat"],
	shortDays : ["V", "H", "K", "Sze",
"Cs", "P", "Szo"],
	months : ["január", "február", "március",
"április", "május", "június",
"július", "augusztus", "szeptember",
"október", "november", "december"],
	shortMonths : ["jan", "febr", "márc",
"ápr", "máj", "jún", "júl",
"aug", "szept", "okt", "nov",
"dec"],
	AM : "de.",
	PM :  "du.",
	am : "de.",
	pm : "du.",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Bezárás",
	clear: "Törlés"
};PK[n�[kn�}}
js/fields/calendar-locales/it.jsnu�[���window.JoomlaCalLocale =
{
	today : "Oggi",
	weekend : [0, 6],
	wk : "set",
	time : "Ora:",
	days : ["Domenica", "Lunedì", "Martedì",
"Mercoledì", "Giovedì", "Venerdì",
"Sabato"],
	shortDays : ["Dom", "Lun", "Mar",
"Mer", "Gio", "Ven", "Sab"],
	months : ["Gennaio", "Febbraio", "Marzo",
"Aprile", "Maggio", "Giugno",
"Luglio", "Agosto", "Settembre",
"Ottobre", "Novembre", "Dicembre"],
	shortMonths : ["Gen", "Feb", "Mar",
"Apr", "Mag", "Giu", "Lug",
"Ago", "Set", "Ott", "Nov",
"Dic"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Chiudi",
	clear: "Annulla"
};PK[n�[����
js/fields/calendar-locales/ja.jsnu�[���window.JoomlaCalLocale =
{
	today : "今日",
	weekend : [0, 6],
	wk : "週",
	time : "時間:",
	days : ["日曜日", "月曜日",
"火曜日", "水曜日", "木曜日",
"金曜日", "土曜日"],
	shortDays : ["日", "月", "火",
"水", "木", "金", "土"],
	months : ["1月", "2月", "3月",
"4月", "5月", "6月", "7月",
"8月", "9月", "10月", "11月",
"12月"],
	shortMonths : ["1月", "2月", "3月",
"4月", "5月", "6月", "7月",
"8月", "9月", "10月", "11月",
"12月"],
	AM : "午前",
	PM :  "午後",
	am : "午前",
	pm : "午後",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "閉じる",
	clear: "クリア"
};PK[n�[e��PP
js/fields/calendar-locales/ka.jsnu�[���window.JoomlaCalLocale =
{
	today : "დღეს",
	weekend : [0, 6],
	wk : "კვ",
	time : "დრო:",
	days : ["კვირა", "ორშაბათი",
"სამშაბათი",
"ოთხშაბათი",
"ხუთშაბათი",
"პარასკევი", "შაბათი"],
	shortDays : ["კვ", "ორშ",
"სამშ", "ოთხშ",
"ხუთშ", "პარ", "შაბ"],
	months : ["იანვარი",
"თებერვალი", "მარტი",
"აპრილი", "მაისი",
"ივნისი", "ივლისი",
"აგვისტო",
"სექტემბერი",
"ოქტომბერი",
"ნოემბერი",
"დეკემბერი"],
	shortMonths : ["იან", "თებ",
"მარ", "აპრ", "მაი",
"ივნ", "ივლ", "აგვ",
"სექ", "ოქტ", "ნოე",
"დეკ"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "დახურვა",
	clear: "გასუფთავება"
};PK[n�[���FF
js/fields/calendar-locales/kk.jsnu�[���window.JoomlaCalLocale =
{
	today : "Бүгін",
	weekend : [0, 6],
	wk : "апта",
	time : "Уақыт:",
	days : ["Жексенбі", "Дүйсенбі",
"Сейсенбі", "Сәрсенбі",
"Бейсенбі", "Жұма",
"Сенбі"],
	shortDays : ["Жекс", "Дүйс",
"Сейс", "Сәрс", "Бейс",
"Жұма", "Сенбі"],
	months : ["Қаңтар", "Ақпан",
"Наурыз", "Сәуір", "Мамыр",
"Маусым", "Шілде", "Тамыз",
"Қыркүйек", "Қазан",
"Қараша", "Желтоқсан"],
	shortMonths : ["Қаң", "Ақп", "Нау",
"Сәу", "Мам", "Мау",
"Шіл", "Там", "Қырк",
"Қаз", "Қар", "Жел"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Жабу",
	clear: "Өшіру"
};PK\n�[�Sq���
js/fields/calendar-locales/ko.jsnu�[���window.JoomlaCalLocale =
{
	today : "오늘",
	weekend : [0, 6],
	wk : "wk",
	time : "시간:",
	days : ["일요일", "월요일",
"화요일", "수요일", "목요일",
"금요일", "토요일"],
	shortDays : ["일", "월", "화",
"수", "목", "금", "토"],
	months : ["1월", "2월", "3월",
"4월", "5월", "6월", "7월",
"8월", "9월", "10월", "11월",
"12월"],
	shortMonths : ["1월", "2월", "3월",
"4월", "5월", "6월", "7월",
"8월", "9월", "10월", "11월",
"12월"],
	AM : "오전",
	PM :  "오후",
	am : "오전",
	pm : "오후",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "닫기",
	clear: "Clear"
};PK\n�[|�|��
js/fields/calendar-locales/lt.jsnu�[���window.JoomlaCalLocale =
{
	today : "Šiandien",
	weekend : [0, 6],
	wk : "wk",
	time : "Laikas:",
	days : ["Sekmadienis", "Pirmadienis",
"Antradienis", "Trečiadienis",
"Ketvirtadienis", "Penktadienis",
"Šeštadienis"],
	shortDays : ["Sek", "Pir", "Ant",
"Tre", "Ket", "Pen", "Šeš"],
	months : ["Sausis", "Vasaris", "Kovas",
"Balandis", "Gegužė", "Birželis",
"Liepa", "Rugpjūtis", "Rugsšjis",
"Spalis", "Lapkritis", "Gruodis"],
	shortMonths : ["Sau", "Vas", "Kov",
"Bal", "Geg", "Bir", "Lie",
"Rug", "Rgs", "Spa", "Lap",
"Grd"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Uždaryti",
	clear: "Išvalyti"
};PK\n�[R9lr<<
js/fields/calendar-locales/mk.jsnu�[���window.JoomlaCalLocale =
{
	today : "Денес",
	weekend : [0, 6],
	wk : "нед",
	time : "Време:",
	days : ["Недела", "Понеделник",
"Вторник", "Среда",
"Четврток", "Петок",
"Сабота"],
	shortDays : ["Нед", "Пон", "Вто",
"Сре", "Чет", "Пет",
"Саб"],
	months : ["Јануари", "Февруари",
"Март", "Април", "Мај",
"Јуни", "Јули", "Август",
"Септември", "Октомври",
"Ноември", "Декември"],
	shortMonths : ["Јан", "Фев", "Мар",
"Апр", "Мај", "Јун",
"Јул", "Авг", "Сеп",
"Окт", "Ное", "Дек"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Затвори",
	clear: "Зачувај"
};PK\n�[-<��nn
js/fields/calendar-locales/nb.jsnu�[���window.JoomlaCalLocale =
{
	today : "Dagens dato",
	weekend : [0, 6],
	wk : "Uke",
	time : "Tid:",
	days : ["Søndag", "Mandag", "Tirsdag",
"Onsdag", "Torsdag", "Fredag",
"Lørdag"],
	shortDays : ["Søn", "Man", "Tir",
"Ons", "Tor", "Fre", "Lør"],
	months : ["Januar", "Februar", "Mars",
"April", "Mai", "Juni", "Juli",
"August", "September", "Oktober",
"November", "Desember"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "Mai", "Jun", "Jul",
"Aug", "Sep", "Okt", "Nov",
"Des"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Lukk",
	clear: "Tøm"
};
PK\n�[��#�vv
js/fields/calendar-locales/nl.jsnu�[���window.JoomlaCalLocale =
{
	today : "Vandaag",
	weekend : [0, 6],
	wk : "wk",
	time : "Tijd:",
	days : ["Zondag", "Maandag", "Dinsdag",
"Woensdag", "Donderdag", "Vrijdag",
"Zaterdag"],
	shortDays : ["Zon", "Maa", "Din",
"Woe", "Don", "Vri", "Zat"],
	months : ["Januari", "Februari", "Maart",
"April", "Mei", "Juni", "Juli",
"Augustus", "September", "Oktober",
"November", "December"],
	shortMonths : ["Jan", "Feb", "Maa",
"Apr", "Mei", "Jun", "Jul",
"Aug", "Sep", "Okt", "Nov",
"Dec"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Sluiten",
	clear: "Legen"
};PK\n�[Q�"5��
js/fields/calendar-locales/pl.jsnu�[���window.JoomlaCalLocale =
{
	today : "Dzisiaj",
	weekend : [0, 6],
	wk : "tydz",
	time : "Godzina:",
	days : ["Niedziela", "Poniedziałek",
"Wtorek", "Środa", "Czwartek",
"Piątek", "Sobota"],
	shortDays : ["nie.", "pon.", "wt.",
"śr.", "czw.", "pt.", "sob."],
	months : ["Styczeń", "Luty", "Marzec",
"Kwiecień", "Maj", "Czerwiec",
"Lipiec", "Sierpień", "Wrzesień",
"Październik", "Listopad", "Grudzień"],
	shortMonths : ["Sty", "Lut", "Mar",
"Kwi", "Maj", "Cze", "Lip",
"Sie", "Wrz", "Paź", "Lis",
"Gru"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Zamknij",
	clear: "Wyczyść"
};PK\n�[|I�TT$js/fields/calendar-locales/prs-af.jsnu�[���window.JoomlaCalLocale
= {
	today : "امروز",
	weekend : [5],
	wk : "هفته",
	time : "زمان",
	days : ["یکشنبه","دوشنبه","سه
شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
	shortDays :
["یک","دو","سه","چهار","پنج","جمعه","شنبه"],
	months :
["فروردین","اردیبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند"],
	shortMonths :
["فروردین","اردیبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند"],
	AM : "ق.ظ.",
	PM :  "ب.ظ.",
	am : "ق.ظ.",
	pm : "ب.ظ.",
	dateType : "jalali",
	minYear : 1268,
	maxYear : 1458,
	exit: "بستن",
	clear: "پاک",
	localLangNumbers:
["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"]
};PK\n�[6CE���
js/fields/calendar-locales/pt.jsnu�[���window.JoomlaCalLocale =
{
	today : "Hoje",
	weekend : [0, 6],
	wk : "sem",
	time : "Hora:",
	days : ["Domingo", "Segunda-feira",
"Terça-feira", "Quarta-feira",
"Quinta-feira", "Sexta-feira", "Sábado"],
	shortDays : ["Dom", "Seg", "Ter",
"Qua", "Qui", "Sex", "Sab"],
	months : ["Janeiro", "Fevereiro", "Março",
"Abril", "Maio", "Junho", "Julho",
"Agosto", "Setembro", "Outubro",
"Novembro", "Dezembro"],
	shortMonths : ["Jan", "Fev", "Mar",
"Abr", "Mai", "Jun", "Jul",
"Ago", "Set", "Out", "Nov",
"Dez"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Fechar",
	clear: "Limpar"
};
PK\n�[I`'�;;
js/fields/calendar-locales/ru.jsnu�[���window.JoomlaCalLocale =
{
	today : "Сегодня",
	weekend : [0, 6],
	wk : "нед",
	time : "Время:",
	days : ["Воскресенье",
"Понедельник", "Вторник",
"Среда", "Четверг",
"Пятница", "Суббота"],
	shortDays : ["Вс", "Пн", "Вт",
"Ср", "Чт", "Пт", "Сб"],
	months : ["Январь", "Февраль",
"Март", "Апрель", "Май",
"Июнь", "Июль", "Август",
"Сентябрь", "Октябрь",
"Ноябрь", "Декабрь"],
	shortMonths : ["Янв", "Фев", "Мар",
"Апр", "Май", "Июн",
"Июл", "Авг", "Сен",
"Окт", "Ноя", "Дек"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Закрыть",
	clear: "Очистить"
};
PK\n�[칌�
js/fields/calendar-locales/sk.jsnu�[���window.JoomlaCalLocale =
{
	today : "Dnes",
	weekend : [0, 6],
	wk : "týž.",
	time : "Čas:",
	days : ["Nedeľa", "Pondelok", "Utorok",
"Streda", "Štvrtok", "Piatok",
"Sobota"],
	shortDays : ["Ned", "Pon", "Uto",
"Str", "Štv", "Pia", "Sob"],
	months : ["Január", "Február", "Marec",
"Apríl", "Máj", "Jún", "Júl",
"August", "September", "Október",
"November", "December"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "Máj", "Jún", "Júl",
"Aug", "Sep", "Okt", "Nov",
"Dec"],
	AM : "DOPOL.",
	PM :  "POPOL.",
	am : "dopol.",
	pm : "popol.",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Zavrieť",
	clear: "Vymazať"
};
PK\n�[��Hnn
js/fields/calendar-locales/sl.jsnu�[���window.JoomlaCalLocale =
{
	today : "Danes",
	weekend : [0, 6],
	wk : "td",
	time : "Čas:",
	days : ["Nedelja", "Ponedeljek", "Torek",
"Sreda", "Četrtek", "Petek",
"Sobota"],
	shortDays : ["Ned", "Pon", "Tor",
"Sre", "Čet", "Pet", "Sob"],
	months : ["Januar", "Februar", "Marec",
"April", "Maj", "Junij", "Julij",
"Avgust", "September", "Oktober",
"November", "December"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "Maj", "Jun", "Jul",
"Avg", "Sep", "Okt", "Nov",
"Dec"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Zapri",
	clear: "Počisti"
};PK\n�[�N!�44#js/fields/calendar-locales/sr-rs.jsnu�[���window.JoomlaCalLocale
= {
	today : "Данас",
	weekend : [0, 6],
	wk : "нед",
	time : "Време:",
	days : ["Недеља", "Понедељак",
"Уторак", "Среда",
"Четвртак", "Петак",
"Субота"],
	shortDays : ["Нед", "Пон", "Уто",
"Сре", "Чет", "Пет",
"Суб"],
	months : ["Јануар", "Фенруар",
"Март", "Април", "Мај",
"Јуни", "Јули", "Август",
"Септембар", "Октобар",
"Новембар", "Децембар"],
	shortMonths : ["Јан", "Феб", "Мар",
"Апр", "Мај", "Јун",
"Јул", "Авг", "Сеп",
"Окт", "Нов", "Дец"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Затвори",
	clear: "Зачувај"
};PK\n�[k>��rr#js/fields/calendar-locales/sr-yu.jsnu�[���window.JoomlaCalLocale
= {
	today : "Danas",
	weekend : [0, 6],
	wk : "ned",
	time : "Vreme:",
	days : ["Nedelja", "Ponedeljak", "Utorak",
"Sreda", "Četvrtak", "Petak",
"Subota"],
	shortDays : ["Ned", "Pon", "Uto",
"Sre", "Čet", "Pet", "Sub"],
	months : ["Januar", "Fenruar", "Mart",
"April", "Maj", "Juni", "Juli",
"Avgust", "Septembar", "Oktobar",
"Novembar", "Decembar"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "Maj", "Jun", "Jul",
"Avg", "Sep", "Okt", "Nov",
"Dec"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Zatvori",
	clear: "Sačuvaj"
};
PK\n�[�p�\ll
js/fields/calendar-locales/sv.jsnu�[���window.JoomlaCalLocale =
{
	today : "Idag",
	weekend : [0, 6],
	wk : "vk",
	time : "Tid:",
	days : ["Söndag", "Måndag", "Tisdag",
"Onsdag", "Torsdag", "Fredag",
"Lördag"],
	shortDays : ["Sön", "Mån", "Tis",
"Ons", "Tor", "Fre", "Lör"],
	months : ["Januari", "Februari", "Mars",
"April", "Maj", "Juni", "Juli",
"Augusti", "September", "Oktober",
"November", "December"],
	shortMonths : ["Jan", "Feb", "Mar",
"Apr", "Maj", "Jun", "Jul",
"Aug", "Sep", "Okt", "Nov",
"Dec"],
	AM : "FM",
	PM :  "EM",
	am : "fm",
	pm : "em",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Stäng",
	clear: "Rensa"
};PK\n�[��6�ss
js/fields/calendar-locales/sw.jsnu�[���window.JoomlaCalLocale
= {
	today : "Leo",
	weekend : [0, 6],
	wk : "wk",
	time : "Saa:",
	days : ["Jumapili", "Jumatatu", "Jumanne",
"Jumatano", "Alhamisi", "Ijumaa",
"Jumamosi"],
	shortDays : ["Jmp", "Jmt", "Jmn",
"Jtn", "Alh", "Ijm", "Jmm"],
	months : ["Januari", "Februari", "Machi",
"Aprili", "Mai", "Juni", "Julai",
"Augosti", "Septemba", "Oktoba",
"Novemba", "Desemba"],
	shortMonths : ["Jan", "Feb", "Mach",
"Apr", "Mai", "Jun", "Jul",
"Ago", "Sep", "Okt", "Nov",
"Des"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Funga",
	clear: "Safisha"
};PK\n�[�Ʊ��
js/fields/calendar-locales/ta.jsnu�[���window.JoomlaCalLocale =
{
	today : "இன்று",
	weekend : [0, 6],
	wk : "வா",
	time : "நேரம்:",
	days : ["ஞாயிறு", "திங்கள்",
"செவ்வாய்", "புதன்",
"வியாழன்", "வெள்ளி",
"சனி"],
	shortDays : ["ஞா", "தி", "செ",
"பு", "வி", "வெ",
"ச"],
	months : ["ஜனவரி",
"பிப்ரவரி", "மார்ச்",
"ஏப்ரல்", "மே",
"ஜூன்", "ஜூலை",
"ஆகஸ்ட்", "செப்டம்பர்",
"அக்டோபர்", "நவம்பர்",
"டிசம்பர்"],
	shortMonths : ["ஜன", "பிப்",
"மார்", "ஏப்", "மே",
"ஜூன்", "ஜூலை", "ஆக",
"செப்", "அக்", "நவ",
"டிச"],
	AM : "முப",
	PM : "பிப",
	am : "முப",
	pm : "பிப",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "மூடுக",
	clear: "துடைக்க"
};PK\n�[�=����
js/fields/calendar-locales/th.jsnu�[���window.JoomlaCalLocale =
{
	today : "วันนี้",
	weekend : [0, 6],
	wk : "สัปดาห์",
	time : "เวลา:",
	days : ["อาทิตย์", "จันทร์",
"อังคาร", "พุธ",
"พฤหัสบดี", "ศุกร์",
"เสาร์"],
	shortDays : ["อา.", "จ.", "อ.",
"พ.", "พฤ.", "ศ.", "ส."],
	months : ["มกราคม",
"กุมภาพันธ์", "มีนาคม",
"เมษายน", "พฤษภาคม",
"มิถุนายน", "กรกฏาคม",
"สิงหาคม", "กันยายน",
"ตุลาคม", "พฤศจิกายน",
"ธันวาคม"],
	shortMonths : ["ม.ค.", "ก.พ.",
"มี.ค.", "เม.ย.", "พ.ค.",
"มิ.ย.", "ก.ค.", "ส.ค.",
"ก.ย.", "ต.ค.", "พ.ย.",
"ธ.ค."],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "ปิด",
	clear: "ล้าง"
};PK\n�[��Vrmm
js/fields/calendar-locales/uk.jsnu�[���window.JoomlaCalLocale =
{
	today : "Сьогодні",
	weekend : [0, 6],
	wk : "тждн.",
	time : "Час:",
	days : ["Неділя", "Понеділок",
"Вівторок", "Середа",
"Четвер", "П'ятниця",
"Субота"],
	shortDays : ["Нд.", "Пн.", "Вт.",
"Ср.", "Чт.", "Пт.",
"Сб."],
	months : ["Січень", "Лютий",
"Березень", "Квітень",
"Травень", "Червень",
"Липень", "Серпень",
"Вересень", "Жовтень",
"Листопад", "Грудень"],
	shortMonths : ["Січ.", "Лют.",
"Бер.", "Квіт.", "Трав.",
"Черв.", "Лип.", "Серп.",
"Вер.", "Жовт.", "Лист.",
"Груд."],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "Закрити",
	clear: "Очистити"
};PK\n�[z2���#js/fields/calendar-locales/zh-CN.jsnu�[���window.JoomlaCalLocale
= {
	today : "今天",
	weekend : [0, 6],
	wk : "星期",
	time : "时间",
	days : ["星期日", "星期一",
"星期二", "星期三", "星期四",
"星期五", "星期六"],
	shortDays : ["日", "一", "二",
"三", "四", "五", "六"],
	months : ["一月", "二月", "三月",
"四月", "五月", "六月",
"七月", "八月", "九月",
"十月", "十一月", "十二月"],
	shortMonths : ["一", "二", "三",
"四", "五", "六", "七",
"八", "九", "十", "十一",
"十二"],
	AM : "上午",
	PM :  "下午",
	am : "上午",
	pm : "下午",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "关闭",
	clear: "清除"
};PK\n�[f�=�bb#js/fields/calendar-locales/zh-TW.jsnu�[���window.JoomlaCalLocale
= {
	today : "今天",
	weekend : [0, 6],
	wk : "週",
	time : "時間:",
	days : ["日", "一", "二",
"三", "四", "五", "六"],
	shortDays : ["日", "一", "二",
"三", "四", "五", "六"],
	months : ["一月", "二月", "三月",
"四月", "五月", "六月",
"七月", "八月", "九月",
"十月", "十一月", "十二月"],
	shortMonths : ["一", "二", "三",
"四", "五", "六", "七",
"八", "九", "十", "十一",
"十二"],
	AM : "AM",
	PM :  "PM",
	am : "am",
	pm : "pm",
	dateType : "gregorian",
	minYear : 1900,
	maxYear : 2100,
	exit: "關閉",
	clear: "清除"
};
PK\n�[���5�5�js/fields/calendar.jsnu�[���/**
 * @copyright  Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */
!(function(window, document){
	'use strict';

	/** Method to convert numbers to local symbols. */
	Date.convertNumbers = function(str) {
		var str = str.toString();

		if (Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers) ===
'[object Array]') {
			for (var i = 0; i < JoomlaCalLocale.localLangNumbers.length; i++) {
				str = str.replace(new RegExp(i, 'g'),
JoomlaCalLocale.localLangNumbers[i]);
			}
		}
		return str;
	};

	/** Translates to english numbers a string. */
	Date.toEnglish = function(str) {
		str = this.toString();
		var nums = [0,1,2,3,4,5,6,7,8,9];
		for (var i = 0; i < 10; i++) {
			str = str.replace(new RegExp(nums[i], 'g'), i);
		}
		return str;
	};

	var JoomlaCalendar = function (element) {

		// Initialize only if the element exists
		if (!element) {
			throw new Error("Calendar setup failed:\n  No valid element found,
Please check your code");
		}

		if (typeof Date.parseFieldDate !== 'function') {
			throw new Error("Calendar setup failed:\n  No valid date helper,
Please check your code");
		}

		if (element._joomlaCalendar) {
			throw new Error('JoomlaCalendar instance already exists for the
element');
		}

		element._joomlaCalendar = this;

		this.writable   = true;
		this.hidden     = true;
		this.params     = {};
		this.element    = element;
		this.inputField = element.getElementsByTagName('input')[0];
		this.button     = element.getElementsByTagName('button')[0];

		if (!this.inputField) {
			throw new Error("Calendar setup failed:\n  No valid input found,
Please check your code");
		}

		// Prepare the parameters
		this.params = {
			debug: false,
			clicked: false,
			element: {style: {display: "none"}},
			writable: true
		};

		var self = this,
			btn  = this.button,
			instanceParams = {
				inputField      : this.inputField,
				dateType        : JoomlaCalLocale.dateType ? JoomlaCalLocale.dateType :
'gregorian',
				direction       : (document.dir !== undefined) ? document.dir :
document.getElementsByTagName("html")[0].getAttribute("dir"),
				firstDayOfWeek  : btn.getAttribute("data-firstday") ?
parseInt(btn.getAttribute("data-firstday")) : 0,
				dateFormat      : "%Y-%m-%d %H:%M:%S",
				weekend         : JoomlaCalLocale.weekend ? JoomlaCalLocale.weekend :
[0,6],
				minYear         : JoomlaCalLocale.minYear ? JoomlaCalLocale.minYear :
1900,
				maxYear         : JoomlaCalLocale.maxYear ? JoomlaCalLocale.maxYear :
2100,
				minYearTmp      : btn.getAttribute("data-min-year"),
				maxYearTmp      : btn.getAttribute("data-max-year"),
				weekendTmp      : btn.getAttribute("data-weekend"),
				time24          : true,
				showsOthers     :
(parseInt(btn.getAttribute("data-show-others")) === 1) ? true :
false,
				showsTime       : true,
				weekNumbers     :
(parseInt(btn.getAttribute("data-week-numbers")) === 1) ? true :
false,
				showsTodayBtn   : true,
				compressedHeader:
(parseInt(btn.getAttribute("data-only-months-nav")) === 1) ? true
: false,
			};

		// Keep B/C
		if (btn.getAttribute("data-dayformat")) {
			instanceParams.dateFormat = btn.getAttribute("data-dayformat")
? btn.getAttribute("data-dayformat") : "%Y-%m-%d
%H:%M:%S";
		}

		if (btn.getAttribute("data-time-24")) {
			instanceParams.time24 =
parseInt(btn.getAttribute("data-time-24")) === 24 ? true : false;
		}

		if (btn.getAttribute("data-show-time")) {
			instanceParams.showsTime =
parseInt(btn.getAttribute("data-show-time")) === 1 ? true :
false;
		}

		if (btn.getAttribute("data-today-btn")) {
			instanceParams.showsTodayBtn =
parseInt(btn.getAttribute("data-today-btn")) === 1 ? true :
false;
		}

		// Merge the parameters
		for (var param in instanceParams) {
			this.params[param] = instanceParams[param];
		}

		// Evaluate the min year
		if (isInt(self.params.minYearTmp)) {
			self.params.minYear = getBoundary(parseInt(self.params.minYearTmp),
self.params.dateType);
		}
		// Evaluate the max year
		if (isInt(self.params.maxYearTmp)) {
			self.params.maxYear = getBoundary(parseInt(self.params.maxYearTmp),
self.params.dateType);
		}
		// Evaluate the weekend days
		if (self.params.weekendTmp !== "undefined") {
			self.params.weekend =
self.params.weekendTmp.split(',').map(function(item) { return
parseInt(item, 10); });
		}

		// Event handler need to define here, to be able access in current
context
		this._dayMouseDown = function(event) {
			return self._handleDayMouseDown(event);
		};
		this._calKeyEvent = function(event) {
			return self._handleCalKeyEvent(event);
		};
		this._documentClick = function(event) {
			return self._handleDocumentClick(event);
		};

		// Set it up
		this.checkInputs();

		// For the fields with readonly tag calendar will not initiate fully
		if (this.inputField.getAttribute('readonly')) {
			return;
		}

		this._create();
		this._bindEvents();
	};

	JoomlaCalendar.prototype.checkInputs = function () {
		// Get the date from the input
		var inputAltValueDate =
Date.parseFieldDate(this.inputField.getAttribute('data-alt-value'),
this.params.dateFormat, 'gregorian');

		if (this.inputField.value !== '') {
			this.date = inputAltValueDate;
			this.inputField.value = inputAltValueDate.print(this.params.dateFormat,
this.params.dateType, true);
		} else {
			this.date = new Date();
		}
	};

	/** Removes the calendar object from the DOM tree and destroys it and then
recreates it. */
	JoomlaCalendar.prototype.recreate = function () {
		var element = this.element, el =
element.querySelector('.js-calendar');
		if (el) {
			element._joomlaCalendar = null;
			el.parentNode.removeChild(el);
			new JoomlaCalendar(element);
		}
	};

	/** Time Control */
	JoomlaCalendar.prototype.updateTime = function (hours, mins, secs) {
		var self = this,
			date = self.date;

		var d = self.date.getLocalDate(self.params.dateType),
			m = self.date.getLocalMonth(self.params.dateType),
			y = self.date.getLocalFullYear(self.params.dateType),
			ampm =
this.inputField.parentNode.parentNode.querySelectorAll('.time-ampm')[0];

		if (!self.params.time24) {
			if (/pm/i.test(ampm.value) && hours < 12) {
				hours = parseInt(hours) + 12;
			} else if (/am/i.test(ampm.value) && hours == 12) {
				hours = 0;
			}
		}

		date.setHours(hours);
		date.setMinutes(parseInt(mins, 10));
		date.setSeconds(date.getSeconds());
		date.setLocalFullYear(self.params.dateType, y);
		date.setLocalMonth(self.params.dateType, m);
		date.setLocalDate(self.params.dateType, d);
		self.dateClicked = false;

		this.callHandler();
	};

	/** Method to set the date to the given date object */
	JoomlaCalendar.prototype.setDate = function (date) {
		if (!date.equalsTo(this.date)) {
			this.date = date;
			this.processCalendar(this.params.firstDayOfWeek, date);
		}
	};

	/** Method to set the current date by a number, step */
	JoomlaCalendar.prototype.moveCursorBy = function (step) {
		var date = new Date(this.date);
		date.setDate(date.getDate() - step);
		this.setDate(date);
	};

	/** Reset select element */
	JoomlaCalendar.prototype.resetSelected = function (element) {
		var options = element.options;
		var i = options.length;
		while (i--) {
			var current = options[i];
			if (current.selected) {
				current.selected = false;
			}
		}
	};

	/** Method to set the value for the input field */
	JoomlaCalendar.prototype.callHandler = function () {
		/** Output the date **/
		this.inputField.setAttribute('data-alt-value',
this.date.print(this.params.dateFormat, 'gregorian', false));

		if (this.inputField.getAttribute('data-alt-value') &&
this.inputField.getAttribute('data-alt-value') !==
'0000-00-00 00:00:00') {
			this.inputField.value = this.date.print(this.params.dateFormat,
this.params.dateType, true);
			if (this.params.dateType !== 'gregorian') {
				this.inputField.setAttribute('data-local-value',
this.date.print(this.params.dateFormat, this.params.dateType, true));
			}
		}
		this.inputField.value = this.date.print(this.params.dateFormat,
this.params.dateType, true);

		if (typeof this.inputField.onchange == "function") {
			this.inputField.onchange();
		}

		if (this.dateClicked && typeof this.params.onUpdate ===
"function") {
			this.params.onUpdate(this);
		}

		if (this.dateClicked) {
			this.close();
		} else {
			this.processCalendar();
		}
	};

	/** Method to close/hide the calendar */
	JoomlaCalendar.prototype.close = function () {
		this.hide();
	};

	/** Method to show the calendar. */
	JoomlaCalendar.prototype.show = function () {
		/** This is needed for IE8 */
		if (navigator.appName.indexOf("Internet Explorer")!==-1) {
			var badBrowser = (
				navigator.appVersion.indexOf("MSIE 9")===-1 &&
				navigator.appVersion.indexOf("MSIE 1")===-1
			);

			if (badBrowser) {
				if (window.jQuery && jQuery().chosen) {
					var selItems = this.element.getElementsByTagName('select');
					for (var i = 0; i < selItems.length; i++) {
						jQuery(selItems[i]).chosen('destroy');
					}
				}
			}
		}

		this.checkInputs();
		this.inputField.focus();
		this.dropdownElement.style.display = "block";
		this.hidden = false;

		document.addEventListener("keydown", this._calKeyEvent, true);
		document.addEventListener("keypress", this._calKeyEvent, true);
		document.addEventListener("mousedown", this._documentClick,
true);

		/** Move the calendar to top position if it doesn't fit below. */
		var containerTmp = this.element.querySelector('.js-calendar');

		if (window.innerHeight < containerTmp.getBoundingClientRect().bottom +
20) {
			containerTmp.style.marginTop = -
(containerTmp.getBoundingClientRect().height +
this.inputField.getBoundingClientRect().height) + "px";
		}

		this.processCalendar();
	};

	/** Method to hide the calendar. */
	JoomlaCalendar.prototype.hide = function () {
		document.removeEventListener("keydown", this._calKeyEvent,
true);
		document.removeEventListener("keypress", this._calKeyEvent,
true);
		document.removeEventListener("mousedown", this._documentClick,
true);

		this.dropdownElement.style.display = "none";
		this.hidden = true;
	};

	/** Method to catch clicks outside of the calendar (used as close call) */
	JoomlaCalendar.prototype._handleDocumentClick = function (ev) {
		var el = ev.target;

		if (el !== null && !el.classList.contains('time')) {
			for (; el !== null && el !== this.element; el = el.parentNode);
		}

		if (el === null) {
			document.activeElement.blur();
			this.hide();
			return stopCalEvent(ev);
		}
	};

	/** Method to handle mouse click events (menus, buttons) **/
	JoomlaCalendar.prototype._handleDayMouseDown = function (ev) {
		var self = this,
			el = ev.currentTarget,
			target = ev.target || ev.srcElement;

		if (target && target.hasAttribute('data-action')) {
			return;
		}

		if (el.nodeName !== 'TD') {                         // A
bootstrap inner button was pressed?
			var testel = el.getParent('TD');
			if (testel.nodeName === 'TD') {                 // Yes so use
that element's td
				el = testel;
			} else {                                        // No - try to find the
table this way
				el = el.getParent('TD');
				if (el.classList.contains('js-calendar')) {
					el = el.getElementsByTagName('table')[0];
				}
			}
		} else {                                            // Check that
doesn't have a button and is not a day td
			if (!(target.classList.contains('js-btn')) &&
!el.classList.contains('day') &&
!el.classList.contains('title')) {
				return;
			}
		}

		if (!el || el.disabled) {
			return false;
		}

		if (typeof el.navtype === "undefined" || el.navtype !== 300) {
			if (el.navtype === 50) { el._current = el.innerHTML; }

			if (target === el || target.parentNode === el) { self.cellClick(el, ev);
}

			var mon = null;
			if (typeof el.month !== "undefined") {
				mon = el;
			}
			if (typeof el.parentNode.month !== "undefined") {
				mon = el.parentNode;
			}
			var date = null;
			if (mon) {
				date = new Date(self.date);
				if (mon.month !== date.getLocalMonth(self.params.dateType)) {
					date.setLocalMonth(self.params.dateType, mon.month);
					self.setDate(date);
					self.dateClicked = false;
					this.callHandler();
				}
			} else {
				var year = null;
				if (typeof el.year !== "undefined") {
					year = target;
				}
				if (typeof el.parentNode.year !== "undefined") {
					year = target.parentNode;
				}
				if (year) {
					date = new Date(self.date);
					if (year.year !== date.getLocalFullYear(self.params.dateType)) {
						date.setFullYear(self.params.dateType, year.year);
						self.setDate(date);
						self.dateClicked = false;
						this.callHandler();
					}
				}
			}
		}

		return stopCalEvent(ev);
	};

	/** Method to handle mouse click events (dates) **/
	JoomlaCalendar.prototype.cellClick = function (el, ev) {
		var self = this,
			closing = false,
			newdate = false,
			date = null;

		if (typeof el.navtype === "undefined") {
			if (self.currentDateEl) {
				el.classList.add("selected");
				self.currentDateEl = el.caldate;
				closing = (self.currentDateEl === el.caldate);
				if (!closing) {
					self.currentDateEl = el.caldate;
				}
			}
			self.date.setLocalDateOnly('gregorian', el.caldate);
			var other_month = !(self.dateClicked = !el.otherMonth);
			if (self.currentDateEl) { newdate = !el.disabled; }
			if (other_month) {
				this.processCalendar();
			}
		} else {
			date = new Date(self.date);
			self.dateClicked = false;
			var year = date.getOtherFullYear(self.params.dateType), mon =
date.getLocalMonth(self.params.dateType);
			switch (el.navtype) {
				case 400:
					break;
				case -2:                                                               
             // Prev year
					if (!self.params.compressedHeader) {
						if (year > self.params.minYear) {
							date.setOtherFullYear(self.params.dateType, year - 1);
						}
					}
					break;
				case -1:                                                               
             // Prev month
					var day = date.getLocalDate(self.params.dateType);
					if (mon > 0) {
						var max = date.getLocalMonthDays(self.params.dateType, mon - 1);
						if (day > max) {
							date.setLocalDate(self.params.dateType, max);
						}
						date.setLocalMonth(self.params.dateType, mon - 1);
					} else if (year-- > self.params.minYear) {
						date.setOtherFullYear(self.params.dateType, year);
						var max = date.getLocalMonthDays(self.params.dateType, 11);
						if (day > max) {
							date.setLocalDate(self.params.dateType, max);
						}
						date.setLocalMonth(self.params.dateType, 11);
					}
					break;
				case 1:                                                                
            // Next month
					var day = date.getLocalDate(self.params.dateType);
					if (mon < 11) {
						var max = date.getLocalMonthDays(self.params.dateType, mon + 1);
						if (day > max) {
							date.setLocalDate(self.params.dateType, max);
						}
						date.setLocalMonth(self.params.dateType, mon + 1);
					} else if (year < self.params.maxYear) {
						date.setOtherFullYear(self.params.dateType, year + 1);
						var max = date.getLocalMonthDays(self.params.dateType, 0);
						if (day > max) {
							date.setLocalDate(self.params.dateType, max);
						}
						date.setLocalMonth(self.params.dateType, 0);
					}
					break;
				case 2:                                                                
            // Next year
					if (!self.params.compressedHeader)
						if (year < self.params.maxYear) {
							date.setOtherFullYear(self.params.dateType, year + 1);
						}
					break;
				case 0:                                                                
            // Today
					break;
			}

			if (!date.equalsTo(self.date)) {
				this.setDate(date);
				newdate = true;
			} else if (el.navtype === 0) {
				newdate = closing = true;
			}
		}

		if (newdate) {
			if (self.params.showsTime) {
				this.dateClicked = false;
			}
			ev && this.callHandler();
		}

		el.classList.remove("hilite");

		if (closing && !self.params.showsTime) {
			self.dateClicked = false;
			ev && this.close();
		}
	};

	/** Method to handle keyboard click events **/
	JoomlaCalendar.prototype._handleCalKeyEvent = function (ev) {
		var self = this,
			K = ev.keyCode;

		// Get value from input
		if (ev.target === this.inputField && (K === 13 || K === 9)) {
			this.close();
		}

		if (self.params.direction === 'rtl') {
			if (K === 37) {
				K = 39;
			} else if (K === 39) {
				K = 37;
			}
		}

		if (K === 32) {                                // KEY Shift + space (now)
			if (ev.shiftKey) {
				ev.preventDefault();
				this.cellClick(self._nav_now, ev);
				self.close();
			}
		}
		if (K === 27) {                                // KEY esc (close);
			this.close();
		}
		if (K === 38) {                                // KEY up (previous week)
			this.moveCursorBy(7);
		}
		if (K === 40) {                                // KEY down (next week)
			this.moveCursorBy( -7);
		}
		if (K === 37) {                                // KEY left (previous day)
			this.moveCursorBy(1);
		}
		if (K === 39) {                                // KEY right (next day)
			this.moveCursorBy( -1);
		}
		if (ev.target === this.inputField && !(K>48 || K<57 ||
K===186 || K===189 || K===190 || K===32)) {
			return stopCalEvent(ev);
		}
	};

	/** Method to create the html structure of the calendar */
	JoomlaCalendar.prototype._create = function () {
		var self   = this,
			parent = this.element,
			table  = createElement("table"),
			div    = createElement("div");

		this.table = table;
		table.className = 'table';
		table.cellSpacing = 0;
		table.cellPadding = 0;
		table.style.marginBottom = 0;

		this.dropdownElement = div;
		parent.appendChild(div);

		if (this.params.direction) {
			div.style.direction = this.params.direction;
		}

		div.className = 'js-calendar';
		div.style.position = "absolute";
		div.style.boxShadow = "0px 0px 70px 0px rgba(0,0,0,0.67)";
		div.style.minWidth = this.inputField.width;
		div.style.padding = '0';
		div.style.display = "none";
		div.style.left = "auto";
		div.style.top = "auto";
		div.style.zIndex = 1060;
		div.style.borderRadius = "20px";

		this.wrapper = createElement('div');
		this.wrapper.className = 'calendar-container';
		div.appendChild(this.wrapper);
		this.wrapper.appendChild(table);

		var thead = createElement("thead", table);
		thead.className = 'calendar-header';

		var cell = null,
			row  = null,
			cal  = this,
			hh   = function (text, cs, navtype, node, styles, classes, attributes) {
				node = node ? node : "td";
				styles = styles ? styles : {};
				cell = createElement(node, row);
				if (cs) {
					classes = classes ? 'class="' + classes +
'"' : '';
				cell.colSpan = cs;
				}

				for (var key in styles) {
					cell.style[key] = styles[key];
				}
				for (var key in attributes) {
					cell.setAttribute(key, attributes[key]);
				}
				if (navtype !== 0 && Math.abs(navtype) <= 2) {
					cell.className += " nav";
				}

				if (cs) {
					cell.addEventListener("mousedown", self._dayMouseDown,
true);
				}

				cell.calendar = cal;
				cell.navtype = navtype;
				if (navtype !== 0 && Math.abs(navtype) <= 2) {
					cell.innerHTML = "<a " + classes + "
style='display:inline;padding:2px
6px;cursor:pointer;text-decoration:none;'
unselectable='on'>" + text + "</a>";
				} else {
					cell.innerHTML = cs ? "<div unselectable='on'"
+ classes + ">" + text + "</div>" : text;
					if (!cs && classes) {
						cell.className = classes;
					}
				}
				return cell;
			};

		if (this.params.compressedHeader === false) {                            
                           // Head - year
			row = createElement("tr", thead);
			row.className = "calendar-head-row";
			this._nav_py = hh("&lsaquo;", 1, -2, '',
{"text-align": "center", "font-size":
"18px", "line-height": "18px"}, 'js-btn
btn-prev-year');                   // Previous year button
			this.title = hh('<div
style="text-align:center;font-size:18px"><span></span></div>',
this.params.weekNumbers ? 6 : 5, 300);
			this.title.className = "title";
			this._nav_ny = hh(" &rsaquo;", 1, 2, '',
{"text-align": "center", "font-size":
"18px", "line-height": "18px"}, 'js-btn
btn-next-year');                   // Next year button
		}

		row = createElement("tr", thead);                              
                                    // Head - month
		row.className = "calendar-head-row";
		this._nav_pm = hh("&lsaquo;", 1, -1, '',
{"text-align": "center", "font-size":
"2em", "line-height": "1em"}, 'js-btn
btn-prev-month');                       // Previous month button
		this._nav_month = hh('<div
style="text-align:center;font-size:1.2em"><span></span></div>',
this.params.weekNumbers ? 6 : 5, 888, 'td',
{'textAlign': 'center'});
		this._nav_month.className = "title";
		this._nav_nm = hh(" &rsaquo;", 1, 1, '',
{"text-align": "center", "font-size":
"2em", "line-height": "1em"}, 'js-btn
btn-next-month');                       // Next month button

		row = createElement("tr", thead);                              
                                    // day names
		row.className = self.params.weekNumbers ? "daynames wk" :
"daynames";
		if (this.params.weekNumbers) {
			cell = createElement("td", row);
			cell.className = "day-name wn";
			cell.innerHTML = JoomlaCalLocale.wk;
		}
		for (var i = 7; i > 0; --i) {
			cell = createElement("td", row);
			if (!i) {
				cell.calendar = self;
			}
		}
		this.firstdayname = (this.params.weekNumbers) ?
row.firstChild.nextSibling : row.firstChild;

		var fdow = this.params.firstDayOfWeek,
			cell = this.firstdayname,
			weekend = JoomlaCalLocale.weekend;

		for (var i = 0; i < 7; ++i) {
			var realday = (i + fdow) % 7;
			cell.classList.add("day-name");
			this.params.weekNumbers ? cell.classList.add('day-name-week')
: '';

			if (i) {
				cell.calendar = self;
				cell.fdow = realday;
			}
			if (weekend.indexOf(weekend) !== -1) {
				cell.classList.add("weekend");
			}

			cell.innerHTML = JoomlaCalLocale.shortDays[(i + fdow) % 7];
			cell = cell.nextSibling;
		}

		var tbody = createElement("tbody", table);
		this.tbody = tbody;
		for (i = 6; i > 0; --i) {
			row = createElement("tr", tbody);
			if (this.params.weekNumbers) {
				cell = createElement("td", row);
			}

			for (var j = 7; j > 0; --j) {
				cell = createElement("td", row);
				cell.calendar = this;
				cell.addEventListener("mousedown", this._dayMouseDown, true);
			}
		}

		if (this.params.showsTime) {
			row = createElement("tr", tbody);
			row.className = "time";

			cell = createElement("td", row);
			cell.className = "time time-title";
			cell.colSpan = 1;
			cell.style.verticalAlign = 'middle';
			cell.innerHTML = " ";

			var cell1 = createElement("td", row);
			cell1.className = "time hours-select";
			cell1.colSpan = 2;

			var cell2 = createElement("td", row);
			cell2.className = "time minutes-select";
			cell2.colSpan = 2;

			(function () {
				function makeTimePart(className, selected, range_start, range_end,
cellTml) {
					var part = createElement("select", cellTml), num;
					part.calendar  = self;
					part.className =  className;
					part.setAttribute('data-chosen', true); // avoid Chosen,
hack
					part.style.width = '100%';
					part.navtype = 50;
					part._range = [];
					for (var i = range_start; i <= range_end; ++i) {
						var txt, selAttr = '';
						if (i === selected) {
							selAttr = true;
						}
						if (i < 10 && range_end >= 10) {
							num = '0' + i;
							txt = Date.convertNumbers('0') + Date.convertNumbers(i);
						} else {
							num = '' + i;
							txt = '' + Date.convertNumbers(i);
						}
						part.options.add(new Option(txt, num, selAttr, selAttr));
					}
					return part;
				}
				var hrs  = self.date.getHours(),
					mins = self.date.getMinutes(),
					t12  = !self.params.time24,
					pm   = (self.date.getHours() > 12);

				if (t12 && pm) {
					hrs -= 12;
				}

				var H = makeTimePart("time time-hours", hrs, t12 ? 1 : 0, t12
? 12 : 23, cell1),
					M = makeTimePart("time time-minutes", mins, 0, 59, cell2),
					AP = null;

				cell = createElement("td", row);
				cell.className = "time ampm-select";
				cell.colSpan = self.params.weekNumbers ? 1 : 2;

				if (t12) {
					var selAttr = true,
						altDate =
Date.parseFieldDate(self.inputField.getAttribute('data-alt-value'),
self.params.dateFormat, 'gregorian');
					pm = (altDate.getHours() >= 12);

					var part = createElement("select", cell);
					part.className = "time-ampm";
					part.style.width = '100%';
					part.options.add(new Option(JoomlaCalLocale.PM, "pm", pm ?
selAttr : '', pm ? selAttr : ''));
					part.options.add(new Option(JoomlaCalLocale.AM, "am", pm ?
'' : selAttr, pm ? '' : selAttr));
					AP = part;

					// Event listener for the am/pm select
					AP.addEventListener("change", function (event) {
						self.updateTime(event.target.parentNode.parentNode.childNodes[1].childNodes[0].value,
							event.target.parentNode.parentNode.childNodes[2].childNodes[0].value,
							event.target.parentNode.parentNode.childNodes[3].childNodes[0].value);
					}, false);
				} else {
					cell.innerHTML = "&#160;";
					cell.colSpan = self.params.weekNumbers ? 3 : 2;
				}

				H.addEventListener("change", function (event) {
					self.updateTime(event.target.parentNode.parentNode.childNodes[1].childNodes[0].value,
						event.target.parentNode.parentNode.childNodes[2].childNodes[0].value,
						event.target.parentNode.parentNode.childNodes[3].childNodes[0].value);
				}, false);
				M.addEventListener("change", function (event) {
					self.updateTime(event.target.parentNode.parentNode.childNodes[1].childNodes[0].value,
						event.target.parentNode.parentNode.childNodes[2].childNodes[0].value,
						event.target.parentNode.parentNode.childNodes[3].childNodes[0].value);
				}, false);
			})();
		}

		row = createElement("div", this.wrapper);
		row.className = "buttons-wrapper btn-group";

		this._nav_clear = hh(JoomlaCalLocale.clear, '', 100,
'button', '', 'js-btn btn btn-clear',
{"type": "button", "data-action":
"clear"});

			var cleara =
row.querySelector('[data-action="clear"]');
			cleara.addEventListener("click", function (e) {
				e.preventDefault();
				var days = self.table.querySelectorAll('td');
				for (var i = 0; i < days.length; i++) {
					if (days[i].classList.contains('selected')) {
						days[i].classList.remove('selected');
						break;
					}
				}
				self.inputField.setAttribute('data-alt-value',
"0000-00-00 00:00:00");
				self.inputField.setAttribute('value', '');
				self.inputField.value = '';
				if (self.inputField.onchange) {
					self.inputField.onchange();
				}
			});

		if (this.params.showsTodayBtn) {
			this._nav_now = hh(JoomlaCalLocale.today, '', 0,
'button', '', 'js-btn btn btn-today',
{"type": "button", "data-action":
"today"});

			var todaya =
this.wrapper.querySelector('[data-action="today"]');
			todaya.addEventListener('click', function (e) {
				e.preventDefault();
				self.date.setLocalDateOnly('gregorian', new Date());         
                        // TODAY
				self.dateClicked = true;
				self.callHandler();
				self.close();
			});
		}

		this._nav_exit = hh(JoomlaCalLocale.exit, '', 999,
'button', '', 'js-btn btn btn-exit',
{"type": "button", "data-action":
"exit"});
		var exita =
this.wrapper.querySelector('[data-action="exit"]');
		exita.addEventListener('click', function (e) {
			e.preventDefault();
			if (!self.dateClicked) {
				if (self.inputField.value) {
					if (self.params.dateType !== 'gregorian') {
						self.inputField.setAttribute('data-local-value',
self.inputField.value);
					}
					if (typeof self.dateClicked === 'undefined') {
						// value needs to be validated
						self.inputField.setAttribute('data-alt-value',
Date.parseFieldDate(self.inputField.value, self.params.dateFormat,
self.params.dateType)
							.print(self.params.dateFormat, 'gregorian', false));
					} else {
						self.inputField.setAttribute('data-alt-value',
self.date.print(self.params.dateFormat, 'gregorian', false));
					}
				} else {
					self.inputField.setAttribute('data-alt-value',
'0000-00-00 00:00:00');
				}
				self.date =
Date.parseFieldDate(self.inputField.getAttribute('data-alt-value'),
self.params.dateFormat, self.params.dateType);
			}
			self.close();
		});

		this.processCalendar();
	};

	/** Method to append numbers to the calendar table */
	JoomlaCalendar.prototype.processCalendar = function () {
		this.table.style.visibility = "hidden";

		var firstDayOfWeek = this.params.firstDayOfWeek,
			date  = this.date,
			today = new Date(),
			TY    = today.getLocalFullYear(this.params.dateType),
			TM    = today.getLocalMonth(this.params.dateType),
			TD    = today.getLocalDate(this.params.dateType),
			year  = date.getOtherFullYear(this.params.dateType),
			hrs   = date.getHours(),
			mins  = date.getMinutes(),
			secs  = date.getSeconds(),
			t12   = !this.params.time24;

		if (year < this.params.minYear) {                                     
                             // Check min,max year
			year = this.params.minYear;
			date.setOtherFullYear(this.params.dateType, year);
		} else if (year > this.params.maxYear) {
			year = this.params.maxYear;
			date.setOtherFullYear(this.params.dateType, year);
		}

		this.params.firstDayOfWeek = firstDayOfWeek;
		this.date = new Date(date);

		var month = date.getLocalMonth(this.params.dateType);
		var mday  = date.getLocalDate(this.params.dateType);

		// Compute the first day that would actually be displayed in the
calendar, even if it's from the previous month.
		date.setLocalDate(this.params.dateType, 1);
		var day1 = (date.getLocalDay(this.params.dateType) -
this.params.firstDayOfWeek) % 7;

		if (day1 < 0) {
			day1 += 7;
		}

		date.setLocalDate(this.params.dateType, - day1);
		date.setLocalDate(this.params.dateType,
date.getLocalDate(this.params.dateType) + 1);

		var row = this.tbody.firstChild,
			ar_days = this.ar_days = new Array(),
			weekend = JoomlaCalLocale.weekend,
			monthDays = parseInt(date.getLocalWeekDays(this.params.dateType));

		/** Fill the table **/
		for (var i = 0; i < monthDays; ++i, row = row.nextSibling) {
			var cell = row.firstChild;
			if (this.params.weekNumbers) {
				cell.className = "day wn";
				cell.innerHTML = date.getLocalWeekNumber(this.params.dateType);
//date.convertNumbers();
				cell = cell.nextSibling;
			}

			row.className = this.params.weekNumbers ? "daysrow wk" :
"daysrow";
			var hasdays = false, iday,
				dpos = ar_days[i] = [],
				totalDays = monthDays + 1;

			for (var j = 0; j < totalDays; ++j, cell = cell.nextSibling,
date.setLocalDate(this.params.dateType, iday + 1)) {
				cell.className = "day";
				cell.style['textAlign'] = 'center';
				iday = date.getLocalDate(this.params.dateType);
				var wday = date.getLocalDay(this.params.dateType);
				cell.pos = i << 4 | j;
				dpos[j] = cell;
				var current_month = (date.getLocalMonth(this.params.dateType) ===
month);
				if (!current_month) {
					if (this.params.showsOthers) {
						cell.className += " disabled othermonth ";
						cell.otherMonth = true;
					} else {
						cell.className += " emptycell";
						cell.innerHTML = "&#160;";
						cell.disabled = true;
						continue;
					}
				} else {
					cell.otherMonth = false;
					hasdays = true;
					cell.style.cursor = "pointer";
				}
				cell.disabled = false;
				cell.innerHTML = this.params.debug ? iday : Date.convertNumbers(iday); 
        // translated day number for each cell
				if (!cell.disabled) {
					cell.caldate = new Date(date);
					if (current_month && iday === mday) {
						cell.className += " selected";
						this.currentDateEl = cell;
					}
					if (date.getLocalFullYear(this.params.dateType) === TY &&
date.getLocalMonth(this.params.dateType) === TM && iday === TD) {
						cell.className += " today";
					}
					if (weekend.indexOf(wday) !== -1)
						cell.className += " weekend";
				}
			}
			if (!(hasdays || this.params.showsOthers)) {
				row.style.display = 'none';
				row.className = "emptyrow";
			} else {
				row.style.display = '';
			}
		}

		/* Set the time */
		if (this.params.showsTime) {
			if (hrs > 12 && t12) {
				hrs -= 12;
			}

			hrs = (hrs < 10) ? "0" + hrs : hrs;
			mins = (mins < 10) ? "0" + mins : mins;

			var hoursEl = this.table.querySelector('.time-hours'),
				minsEl = this.table.querySelector('.time-minutes');

			/* remove the selected class  for the hours*/
			this.resetSelected(hoursEl);
			if (!this.params.time24) 
			{ 
				hoursEl.value = (hrs == "00") ? "12" : hrs; 
			} 
			else 
			{ 
				hoursEl.value = hrs; 
			}

			/* remove the selected class  for the minutes*/
			this.resetSelected(minsEl);
			minsEl.value = mins;

			if (!this.params.time24)
			{
				var dateAlt = new
Date(this.inputField.getAttribute('data-alt-value')),
					ampmEl = this.table.querySelector('.time-ampm'),
					hrsAlt = dateAlt.getHours();

				if (hrsAlt > 12) {
					/* remove the selected class  for the am-pm*/
					this.resetSelected(ampmEl);
					ampmEl.value = 'pm';
				}
			}
		}

		if (!this.params.compressedHeader) {
			this._nav_month.getElementsByTagName('span')[0].innerHTML =
this.params.debug ? month + ' ' + JoomlaCalLocale.months[month] :
JoomlaCalLocale.months[month];
			this.title.getElementsByTagName('span')[0].innerHTML =
this.params.debug ? year + ' ' + 
Date.convertNumbers(year.toString()) :
Date.convertNumbers(year.toString());
		} else {
			var tmpYear = Date.convertNumbers(year.toString());
			this._nav_month.getElementsByTagName('span')[0].innerHTML =
!this.params.monthBefore  ? JoomlaCalLocale.months[month] + ' - '
+ tmpYear : tmpYear + ' - ' + JoomlaCalLocale.months[month] ;
		}
		this.table.style.visibility = "visible";
	};

	/** Method to listen for the click event on the input button. **/
	JoomlaCalendar.prototype._bindEvents = function () {
		var self = this;
		this.inputField.addEventListener('blur', function(event) {
			var calObj = JoomlaCalendar.getCalObject(this)._joomlaCalendar;

			// If calendar is open we will handle the event elsewhere
			if (calObj.dropdownElement.style.display === 'block') {
				event.preventDefault();
				return;
			}

			if (calObj) {
				if (calObj.inputField.value) {
					if (typeof calObj.params.dateClicked === 'undefined') {
						calObj.inputField.setAttribute('data-local-value',
calObj.inputField.value);

						if (calObj.params.dateType !== 'gregorian') {
							// We need to transform the date for the data-alt-value
							var ndate, date = Date.parseFieldDate(calObj.inputField.value,
calObj.params.dateFormat, calObj.params.dateType);
							ndate = Date.localCalToGregorian(date.getFullYear(),
date.getMonth(), date.getDate());
							date.setFullYear(ndate[0]);
							date.setMonth(ndate[1]);
							date.setDate(ndate[2]);
							calObj.inputField.setAttribute('data-alt-value',
date.print(calObj.params.dateFormat, 'gregorian', false));
						} else {
							calObj.inputField.setAttribute('data-alt-value',
Date.parseFieldDate(calObj.inputField.value, calObj.params.dateFormat,
calObj.params.dateType)
								.print(calObj.params.dateFormat, 'gregorian', false));
						}
					} else {
						calObj.inputField.setAttribute('data-alt-value',
calObj.date.print(calObj.params.dateFormat, 'gregorian', false));
					}
				} else {
					calObj.inputField.setAttribute('data-alt-value',
'0000-00-00 00:00:00');
				}
				calObj.date =
Date.parseFieldDate(calObj.inputField.getAttribute('data-alt-value'),
calObj.params.dateFormat, calObj.params.dateType);
			}

			self.close();
		}, true);
		this.button.addEventListener('click', function() {
			self.show();
		}, false);
	};

	/** Helpers **/
	var stopCalEvent = function (ev) { ev || (ev = window.event); 
ev.preventDefault(); ev.stopPropagation(); return false; };
	var createElement = function (type, parent) { var el = null; el =
document.createElement(type); if (typeof parent !== "undefined")
{ parent.appendChild(el); } return el; };
	var isInt = function (input) { return !isNaN(input) &&
(function(x) { return (x | 0) === x; })(parseFloat(input)) };
	var getBoundary = function (input, type) { var date = new Date(); var y =
date.getLocalFullYear(type); return y + input; };
	/**
	 * IE8 polyfill for indexOf()
	 */
	if (!Array.prototype.indexOf) {
		Array.prototype.indexOf = function(elt) {
			var len = this.length >>> 0,
				from = Number(arguments[1]) || 0;

			from = (from < 0) ? Math.ceil(from) : Math.floor(from);

			if (from < 0) {
				from += len;
			}

			for (; from < len; from++) {
				if (from in this && this[from] === elt) {
					return from;
				}
			}
			return -1;
		};
	}

	/** Method to get the active calendar element through any descendant
element. */
	JoomlaCalendar.getCalObject = function(element) {
		if (!element) {
			return false;
		}
		while (element.parentNode) {
			element = element.parentNode;
			if (element.classList.contains('field-calendar')) {
				return element;
			}
		}
		return false;
	};

	/** Method to change input values with the data-alt-value values. **/
	JoomlaCalendar.prototype.setAltValue = function() {
		var input = this.inputField;
		if (input.getAttribute('disabled')) return;
		input.value = input.getAttribute('data-alt-value') ?
input.getAttribute('data-alt-value') : '';
	};

	/** Method to change the inputs before submit. **/
	JoomlaCalendar.onSubmit = function() {
		Joomla = window.Joomla || {};
		if (!Joomla.calendarProcessed) {
			Joomla.calendarProcessed = true;
			var elements = document.querySelectorAll(".field-calendar");

			for (var i = 0; i < elements.length; i++) {
				var element  = elements[i],
				    instance = element._joomlaCalendar;

				if (instance) {
					instance.setAltValue();
				}
			}
		}
	};

	/**
	 * Init the Calendars on the page
	 *
	 * @param {Node}        element    The element node
	 * @param {HTMLElement} container  The field container (optional)
	 */
	JoomlaCalendar.init = function (element, container) {

		// Fall back for translation strings
		window.JoomlaCalLocale           = window.JoomlaCalLocale ?
JoomlaCalLocale : {};
		JoomlaCalLocale.today            = JoomlaCalLocale.today ?
JoomlaCalLocale.today : 'today';
		JoomlaCalLocale.weekend          = JoomlaCalLocale.weekend ?
JoomlaCalLocale.weekend : [0, 6];
		JoomlaCalLocale.localLangNumbers = JoomlaCalLocale.localLangNumbers ?
JoomlaCalLocale.localLangNumbers : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
		JoomlaCalLocale.wk               = JoomlaCalLocale.wk ?
JoomlaCalLocale.wk : 'wk';
		JoomlaCalLocale.AM               = JoomlaCalLocale.AM ?
JoomlaCalLocale.AM : 'AM';
		JoomlaCalLocale.PM               = JoomlaCalLocale.PM ?
JoomlaCalLocale.PM : 'PM';
		JoomlaCalLocale.am               = JoomlaCalLocale.am ?
JoomlaCalLocale.am : 'am';
		JoomlaCalLocale.pm               = JoomlaCalLocale.pm ?
JoomlaCalLocale.pm : 'pm';
		JoomlaCalLocale.dateType         = JoomlaCalLocale.dateType ?
JoomlaCalLocale.dateType : 'gregorian';
		JoomlaCalLocale.time             = JoomlaCalLocale.time ?
JoomlaCalLocale.time : 'time';
		JoomlaCalLocale.days             = JoomlaCalLocale.days ?
JoomlaCalLocale.days : '["Sunday", "Monday",
"Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday"]';
		JoomlaCalLocale.shortDays        = JoomlaCalLocale.shortDays ?
JoomlaCalLocale.shortDays : ["Sun", "Mon",
"Tue", "Wed", "Thu", "Fri",
"Sat", "Sun"];
		JoomlaCalLocale.months           = JoomlaCalLocale.months ?
JoomlaCalLocale.months : ["January", "February",
"March", "April", "May", "June",
"July", "August", "September",
"October", "November", "December"];
		JoomlaCalLocale.shortMonths      = JoomlaCalLocale.shortMonths ?
JoomlaCalLocale.shortMonths : ["Jan", "Feb",
"Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct",
"Nov", "Dec"];
		JoomlaCalLocale.minYear          = JoomlaCalLocale.minYear ?
JoomlaCalLocale.minYear : 1900;
		JoomlaCalLocale.maxYear          = JoomlaCalLocale.maxYear ?
JoomlaCalLocale.maxYear : 2100;
		JoomlaCalLocale.exit             = JoomlaCalLocale.exit ?
JoomlaCalLocale.exit : 'Cancel';
		JoomlaCalLocale.clear            = JoomlaCalLocale.clear ?
JoomlaCalLocale.clear : 'Clear';

		var instance = element._joomlaCalendar;
		if (!instance) {
			new JoomlaCalendar(element);
		} else {
			instance.recreate();
		}

		if (element && element.getElementsByTagName('input')[0]
&& element.getElementsByTagName('input')[0].form
&& !element.getElementsByTagName('input')[0].disabled) {
			element.getElementsByTagName('input')[0].form.addEventListener('submit',
JoomlaCalendar.onSubmit);
		}
	};

	window.JoomlaCalendar = JoomlaCalendar;

	/** Instantiate all the calendar fields when the document is ready */
	document.addEventListener("DOMContentLoaded", function() {
		var elements, i;

		elements = document.querySelectorAll(".field-calendar");

		for (i = 0; i < elements.length; i++) {
			JoomlaCalendar.init(elements[i]);
		}

		window.jQuery && jQuery(document).on("subform-row-add",
function (event, row) {
			elements = row.querySelectorAll(".field-calendar");

			for (i = 0; i < elements.length; i++) {
				JoomlaCalendar.init(elements[i]);
			}
		});

		/** B/C related code
		 *  @deprecated 4.0
		 */
		window.Calendar = {};

		/** B/C related code
		 *  @deprecated 4.0
		 */
		Calendar.setup = function(obj) {

			if (obj.inputField && document.getElementById(obj.inputField)) {
				var element = document.getElementById(obj.inputField),
					cal = element.parentNode.querySelectorAll('button')[0];

				for (var property in obj) {
					if (obj.hasOwnProperty(property)) {
						switch (property) {
							case 'ifFormat':
								if (cal) cal.setAttribute('data-dayformat',
obj.ifFormat);
								break;

							case 'firstDay':
								if (cal) cal.setAttribute('data-firstday',
parseInt(obj.firstDay));
								break;

							case 'weekNumbers':
								if (cal) cal.setAttribute('data-week-numbers',
(obj.weekNumbers === "true" || obj.weekNumbers === true) ?
'1' : '0');
								break;

							case 'showOthers':
								if (cal) cal.setAttribute('data-show-others',
(obj.showOthers === "true" || obj.showOthers === true) ?
'1' : '0');
								break;

							case 'showsTime':
								if (cal) cal.setAttribute('data-show-time',
(obj.showsTime === "true" || obj.showsTime === true) ?
'1' : '0');
								break;

							case 'timeFormat':
								if (cal) cal.setAttribute('data-time-24',
parseInt(obj.timeFormat));
								break;

							case 'displayArea':
							case 'inputField':
							case 'button':
							case 'eventName':
							case 'daFormat':
							case 'disableFunc':
							case 'dateStatusFunc':
							case 'dateTooltipFunc':
							case 'dateText':
							case 'align':
							case 'range':
							case 'flat':
							case 'flatCallback':
							case 'onSelect':
							case 'onClose':
							case 'onUpdate':
							case 'date':
							case 'electric':
							case 'step':
							case 'position':
							case 'cache':
							case 'multiple':
								break;
						}


					}
				}
				JoomlaCalendar.init(element.parentNode.parentNode);
			}
			return null;
		};
	});
})(window, document);
PK\n�[.��ccjs/fields/calendar.min.jsnu�[���!function(e,a){"use
strict";Date.convertNumbers=function(e){e=e.toString();if("[object
Array]"===Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers))for(var
a=0;a<JoomlaCalLocale.localLangNumbers.length;a++)e=e.replace(new
RegExp(a,"g"),JoomlaCalLocale.localLangNumbers[a]);return
e},Date.toEnglish=function(e){e=this.toString();for(var
a=[0,1,2,3,4,5,6,7,8,9],t=0;t<10;t++)e=e.replace(new
RegExp(a[t],"g"),t);return e};var t=function(e){if(!e)throw new
Error("Calendar setup failed:\n  No valid element found, Please check
your code");if("function"!=typeof Date.parseFieldDate)throw
new Error("Calendar setup failed:\n  No valid date helper, Please
check your code");if(e._joomlaCalendar)throw new
Error("JoomlaCalendar instance already exists for the
element");if(e._joomlaCalendar=this,this.writable=!0,this.hidden=!0,this.params={},this.element=e,this.inputField=e.getElementsByTagName("input")[0],this.button=e.getElementsByTagName("button")[0],!this.inputField)throw
new Error("Calendar setup failed:\n  No valid input found, Please
check your
code");this.params={debug:!1,clicked:!1,element:{style:{display:"none"}},writable:!0};var
t=this,s=this.button,r={inputField:this.inputField,dateType:JoomlaCalLocale.dateType?JoomlaCalLocale.dateType:"gregorian",direction:void
0!==a.dir?a.dir:a.getElementsByTagName("html")[0].getAttribute("dir"),firstDayOfWeek:s.getAttribute("data-firstday")?parseInt(s.getAttribute("data-firstday")):0,dateFormat:"%Y-%m-%d
%H:%M:%S",weekend:JoomlaCalLocale.weekend?JoomlaCalLocale.weekend:[0,6],minYear:JoomlaCalLocale.minYear?JoomlaCalLocale.minYear:1900,maxYear:JoomlaCalLocale.maxYear?JoomlaCalLocale.maxYear:2100,minYearTmp:s.getAttribute("data-min-year"),maxYearTmp:s.getAttribute("data-max-year"),weekendTmp:s.getAttribute("data-weekend"),time24:!0,showsOthers:1===parseInt(s.getAttribute("data-show-others")),showsTime:!0,weekNumbers:1===parseInt(s.getAttribute("data-week-numbers")),showsTodayBtn:!0,compressedHeader:1===parseInt(s.getAttribute("data-only-months-nav"))};for(var
o in
s.getAttribute("data-dayformat")&&(r.dateFormat=s.getAttribute("data-dayformat")?s.getAttribute("data-dayformat"):"%Y-%m-%d
%H:%M:%S"),s.getAttribute("data-time-24")&&(r.time24=24===parseInt(s.getAttribute("data-time-24"))),s.getAttribute("data-show-time")&&(r.showsTime=1===parseInt(s.getAttribute("data-show-time"))),s.getAttribute("data-today-btn")&&(r.showsTodayBtn=1===parseInt(s.getAttribute("data-today-btn"))),r)this.params[o]=r[o];i(t.params.minYearTmp)&&(t.params.minYear=l(parseInt(t.params.minYearTmp),t.params.dateType)),i(t.params.maxYearTmp)&&(t.params.maxYear=l(parseInt(t.params.maxYearTmp),t.params.dateType)),"undefined"!==t.params.weekendTmp&&(t.params.weekend=t.params.weekendTmp.split(",").map(function(e){return
parseInt(e,10)})),this._dayMouseDown=function(e){return
t._handleDayMouseDown(e)},this._calKeyEvent=function(e){return
t._handleCalKeyEvent(e)},this._documentClick=function(e){return
t._handleDocumentClick(e)},this.checkInputs(),this.inputField.getAttribute("readonly")||(this._create(),this._bindEvents())};t.prototype.checkInputs=function(){var
e=Date.parseFieldDate(this.inputField.getAttribute("data-alt-value"),this.params.dateFormat,"gregorian");""!==this.inputField.value?(this.date=e,this.inputField.value=e.print(this.params.dateFormat,this.params.dateType,!0)):this.date=new
Date},t.prototype.recreate=function(){var
e=this.element,a=e.querySelector(".js-calendar");a&&(e._joomlaCalendar=null,a.parentNode.removeChild(a),new
t(e))},t.prototype.updateTime=function(e,a,t){var
s=this.date,r=this.date.getLocalDate(this.params.dateType),i=this.date.getLocalMonth(this.params.dateType),l=this.date.getLocalFullYear(this.params.dateType),o=this.inputField.parentNode.parentNode.querySelectorAll(".time-ampm")[0];this.params.time24||(/pm/i.test(o.value)&&e<12?e=parseInt(e)+12:/am/i.test(o.value)&&12==e&&(e=0)),s.setHours(e),s.setMinutes(parseInt(a,10)),s.setSeconds(s.getSeconds()),s.setLocalFullYear(this.params.dateType,l),s.setLocalMonth(this.params.dateType,i),s.setLocalDate(this.params.dateType,r),this.dateClicked=!1,this.callHandler()},t.prototype.setDate=function(e){e.equalsTo(this.date)||(this.date=e,this.processCalendar(this.params.firstDayOfWeek,e))},t.prototype.moveCursorBy=function(e){var
a=new
Date(this.date);a.setDate(a.getDate()-e),this.setDate(a)},t.prototype.resetSelected=function(e){for(var
a=e.options,t=a.length;t--;){var
s=a[t];s.selected&&(s.selected=!1)}},t.prototype.callHandler=function(){this.inputField.setAttribute("data-alt-value",this.date.print(this.params.dateFormat,"gregorian",!1)),this.inputField.getAttribute("data-alt-value")&&"0000-00-00
00:00:00"!==this.inputField.getAttribute("data-alt-value")&&(this.inputField.value=this.date.print(this.params.dateFormat,this.params.dateType,!0),"gregorian"!==this.params.dateType&&this.inputField.setAttribute("data-local-value",this.date.print(this.params.dateFormat,this.params.dateType,!0))),this.inputField.value=this.date.print(this.params.dateFormat,this.params.dateType,!0),"function"==typeof
this.inputField.onchange&&this.inputField.onchange(),this.dateClicked&&"function"==typeof
this.params.onUpdate&&this.params.onUpdate(this),this.dateClicked?this.close():this.processCalendar()},t.prototype.close=function(){this.hide()},t.prototype.show=function(){if(-1!==navigator.appName.indexOf("Internet
Explorer")&&(-1===navigator.appVersion.indexOf("MSIE
9")&&-1===navigator.appVersion.indexOf("MSIE
1")&&e.jQuery&&jQuery().chosen))for(var
t=this.element.getElementsByTagName("select"),s=0;s<t.length;s++)jQuery(t[s]).chosen("destroy");this.checkInputs(),this.inputField.focus(),this.dropdownElement.style.display="block",this.hidden=!1,a.addEventListener("keydown",this._calKeyEvent,!0),a.addEventListener("keypress",this._calKeyEvent,!0),a.addEventListener("mousedown",this._documentClick,!0);var
r=this.element.querySelector(".js-calendar");e.innerHeight<r.getBoundingClientRect().bottom+20&&(r.style.marginTop=-(r.getBoundingClientRect().height+this.inputField.getBoundingClientRect().height)+"px"),this.processCalendar()},t.prototype.hide=function(){a.removeEventListener("keydown",this._calKeyEvent,!0),a.removeEventListener("keypress",this._calKeyEvent,!0),a.removeEventListener("mousedown",this._documentClick,!0),this.dropdownElement.style.display="none",this.hidden=!0},t.prototype._handleDocumentClick=function(e){var
t=e.target;if(null!==t&&!t.classList.contains("time"))for(;null!==t&&t!==this.element;t=t.parentNode);if(null===t)return
a.activeElement.blur(),this.hide(),s(e)},t.prototype._handleDayMouseDown=function(e){var
a=e.currentTarget,t=e.target||e.srcElement;if(!t||!t.hasAttribute("data-action")){if("TD"!==a.nodeName){var
r=a.getParent("TD");"TD"===r.nodeName?a=r:(a=a.getParent("TD")).classList.contains("js-calendar")&&(a=a.getElementsByTagName("table")[0])}else
if(!t.classList.contains("js-btn")&&!a.classList.contains("day")&&!a.classList.contains("title"))return;if(!a||a.disabled)return!1;if(void
0===a.navtype||300!==a.navtype){50===a.navtype&&(a._current=a.innerHTML),t!==a&&t.parentNode!==a||this.cellClick(a,e);var
i=null;void 0!==a.month&&(i=a),void
0!==a.parentNode.month&&(i=a.parentNode);var l=null;if(i)l=new
Date(this.date),i.month!==l.getLocalMonth(this.params.dateType)&&(l.setLocalMonth(this.params.dateType,i.month),this.setDate(l),this.dateClicked=!1,this.callHandler());else{var
o=null;void 0!==a.year&&(o=t),void
0!==a.parentNode.year&&(o=t.parentNode),o&&(l=new
Date(this.date),o.year!==l.getLocalFullYear(this.params.dateType)&&(l.setFullYear(this.params.dateType,o.year),this.setDate(l),this.dateClicked=!1,this.callHandler()))}}return
s(e)}},t.prototype.cellClick=function(e,a){var t=!1,s=!1,r=null;if(void
0===e.navtype){this.currentDateEl&&(e.classList.add("selected"),this.currentDateEl=e.caldate,(t=this.currentDateEl===e.caldate)||(this.currentDateEl=e.caldate)),this.date.setLocalDateOnly("gregorian",e.caldate);var
i=!(this.dateClicked=!e.otherMonth);this.currentDateEl&&(s=!e.disabled),i&&this.processCalendar()}else{r=new
Date(this.date),this.dateClicked=!1;var
l=r.getOtherFullYear(this.params.dateType),o=r.getLocalMonth(this.params.dateType);switch(e.navtype){case
400:break;case-2:this.params.compressedHeader||l>this.params.minYear&&r.setOtherFullYear(this.params.dateType,l-1);break;case-1:var
n=r.getLocalDate(this.params.dateType);if(o>0)n>(d=r.getLocalMonthDays(this.params.dateType,o-1))&&r.setLocalDate(this.params.dateType,d),r.setLocalMonth(this.params.dateType,o-1);else
if(l--
>this.params.minYear){r.setOtherFullYear(this.params.dateType,l),n>(d=r.getLocalMonthDays(this.params.dateType,11))&&r.setLocalDate(this.params.dateType,d),r.setLocalMonth(this.params.dateType,11)}break;case
1:n=r.getLocalDate(this.params.dateType);if(o<11)n>(d=r.getLocalMonthDays(this.params.dateType,o+1))&&r.setLocalDate(this.params.dateType,d),r.setLocalMonth(this.params.dateType,o+1);else
if(l<this.params.maxYear){var
d;r.setOtherFullYear(this.params.dateType,l+1),n>(d=r.getLocalMonthDays(this.params.dateType,0))&&r.setLocalDate(this.params.dateType,d),r.setLocalMonth(this.params.dateType,0)}break;case
2:this.params.compressedHeader||l<this.params.maxYear&&r.setOtherFullYear(this.params.dateType,l+1)}r.equalsTo(this.date)?0===e.navtype&&(s=t=!0):(this.setDate(r),s=!0)}s&&(this.params.showsTime&&(this.dateClicked=!1),a&&this.callHandler()),e.classList.remove("hilite"),t&&!this.params.showsTime&&(this.dateClicked=!1,a&&this.close())},t.prototype._handleCalKeyEvent=function(e){var
a=e.keyCode;if(e.target!==this.inputField||13!==a&&9!==a||this.close(),"rtl"===this.params.direction&&(37===a?a=39:39===a&&(a=37)),32===a&&e.shiftKey&&(e.preventDefault(),this.cellClick(this._nav_now,e),this.close()),27===a&&this.close(),38===a&&this.moveCursorBy(7),40===a&&this.moveCursorBy(-7),37===a&&this.moveCursorBy(1),39===a&&this.moveCursorBy(-1),e.target===this.inputField&&!(a>48||a<57||186===a||189===a||190===a||32===a))return
s(e)},t.prototype._create=function(){var
e=this,a=this.element,t=r("table"),s=r("div");this.table=t,t.className="table",t.cellSpacing=0,t.cellPadding=0,t.style.marginBottom=0,this.dropdownElement=s,a.appendChild(s),this.params.direction&&(s.style.direction=this.params.direction),s.className="js-calendar",s.style.position="absolute",s.style.boxShadow="0px
0px 70px 0px
rgba(0,0,0,0.67)",s.style.minWidth=this.inputField.width,s.style.padding="0",s.style.display="none",s.style.left="auto",s.style.top="auto",s.style.zIndex=1060,s.style.borderRadius="20px",this.wrapper=r("div"),this.wrapper.className="calendar-container",s.appendChild(this.wrapper),this.wrapper.appendChild(t);var
i=r("thead",t);i.className="calendar-header";var
l=null,o=null,n=this,d=function(a,t,s,i,d,m,p){for(var c in
d=d||{},l=r(i=i||"td",o),t&&(m=m?'class="'+m+'"':"",l.colSpan=t),d)l.style[c]=d[c];for(var
c in p)l.setAttribute(c,p[c]);return
0!==s&&Math.abs(s)<=2&&(l.className+="
nav"),t&&l.addEventListener("mousedown",e._dayMouseDown,!0),l.calendar=n,l.navtype=s,0!==s&&Math.abs(s)<=2?l.innerHTML="<a
"+m+" style='display:inline;padding:2px
6px;cursor:pointer;text-decoration:none;'
unselectable='on'>"+a+"</a>":(l.innerHTML=t?"<div
unselectable='on'"+m+">"+a+"</div>":a,!t&&m&&(l.className=m)),l};!1===this.params.compressedHeader&&((o=r("tr",i)).className="calendar-head-row",this._nav_py=d("&lsaquo;",1,-2,"",{"text-align":"center","font-size":"18px","line-height":"18px"},"js-btn
btn-prev-year"),this.title=d('<div
style="text-align:center;font-size:18px"><span></span></div>',this.params.weekNumbers?6:5,300),this.title.className="title",this._nav_ny=d("
&rsaquo;",1,2,"",{"text-align":"center","font-size":"18px","line-height":"18px"},"js-btn
btn-next-year")),(o=r("tr",i)).className="calendar-head-row",this._nav_pm=d("&lsaquo;",1,-1,"",{"text-align":"center","font-size":"2em","line-height":"1em"},"js-btn
btn-prev-month"),this._nav_month=d('<div
style="text-align:center;font-size:1.2em"><span></span></div>',this.params.weekNumbers?6:5,888,"td",{textAlign:"center"}),this._nav_month.className="title",this._nav_nm=d("
&rsaquo;",1,1,"",{"text-align":"center","font-size":"2em","line-height":"1em"},"js-btn
btn-next-month"),(o=r("tr",i)).className=e.params.weekNumbers?"daynames
wk":"daynames",this.params.weekNumbers&&((l=r("td",o)).className="day-name
wn",l.innerHTML=JoomlaCalLocale.wk);for(var
m=7;m>0;--m)l=r("td",o),m||(l.calendar=e);this.firstdayname=this.params.weekNumbers?o.firstChild.nextSibling:o.firstChild;var
p=this.params.firstDayOfWeek,c=(l=this.firstdayname,JoomlaCalLocale.weekend);for(m=0;m<7;++m){var
h=(m+p)%7;l.classList.add("day-name"),this.params.weekNumbers&&l.classList.add("day-name-week"),m&&(l.calendar=e,l.fdow=h),-1!==c.indexOf(c)&&l.classList.add("weekend"),l.innerHTML=JoomlaCalLocale.shortDays[(m+p)%7],l=l.nextSibling}var
u=r("tbody",t);for(this.tbody=u,m=6;m>0;--m){o=r("tr",u),this.params.weekNumbers&&(l=r("td",o));for(var
y=7;y>0;--y)(l=r("td",o)).calendar=this,l.addEventListener("mousedown",this._dayMouseDown,!0)}if(this.params.showsTime){(o=r("tr",u)).className="time",(l=r("td",o)).className="time
time-title",l.colSpan=1,l.style.verticalAlign="middle",l.innerHTML="
";var v=r("td",o);v.className="time
hours-select",v.colSpan=2;var
g=r("td",o);g.className="time
minutes-select",g.colSpan=2,function(){function a(a,t,s,i,l){var
o,n=r("select",l);n.calendar=e,n.className=a,n.setAttribute("data-chosen",!0),n.style.width="100%",n.navtype=50,n._range=[];for(var
d=s;d<=i;++d){var
m,p="";d===t&&(p=!0),d<10&&i>=10?(o="0"+d,m=Date.convertNumbers("0")+Date.convertNumbers(d)):(o=""+d,m=""+Date.convertNumbers(d)),n.options.add(new
Option(m,o,p,p))}return n}var
t=e.date.getHours(),s=e.date.getMinutes(),i=!e.params.time24,n=e.date.getHours()>12;i&&n&&(t-=12);var
d=a("time time-hours",t,i?1:0,i?12:23,v),m=a("time
time-minutes",s,0,59,g);if((l=r("td",o)).className="time
ampm-select",l.colSpan=e.params.weekNumbers?1:2,i){n=Date.parseFieldDate(e.inputField.getAttribute("data-alt-value"),e.params.dateFormat,"gregorian").getHours()>=12;var
p=r("select",l);p.className="time-ampm",p.style.width="100%",p.options.add(new
Option(JoomlaCalLocale.PM,"pm",!!n||"",!!n||"")),p.options.add(new
Option(JoomlaCalLocale.AM,"am",!n||"",!n||"")),p.addEventListener("change",function(a){e.updateTime(a.target.parentNode.parentNode.childNodes[1].childNodes[0].value,a.target.parentNode.parentNode.childNodes[2].childNodes[0].value,a.target.parentNode.parentNode.childNodes[3].childNodes[0].value)},!1)}else
l.innerHTML="&#160;",l.colSpan=e.params.weekNumbers?3:2;d.addEventListener("change",function(a){e.updateTime(a.target.parentNode.parentNode.childNodes[1].childNodes[0].value,a.target.parentNode.parentNode.childNodes[2].childNodes[0].value,a.target.parentNode.parentNode.childNodes[3].childNodes[0].value)},!1),m.addEventListener("change",function(a){e.updateTime(a.target.parentNode.parentNode.childNodes[1].childNodes[0].value,a.target.parentNode.parentNode.childNodes[2].childNodes[0].value,a.target.parentNode.parentNode.childNodes[3].childNodes[0].value)},!1)}()}((o=r("div",this.wrapper)).className="buttons-wrapper
btn-group",this._nav_clear=d(JoomlaCalLocale.clear,"",100,"button","","js-btn
btn
btn-clear",{type:"button","data-action":"clear"}),o.querySelector('[data-action="clear"]').addEventListener("click",function(a){a.preventDefault();for(var
t=e.table.querySelectorAll("td"),s=0;s<t.length;s++)if(t[s].classList.contains("selected")){t[s].classList.remove("selected");break}e.inputField.setAttribute("data-alt-value","0000-00-00
00:00:00"),e.inputField.setAttribute("value",""),e.inputField.value="",e.inputField.onchange&&e.inputField.onchange()}),this.params.showsTodayBtn)&&(this._nav_now=d(JoomlaCalLocale.today,"",0,"button","","js-btn
btn
btn-today",{type:"button","data-action":"today"}),this.wrapper.querySelector('[data-action="today"]').addEventListener("click",function(a){a.preventDefault(),e.date.setLocalDateOnly("gregorian",new
Date),e.dateClicked=!0,e.callHandler(),e.close()}));this._nav_exit=d(JoomlaCalLocale.exit,"",999,"button","","js-btn
btn
btn-exit",{type:"button","data-action":"exit"}),this.wrapper.querySelector('[data-action="exit"]').addEventListener("click",function(a){a.preventDefault(),e.dateClicked||(e.inputField.value?("gregorian"!==e.params.dateType&&e.inputField.setAttribute("data-local-value",e.inputField.value),void
0===e.dateClicked?e.inputField.setAttribute("data-alt-value",Date.parseFieldDate(e.inputField.value,e.params.dateFormat,e.params.dateType).print(e.params.dateFormat,"gregorian",!1)):e.inputField.setAttribute("data-alt-value",e.date.print(e.params.dateFormat,"gregorian",!1))):e.inputField.setAttribute("data-alt-value","0000-00-00
00:00:00"),e.date=Date.parseFieldDate(e.inputField.getAttribute("data-alt-value"),e.params.dateFormat,e.params.dateType)),e.close()}),this.processCalendar()},t.prototype.processCalendar=function(){this.table.style.visibility="hidden";var
e=this.params.firstDayOfWeek,a=this.date,t=new
Date,s=t.getLocalFullYear(this.params.dateType),r=t.getLocalMonth(this.params.dateType),i=t.getLocalDate(this.params.dateType),l=a.getOtherFullYear(this.params.dateType),o=a.getHours(),n=a.getMinutes(),d=(a.getSeconds(),!this.params.time24);l<this.params.minYear?(l=this.params.minYear,a.setOtherFullYear(this.params.dateType,l)):l>this.params.maxYear&&(l=this.params.maxYear,a.setOtherFullYear(this.params.dateType,l)),this.params.firstDayOfWeek=e,this.date=new
Date(a);var
m=a.getLocalMonth(this.params.dateType),p=a.getLocalDate(this.params.dateType);a.setLocalDate(this.params.dateType,1);var
c=(a.getLocalDay(this.params.dateType)-this.params.firstDayOfWeek)%7;c<0&&(c+=7),a.setLocalDate(this.params.dateType,-c),a.setLocalDate(this.params.dateType,a.getLocalDate(this.params.dateType)+1);for(var
h=this.tbody.firstChild,u=this.ar_days=new
Array,y=JoomlaCalLocale.weekend,v=parseInt(a.getLocalWeekDays(this.params.dateType)),g=0;g<v;++g,h=h.nextSibling){var
b=h.firstChild;this.params.weekNumbers&&(b.className="day
wn",b.innerHTML=a.getLocalWeekNumber(this.params.dateType),b=b.nextSibling),h.className=this.params.weekNumbers?"daysrow
wk":"daysrow";for(var
f,L=!1,C=u[g]=[],w=v+1,T=0;T<w;++T,b=b.nextSibling,a.setLocalDate(this.params.dateType,f+1)){b.className="day",b.style.textAlign="center",f=a.getLocalDate(this.params.dateType);var
N=a.getLocalDay(this.params.dateType);b.pos=g<<4|T,C[T]=b;var
D=a.getLocalMonth(this.params.dateType)===m;if(D)b.otherMonth=!1,L=!0,b.style.cursor="pointer";else{if(!this.params.showsOthers){b.className+="
emptycell",b.innerHTML="&#160;",b.disabled=!0;continue}b.className+="
disabled othermonth
",b.otherMonth=!0}b.disabled=!1,b.innerHTML=this.params.debug?f:Date.convertNumbers(f),b.disabled||(b.caldate=new
Date(a),D&&f===p&&(b.className+="
selected",this.currentDateEl=b),a.getLocalFullYear(this.params.dateType)===s&&a.getLocalMonth(this.params.dateType)===r&&f===i&&(b.className+="
today"),-1!==y.indexOf(N)&&(b.className+="
weekend"))}L||this.params.showsOthers?h.style.display="":(h.style.display="none",h.className="emptyrow")}if(this.params.showsTime){o>12&&d&&(o-=12),o=o<10?"0"+o:o,n=n<10?"0"+n:n;var
F=this.table.querySelector(".time-hours"),k=this.table.querySelector(".time-minutes");if(this.resetSelected(F),this.params.time24?F.value=o:F.value="00"==o?"12":o,this.resetSelected(k),k.value=n,!this.params.time24){var
J=new
Date(this.inputField.getAttribute("data-alt-value")),A=this.table.querySelector(".time-ampm");J.getHours()>12&&(this.resetSelected(A),A.value="pm")}}if(this.params.compressedHeader){var
M=Date.convertNumbers(l.toString());this._nav_month.getElementsByTagName("span")[0].innerHTML=this.params.monthBefore?M+"
- "+JoomlaCalLocale.months[m]:JoomlaCalLocale.months[m]+" -
"+M}else
this._nav_month.getElementsByTagName("span")[0].innerHTML=this.params.debug?m+"
"+JoomlaCalLocale.months[m]:JoomlaCalLocale.months[m],this.title.getElementsByTagName("span")[0].innerHTML=this.params.debug?l+"
"+Date.convertNumbers(l.toString()):Date.convertNumbers(l.toString());this.table.style.visibility="visible"},t.prototype._bindEvents=function(){var
e=this;this.inputField.addEventListener("blur",function(a){var
s=t.getCalObject(this)._joomlaCalendar;if("block"!==s.dropdownElement.style.display){if(s){if(s.inputField.value)if(void
0===s.params.dateClicked)if(s.inputField.setAttribute("data-local-value",s.inputField.value),"gregorian"!==s.params.dateType){var
r,i=Date.parseFieldDate(s.inputField.value,s.params.dateFormat,s.params.dateType);r=Date.localCalToGregorian(i.getFullYear(),i.getMonth(),i.getDate()),i.setFullYear(r[0]),i.setMonth(r[1]),i.setDate(r[2]),s.inputField.setAttribute("data-alt-value",i.print(s.params.dateFormat,"gregorian",!1))}else
s.inputField.setAttribute("data-alt-value",Date.parseFieldDate(s.inputField.value,s.params.dateFormat,s.params.dateType).print(s.params.dateFormat,"gregorian",!1));else
s.inputField.setAttribute("data-alt-value",s.date.print(s.params.dateFormat,"gregorian",!1));else
s.inputField.setAttribute("data-alt-value","0000-00-00
00:00:00");s.date=Date.parseFieldDate(s.inputField.getAttribute("data-alt-value"),s.params.dateFormat,s.params.dateType)}e.close()}else
a.preventDefault()},!0),this.button.addEventListener("click",function(){e.show()},!1)};var
s=function(a){return
a||(a=e.event),a.preventDefault(),a.stopPropagation(),!1},r=function(e,t){var
s;return s=a.createElement(e),void
0!==t&&t.appendChild(s),s},i=function(e){return!isNaN(e)&&(0|(a=parseFloat(e)))===a;var
a},l=function(e,a){return(new
Date).getLocalFullYear(a)+e};Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var
a=this.length>>>0,t=Number(arguments[1])||0;for((t=t<0?Math.ceil(t):Math.floor(t))<0&&(t+=a);t<a;t++)if(t
in this&&this[t]===e)return
t;return-1}),t.getCalObject=function(e){if(!e)return!1;for(;e.parentNode;)if((e=e.parentNode).classList.contains("field-calendar"))return
e;return!1},t.prototype.setAltValue=function(){var
e=this.inputField;e.getAttribute("disabled")||(e.value=e.getAttribute("data-alt-value")?e.getAttribute("data-alt-value"):"")},t.onSubmit=function(){if(Joomla=e.Joomla||{},!Joomla.calendarProcessed){Joomla.calendarProcessed=!0;for(var
t=a.querySelectorAll(".field-calendar"),s=0;s<t.length;s++){var
r=t[s]._joomlaCalendar;r&&r.setAltValue()}}},t.init=function(a,s){e.JoomlaCalLocale=e.JoomlaCalLocale?JoomlaCalLocale:{},JoomlaCalLocale.today=JoomlaCalLocale.today?JoomlaCalLocale.today:"today",JoomlaCalLocale.weekend=JoomlaCalLocale.weekend?JoomlaCalLocale.weekend:[0,6],JoomlaCalLocale.localLangNumbers=JoomlaCalLocale.localLangNumbers?JoomlaCalLocale.localLangNumbers:[0,1,2,3,4,5,6,7,8,9],JoomlaCalLocale.wk=JoomlaCalLocale.wk?JoomlaCalLocale.wk:"wk",JoomlaCalLocale.AM=JoomlaCalLocale.AM?JoomlaCalLocale.AM:"AM",JoomlaCalLocale.PM=JoomlaCalLocale.PM?JoomlaCalLocale.PM:"PM",JoomlaCalLocale.am=JoomlaCalLocale.am?JoomlaCalLocale.am:"am",JoomlaCalLocale.pm=JoomlaCalLocale.pm?JoomlaCalLocale.pm:"pm",JoomlaCalLocale.dateType=JoomlaCalLocale.dateType?JoomlaCalLocale.dateType:"gregorian",JoomlaCalLocale.time=JoomlaCalLocale.time?JoomlaCalLocale.time:"time",JoomlaCalLocale.days=JoomlaCalLocale.days?JoomlaCalLocale.days:'["Sunday",
"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday",
"Sunday"]',JoomlaCalLocale.shortDays=JoomlaCalLocale.shortDays?JoomlaCalLocale.shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],JoomlaCalLocale.months=JoomlaCalLocale.months?JoomlaCalLocale.months:["January","February","March","April","May","June","July","August","September","October","November","December"],JoomlaCalLocale.shortMonths=JoomlaCalLocale.shortMonths?JoomlaCalLocale.shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],JoomlaCalLocale.minYear=JoomlaCalLocale.minYear?JoomlaCalLocale.minYear:1900,JoomlaCalLocale.maxYear=JoomlaCalLocale.maxYear?JoomlaCalLocale.maxYear:2100,JoomlaCalLocale.exit=JoomlaCalLocale.exit?JoomlaCalLocale.exit:"Cancel",JoomlaCalLocale.clear=JoomlaCalLocale.clear?JoomlaCalLocale.clear:"Clear";var
r=a._joomlaCalendar;r?r.recreate():new
t(a),a&&a.getElementsByTagName("input")[0]&&a.getElementsByTagName("input")[0].form&&!a.getElementsByTagName("input")[0].disabled&&a.getElementsByTagName("input")[0].form.addEventListener("submit",t.onSubmit)},e.JoomlaCalendar=t,a.addEventListener("DOMContentLoaded",function(){var
s,r;for(s=a.querySelectorAll(".field-calendar"),r=0;r<s.length;r++)t.init(s[r]);e.jQuery&&jQuery(a).on("subform-row-add",function(e,a){for(s=a.querySelectorAll(".field-calendar"),r=0;r<s.length;r++)t.init(s[r])}),e.Calendar={},Calendar.setup=function(e){if(e.inputField&&a.getElementById(e.inputField)){var
s=a.getElementById(e.inputField),r=s.parentNode.querySelectorAll("button")[0];for(var
i in
e)if(e.hasOwnProperty(i))switch(i){case"ifFormat":r&&r.setAttribute("data-dayformat",e.ifFormat);break;case"firstDay":r&&r.setAttribute("data-firstday",parseInt(e.firstDay));break;case"weekNumbers":r&&r.setAttribute("data-week-numbers","true"===e.weekNumbers||!0===e.weekNumbers?"1":"0");break;case"showOthers":r&&r.setAttribute("data-show-others","true"===e.showOthers||!0===e.showOthers?"1":"0");break;case"showsTime":r&&r.setAttribute("data-show-time","true"===e.showsTime||!0===e.showsTime?"1":"0");break;case"timeFormat":r&&r.setAttribute("data-time-24",parseInt(e.timeFormat))}t.init(s.parentNode.parentNode)}return
null}})}(window,document);PK\n�[��TTjs/frontediting-uncompressed.jsnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * JavaScript behavior to add front-end hover edit icons with tooltips for
modules and menu items.
 *
 */
(function($) {

	$.fn.extend({
		/**
		 * This jQuery custom method makes the elements absolute, and with true
argument moves them to end of body to avoid CSS inheritence
		 *
		 * @param   rebase boolean
		 * @returns {jQuery}
		 */
		jEditMakeAbsolute: function(rebase) {

			return this.each(function() {

				var el = $(this);
				var pos;

				if (rebase) {
					pos = el.offset();
				} else {
					pos = el.position();
				}

				el.css({ position: "absolute",
					marginLeft: 0, marginTop: 0,
					top: pos.top, left: pos.left,
					bottom: 'auto', right: 'auto'
				});

				if (rebase) {
					el.detach().appendTo("body");
				}
			});

		}
	});

	$(document).ready(function () {

		// Tooltip maximal dimensions for intelligent placement:
		var actualWidth = 200;
		var actualHeight = 100;
		// Tooltip smart tooltip placement function:
		var tooltipPlacer = function(tip, element) {
			var $element, above, below, boundBottom, boundLeft, boundRight,
boundTop, elementAbove, elementBelow, elementLeft, elementRight,
isWithinBounds, left, pos, right;
			isWithinBounds = function(elementPosition) {
				return boundTop < elementPosition.top && boundLeft <
elementPosition.left && boundRight > (elementPosition.left +
actualWidth) && boundBottom > (elementPosition.top +
actualHeight);
			};
			$element = $(element);
			pos = $.extend({}, $element.offset(), {
				width: element.offsetWidth,
				height: element.offsetHeight
			});
			boundTop = $(document).scrollTop();
			boundLeft = $(document).scrollLeft();
			boundRight = boundLeft + $(window).width();
			boundBottom = boundTop + $(window).height();
			elementAbove = {
				top: pos.top - actualHeight,
				left: pos.left + pos.width / 2 - actualWidth / 2
			};
			elementBelow = {
				top: pos.top + pos.height,
				left: pos.left + pos.width / 2 - actualWidth / 2
			};
			elementLeft = {
				top: pos.top + pos.height / 2 - actualHeight / 2,
				left: pos.left - actualWidth
			};
			elementRight = {
				top: pos.top + pos.height / 2 - actualHeight / 2,
				left: pos.left + pos.width
			};
			above = isWithinBounds(elementAbove);
			below = isWithinBounds(elementBelow);
			left = isWithinBounds(elementLeft);
			right = isWithinBounds(elementRight);
			if (above) {
				return "top";
			} else {
				if (below) {
					return "bottom";
				} else {
					if (left) {
						return "left";
					} else {
						if (right) {
							return "right";
						} else {
							return "right";
						}
					}
				}
			}
		};

		// Modules edit icons:

		$('.jmoddiv').on({
			mouseenter: function() {

				// Get module editing URL and tooltip for module edit:
				var moduleEditUrl = $(this).data('jmodediturl');
				var moduleTip = $(this).data('jmodtip');
                var moduleTarget = $(this).data('target');

				// Stop timeout on previous tooltip and remove it:
				$('body>.btn.jmodedit').clearQueue().tooltip('destroy').remove();

				// Add editing button with tooltip:
				$(this).addClass('jmodinside')
					.prepend('<a class="btn jmodedit" href="#"
target="' + moduleTarget + '"><span
class="icon-edit"></span></a>')
					.children(":first").attr('href',
moduleEditUrl).attr('title', moduleTip)
					.tooltip({"container": false, html: true, placement:
tooltipPlacer})
					.jEditMakeAbsolute(true);

				$('.btn.jmodedit')
					.on({
						mouseenter: function() {
							// Stop delayed removal programmed by mouseleave of .jmoddiv or of
this one:
							$(this).clearQueue();
						},
						mouseleave: function() {
							// Delay remove editing button if not hovering it:
							$(this).delay(500).queue(function(next) {
								$(this).tooltip('destroy').remove();
								next();
							});
						}
					});
			},
			mouseleave: function() {

				// Delay remove editing button if not hovering it:
				$('body>.btn.jmodedit').delay(500).queue(function(next) {
					$(this).tooltip('destroy').remove();
					next();
				});
			}
		});

		// Menu items edit icons:

		var activePopover = null;

		$('.jmoddiv[data-jmenuedittip] .nav
li,.jmoddiv[data-jmenuedittip].nav li,.jmoddiv[data-jmenuedittip] .nav
.nav-child li,.jmoddiv[data-jmenuedittip].nav .nav-child li').on({
			mouseenter: function() {

				// Get menu ItemId from the item-nnn class of the li element of the
menu:
				var itemids = /\bitem-(\d+)\b/.exec($(this).attr('class'));
				if (typeof itemids[1] == 'string') {
					// Find module editing URL from enclosing module:
					var enclosingModuleDiv = $(this).closest('.jmoddiv');
					var moduleEditUrl = enclosingModuleDiv.data('jmodediturl');
					// Transform module editing URL into Menu Item editing url:
					var menuitemEditUrl =
moduleEditUrl.replace(/\/index.php\?option=com_config&controller=config.display.modules([^\d]+).+$/,
'/administrator/index.php?option=com_menus&view=item&layout=edit$1'
+ itemids[1]);

				}

				// Get tooltip for menu items from enclosing module
				var menuEditTip =
enclosingModuleDiv.data('jmenuedittip').replace('%s',
itemids[1]);

				var content = $('<div><a class="btn
jfedit-menu" href="#" target="_blank"><span
class="icon-edit"></span></a></div>');
				content.children('a.jfedit-menu').prop('href',
menuitemEditUrl).prop('title', menuEditTip);

				if (activePopover) {
					$(activePopover).popover('hide');
				}
				$(this).popover({html:true, content:content.html(),
container:'body', trigger:'manual', animation:false,
placement: 'bottom'}).popover('show');
				activePopover = this;

				$('body>div.popover')
					.on({
					mouseenter: function() {
						if (activePopover) {
							$(activePopover).clearQueue();
						}
					},
					mouseleave: function() {
						if (activePopover) {
							$(activePopover).popover('hide');
						}
					}
				})
				.find('a.jfedit-menu').tooltip({"container": false,
html: true, placement: 'bottom'});
			},
			mouseleave: function() {
				$(this).delay(1500).queue(function(next) {
$(this).popover('hide'); next() });
			}
		});
	});
})(jQuery);
PK\n�[;�%��
�
js/frontediting.jsnu�[���!function(t){t.fn.extend({jEditMakeAbsolute:function(e){return
this.each(function(){var
o,i=t(this);o=e?i.offset():i.position(),i.css({position:"absolute",marginLeft:0,marginTop:0,top:o.top,left:o.left,bottom:"auto",right:"auto"}),e&&i.detach().appendTo("body")})}}),t(document).ready(function(){var
e=200,o=100,i=function(i,n){var d,a,l,r,s,p,u,m,c,h,f,v,j,b,g;return
v=function(t){return
u<t.top&&s<t.left&&p>t.left+e&&r>t.top+o},d=t(n),b=t.extend({},d.offset(),{width:n.offsetWidth,height:n.offsetHeight}),u=t(document).scrollTop(),s=t(document).scrollLeft(),p=s+t(window).width(),r=u+t(window).height(),m={top:b.top-o,left:b.left+b.width/2-e/2},c={top:b.top+b.height,left:b.left+b.width/2-e/2},h={top:b.top+b.height/2-o/2,left:b.left-e},f={top:b.top+b.height/2-o/2,left:b.left+b.width},a=v(m),l=v(c),j=v(h),g=v(f),a?"top":l?"bottom":j?"left":"right"};t(".jmoddiv").on({mouseenter:function(){var
e=t(this).data("jmodediturl"),o=t(this).data("jmodtip"),n=t(this).data("target");t("body>.btn.jmodedit").clearQueue().tooltip("destroy").remove(),t(this).addClass("jmodinside").prepend('<a
class="btn jmodedit" href="#"
target="'+n+'"><span
class="icon-edit"></span></a>').children(":first").attr("href",e).attr("title",o).tooltip({container:!1,html:!0,placement:i}).jEditMakeAbsolute(!0),t(".btn.jmodedit").on({mouseenter:function(){t(this).clearQueue()},mouseleave:function(){t(this).delay(500).queue(function(e){t(this).tooltip("destroy").remove(),e()})}})},mouseleave:function(){t("body>.btn.jmodedit").delay(500).queue(function(e){t(this).tooltip("destroy").remove(),e()})}});var
n=null;t(".jmoddiv[data-jmenuedittip] .nav
li,.jmoddiv[data-jmenuedittip].nav li,.jmoddiv[data-jmenuedittip] .nav
.nav-child li,.jmoddiv[data-jmenuedittip].nav .nav-child
li").on({mouseenter:function(){var
e=/\bitem-(\d+)\b/.exec(t(this).attr("class"));if("string"==typeof
e[1])var
o=t(this).closest(".jmoddiv"),i=o.data("jmodediturl"),d=i.replace(/\/index.php\?option=com_config&controller=config.display.modules([^\d]+).+$/,"/administrator/index.php?option=com_menus&view=item&layout=edit$1"+e[1]);var
a=o.data("jmenuedittip").replace("%s",e[1]),l=t('<div><a
class="btn jfedit-menu" href="#"
target="_blank"><span
class="icon-edit"></span></a></div>');l.children("a.jfedit-menu").prop("href",d).prop("title",a),n&&t(n).popover("hide"),t(this).popover({html:!0,content:l.html(),container:"body",trigger:"manual",animation:!1,placement:"bottom"}).popover("show"),n=this,t("body>div.popover").on({mouseenter:function(){n&&t(n).clearQueue()},mouseleave:function(){n&&t(n).popover("hide")}}).find("a.jfedit-menu").tooltip({container:!1,html:!0,placement:"bottom"})},mouseleave:function(){t(this).delay(1500).queue(function(e){t(this).popover("hide"),e()})}})})}(jQuery);PK\n�[|�++js/helpsite.jsnu�[���/**
 * @package		Joomla.JavaScript
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * gets the help site with ajax
 */
jQuery(document).ready(function() {
	jQuery('#helpsite-refresh').click(function()
	{
		// Uses global variable helpsite_base for bast uri
		var select_id   = jQuery(this).attr('rel');
		var showDefault = jQuery(this).attr('showDefault');

		jQuery.getJSON('index.php?option=com_users&task=profile.gethelpsites&format=json',
function(data){
			// The response contains the options to use in help site select field
			var items = [];

			// Build options
			jQuery.each(data, function(key, val) {
				if (val.value !== '' || showDefault === 'true') {
					items.push('<option value="' + val.value +
'">' + val.text + '</option>');
				}
			});

			// Replace current select options. The trigger is needed for Chosen
select box enhancer
			jQuery("#" +
select_id).empty().append(items).trigger("liszt:updated");
		});
	});
});
PK\n�[a}��js/highlighter-uncompressed.jsnu�[���/**
 * @package     Joomla.JavaScript
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license     GNU General Public License version 2 or later; see
LICENSE.txt
 */

// Only define the Joomla namespace if not defined.
if (typeof(Joomla) === 'undefined') {
    var Joomla = {};
}

Joomla.Highlighter = function(_options){
    var $, words, options = {
        autoUnhighlight: true,
        caseSensitive: false,
        startElement: false,
        endElement: false,
        elements: [],
        className: 'highlight',
        onlyWords: true,
        tag: 'span'
    },

    highlight = function (words) {
        if (words.constructor === String) {
            words = [words];
        }
        if (options.autoUnhighlight) {
            unhighlight(words);
        }
        var pattern = options.onlyWords ? '\b' + pattern +
'\b' : '(' + words.join('\\b|\\b') +
')',
        regex = new RegExp(pattern, options.caseSensitive ? '' :
'i');
        options.elements.map(function(el){
            recurse(el, regex, options.className);
        });
        return this;
    },

    unhighlight = function (words) {
        if (words.constructor === String) {
            words = [words];
        }

        var $elements, tn;
        words.map(function(word){
            word = (options.caseSensitive ? word : word.toUpperCase());
            if (words[word]) {
                $elements = $(words[word]);
                $elements.removeClass();
                $elements.each(function (index, el) {
                    tn = document.createTextNode($(el).text());
                    el.parentNode.replaceChild(tn, el);
                });
            }
        });
        return this;
    },

    recurse = function (node, regex, klass) {
        if (node.nodeType === 3) {
            var match = node.nodeValue.match(regex), highlight, $highlight,
wordNode, wordClone, comparer, i;
            if (match) {
                highlight = document.createElement(options.tag);
                $highlight = $(highlight);
                $highlight.addClass(klass);
                wordNode = node.splitText(match.index);
                wordNode.splitText(match[0].length);
                wordClone = wordNode.cloneNode(true);
                $highlight.append(wordClone);
                $(wordNode).replaceWith(highlight)
                $highlight.attr('rel', $highlight.text());
                comparer = $highlight.text()
                if (!options.caseSensitive) {
                    comparer = $highlight.text().toUpperCase();
                }
                if (!words[comparer]) {
                    words[comparer] = [];
                }
                words[comparer].push(highlight);
                return 1;
            }
        } else if ((node.nodeType === 1 && node.childNodes)
&& !/(script|style|textarea|iframe)/i.test(node.tagName) &&
!(node.tagName === options.tag.toUpperCase() && node.className ===
klass)) {
            for (i = 0; i < node.childNodes.length; i++) {
                i += recurse(node.childNodes[i], regex, klass);
            }
        }
        return 0;
    },

    getElements = function ($start, $end) {
        var $next = $start.next();
        if ($next.attr('id') !== $end.attr('id')) {
            options.elements.push($next.get(0));
            getElements($next, $end);
        }
    },

    initialize = function(_options) {
        $ = jQuery.noConflict();
        $.extend(options, _options);
        getElements($(options.startElement), $(options.endElement));
        words = [];
    };

    initialize(_options);

    return {
        highlight: highlight,
        unhighlight : unhighlight
    };
}
PK\n�[�G�44js/highlighter.jsnu�[���/*
		GNU General Public License version 2 or later; see LICENSE.txt
*/
if(typeof(Joomla)==="undefined"){var
Joomla={}}Joomla.Highlighter=function(h){var
d,f,i={autoUnhighlight:true,caseSensitive:false,startElement:false,endElement:false,elements:[],className:"highlight",onlyWords:true,tag:"span"},b=function(l){if(l.constructor===String){l=[l]}if(i.autoUnhighlight){g(l)}var
k=i.onlyWords?"\b"+k+"\b":"("+l.join("\\b|\\b")+")",j=new
RegExp(k,i.caseSensitive?"":"i");i.elements.map(function(m){a(m,j,i.className)});return
this},g=function(l){if(l.constructor===String){l=[l]}var
k,j;l.map(function(m){m=(i.caseSensitive?m:m.toUpperCase());if(l[m]){k=d(l[m]);k.removeClass();k.each(function(n,o){j=document.createTextNode(d(o).text());o.parentNode.replaceChild(j,o)})}});return
this},a=function(k,r,q){if(k.nodeType===3){var
o=k.nodeValue.match(r),l,j,s,p,n,m;if(o){l=document.createElement(i.tag);j=d(l);j.addClass(q);s=k.splitText(o.index);s.splitText(o[0].length);p=s.cloneNode(true);j.append(p);d(s).replaceWith(l);j.attr("rel",j.text());n=j.text();if(!i.caseSensitive){n=j.text().toUpperCase()}if(!f[n]){f[n]=[]}f[n].push(l);return
1}}else{if((k.nodeType===1&&k.childNodes)&&!/(script|style|textarea|iframe)/i.test(k.tagName)&&!(k.tagName===i.tag.toUpperCase()&&k.className===q)){for(m=0;m<k.childNodes.length;m++){m+=a(k.childNodes[m],r,q)}}}return
0},e=function(l,k){var
j=l.next();if(j.attr("id")!==k.attr("id")){i.elements.push(j.get(0));e(j,k)}},c=function(j){d=jQuery.noConflict();d.extend(i,j);e(d(i.startElement),d(i.endElement));f=[]};c(h);return{highlight:b,unhighlight:g}};PK\n�[O/n?5?5
js/html5fallback-uncompressed.jsnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * Unobtrusive Form Validation and HTML5 Form polyfill library
 *
 * Inspired by: Ryan Seddon <http://thecssninja.com/javascript/H5F>
 *
 * @package		Joomla.Framework
 * @subpackage	Forms
 */

( function( $, document, undefined ) {
	"use strict";

	// Utility function
	if ( typeof Object.create !== 'function' ) {
		Object.create = function( obj ) {
			function F() {}
			F.prototype = obj;
			return new F();
		};
	}

	var features = ( function( el, item ) {
		var attributes = [ 'required', 'pattern',
'placeholder', 'autofocus', 'formnovalidate'
],
			types = [ 'email', 'url', 'number',
'range' ],
			result = {
				attributes: {},
				types: {}
			};

		while ( item = attributes.pop() ) {
			result.attributes[ item ] = !!( item in el );
		}

		while ( item = types.pop() ) {
			el.setAttribute( 'type', item );
			result.types[ item ] = ( el.type == item );
		}

		return result;
	}( document.createElement( "input" ) ) );

	var H5Form = {
		/**
		 * Init function, prepares the form for for validation
		 *
		 * @param   object   options  Some options to override the defaults.
		 * @param   Element  elem     The form or element to validate.
		 *
		 * @return  void
		 */
		init: function( options, elem ) {
			var self = this;

			self.elem = elem;
			self.$elem = $( elem );
			elem.H5Form = self;
			self.options = $.extend( {}, $.fn.h5f.options, options );

			// Check whether the element is form or not
			if ( elem.nodeName.toLowerCase() === "form" ) {
				self.bindWithForm( self.elem, self.$elem );
			}
		},

		/**
		 * Attach the validation behaviors to the form
		 *
		 * @param   Element  form   The form element
		 * @param   jQuery   $form  A jQuery object containing the form
		 *
		 * @return  void
		 */
		bindWithForm: function( form, $form ) {
			var self = this,
				novalidate = !!$form.attr( 'novalidate' ),
				f = form.elements,
				flen = f.length,
				formnovalidate;

			if ( self.options.formValidationEvent === "onSubmit" ) {
				$form.on( 'submit', function( e ) {
					formnovalidate = this.H5Form.donotValidate !== undefined ?
this.H5Form.donotValidate : false;

					if ( !formnovalidate && !novalidate &&
!self.validateForm( self ) ) {
						// Prevent form from submit
						e.preventDefault();
						this.donotValidate = false;
					} else {
						$form.find( ':input' )
							.each( function() {
								self.placeholder( self, this, 'submit' );
							} );
					}
				});
			}

			$form.on( 'focusout focusin', function( event ) {
				self.placeholder( self, event.target, event.type );
			});

			$form.on( 'focusout change', self.validateField );

			$form.find( 'fieldset' )
				.on( 'change', function() {
					self.validateField( this );
				});

			if ( !features.attributes.formnovalidate ) {
				$form.find( ':submit[formnovalidate]' )
					.on( 'click', function() {
						self.donotValidate = true;
					});
			}

			while ( flen-- ) {
				// Assign graphical polyfills
				self.polyfill( f[ flen ] );
				self.autofocus( self, f[ flen ] );
			}
		},

		/**
		 * Apply the polyfills where applicable
		 *
		 * @param   Element  elem  The element to apply polyfills to
		 *
		 * @return  void
		 */
		polyfill: function( elem ) {
			if ( elem.nodeName.toLowerCase() === 'form' ) return true;

			var self = elem.form.H5Form;

			self.placeholder( self, elem );
			self.numberType( self, elem );
		},

		/**
		 * Validate the form
		 *
		 * @return  boolean  True if the form is valid, False if not
		 */
		validateForm: function() {
			var self = this,
				form = self.elem,
				f = form.elements,
				flen = f.length,
				isFieldValid = true,
				i, elem;

			form.isValid = true;

			for ( i = 0; i < flen; i++ ) {
				elem = f[ i ];
				elem.isRequired = !!elem.required;
				if (elem.isDisabled) {
					elem.isDisabled = !!elem.disabled;
				}

				//Do Validation
				if ( !elem.isDisabled ) {
					isFieldValid = self.validateField( elem );

					// Set focus to first invalid field
					if ( form.isValid && !isFieldValid ) {
						self.setFocusOn( elem );
					}

					form.isValid = isFieldValid && form.isValid;
				}
			}

			if ( self.options.doRenderMessage ) {
				self.renderErrorMessages( self, form );
			}

			return form.isValid;
		},

		/**
		 * Validate a field
		 *
		 * @param   mixed  e  Either an Event or Element
		 *
		 * @return  mixed  True if the field is valid, False if not, null if the
field has no form.
		 */
		validateField: function( e ) {
			var elem = e.target || e,
				isMissing = false,
				isRequired = false,
				isDisabled = false,
				isPatternMismatched = false,
				self, $elem, $labelref;

			if ( elem.form === undefined ) {
				return null;
			}

			self = elem.form.H5Form;
			$elem = $( elem );
			isRequired = !!$elem.attr( "required" );
			isDisabled = !!$elem.attr( "disabled" );

			if ( !elem.isDisabled ) {
				isMissing = !features.attributes.required && isRequired
&& self.isValueMissing( self, elem );
				isPatternMismatched = !features.attributes.pattern &&
self.matchPattern( self, elem );
			}

			elem.validityState = {
				valueMissing: isMissing,
				patternMismatch: isPatternMismatched,
				valid: ( elem.isDisabled || !( isMissing || isPatternMismatched ) )
			};

			if ( !features.attributes.required ) {
				if ( elem.validityState.valueMissing ) {
					$elem.addClass( self.options.requiredClass );
				} else {
					$elem.removeClass( self.options.requiredClass );
				}
			}

			if ( !features.attributespattern ) {
				if ( elem.validityState.patternMismatch ) {
					$elem.addClass( self.options.patternClass );
				} else {
					$elem.removeClass( self.options.patternClass );
				}
			}

			if ( !elem.validityState.valid ) {
				$elem.addClass( self.options.invalidClass );
				$labelref = self.findLabel( $elem );
				$labelref.addClass( self.options.invalidClass );
				$labelref.attr( 'aria-invalid', 'true' );
			} else {
				$elem.removeClass( self.options.invalidClass );
				$labelref = self.findLabel( $elem );
				$labelref.removeClass( self.options.invalidClass );
				$labelref.attr( 'aria-invalid', 'false' );
			}

			return elem.validityState.valid;
		},

		/**
		 * Check if the field has no value
		 *
		 * @param   H5Form    self  This
		 * @param   Element   elem  A field element to check
		 *
		 * @return  Boolean
		 */
		isValueMissing: function( self, elem ) {
			var $elem = $( elem ),
				type = elem.type !== undefined ? elem.type :
elem.tagName.toLowerCase(),
				isSpecialType = /^(checkbox|radio|fieldset)$/i.test( type ),
				isIgnoredType = /^submit$/i.test( type ),
				elements, i, l;

			if ( isIgnoredType ) {
				return false;
			}

			if ( !isSpecialType ) {
				if ( $elem.val() === "" || ( !features.attributes.placeholder
&& $elem.hasClass( self.options.placeholderClass ) ) ) {
					return true;
				}
			} else {
				if ( type === "checkbox" ) {
					return !$elem.is( ':checked' );
				} else {
					elements = ( type === "fieldset" ) ? $elem.find(
'input' ) : document.getElementsByName( elem.name );

					for ( i = 0, l = elements.length; i < l; i++ ) {
						if ( $( elements[ i ] ).is( ':checked' ) ) {
							return false;
						}
					}

					// Since no checkbox or radio box is checked value is missing.
					return true;
				}
			}

			return false;
		},

		/**
		 * Check if a pattern is not matched
		 *
		 * @param   H5Form    self  This
		 * @param   Element   elem  A field element to check
		 *
		 * @return  boolean   True if the pattern does not match.
		 */
		matchPattern: function( self, elem ) {
			var $elem = $( elem ),
				val = $elem.attr( 'value' ),
				pattern = $elem.attr( 'pattern' ),
				type = $elem.attr( 'type' ),
				i, l;

			if ( features.attributes.placeholder || !$elem.attr(
'placeholder' ) || !$elem.hasClass( self.options.placeholderClass
) ) {
				val = $elem.attr( 'value' );
			}

			if ( val === "" ) {
				return false;
			}

			if ( type === "email" ) {
				if ( $elem.attr( 'multiple' ) !== undefined ) {
					val = val.split( self.options.mutipleDelimiter );

					for ( i = 0, l = val.length; i < l; i++ ) {
						if ( !self.options.emailPatt.test( val[ i ].replace( /[ ]*/g,
'' ) ) ) return true;
					}
				} else {
					return !self.options.emailPatt.test( val );
				}
			} else if ( type === "url" ) {
				return !self.options.urlPatt.test( val );
			} else if ( type === 'text' ) {
				if ( pattern !== undefined ) {
					usrPatt = new RegExp( '^(?:' + pattern + ')$' );

					return !usrPatt.test( val );
				}
			}

			return false;
		},

		/**
		 * Placeholder polyfill
		 *
		 * @param   H5Form    self   This
		 * @param   Element   elem   A field element to fill
		 * @param   Event     event  Event object
		 *
		 * @return  void
		 */
		placeholder: function( self, elem, event ) {
			var $elem = $( elem ),
				placeholder = $elem.attr( "placeholder" ),
				expectEmpty = /^(focusin|submit)$/i.test( event ),
				isInput = /^(input|textarea)$/i.test( elem.nodeName ),
				isIgnored = /^password$/i.test( elem.type ),
				isNative = features.attributes.placeholder;

			if ( isNative || !isInput || isIgnored || placeholder === undefined ) {
				return;
			}

			if ( elem.value === "" && !expectEmpty ) {
				elem.value = placeholder;
				$elem.addClass( self.options.placeholderClass );
			} else if ( elem.value === placeholder && expectEmpty ) {
				elem.value = "";
				$elem.removeClass( self.options.placeholderClass );
			}
		},

		/**
		 * Polyfill for number type fields
		 *
		 * @param   H5Form    self   This
		 * @param   Element   elem   A field element to replace
		 *
		 * @return  void
		 */
		numberType: function( self, elem ) {
			var $elem = $( elem ),
				type = $elem.attr( 'type' ),
				isInput = /^input$/i.test( elem.nodeName ),
				isType = /^(number|range)$/i.test( type ),
				min, max, step, value, attributes, $select, $option, i;

			if ( !isInput || !isType || ( type == "number" &&
features.types.number ) || ( type == "range" &&
features.types.range ) ) {
				return;
			}

			min = parseInt( $elem.attr( 'min' ) );
			max = parseInt( $elem.attr( 'max' ) );
			step = parseInt( $elem.attr( 'step' ) );
			value = parseInt( $elem.attr( 'value' ) );
			attributes = $elem.prop( "attributes" );
			$select = $( '<select>' );

			min = isNaN( min ) ? -100 : min;

			for ( i = min; i <= max; i += step ) {
				$option = $( '<option value="' + i +
'">' + i + '</option>' );

				if ( value == i || ( value > i && value < i + step ) ) {
					$option.attr( 'selected', '' );
				}

				$select.append( $option );
			}

			$.each( attributes, function() {
				$select.attr( this.name, this.value );
			});

			$elem.replaceWith( $select );
		},

		/**
		 * Autofocus polyfill
		 *
		 * @param   H5Form    self   This
		 * @param   Element   elem   A field element to autofocus
		 *
		 * @return  void
		 */
		autofocus: function( self, elem ) {
			var $elem = $( elem ),
				doAutofocus = !!$elem.attr( "autofocus" ),
				canFocus = /^(input|textarea|select|fieldset)$/i.test( elem.nodeName ),
				isIgnored = /^submit$/i.test( elem.type ),
				isNative = features.attributes.autofocus;

			if ( !isNative && canFocus && !isIgnored &&
doAutofocus ) {
				$(function() {
					self.setFocusOn( elem );
				});
			}
		},

		/**
		 * Find an element's label.
		 *
		 * @param   Element  $elem  Some kind of input element
		 *
		 * @return  Element  A label element
		 */
		findLabel: function( $elem ) {
			var $label = $( 'label[for="' + $elem.attr(
'id' ) + '"]' ),
				$parentElem;

			if ( $label.length <= 0 ) {
				$parentElem = $elem.parent();

				if ( $parentElem.get( 0 )
					.tagName.toLowerCase() == "label" ) {
					$label = $parentElem;
				}
			}

			return $label;
		},

		/**
		 * Set focus on an element.
		 *
		 * @param  Element  elem  The element to focus on.
		 */
		setFocusOn: function( elem ) {
			if ( elem.tagName.toLowerCase() === "fieldset" ) {
				$( elem )
					.find( ":first" )
					.focus();
			} else {
				$( elem )
					.focus();
			}
		},

		/**
		 * Renders any error messages
		 *
		 * @param   H5Form    self   This
		 * @param   Element   form   A form element
		 *
		 * @return  void
		 */
		renderErrorMessages: function( self, form ) {
			var f = form.elements,
				flen = f.length,
				error = {
					errors: []
				},
				$elem, $label;

			while ( flen-- ) {
				$elem = $( f[ flen ] );
				$label = self.findLabel( $elem );

				if ( $elem.hasClass( self.options.requiredClass ) ) {
					error.errors[ flen ] = $label.text()
						.replace( "*", "" ) +
self.options.requiredMessage;
				}

				if ( $elem.hasClass( self.options.patternClass ) ) {
					error.errors[ flen ] = $label.text()
						.replace( "*", "" ) +
self.options.patternMessage;
				}
			}

			if ( error.errors.length > 0 ) {
				Joomla.renderMessages( error );
			}
		}
	};

	$.fn.h5f = function( options ) {
		return this.each(function() {
			Object.create( H5Form )
				.init( options, this );
		});
	};

	$.fn.h5f.options = {
		invalidClass: "invalid",
		requiredClass: "required",
		requiredMessage: " is required.",
		placeholderClass: "placeholder",
		patternClass: "pattern",
		patternMessage: " doesn't match pattern.",
		doRenderMessage: false,
		formValidationEvent: 'onSubmit',
		emailPatt:
/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/,
		urlPatt: /[a-z][\-\.+a-z]*:\/\//i
	};

	$( function() {
		$( 'form' )
			.h5f({
				doRenderMessage: true,
				requiredClass: "musthavevalue"
			});
	});

})( jQuery, document );
PK\n�[;s��66js/html5fallback.jsnu�[���!function(a,b,c){"use
strict";"function"!=typeof
Object.create&&(Object.create=function(a){function b(){}return
b.prototype=a,new b});var d=function(a,b){for(var
c=["required","pattern","placeholder","autofocus","formnovalidate"],d=["email","url","number","range"],e={attributes:{},types:{}};b=c.pop();)e.attributes[b]=!!(b
in
a);for(;b=d.pop();)a.setAttribute("type",b),e.types[b]=a.type==b;return
e}(b.createElement("input")),e={init:function(b,c){var
d=this;d.elem=c,d.$elem=a(c),c.H5Form=d,d.options=a.extend({},a.fn.h5f.options,b),"form"===c.nodeName.toLowerCase()&&d.bindWithForm(d.elem,d.$elem)},bindWithForm:function(a,b){var
i,e=this,f=!!b.attr("novalidate"),g=a.elements,h=g.length;for("onSubmit"===e.options.formValidationEvent&&b.on("submit",function(a){i=this.H5Form.donotValidate!==c&&this.H5Form.donotValidate,i||f||e.validateForm(e)?b.find(":input").each(function(){e.placeholder(e,this,"submit")}):(a.preventDefault(),this.donotValidate=!1)}),b.on("focusout
focusin",function(a){e.placeholder(e,a.target,a.type)}),b.on("focusout
change",e.validateField),b.find("fieldset").on("change",function(){e.validateField(this)}),d.attributes.formnovalidate||b.find(":submit[formnovalidate]").on("click",function(){e.donotValidate=!0});h--;)e.polyfill(g[h]),e.autofocus(e,g[h])},polyfill:function(a){if("form"===a.nodeName.toLowerCase())return!0;var
b=a.form.H5Form;b.placeholder(b,a),b.numberType(b,a)},validateForm:function(){var
f,g,a=this,b=a.elem,c=b.elements,d=c.length,e=!0;for(b.isValid=!0,f=0;f<d;f++)g=c[f],g.isRequired=!!g.required,g.isDisabled&&(g.isDisabled=!!g.disabled),g.isDisabled||(e=a.validateField(g),b.isValid&&!e&&a.setFocusOn(g),b.isValid=e&&b.isValid);return
a.options.doRenderMessage&&a.renderErrorMessages(a,b),b.isValid},validateField:function(b){var
j,k,l,e=b.target||b,f=!1,g=!1,h=!1,i=!1;return
e.form===c?null:(j=e.form.H5Form,k=a(e),g=!!k.attr("required"),h=!!k.attr("disabled"),e.isDisabled||(f=!d.attributes.required&&g&&j.isValueMissing(j,e),i=!d.attributes.pattern&&j.matchPattern(j,e)),e.validityState={valueMissing:f,patternMismatch:i,valid:e.isDisabled||!(f||i)},d.attributes.required||(e.validityState.valueMissing?k.addClass(j.options.requiredClass):k.removeClass(j.options.requiredClass)),d.attributespattern||(e.validityState.patternMismatch?k.addClass(j.options.patternClass):k.removeClass(j.options.patternClass)),e.validityState.valid?(k.removeClass(j.options.invalidClass),l=j.findLabel(k),l.removeClass(j.options.invalidClass),l.attr("aria-invalid","false")):(k.addClass(j.options.invalidClass),l=j.findLabel(k),l.addClass(j.options.invalidClass),l.attr("aria-invalid","true")),e.validityState.valid)},isValueMissing:function(e,f){var
k,l,m,g=a(f),h=f.type!==c?f.type:f.tagName.toLowerCase(),i=/^(checkbox|radio|fieldset)$/i.test(h),j=/^submit$/i.test(h);if(j)return!1;if(i){if("checkbox"===h)return!g.is(":checked");for(k="fieldset"===h?g.find("input"):b.getElementsByName(f.name),l=0,m=k.length;l<m;l++)if(a(k[l]).is(":checked"))return!1;return!0}return!(""!==g.val()&&(d.attributes.placeholder||!g.hasClass(e.options.placeholderClass)))},matchPattern:function(b,e){var
j,k,f=a(e),g=f.attr("value"),h=f.attr("pattern"),i=f.attr("type");if(!d.attributes.placeholder&&f.attr("placeholder")&&f.hasClass(b.options.placeholderClass)||(g=f.attr("value")),""===g)return!1;if("email"===i){if(f.attr("multiple")===c)return!b.options.emailPatt.test(g);for(g=g.split(b.options.mutipleDelimiter),j=0,k=g.length;j<k;j++)if(!b.options.emailPatt.test(g[j].replace(/[
]*/g,"")))return!0}else{if("url"===i)return!b.options.urlPatt.test(g);if("text"===i&&h!==c)return
usrPatt=new
RegExp("^(?:"+h+")$"),!usrPatt.test(g)}return!1},placeholder:function(b,e,f){var
g=a(e),h=g.attr("placeholder"),i=/^(focusin|submit)$/i.test(f),j=/^(input|textarea)$/i.test(e.nodeName),k=/^password$/i.test(e.type),l=d.attributes.placeholder;l||!j||k||h===c||(""!==e.value||i?e.value===h&&i&&(e.value="",g.removeClass(b.options.placeholderClass)):(e.value=h,g.addClass(b.options.placeholderClass)))},numberType:function(b,c){var
i,j,k,l,m,n,o,p,e=a(c),f=e.attr("type"),g=/^input$/i.test(c.nodeName),h=/^(number|range)$/i.test(f);if(!(!g||!h||"number"==f&&d.types.number||"range"==f&&d.types.range)){for(i=parseInt(e.attr("min")),j=parseInt(e.attr("max")),k=parseInt(e.attr("step")),l=parseInt(e.attr("value")),m=e.prop("attributes"),n=a("<select>"),i=isNaN(i)?-100:i,p=i;p<=j;p+=k)o=a('<option
value="'+p+'">'+p+"</option>"),(l==p||l>p&&l<p+k)&&o.attr("selected",""),n.append(o);a.each(m,function(){n.attr(this.name,this.value)}),e.replaceWith(n)}},autofocus:function(b,c){var
e=a(c),f=!!e.attr("autofocus"),g=/^(input|textarea|select|fieldset)$/i.test(c.nodeName),h=/^submit$/i.test(c.type),i=d.attributes.autofocus;!i&&g&&!h&&f&&a(function(){b.setFocusOn(c)})},findLabel:function(b){var
d,c=a('label[for="'+b.attr("id")+'"]');return
c.length<=0&&(d=b.parent(),"label"==d.get(0).tagName.toLowerCase()&&(c=d)),c},setFocusOn:function(b){"fieldset"===b.tagName.toLowerCase()?a(b).find(":first").focus():a(b).focus()},renderErrorMessages:function(b,c){for(var
g,h,d=c.elements,e=d.length,f={errors:[]};e--;)g=a(d[e]),h=b.findLabel(g),g.hasClass(b.options.requiredClass)&&(f.errors[e]=h.text().replace("*","")+b.options.requiredMessage),g.hasClass(b.options.patternClass)&&(f.errors[e]=h.text().replace("*","")+b.options.patternMessage);f.errors.length>0&&Joomla.renderMessages(f)}};a.fn.h5f=function(a){return
this.each(function(){Object.create(e).init(a,this)})},a.fn.h5f.options={invalidClass:"invalid",requiredClass:"required",requiredMessage:"
is
required.",placeholderClass:"placeholder",patternClass:"pattern",patternMessage:"
doesn't match
pattern.",doRenderMessage:!1,formValidationEvent:"onSubmit",emailPatt:/^[a-zA-Z0-9.!#$%&‚Äô*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/,urlPatt:/[a-z][\-\.+a-z]*:\/\//i},a(function(){a("form").h5f({doRenderMessage:!0,requiredClass:"musthavevalue"})})}(jQuery,document);PK\n�[��&�'�'js/jquery.Jcrop.jsnu�[���/*!
Jcrop.js v2.0.4 - build: 20151117
 *  @copyright 2008-2015 Tapmodo Interactive LLC
 *  @license Free software under MIT License
 *  @website http://jcrop.org/
 **/
(function($){
  'use strict';

  // Jcrop constructor
  var Jcrop = function(element,opt){
    var _ua = navigator.userAgent.toLowerCase();

    this.opt = $.extend({},Jcrop.defaults,opt || {});

    this.container = $(element);

    this.opt.is_msie = /msie/.test(_ua);
    this.opt.is_ie_lt9 = /msie [1-8]\./.test(_ua);

    this.container.addClass(this.opt.css_container);

    this.ui = {};
    this.state = null;
    this.ui.multi = [];
    this.ui.selection = null;
    this.filter = {};

    this.init();
    this.setOptions(opt);
    this.applySizeConstraints();
    this.container.trigger('cropinit',this);
      
    // IE<9 doesn't work if mouse events are attached to window
    if (this.opt.is_ie_lt9)
      this.opt.dragEventTarget = document.body;
  };


  // Jcrop static functions
  $.extend(Jcrop,{
    component: { },
    filter: { },
    stage: { },
    registerComponent: function(name,component){
      Jcrop.component[name] = component;
    },
    registerFilter: function(name,filter){
      Jcrop.filter[name] = filter;
    },
    registerStageType: function(name,stage){
      Jcrop.stage[name] = stage;
    },
    // attach: function(element,opt){{{
    attach: function(element,opt){
      var obj = new $.Jcrop(element,opt);
      return obj;
    },
    // }}}
    // imgCopy: function(imgel){{{
    imgCopy: function(imgel){
      var img = new Image;
      img.src = imgel.src;
      return img;
    },
    // }}}
    // imageClone: function(imgel){{{
    imageClone: function(imgel){
      return $.Jcrop.supportsCanvas?
        Jcrop.canvasClone(imgel):
        Jcrop.imgCopy(imgel);
    },
    // }}}
    // canvasClone: function(imgel){{{
    canvasClone: function(imgel){
      var canvas = document.createElement('canvas'),
          ctx = canvas.getContext('2d');

      $(canvas).width(imgel.width).height(imgel.height),
      canvas.width = imgel.naturalWidth;
      canvas.height = imgel.naturalHeight;
      ctx.drawImage(imgel,0,0,imgel.naturalWidth,imgel.naturalHeight);
      return canvas;
    },
    // }}}
    // propagate: function(plist,config,obj){{{
    propagate: function(plist,config,obj){
      for(var i=0,l=plist.length;i<l;i++)
        if (config.hasOwnProperty(plist[i]))
          obj[plist[i]] = config[plist[i]];
    },
    // }}}
    // getLargestBox: function(ratio,w,h){{{
    getLargestBox: function(ratio,w,h){
      if ((w/h) > ratio)
        return [ h * ratio, h ];
          else return [ w, w / ratio ];
    },
    // }}}
    // stageConstructor: function(el,options,callback){{{
    stageConstructor: function(el,options,callback){

      // Get a priority-ordered list of available stages
      var stages = [];
      $.each(Jcrop.stage,function(i,e){
        stages.push(e);
      });
      stages.sort(function(a,b){ return a.priority - b.priority; });

      // Find the first one that supports this element
      for(var i=0,l=stages.length;i<l;i++){
        if (stages[i].isSupported(el,options)){
          stages[i].create(el,options,function(obj,opt){
            if (typeof callback == 'function') callback(obj,opt);
          });
          break;
        }
      }
    },
    // }}}
    // supportsColorFade: function(){{{
    supportsColorFade: function(){
      return $.fx.step.hasOwnProperty('backgroundColor');
    },
    // }}}
    // wrapFromXywh: function(xywh){{{
    wrapFromXywh: function(xywh){
      var b = { x: xywh[0], y: xywh[1], w: xywh[2], h: xywh[3] };
      b.x2 = b.x + b.w;
      b.y2 = b.y + b.h;
      return b;
    }
    // }}}
  });

var AbstractStage = function(){
};

$.extend(AbstractStage,{
  isSupported: function(el,o){
    // @todo: should actually check if it's an HTML element
    return true;
  },
  // A higher priority means less desirable
  // AbstractStage is the last one we want to use
  priority: 100,
  create: function(el,options,callback){
    var obj = new AbstractStage;
    obj.element = el;
    callback.call(this,obj,options);
  },
  prototype: {
    attach: function(core){
      this.init(core);
      core.ui.stage = this;
    },
    triggerEvent: function(ev){
      $(this.element).trigger(ev);
      return this;
    },
    getElement: function(){
      return this.element;
    }
  }
});
Jcrop.registerStageType('Block',AbstractStage);


var ImageStage = function(){
};

ImageStage.prototype = new AbstractStage();

$.extend(ImageStage,{
  isSupported: function(el,o){
    if (el.tagName == 'IMG') return true;
  },
  priority: 90,
  create: function(el,options,callback){
    $.Jcrop.component.ImageLoader.attach(el,function(w,h){
      var obj = new ImageStage;
      obj.element = $(el).wrap('<div />').parent();

      obj.element.width(w).height(h);
      obj.imgsrc = el;

      if (typeof callback == 'function')
        callback.call(this,obj,options);
    });
  }
});
Jcrop.registerStageType('Image',ImageStage);


var CanvasStage = function(){
  this.angle = 0;
  this.scale = 1;
  this.scaleMin = 0.2;
  this.scaleMax = 1.25;
  this.offset = [0,0];
};

CanvasStage.prototype = new ImageStage();

$.extend(CanvasStage,{
  isSupported: function(el,o){
    if ($.Jcrop.supportsCanvas && (el.tagName == 'IMG'))
return true;
  },
  priority: 60,
  create: function(el,options,callback){
    var $el = $(el);
    var opt = $.extend({},options);
    $.Jcrop.component.ImageLoader.attach(el,function(w,h){
      var obj = new CanvasStage;
      $el.hide();
      obj.createCanvas(el,w,h);
      $el.before(obj.element);
      obj.imgsrc = el;
      opt.imgsrc = el;

      if (typeof callback == 'function'){
        callback(obj,opt);
        obj.redraw();
      }
    });
  }
});

$.extend(CanvasStage.prototype,{
  init: function(core){
    this.core = core;
  },
  // setOffset: function(x,y) {{{
  setOffset: function(x,y) {
    this.offset = [x,y];
    return this;
  },
  // }}}
  // setAngle: function(v) {{{
  setAngle: function(v) {
    this.angle = v;
    return this;
  },
  // }}}
  // setScale: function(v) {{{
  setScale: function(v) {
    this.scale = this.boundScale(v);
    return this;
  },
  // }}}
  boundScale: function(v){
    if (v<this.scaleMin) v = this.scaleMin;
    else if (v>this.scaleMax) v = this.scaleMax;
    return v;
  },
  createCanvas: function(img,w,h){
    this.width = w;
    this.height = h;
    this.canvas = document.createElement('canvas');
    this.canvas.width = w;
    this.canvas.height = h;
    this.$canvas =
$(this.canvas).width('100%').height('100%');
    this.context = this.canvas.getContext('2d');
    this.fillstyle = "rgb(0,0,0)";
    this.element = this.$canvas.wrap('<div
/>').parent().width(w).height(h);
  },
  triggerEvent: function(ev){
    this.$canvas.trigger(ev);
    return this;
  },
  // clear: function() {{{
  clear: function() {
    this.context.fillStyle = this.fillstyle;
    this.context.fillRect(0, 0, this.canvas.width, this.canvas.height);
    return this;
  },
  // }}}
  // redraw: function() {{{
  redraw: function() {
    // Save the current context
    this.context.save();
    this.clear();

    // Translate to the center point of our image
    this.context.translate(parseInt(this.width * 0.5), parseInt(this.height
* 0.5));
    // Perform the rotation and scaling
   
this.context.translate(this.offset[0]/this.core.opt.xscale,this.offset[1]/this.core.opt.yscale);
    this.context.rotate(this.angle * (Math.PI/180));
    this.context.scale(this.scale,this.scale);
    // Translate back to the top left of our image
    this.context.translate(-parseInt(this.width * 0.5),
-parseInt(this.height * 0.5));
    // Finally we draw the image
    this.context.drawImage(this.imgsrc,0,0,this.width,this.height);

    // And restore the updated context
    this.context.restore();
    this.$canvas.trigger('cropredraw');
    return this;
  },
  // }}}
  // setFillStyle: function(v) {{{
  setFillStyle: function(v) {
    this.fillstyle = v;
    return this;
  }
  // }}}
});

Jcrop.registerStageType('Canvas',CanvasStage);


  /**
   *  BackoffFilter
   *  move out-of-bounds selection into allowed position at same size
   */
  var BackoffFilter = function(){
    this.minw = 40;
    this.minh = 40;
    this.maxw = 0;
    this.maxh = 0;
    this.core = null;
  };
  $.extend(BackoffFilter.prototype,{
    tag: 'backoff',
    priority: 22,
    filter: function(b){
      var r = this.bound;

      if (b.x < r.minx) { b.x = r.minx; b.x2 = b.w + b.x; }
      if (b.y < r.miny) { b.y = r.miny; b.y2 = b.h + b.y; }
      if (b.x2 > r.maxx) { b.x2 = r.maxx; b.x = b.x2 - b.w; }
      if (b.y2 > r.maxy) { b.y2 = r.maxy; b.y = b.y2 - b.h; }

      return b;
    },
    refresh: function(sel){
      this.elw = sel.core.container.width();
      this.elh = sel.core.container.height();
      this.bound = {
        minx: 0 + sel.edge.w,
        miny: 0 + sel.edge.n,
        maxx: this.elw + sel.edge.e,
        maxy: this.elh + sel.edge.s
      };
    }
  });
  Jcrop.registerFilter('backoff',BackoffFilter);

  /**
   *  ConstrainFilter
   *  a filter to constrain crop selection to bounding element
   */
  var ConstrainFilter = function(){
    this.core = null;
  };
  $.extend(ConstrainFilter.prototype,{
    tag: 'constrain',
    priority: 5,
    filter: function(b,ord){
      if (ord == 'move') {
        if (b.x < this.minx) { b.x = this.minx; b.x2 = b.w + b.x; }
        if (b.y < this.miny) { b.y = this.miny; b.y2 = b.h + b.y; }
        if (b.x2 > this.maxx) { b.x2 = this.maxx; b.x = b.x2 - b.w; }
        if (b.y2 > this.maxy) { b.y2 = this.maxy; b.y = b.y2 - b.h; }
      } else {
        if (b.x < this.minx) { b.x = this.minx; }
        if (b.y < this.miny) { b.y = this.miny; }
        if (b.x2 > this.maxx) { b.x2 = this.maxx; }
        if (b.y2 > this.maxy) { b.y2 = this.maxy; }
      }
      b.w = b.x2 - b.x;
      b.h = b.y2 - b.y;
      return b;
    },
    refresh: function(sel){
      this.elw = sel.core.container.width();
      this.elh = sel.core.container.height();
      this.minx = 0 + sel.edge.w;
      this.miny = 0 + sel.edge.n;
      this.maxx = this.elw + sel.edge.e;
      this.maxy = this.elh + sel.edge.s;
    }
  });
  Jcrop.registerFilter('constrain',ConstrainFilter);

  /**
   *  ExtentFilter
   *  a filter to implement minimum or maximum size
   */
  var ExtentFilter = function(){
    this.core = null;
  };
  $.extend(ExtentFilter.prototype,{
    tag: 'extent',
    priority: 12,
    offsetFromCorner: function(corner,box,b){
      var w = box[0], h = box[1];
      switch(corner){
        case 'bl': return [ b.x2 - w, b.y, w, h ];
        case 'tl': return [ b.x2 - w , b.y2 - h, w, h ];
        case 'br': return [ b.x, b.y, w, h ];
        case 'tr': return [ b.x, b.y2 - h, w, h ];
      }
    },
    getQuadrant: function(s){
      var relx = s.opposite[0]-s.offsetx
      var rely = s.opposite[1]-s.offsety;

      if ((relx < 0) && (rely < 0)) return 'br';
        else if ((relx >= 0) && (rely >= 0)) return
'tl';
        else if ((relx < 0) && (rely >= 0)) return
'tr';
        return 'bl';
    },
    filter: function(b,ord,sel){

      if (ord == 'move') return b;

      var w = b.w, h = b.h, st = sel.state, r = this.limits;
      var quad = st? this.getQuadrant(st): 'br';

      if (r.minw && (w < r.minw)) w = r.minw;
      if (r.minh && (h < r.minh)) h = r.minh;
      if (r.maxw && (w > r.maxw)) w = r.maxw;
      if (r.maxh && (h > r.maxh)) h = r.maxh;

      if ((w == b.w) && (h == b.h)) return b;

      return Jcrop.wrapFromXywh(this.offsetFromCorner(quad,[w,h],b));
    },
    refresh: function(sel){
      this.elw = sel.core.container.width();
      this.elh = sel.core.container.height();

      this.limits = {
        minw: sel.minSize[0],
        minh: sel.minSize[1],
        maxw: sel.maxSize[0],
        maxh: sel.maxSize[1]
      };
    }
  });
  Jcrop.registerFilter('extent',ExtentFilter);


  /**
   *  GridFilter
   *  a rudimentary grid effect
   */
  var GridFilter = function(){
    this.stepx = 1;
    this.stepy = 1;
    this.core = null;
  };
  $.extend(GridFilter.prototype,{
    tag: 'grid',
    priority: 19,
    filter: function(b){
      
      var n = {
        x: Math.round(b.x / this.stepx) * this.stepx,
        y: Math.round(b.y / this.stepy) * this.stepy,
        x2: Math.round(b.x2 / this.stepx) * this.stepx,
        y2: Math.round(b.y2 / this.stepy) * this.stepy
      };
      
      n.w = n.x2 - n.x;
      n.h = n.y2 - n.y;

      return n;
    }
  });
  Jcrop.registerFilter('grid',GridFilter);


  /**
   *  RatioFilter
   *  implements aspectRatio locking
   */
  var RatioFilter = function(){
    this.ratio = 0;
    this.core = null;
  };
  $.extend(RatioFilter.prototype,{
    tag: 'ratio',
    priority: 15,
    offsetFromCorner: function(corner,box,b){
      var w = box[0], h = box[1];
      switch(corner){
        case 'bl': return [ b.x2 - w, b.y, w, h ];
        case 'tl': return [ b.x2 - w , b.y2 - h, w, h ];
        case 'br': return [ b.x, b.y, w, h ];
        case 'tr': return [ b.x, b.y2 - h, w, h ];
      }
    },
    getBoundRatio: function(b,quad){
      var box = Jcrop.getLargestBox(this.ratio,b.w,b.h);
      return Jcrop.wrapFromXywh(this.offsetFromCorner(quad,box,b));
    },
    getQuadrant: function(s){
      var relx = s.opposite[0]-s.offsetx
      var rely = s.opposite[1]-s.offsety;

      if ((relx < 0) && (rely < 0)) return 'br';
        else if ((relx >= 0) && (rely >= 0)) return
'tl';
        else if ((relx < 0) && (rely >= 0)) return
'tr';
        return 'bl';
    },
    filter: function(b,ord,sel){

      if (!this.ratio) return b;

      var rt = b.w / b.h;
      var st = sel.state;

      var quad = st? this.getQuadrant(st): 'br';
      ord = ord || 'se';

      if (ord == 'move') return b;

      switch(ord) {
        case 'n':
          b.x2 = this.elw;
          b.w = b.x2 - b.x;
          quad = 'tr';
          break;
        case 's':
          b.x2 = this.elw;
          b.w = b.x2 - b.x;
          quad = 'br';
          break;
        case 'e':
          b.y2 = this.elh;
          b.h = b.y2 - b.y;
          quad = 'br';
          break;
        case 'w':
          b.y2 = this.elh;
          b.h = b.y2 - b.y;
          quad = 'bl';
          break;
      }

      return this.getBoundRatio(b,quad);
    },
    refresh: function(sel){
      this.ratio = sel.aspectRatio;
      this.elw = sel.core.container.width();
      this.elh = sel.core.container.height();
    }
  });
  Jcrop.registerFilter('ratio',RatioFilter);


  /**
   *  RoundFilter
   *  rounds coordinate values to integers
   */
  var RoundFilter = function(){
    this.core = null;
  };
  $.extend(RoundFilter.prototype,{
    tag: 'round',
    priority: 90,
    filter: function(b){
      
      var n = {
        x: Math.round(b.x),
        y: Math.round(b.y),
        x2: Math.round(b.x2),
        y2: Math.round(b.y2)
      };
      
      n.w = n.x2 - n.x;
      n.h = n.y2 - n.y;

      return n;
    }
  });
  Jcrop.registerFilter('round',RoundFilter);


  /**
   *  ShadeFilter
   *  A filter that implements div-based shading on any element
   *
   *  The shading you see is actually four semi-opaque divs
   *  positioned inside the container, around the selection
   */
  var ShadeFilter = function(opacity,color){
    this.color = color || 'black';
    this.opacity = opacity || 0.5;
    this.core = null;
    this.shades = {};
  };
  $.extend(ShadeFilter.prototype,{
    tag: 'shader',
    fade: true,
    fadeEasing: 'swing',
    fadeSpeed: 320,
    priority: 95,
    init: function(){
      var t = this;

      if (!t.attached) {
        t.visible = false;

        t.container = $('<div
/>').addClass(t.core.opt.css_shades)
          .prependTo(this.core.container).hide();

        t.elh = this.core.container.height();
        t.elw = this.core.container.width();

        t.shades = {
          top: t.createShade(),
          right: t.createShade(),
          left: t.createShade(),
          bottom: t.createShade()
        };

        t.attached = true;
      }
    },
    destroy: function(){
      this.container.remove();
    },
    setColor: function(color,instant){
      var t = this;

      if (color == t.color) return t;

      this.color = color;
      var colorfade = Jcrop.supportsColorFade();
      $.each(t.shades,function(u,i){
        if (!t.fade || instant || !colorfade)
i.css('backgroundColor',color);
          else
i.animate({backgroundColor:color},{queue:false,duration:t.fadeSpeed,easing:t.fadeEasing});
      });
      return t;
    },
    setOpacity: function(opacity,instant){
      var t = this;

      if (opacity == t.opacity) return t;

      t.opacity = opacity;
      $.each(t.shades,function(u,i){
        if (!t.fade || instant) i.css({opacity:opacity});
          else
i.animate({opacity:opacity},{queue:false,duration:t.fadeSpeed,easing:t.fadeEasing});
      });
      return t;
    },
    createShade: function(){
      return $('<div />').css({
        position: 'absolute',
        backgroundColor: this.color,
        opacity: this.opacity
      }).appendTo(this.container);
    },
    refresh: function(sel){
      var m = this.core, s = this.shades;

      this.setColor(sel.bgColor?sel.bgColor:this.core.opt.bgColor);
      this.setOpacity(sel.bgOpacity?sel.bgOpacity:this.core.opt.bgOpacity);
        
      this.elh = m.container.height();
      this.elw = m.container.width();
      s.right.css('height',this.elh+'px');
      s.left.css('height',this.elh+'px');
    },
    filter: function(b,ord,sel){

      if (!sel.active) return b;

      var t = this,
        s = t.shades;
      
      s.top.css({
        left: Math.round(b.x)+'px',
        width: Math.round(b.w)+'px',
        height: Math.round(b.y)+'px'
      });
      s.bottom.css({
        top: Math.round(b.y2)+'px',
        left: Math.round(b.x)+'px',
        width: Math.round(b.w)+'px',
        height: (t.elh-Math.round(b.y2))+'px'
      });
      s.right.css({
        left: Math.round(b.x2)+'px',
        width: (t.elw-Math.round(b.x2))+'px'
      });
      s.left.css({
        width: Math.round(b.x)+'px'
      });

      if (!t.visible) {
        t.container.show();
        t.visible = true;
      }

      return b;
    }
  });
  Jcrop.registerFilter('shader',ShadeFilter);
  

  /**
   *  CanvasAnimator
   *  manages smooth cropping animation
   *
   *  This object is called internally to manage animation.
   *  An in-memory div is animated and a progress callback
   *  is used to update the selection coordinates of the
   *  visible selection in realtime.
   */
  var CanvasAnimator = function(stage){
    this.stage = stage;
    this.core = stage.core;
    this.cloneStagePosition();
  };

  CanvasAnimator.prototype = {

    cloneStagePosition: function(){
      var s = this.stage;
      this.angle = s.angle;
      this.scale = s.scale;
      this.offset = s.offset;
    },

    getElement: function(){
      var s = this.stage;

      return $('<div />')
        .css({
          position: 'absolute',
          top: s.offset[0]+'px',
          left: s.offset[1]+'px',
          width: s.angle+'px',
          height: s.scale+'px'
        });
    },

    animate: function(cb){
      var t = this;

      this.scale = this.stage.boundScale(this.scale);
      t.stage.triggerEvent('croprotstart');

      t.getElement().animate({
        top: t.offset[0]+'px',
        left: t.offset[1]+'px',
        width: t.angle+'px',
        height: t.scale+'px'
      },{
        easing: t.core.opt.animEasing,
        duration: t.core.opt.animDuration,
        complete: function(){
          t.stage.triggerEvent('croprotend');
          (typeof cb == 'function') && cb.call(this);
        },
        progress: function(anim){
          var props = {}, i, tw = anim.tweens;

          for(i=0;i<tw.length;i++){
            props[tw[i].prop] = tw[i].now; }

          t.stage.setAngle(props.width)
            .setScale(props.height)
            .setOffset(props.top,props.left)
            .redraw();
        }
      });
    }

  };
  Jcrop.stage.Canvas.prototype.getAnimator = function(){
    return new CanvasAnimator(this);
  };
  Jcrop.registerComponent('CanvasAnimator',CanvasAnimator);


  /**
   *  CropAnimator
   *  manages smooth cropping animation
   *
   *  This object is called internally to manage animation.
   *  An in-memory div is animated and a progress callback
   *  is used to update the selection coordinates of the
   *  visible selection in realtime.
   */
  // var CropAnimator = function(selection){{{
  var CropAnimator = function(selection){
    this.selection = selection;
    this.core = selection.core;
  };
  // }}}

  CropAnimator.prototype = {

    getElement: function(){
      var b = this.selection.get();

      return $('<div />')
        .css({
          position: 'absolute',
          top: b.y+'px',
          left: b.x+'px',
          width: b.w+'px',
          height: b.h+'px'
        });
    },

    animate: function(x,y,w,h,cb){
      var t = this;

      t.selection.allowResize(false);

      t.getElement().animate({
        top: y+'px',
        left: x+'px',
        width: w+'px',
        height: h+'px'
      },{
        easing: t.core.opt.animEasing,
        duration: t.core.opt.animDuration,
        complete: function(){
          t.selection.allowResize(true);
          cb && cb.call(this);
        },
        progress: function(anim){
          var props = {}, i, tw = anim.tweens;

          for(i=0;i<tw.length;i++){
            props[tw[i].prop] = tw[i].now; }

          var b = {
            x: parseInt(props.left),
            y: parseInt(props.top),
            w: parseInt(props.width),
            h: parseInt(props.height)
          };

          b.x2 = b.x + b.w;
          b.y2 = b.y + b.h;

          t.selection.updateRaw(b,'se');
        }
      });
    }

  };
  Jcrop.registerComponent('Animator',CropAnimator);


  /**
   *  DragState
   *  an object that handles dragging events
   *
   *  This object is used by the built-in selection object to
   *  track a dragging operation on a selection
   */
  // var DragState = function(e,selection,ord){{{
  var DragState = function(e,selection,ord){
    var t = this;

    t.x = e.pageX;
    t.y = e.pageY;

    t.selection = selection;
    t.eventTarget = selection.core.opt.dragEventTarget;
    t.orig = selection.get();

    selection.callFilterFunction('refresh');

    var p = selection.core.container.position();
    t.elx = p.left;
    t.ely = p.top;

    t.offsetx = 0;
    t.offsety = 0;
    t.ord = ord;
    t.opposite = t.getOppositeCornerOffset();

    t.initEvents(e);

  };
  // }}}

  DragState.prototype = {
    // getOppositeCornerOffset: function(){{{
    // Calculate relative offset of locked corner
    getOppositeCornerOffset: function(){

      var o = this.orig;
      var relx = this.x - this.elx - o.x;
      var rely = this.y - this.ely - o.y;

      switch(this.ord){
        case 'nw':
        case 'w':
          return [ o.w - relx, o.h - rely ];
          return [ o.x + o.w, o.y + o.h ];

        case 'sw':
          return [ o.w - relx, -rely ];
          return [ o.x + o.w, o.y ];

        case 'se':
        case 's':
        case 'e':
          return [ -relx, -rely ];
          return [ o.x, o.y ];

        case 'ne':
        case 'n':
          return [ -relx, o.h - rely ];
          return [ o.w, o.y + o.h ];
      }

      return [ null, null ];
    },
    // }}}
    // initEvents: function(e){{{
    initEvents: function(e){
      $(this.eventTarget)
        .on('mousemove.jcrop',this.createDragHandler())
        .on('mouseup.jcrop',this.createStopHandler());
    },
    // }}}
    // dragEvent: function(e){{{
    dragEvent: function(e){
      this.offsetx = e.pageX - this.x;
      this.offsety = e.pageY - this.y;
      this.selection.updateRaw(this.getBox(),this.ord);
    },
    // }}}
    // endDragEvent: function(e){{{
    endDragEvent: function(e){
      var sel = this.selection;
      sel.core.container.removeClass('jcrop-dragging');
     
sel.element.trigger('cropend',[sel,sel.core.unscale(sel.get())]);
      sel.focus();
    },
    // }}}
    // createStopHandler: function(){{{
    createStopHandler: function(){
      var t = this;
      return function(e){
        $(t.eventTarget).off('.jcrop');
        t.endDragEvent(e);
        return false;
      };
    },
    // }}}
    // createDragHandler: function(){{{
    createDragHandler: function(){
      var t = this;
      return function(e){
        t.dragEvent(e);
        return false;
      };
    },
    // }}}
    //update: function(x,y){{{
    update: function(x,y){
      var t = this;
      t.offsetx = x - t.x;
      t.offsety = y - t.y;
    },
    //}}}
    //resultWrap: function(d){{{
    resultWrap: function(d){
      var b = {
          x: Math.min(d[0],d[2]),
          y: Math.min(d[1],d[3]),
          x2: Math.max(d[0],d[2]),
          y2: Math.max(d[1],d[3])
        };

      b.w = b.x2 - b.x;
      b.h = b.y2 - b.y;

      return b;
    },
    //}}}
    //getBox: function(){{{
    getBox: function(){
      var t = this;
      var o = t.orig;
      var _c = { x2: o.x + o.w, y2: o.y + o.h };
      switch(t.ord){
        case 'n': return t.resultWrap([ o.x, t.offsety + o.y,
_c.x2, _c.y2 ]);
        case 's': return t.resultWrap([ o.x, o.y, _c.x2,
t.offsety + _c.y2 ]);
        case 'e': return t.resultWrap([ o.x, o.y, t.offsetx +
_c.x2, _c.y2 ]);
        case 'w': return t.resultWrap([ o.x + t.offsetx, o.y,
_c.x2, _c.y2 ]);
        case 'sw': return t.resultWrap([ t.offsetx + o.x, o.y,
_c.x2, t.offsety + _c.y2 ]);
        case 'se': return t.resultWrap([ o.x, o.y, t.offsetx +
_c.x2, t.offsety + _c.y2 ]);
        case 'ne': return t.resultWrap([ o.x, t.offsety + o.y,
t.offsetx + _c.x2, _c.y2 ]);
        case 'nw': return t.resultWrap([ t.offsetx + o.x,
t.offsety + o.y, _c.x2, _c.y2 ]);
        case 'move':
          _c.nx = o.x + t.offsetx;
          _c.ny = o.y + t.offsety;
          return t.resultWrap([ _c.nx, _c.ny, _c.nx + o.w, _c.ny + o.h ]);
      }
    }
    //}}}
  };
  Jcrop.registerComponent('DragState',DragState);


  /**
   *  EventManager
   *  provides internal event support
   */
  var EventManager = function(core){
    this.core = core;
  };
  EventManager.prototype = {
      on: function(n,cb){ $(this).on(n,cb); },
      off: function(n){ $(this).off(n); },
      trigger: function(n){ $(this).trigger(n); }
  };
  Jcrop.registerComponent('EventManager',EventManager);


  /**
   * Image Loader
   * Reliably pre-loads images
   */
  // var ImageLoader = function(src,element,cb){{{
  var ImageLoader = function(src,element,cb){
    this.src = src;
    if (!element) element = new Image;
    this.element = element;
    this.callback = cb;
    this.load();
  };
  // }}}

  $.extend(ImageLoader,{
    // attach: function(el,cb){{{
    attach: function(el,cb){
      return new ImageLoader(el.src,el,cb);
    },
    // }}}
    // prototype: {{{
    prototype: {
      getDimensions: function(){
        var el = this.element;

        if (el.naturalWidth)
          return [ el.naturalWidth, el. naturalHeight ];

        if (el.width)
          return [ el.width, el.height ];

        return null;
      },
      fireCallback: function(){
        this.element.onload = null;
        if (typeof this.callback == 'function')
          this.callback.apply(this,this.getDimensions());
      },
      isLoaded: function(){
        return this.element.complete;
      },
      load: function(){
        var t = this;
        var el = t.element;

        el.src = t.src;

        if (t.isLoaded()) t.fireCallback();
          else t.element.onload = function(e){
            t.fireCallback();
          };
      }
    }
    // }}}
  });
  Jcrop.registerComponent('ImageLoader',ImageLoader);


  /**
   * JcropTouch
   * Detects and enables mobile touch support
   */
  // var JcropTouch = function(core){{{
  var JcropTouch = function(core){
    this.core = core;
    this.init();
  };
  // }}}

  $.extend(JcropTouch,{
    // support: function(){{{
    support: function(){
      if(('ontouchstart' in window) || window.DocumentTouch
&& document instanceof DocumentTouch)
        return true;
    },
    // }}}
    prototype: {
      // init: function(){{{
      init: function(){
        var t = this,
          p = $.Jcrop.component.DragState.prototype;

        // A bit of an ugly hack to make sure we modify prototype
        // only once, store a key on the prototype
        if (!p.touch) {
          t.initEvents();
          t.shimDragState();
          t.shimStageDrag();
          p.touch = true;
        }
      },
      // }}}
      // shimDragState: function(){{{
      shimDragState: function(){
        var t = this;
        $.Jcrop.component.DragState.prototype.initEvents = function(e){
          
          // Attach subsequent drag event handlers based on initial
          // event type - avoids collecting "pseudo-mouse" events
          // generated by some mobile browsers in some circumstances
          if (e.type.substr(0,5) == 'touch') {

            $(this.eventTarget)
             
.on('touchmove.jcrop.jcrop-touch',t.dragWrap(this.createDragHandler()))
             
.on('touchend.jcrop.jcrop-touch',this.createStopHandler());

          }
          
          // For other events, use the mouse handlers that
          // the default DragState.initEvents() method sets...
          else {

            $(this.eventTarget)
              .on('mousemove.jcrop',this.createDragHandler())
              .on('mouseup.jcrop',this.createStopHandler());

          }

        };
      },
      // }}}
      // shimStageDrag: function(){{{
      shimStageDrag: function(){
        this.core.container
          .addClass('jcrop-touch')
         
.on('touchstart.jcrop.jcrop-stage',this.dragWrap(this.core.ui.manager.startDragHandler()));
      },
      // }}}
      // dragWrap: function(cb){{{
      dragWrap: function(cb){
        return function(e){
          e.preventDefault();
          e.stopPropagation();
          if (e.type.substr(0,5) == 'touch') {
            e.pageX = e.originalEvent.changedTouches[0].pageX;
            e.pageY = e.originalEvent.changedTouches[0].pageY;
            return cb(e);
          }
          return false;
        };
      },
      // }}}
      // initEvents: function(){{{
      initEvents: function(){
        var t = this, c = t.core;

        c.container.on(
          'touchstart.jcrop.jcrop-touch',
          '.'+c.opt.css_drag,
          t.dragWrap(c.startDrag())
        );
      }
      // }}}
    }
  });
  Jcrop.registerComponent('Touch',JcropTouch);


  /**
   *  KeyWatcher
   *  provides keyboard support
   */
  // var KeyWatcher = function(core){{{
  var KeyWatcher = function(core){
    this.core = core;
    this.init();
  };
  // }}}
  $.extend(KeyWatcher,{
    // defaults: {{{
    defaults: {
      eventName: 'keydown.jcrop',
      passthru: [ 9 ],
      debug: false
    },
    // }}}
    prototype: {
      // init: function(){{{
      init: function(){
        $.extend(this,KeyWatcher.defaults);
        this.enable();
      },
      // }}}
      // disable: function(){{{
      disable: function(){
        this.core.container.off(this.eventName);
      },
      // }}}
      // enable: function(){{{
      enable: function(){
        var t = this, m = t.core;
        m.container.on(t.eventName,function(e){
          var nudge = e.shiftKey? 16: 2;

          if ($.inArray(e.keyCode,t.passthru) >= 0)
            return true;

          switch(e.keyCode){
            case 37: m.nudge(-nudge,0); break;
            case 38: m.nudge(0,-nudge); break;
            case 39: m.nudge(nudge,0); break;
            case 40: m.nudge(0,nudge); break;

            case 46:
            case 8:
              m.requestDelete();
              return false;
              break;

            default:
              if (t.debug) console.log('keycode: ' + e.keyCode);
              break;
          }

          if (!e.metaKey && !e.ctrlKey)
            e.preventDefault();
        });
      }
      // }}}
    }
  });
  Jcrop.registerComponent('Keyboard',KeyWatcher);


  /**
   * Selection
   * Built-in selection object
   */
  var Selection = function(){};

  $.extend(Selection,{
    // defaults: {{{
    defaults: {
      minSize: [ 8, 8 ],
      maxSize: [ 0, 0 ],
      aspectRatio: 0,
      edge: { n: 0, s: 0, e: 0, w: 0 },
      bgColor: null,
      bgOpacity: null,
      last: null,

      state: null,
      active: true,
      linked: true,
      canDelete: true,
      canDrag: true,
      canResize: true,
      canSelect: true
    },
    // }}}
    prototype: {
      // init: function(core){{{
      init: function(core){
        this.core = core;
        this.startup();
        this.linked = this.core.opt.linked;
        this.attach();
        this.setOptions(this.core.opt);
        core.container.trigger('cropcreate',[this]);
      },
      // }}}
      // attach: function(){{{
      attach: function(){
        // For extending init() sequence
      },
      // }}}
      // startup: function(){{{
      startup: function(){
        var t = this, o = t.core.opt;
        $.extend(t,Selection.defaults);
        t.filter = t.core.getDefaultFilters();

        t.element = $('<div
/>').addClass(o.css_selection).data({ selection: t });
        t.frame = $('<button
/>').addClass(o.css_button).data('ord','move').attr('type','button');
        t.element.append(t.frame).appendTo(t.core.container);

        // IE background/draggable hack
        if (t.core.opt.is_msie) t.frame.css({
          opacity: 0,
          backgroundColor: 'white'
        });

        t.insertElements();

        // Bind focus and blur events for this selection
        t.frame.on('focus.jcrop',function(e){
          t.core.setSelection(t);
          t.element.trigger('cropfocus',t);
          t.element.addClass('jcrop-focus');
        }).on('blur.jcrop',function(e){
          t.element.removeClass('jcrop-focus');
          t.element.trigger('cropblur',t);
        });
      },
      // }}}
      // propagate: [{{{
      propagate: [
        'canDelete', 'canDrag', 'canResize',
'canSelect',
        'minSize', 'maxSize', 'aspectRatio',
'edge'
      ],
      // }}}
      // setOptions: function(opt){{{
      setOptions: function(opt){
        Jcrop.propagate(this.propagate,opt,this);
        this.refresh();
        return this;
      },
      // }}}
      // refresh: function(){{{
      refresh: function(){
        this.allowResize();
        this.allowDrag();
        this.allowSelect();
        this.callFilterFunction('refresh');
        this.updateRaw(this.get(),'se');
      },
      // }}}
      // callFilterFunction: function(f,args){{{
      callFilterFunction: function(f,args){
        for(var i=0;i<this.filter.length;i++)
          if (this.filter[i][f]) this.filter[i][f](this);
        return this;
      },
      // }}}
      //addFilter: function(filter){{{
      addFilter: function(filter){
        filter.core = this.core;
        if (!this.hasFilter(filter)) {
          this.filter.push(filter);
          this.sortFilters();
          if (filter.init) filter.init();
          this.refresh();
        }
      },
      //}}}
      // hasFilter: function(filter){{{
      hasFilter: function(filter){
        var i, f = this.filter, n = [];
        for(i=0;i<f.length;i++) if (f[i] === filter) return true;
      },
      // }}}
      // sortFilters: function(){{{
      sortFilters: function(){
        this.filter.sort(
          function(x,y){ return x.priority - y.priority; }
        );
      },
      // }}}
      //clearFilters: function(){{{
      clearFilters: function(){
        var i, f = this.filter;

        for(var i=0;i<f.length;i++)
          if (f[i].destroy) f[i].destroy();

        this.filter = [];
      },
      //}}}
      // removeFiltersByTag: function(tag){{{
      removeFilter: function(tag){
        var i, f = this.filter, n = [];

        for(var i=0;i<f.length;i++)
          if ((f[i].tag && (f[i].tag == tag)) || (tag === f[i])){
            if (f[i].destroy) f[i].destroy();
          }
          else n.push(f[i]);

        this.filter = n;
      },
      // }}}
      // runFilters: function(b,ord){{{
      runFilters: function(b,ord){
        for(var i=0;i<this.filter.length;i++)
          b = this.filter[i].filter(b,ord,this);
        return b;
      },
      // }}}
      //endDrag: function(){{{
      endDrag: function(){
        if (this.state) {
          $(document.body).off('.jcrop');
          this.focus();
          this.state = null;
        }
      },
      //}}}
      // startDrag: function(e,ord){{{
      startDrag: function(e,ord){
        var t = this;
        var m = t.core;

        ord = ord || $(e.target).data('ord');

        this.focus();

        if ((ord == 'move') &&
t.element.hasClass(t.core.opt.css_nodrag))
          return false;

        this.state = new Jcrop.component.DragState(e,this,ord);
        return false;
      },
      // }}}
      // allowSelect: function(v){{{
      allowSelect: function(v){
        if (v === undefined) v = this.canSelect;

        if (v && this.canSelect)
this.frame.attr('disabled',false);
          else this.frame.attr('disabled','disabled');

        return this;
      },
      // }}}
      // allowDrag: function(v){{{
      allowDrag: function(v){
        var t = this, o = t.core.opt;
        if (v == undefined) v = t.canDrag;

        if (v && t.canDrag) t.element.removeClass(o.css_nodrag);
          else t.element.addClass(o.css_nodrag);

        return this;
      },
      // }}}
      // allowResize: function(v){{{
      allowResize: function(v){
        var t = this, o = t.core.opt;
        if (v == undefined) v = t.canResize;

        if (v && t.canResize)
t.element.removeClass(o.css_noresize);
          else t.element.addClass(o.css_noresize);

        return this;
      },
      // }}}
      // remove: function(){{{
      remove: function(){
        this.element.trigger('cropremove',this);
        this.element.remove();
      },
      // }}}
      // toBack: function(){{{
      toBack: function(){
        this.active = false;
        this.element.removeClass('jcrop-current jcrop-focus');
      },
      // }}}
      // toFront: function(){{{
      toFront: function(){
        this.active = true;
        this.element.addClass('jcrop-current');
        this.callFilterFunction('refresh');
        this.refresh();
      },
      // }}}
      // redraw: function(b){{{
      redraw: function(b){
        this.moveTo(b.x,b.y);
        this.resize(b.w,b.h);
        this.last = b;
        return this;
      },
      // }}}
      // update: function(b,ord){{{
      update: function(b,ord){
        return this.updateRaw(this.core.scale(b),ord);
      },
      // }}}
      // update: function(b,ord){{{
      updateRaw: function(b,ord){
        b = this.runFilters(b,ord);
        this.redraw(b);
       
this.element.trigger('cropmove',[this,this.core.unscale(b)]);
        return this;
      },
      // }}}
      // animateTo: function(box,cb){{{
      animateTo: function(box,cb){
        var ca = new Jcrop.component.Animator(this),
            b = this.core.scale(Jcrop.wrapFromXywh(box));

        ca.animate(b.x,b.y,b.w,b.h,cb);
      },
      // }}}
      // center: function(instant){{{
      center: function(instant){
        var b = this.get(), m = this.core;
        var elw = m.container.width(), elh = m.container.height();
        var box = [ (elw-b.w)/2, (elh-b.h)/2, b.w, b.h ];
        return
this[instant?'setSelect':'animateTo'](box);
      },
      // }}}
      //createElement: function(type,ord){{{
      createElement: function(type,ord){
        return $('<div />').addClass(type+'
ord-'+ord).data('ord',ord);
      },
      //}}}
      //moveTo: function(x,y){{{
      moveTo: function(x,y){
        this.element.css({top: y+'px', left: x+'px'});
      },
      //}}}
      // blur: function(){{{
      blur: function(){
        this.element.blur();
        return this;
      },
      // }}}
      // focus: function(){{{
      focus: function(){
        this.core.setSelection(this);
        this.frame.focus();
        return this;
      },
      // }}}
      //resize: function(w,h){{{
      resize: function(w,h){
        this.element.css({width: w+'px', height:
h+'px'});
      },
      //}}}
      //get: function(){{{
      get: function(){
        var b = this.element,
          o = b.position(),
          w = b.width(),
          h = b.height(),
          rv = { x: o.left, y: o.top };

        rv.x2 = rv.x + w;
        rv.y2 = rv.y + h;
        rv.w = w;
        rv.h = h;

        return rv;
      },
      //}}}
      //insertElements: function(){{{
      insertElements: function(){
        var t = this, i,
          m = t.core,
          fr = t.element,
          o = t.core.opt,
          b = o.borders,
          h = o.handles,
          d = o.dragbars;

        for(i=0; i<d.length; i++)
          fr.append(t.createElement(o.css_dragbars,d[i]));

        for(i=0; i<h.length; i++)
          fr.append(t.createElement(o.css_handles,h[i]));

        for(i=0; i<b.length; i++)
          fr.append(t.createElement(o.css_borders,b[i]));
      }
      //}}}
    }
  });
  Jcrop.registerComponent('Selection',Selection);


  /**
   * StageDrag
   * Facilitates dragging
   */
  // var StageDrag = function(manager,opt){{{
  var StageDrag = function(manager,opt){
    $.extend(this,StageDrag.defaults,opt || {});
    this.manager = manager;
    this.core = manager.core;
  };
  // }}}
  // StageDrag.defaults = {{{
  StageDrag.defaults = {
    offset: [ -8, -8 ],
    active: true,
    minsize: [ 20, 20 ]
  };
  // }}}

  $.extend(StageDrag.prototype,{
    // start: function(e){{{
    start: function(e){
      var c = this.core;

      // Do nothing if allowSelect is off
      if (!c.opt.allowSelect) return;

      // Also do nothing if we can't draw any more selections
      if (c.opt.multi && c.opt.multiMax &&
(c.ui.multi.length >= c.opt.multiMax)) return false;

      // calculate a few variables for this drag operation
      var o = $(e.currentTarget).offset();
      var origx = e.pageX - o.left + this.offset[0];
      var origy = e.pageY - o.top + this.offset[1];
      var m = c.ui.multi;

      // Determine newly dragged crop behavior if multi disabled
      if (!c.opt.multi) {
        // For multiCleaanup true, remove all existing selections
        if (c.opt.multiCleanup){
          for(var i=0;i<m.length;i++) m[i].remove();
          c.ui.multi = [];
        }
        // If not, only remove the currently active selection
        else {
          c.removeSelection(c.ui.selection);
        }
      }

      c.container.addClass('jcrop-dragging');

      // Create the new selection
      var sel = c.newSelection()
        // and position it
        .updateRaw(Jcrop.wrapFromXywh([origx,origy,1,1]));

     
sel.element.trigger('cropstart',[sel,this.core.unscale(sel.get())]);
      
      return sel.startDrag(e,'se');
    },
    // }}}
    // end: function(x,y){{{
    end: function(x,y){
      this.drag(x,y);
      var b = this.sel.get();

      this.core.container.removeClass('jcrop-dragging');

      if ((b.w < this.minsize[0]) || (b.h < this.minsize[1]))
        this.core.requestDelete();

        else this.sel.focus();
    }
    // }}}
  });
  Jcrop.registerComponent('StageDrag',StageDrag);


  /**
   * StageManager
   * Provides basic stage-specific functionality
   */
  // var StageManager = function(core){{{
  var StageManager = function(core){
    this.core = core;
    this.ui = core.ui;
    this.init();
  };
  // }}}

  $.extend(StageManager.prototype,{
    // init: function(){{{
    init: function(){
      this.setupEvents();
      this.dragger = new StageDrag(this);
    },
    // }}}
    // tellConfigUpdate: function(options){{{
    tellConfigUpdate: function(options){
      for(var i=0,m=this.ui.multi,l=m.length;i<l;i++)
        if (m[i].setOptions && (m[i].linked ||
(this.core.opt.linkCurrent && m[i] == this.ui.selection)))
          m[i].setOptions(options);
    },
    // }}}
    // startDragHandler: function(){{{
    startDragHandler: function(){
      var t = this;
      return function(e){
        if (!e.button || t.core.opt.is_ie_lt9) return t.dragger.start(e);
      };
    },
    // }}}
    // removeEvents: function(){{{
    removeEvents: function(){
      this.core.event.off('.jcrop-stage');
      this.core.container.off('.jcrop-stage');
    },
    // }}}
    // shimLegacyHandlers: function(options){{{
    // This method uses the legacyHandlers configuration object to
    // gracefully wrap old-style Jcrop events with new ones
    shimLegacyHandlers: function(options){
      var _x = {}, core = this.core, tmp;

      $.each(core.opt.legacyHandlers,function(k,i){
        if (k in options) {
          tmp = options[k];
          core.container.off('.jcrop-'+k)
            .on(i+'.jcrop.jcrop-'+k,function(e,s,c){
              tmp.call(core,c);
            });
          delete options[k];
        }
      });
    },
    // }}}
    // setupEvents: function(){{{
    setupEvents: function(){
      var t = this, c = t.core;

      c.event.on('configupdate.jcrop-stage',function(e){
        t.shimLegacyHandlers(c.opt);
        t.tellConfigUpdate(c.opt)
        c.container.trigger('cropconfig',[c,c.opt]);
      });

      this.core.container
       
.on('mousedown.jcrop.jcrop-stage',this.startDragHandler());
    }
    // }}}
  });
  Jcrop.registerComponent('StageManager',StageManager);


  var Thumbnailer = function(){
  };

  $.extend(Thumbnailer,{
    defaults: {
      // Set to a specific Selection object
      // If this value is set, the preview will only track that Selection
      selection: null,

      fading: true,
      fadeDelay: 1000,
      fadeDuration: 1000,
      autoHide: false,
      width: 80,
      height: 80,
      _hiding: null
    },

    prototype: {
      recopyCanvas: function(){
        var s = this.core.ui.stage, cxt = s.context;
       
this.context.putImageData(cxt.getImageData(0,0,s.canvas.width,s.canvas.height),0,0);
      },
      init: function(core,options){
        var t = this;
        this.core = core;
        $.extend(this,Thumbnailer.defaults,options);
        t.initEvents();
        t.refresh();
        t.insertElements();
        if (t.selection) {
          t.renderSelection(t.selection);
          t.selectionTarget = t.selection.element[0];
        } else if (t.core.ui.selection) {
          t.renderSelection(t.core.ui.selection);
        }

        if (t.core.ui.stage.canvas) {
          t.context = t.preview[0].getContext('2d');
          t.core.container.on('cropredraw',function(e){
            t.recopyCanvas();
            t.refresh();
          });
        }
      },
      updateImage: function(imgel){
        this.preview.remove();
        this.preview = $($.Jcrop.imageClone(imgel));
        this.element.append(this.preview);
        this.refresh();
        return this;
      },
      insertElements: function(){
        this.preview = $($.Jcrop.imageClone(this.core.ui.stage.imgsrc));

        this.element = $('<div
/>').addClass('jcrop-thumb')
          .width(this.width).height(this.height)
          .append(this.preview)
          .appendTo(this.core.container);
      },
      resize: function(w,h){
        this.width = w;
        this.height = h;
        this.element.width(w).height(h);
        this.renderCoords(this.last);
      },
      refresh: function(){
        this.cw = (this.core.opt.xscale * this.core.container.width());
        this.ch = (this.core.opt.yscale * this.core.container.height());
        if (this.last) {
          this.renderCoords(this.last);
        }
      },
      renderCoords: function(c){
        var rx = this.width / c.w;
        var ry = this.height / c.h;

        this.preview.css({
          width: Math.round(rx * this.cw) + 'px',
          height: Math.round(ry * this.ch) + 'px',
          marginLeft: '-' + Math.round(rx * c.x) +
'px',
          marginTop: '-' + Math.round(ry * c.y) + 'px'
        });

        this.last = c;
        return this;
      },
      renderSelection: function(s){
        return this.renderCoords(s.core.unscale(s.get()));
      },
      selectionStart: function(s){
        this.renderSelection(s);
      },
      show: function(){
        if (this._hiding) clearTimeout(this._hiding);

        if (!this.fading) this.element.stop().css({ opacity: 1 });
        else this.element.stop().animate({ opacity: 1 },{ duration: 80,
queue: false });
      },
      hide: function(){
        var t = this;
        if (!t.fading) t.element.hide();
        else t._hiding = setTimeout(function(){
          t._hiding = null;
          t.element.stop().animate({ opacity: 0 },{ duration:
t.fadeDuration, queue: false });
        },t.fadeDelay);
      },
      initEvents: function(){
        var t = this;
        t.core.container.on('croprotstart croprotend cropimage
cropstart cropmove cropend',function(e,s,c){
          if (t.selectionTarget && (t.selectionTarget !==
e.target)) return false;

          switch(e.type){

            case 'cropimage':
              t.updateImage(c);
              break;

            case 'cropstart':
              t.selectionStart(s);
            case 'croprotstart':
              t.show();
              break;

            case 'cropend':
              t.renderCoords(c);
            case 'croprotend':
              if (t.autoHide) t.hide();
              break;

            case 'cropmove':
              t.renderCoords(c);
              break;
          }
        });
      }
    }
  });
  Jcrop.registerComponent('Thumbnailer',Thumbnailer);


  /**
   * DialDrag component
   * This is a little hacky, it was adapted from some previous/old code
   * Plan to update this API in the future
   */
  var DialDrag = function() { };

  DialDrag.prototype = {

    init: function(core,actuator,callback){
      var that = this;

      if (!actuator) actuator = core.container;
      this.$btn = $(actuator);
      this.$targ = $(actuator);
      this.core = core;

      this.$btn
        .addClass('dialdrag')
        .on('mousedown.dialdrag',this.mousedown())
        .data('dialdrag',this);

      if (!$.isFunction(callback)) callback = function(){ };
      this.callback = callback;
      this.ondone = callback;
    },

    remove: function(){
      this.$btn
        .removeClass('dialdrag')
        .off('.dialdrag')
        .data('dialdrag',null);
      return this;
    },

    setTarget: function(obj){
      this.$targ = $(obj);
      return this;
    },

    getOffset: function(){
      var targ = this.$targ, pos = targ.offset();
      return [
        pos.left + (targ.width()/2),
        pos.top + (targ.height()/2)
      ];
    },

    relMouse: function(e){
      var x = e.pageX - this.offset[0],
          y = e.pageY - this.offset[1],
          ang = Math.atan2(y,x) * (180 / Math.PI),
          vec = Math.sqrt(Math.pow(x,2)+Math.pow(y,2));
      return [ x, y, ang, vec ];
    },

    mousedown: function(){
      var that = this;

      function mouseUp(e){
        $(window).off('.dialdrag');
        that.ondone.call(that,that.relMouse(e));
        that.core.container.trigger('croprotend');
      }

      function mouseMove(e){
        that.callback.call(that,that.relMouse(e));
      }

      return function(e) {
        that.offset = that.getOffset();
        var rel = that.relMouse(e);
        that.angleOffset = -that.core.ui.stage.angle+rel[2];
        that.distOffset = rel[3];
        that.dragOffset = [rel[0],rel[1]];
        that.core.container.trigger('croprotstart');

        $(window)
          .on('mousemove.dialdrag',mouseMove)
          .on('mouseup.dialdrag',mouseUp);

        that.callback.call(that,that.relMouse(e));

        return false;
      };
    }
    
  };
  Jcrop.registerComponent('DialDrag',DialDrag);


    /////////////////////////////////
    // DEFAULT SETTINGS

    Jcrop.defaults = {

      // Selection Behavior
      edge: { n: 0, s: 0, e: 0, w: 0 },
      setSelect: null,
      linked: true,
      linkCurrent: true,
      canDelete: true,
      canSelect: true,
      canDrag: true,
      canResize: true,

      // Component constructors
      eventManagerComponent:  Jcrop.component.EventManager,
      keyboardComponent:      Jcrop.component.Keyboard,
      dragstateComponent:     Jcrop.component.DragState,
      stagemanagerComponent:  Jcrop.component.StageManager,
      animatorComponent:      Jcrop.component.Animator,
      selectionComponent:     Jcrop.component.Selection,

      // This is a function that is called, which returns a stage object
      stageConstructor:       Jcrop.stageConstructor,

      // Stage Behavior
      allowSelect: true,
      multi: false,
      multiMax: false,
      multiCleanup: true,
      animation: true,
      animEasing: 'swing',
      animDuration: 400,
      fading: true,
      fadeDuration: 300,
      fadeEasing: 'swing',
      bgColor: 'black',
      bgOpacity: .5,

      // Startup options
      applyFilters: [ 'constrain', 'extent',
'backoff', 'ratio', 'shader',
'round' ],
      borders:  [ 'e', 'w', 's',
'n' ],
      handles:  [ 'n', 's', 'e',
'w', 'sw', 'ne', 'nw',
'se' ],
      dragbars: [ 'n', 'e', 'w',
's' ],

      dragEventTarget: window,

      xscale: 1,
      yscale: 1,

      boxWidth: null,
      boxHeight: null,

      // CSS Classes
      // @todo: These need to be moved to top-level object keys
      // for better customization. Currently if you try to extend one
      // via an options object to Jcrop, it will wipe out all
      // the others you don't specify. Be careful for now!
      css_nodrag: 'jcrop-nodrag',
      css_drag: 'jcrop-drag',
      css_container: 'jcrop-active',
      css_shades: 'jcrop-shades',
      css_selection: 'jcrop-selection',
      css_borders: 'jcrop-border',
      css_handles: 'jcrop-handle jcrop-drag',
      css_button: 'jcrop-box jcrop-drag',
      css_noresize: 'jcrop-noresize',
      css_dragbars: 'jcrop-dragbar jcrop-drag',

      legacyHandlers: {
        onChange: 'cropmove',
        onSelect: 'cropend'
      }

    };


  // Jcrop API methods
  $.extend(Jcrop.prototype,{
    //init: function(){{{
    init: function(){
      this.event = new this.opt.eventManagerComponent(this);
      this.ui.keyboard = new this.opt.keyboardComponent(this);
      this.ui.manager = new this.opt.stagemanagerComponent(this);
      this.applyFilters();

      if ($.Jcrop.supportsTouch)
        new $.Jcrop.component.Touch(this);

      this.initEvents();
    },
    //}}}
    // applySizeConstraints: function(){{{
    applySizeConstraints: function(){
      var o = this.opt,
          img = this.opt.imgsrc;

      if (img){

        var iw = img.naturalWidth || img.width,
            ih = img.naturalHeight || img.height,
            bw = o.boxWidth || iw,
            bh = o.boxHeight || ih;

        if (img && ((iw > bw) || (ih > bh))){
          var bx = Jcrop.getLargestBox(iw/ih,bw,bh);
          $(img).width(bx[0]).height(bx[1]);
          this.resizeContainer(bx[0],bx[1]);
          this.opt.xscale = iw / bx[0];
          this.opt.yscale = ih / bx[1];
        }
          
      }

      if (this.opt.trueSize){
        var dw = this.opt.trueSize[0];
        var dh = this.opt.trueSize[1];
        var cs = this.getContainerSize();
        this.opt.xscale = dw / cs[0];
        this.opt.yscale = dh / cs[1];
      }
    },
    // }}}
    initComponent: function(name){
      if (Jcrop.component[name]) {
        var args = Array.prototype.slice.call(arguments);
        var obj = new Jcrop.component[name];
        args.shift();
        args.unshift(this);
        obj.init.apply(obj,args);
        return obj;
      }
    },
    // setOptions: function(opt){{{
    setOptions: function(opt,proptype){

      if (!$.isPlainObject(opt)) opt = {};

      $.extend(this.opt,opt);

      // Handle a setSelect value
      if (this.opt.setSelect) {

        // If there is no current selection
        // passing setSelect will create one
        if (!this.ui.multi.length)
          this.newSelection();

        // Use these values to update the current selection
        this.setSelect(this.opt.setSelect);

        // Set to null so it doesn't get called again
        this.opt.setSelect = null;
      }

      this.event.trigger('configupdate');
      return this;
    },
    // }}}
    //destroy: function(){{{
    destroy: function(){
      if (this.opt.imgsrc) {
        this.container.before(this.opt.imgsrc);
        this.container.remove();
        $(this.opt.imgsrc).removeData('Jcrop').show();
      } else {
        // @todo: more elegant destroy() process for non-image containers
        this.container.remove();
      }
    },
    // }}}
    // applyFilters: function(){{{
    applyFilters: function(){
      var obj;
      for(var i=0,f=this.opt.applyFilters,l=f.length; i<l; i++){
        if ($.Jcrop.filter[f[i]])
          obj = new $.Jcrop.filter[f[i]];
          obj.core = this;
          if (obj.init) obj.init();
          this.filter[f[i]] = obj;
      }
    },
    // }}}
    // getDefaultFilters: function(){{{
    getDefaultFilters: function(){
      var rv = [];

      for(var i=0,f=this.opt.applyFilters,l=f.length; i<l; i++)
        if(this.filter.hasOwnProperty(f[i]))
          rv.push(this.filter[f[i]]);

      rv.sort(function(x,y){ return x.priority - y.priority; });
      return rv;
    },
    // }}}
    // setSelection: function(sel){{{
    setSelection: function(sel){
      var m = this.ui.multi;
      var n = [];
      for(var i=0;i<m.length;i++) {
        if (m[i] !== sel) n.push(m[i]);
        m[i].toBack();
      }
      n.unshift(sel);
      this.ui.multi = n;
      this.ui.selection = sel;
      sel.toFront();
      return sel;
    },
    // }}}
    // getSelection: function(raw){{{
    getSelection: function(raw){
      var b = this.ui.selection.get();
      return b;
    },
    // }}}
    // newSelection: function(){{{
    newSelection: function(sel){
      if (!sel)
        sel = new this.opt.selectionComponent();

      sel.init(this);
      this.setSelection(sel);

      return sel;
    },
    // }}}
    // hasSelection: function(sel){{{
    hasSelection: function(sel){
      for(var i=0;i<this.ui.multi;i++)
        if (sel === this.ui.multi[i]) return true;
    },
    // }}}
    // removeSelection: function(sel){{{
    removeSelection: function(sel){
      var i, n = [], m = this.ui.multi;
      for(var i=0;i<m.length;i++){
        if (sel !== m[i])
          n.push(m[i]);
        else m[i].remove();
      }
      return this.ui.multi = n;
    },
    // }}}
    //addFilter: function(filter){{{
    addFilter: function(filter){
      for(var i=0,m=this.ui.multi,l=m.length; i<l; i++)
        m[i].addFilter(filter);

      return this;
    },
    //}}}
    // removeFiltersByTag: function(tag){{{
    removeFilter: function(filter){
      for(var i=0,m=this.ui.multi,l=m.length; i<l; i++)
        m[i].removeFilter(filter);

      return this;
    },
    // }}}
    // blur: function(){{{
    blur: function(){
      this.ui.selection.blur();
      return this;
    },
    // }}}
    // focus: function(){{{
    focus: function(){
      this.ui.selection.focus();
      return this;
    },
    // }}}
    //initEvents: function(){{{
    initEvents: function(){
      var t = this;
      t.container.on('selectstart',function(e){ return false; })
       
.on('mousedown','.'+t.opt.css_drag,t.startDrag());
    },
    //}}}
    // maxSelect: function(){{{
    maxSelect: function(){
      this.setSelect([0,0,this.elw,this.elh]);
    },
    // }}}
    // nudge: function(x,y){{{
    nudge: function(x,y){
      var s = this.ui.selection, b = s.get();

      b.x += x;
      b.x2 += x;
      b.y += y;
      b.y2 += y;

      if (b.x < 0) { b.x2 = b.w; b.x = 0; }
        else if (b.x2 > this.elw) { b.x2 = this.elw; b.x = b.x2 - b.w; }

      if (b.y < 0) { b.y2 = b.h; b.y = 0; }
        else if (b.y2 > this.elh) { b.y2 = this.elh; b.y = b.y2 - b.h; }
      
      s.element.trigger('cropstart',[s,this.unscale(b)]);
      s.updateRaw(b,'move');
      s.element.trigger('cropend',[s,this.unscale(b)]);
    },
    // }}}
    // refresh: function(){{{
    refresh: function(){
      for(var i=0,s=this.ui.multi,l=s.length;i<l;i++)
        s[i].refresh();
    },
    // }}}
    // blurAll: function(){{{
    blurAll: function(){
      var m = this.ui.multi;
      for(var i=0;i<m.length;i++) {
        if (m[i] !== sel) n.push(m[i]);
        m[i].toBack();
      }
    },
    // }}}
    // scale: function(b){{{
    scale: function(b){
      var xs = this.opt.xscale,
          ys = this.opt.yscale;

      return {
        x: b.x / xs,
        y: b.y / ys,
        x2: b.x2 / xs,
        y2: b.y2 / ys,
        w: b.w / xs,
        h: b.h / ys
      };
    },
    // }}}
    // unscale: function(b){{{
    unscale: function(b){
      var xs = this.opt.xscale,
          ys = this.opt.yscale;

      return {
        x: b.x * xs,
        y: b.y * ys,
        x2: b.x2 * xs,
        y2: b.y2 * ys,
        w: b.w * xs,
        h: b.h * ys
      };
    },
    // }}}
    // requestDelete: function(){{{
    requestDelete: function(){
      if ((this.ui.multi.length > 1) &&
(this.ui.selection.canDelete))
        return this.deleteSelection();
    },
    // }}}
    // deleteSelection: function(){{{
    deleteSelection: function(){
      if (this.ui.selection) {
        this.removeSelection(this.ui.selection);
        if (this.ui.multi.length) this.ui.multi[0].focus();
        this.ui.selection.refresh();
      }
    },
    // }}}
    // animateTo: function(box){{{
    animateTo: function(box){
      if (this.ui.selection)
        this.ui.selection.animateTo(box);
      return this;
    },
    // }}}
    // setselect: function(box){{{
    setSelect: function(box){
      if (this.ui.selection)
        this.ui.selection.update(Jcrop.wrapFromXywh(box));
      return this;
    },
    // }}}
    //startDrag: function(){{{
    startDrag: function(){
      var t = this;
      return function(e){
        var $targ = $(e.target);
        var selection =
$targ.closest('.'+t.opt.css_selection).data('selection');
        var ord = $targ.data('ord');
       
t.container.trigger('cropstart',[selection,t.unscale(selection.get())]);
        selection.startDrag(e,ord);
        return false;
      };
    },
    //}}}
    // getContainerSize: function(){{{
    getContainerSize: function(){
      return [ this.container.width(), this.container.height() ];
    },
    // }}}
    // resizeContainer: function(w,h){{{
    resizeContainer: function(w,h){
      this.container.width(w).height(h);
      this.refresh();
    },
    // }}}
    // setImage: function(src,cb){{{
    setImage: function(src,cb){
      var t = this, targ = t.opt.imgsrc;

      if (!targ) return false;

      new $.Jcrop.component.ImageLoader(src,null,function(w,h){
        t.resizeContainer(w,h);

        targ.src = src;
        $(targ).width(w).height(h);
        t.applySizeConstraints();
        t.refresh();
        t.container.trigger('cropimage',[t,targ]);

        if (typeof cb == 'function')
          cb.call(t,w,h);
      });
    },
    // }}}
    // update: function(b){{{
    update: function(b){
      if (this.ui.selection)
        this.ui.selection.update(b);
    }
    // }}}
  });

  // Jcrop jQuery plugin function
  $.fn.Jcrop = function(options,callback){
    options = options || {};

    var first = this.eq(0).data('Jcrop');
    var args = Array.prototype.slice.call(arguments);

    // Return API if requested
    if (options == 'api') { return first; }

    // Allow calling API methods (with arguments)
    else if (first && (typeof options == 'string')) {

      // Call method if it exists
      if (first[options]) {
        args.shift();
        first[options].apply(first,args);
        return first;
      }

      // Unknown input/method does not exist
      return false;
    }

    // Otherwise, loop over selected elements
    this.each(function(){
      var t = this, $t = $(this);
      var exists = $t.data('Jcrop');
      var obj;

      // If Jcrop already exists on this element only setOptions()
      if (exists)
        exists.setOptions(options);

      else {

        if (!options.stageConstructor)
          options.stageConstructor = $.Jcrop.stageConstructor;

        options.stageConstructor(this,options,function(stage,options){
          var selection = options.setSelect;
          if (selection) delete(options.setSelect);

          var obj = $.Jcrop.attach(stage.element,options);

          if (typeof stage.attach == 'function')
            stage.attach(obj);

          $t.data('Jcrop',obj);

          if (selection) {
            obj.newSelection();
            obj.setSelect(selection);
          }

          if (typeof callback == 'function')
            callback.call(obj);
        });
      }

      return this;
    });
  };

/* Modernizr 2.7.1 (Custom Build) | MIT & BSD
 * Build:
http://modernizr.com/download/#-csstransforms-canvas-canvastext-draganddrop-inlinesvg-svg-svgclippaths-touch-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-url_data_uri
 */
;

var Modernizr = (function( window, document, undefined ) {

    var version = '2.7.1',

    Modernizr = {},


    docElement = document.documentElement,

    mod = 'modernizr',
    modElem = document.createElement(mod),
    mStyle = modElem.style,

    inputElem  ,


    toString = {}.toString,

    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),



    omPrefixes = 'Webkit Moz O ms',

    cssomPrefixes = omPrefixes.split(' '),

    domPrefixes = omPrefixes.toLowerCase().split(' '),

    ns = {'svg': 'http://www.w3.org/2000/svg'},

    tests = {},
    inputs = {},
    attrs = {},

    classes = [],

    slice = classes.slice,

    featureName, 


    injectElementWithStyles = function( rule, callback, nodes, testnames )
{

      var style, ret, node, docOverflow,
          div = document.createElement('div'),
                body = document.body,
                fakeBody = body ||
document.createElement('body');

      if ( parseInt(nodes, 10) ) {
                      while ( nodes-- ) {
              node = document.createElement('div');
              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
              div.appendChild(node);
          }
      }

                style = ['&#173;','<style
id="s', mod, '">', rule,
'</style>'].join('');
      div.id = mod;
          (body ? div : fakeBody).innerHTML += style;
      fakeBody.appendChild(div);
      if ( !body ) {
                fakeBody.style.background = '';
                fakeBody.style.overflow = 'hidden';
          docOverflow = docElement.style.overflow;
          docElement.style.overflow = 'hidden';
          docElement.appendChild(fakeBody);
      }

      ret = callback(div, rule);
        if ( !body ) {
          fakeBody.parentNode.removeChild(fakeBody);
          docElement.style.overflow = docOverflow;
      } else {
          div.parentNode.removeChild(div);
      }

      return !!ret;

    },



    isEventSupported = (function() {

      var TAGNAMES = {
        'select': 'input', 'change':
'input',
        'submit': 'form', 'reset':
'form',
        'error': 'img', 'load':
'img', 'abort': 'img'
      };

      function isEventSupported( eventName, element ) {

        element = element || document.createElement(TAGNAMES[eventName] ||
'div');
        eventName = 'on' + eventName;

            var isSupported = eventName in element;

        if ( !isSupported ) {
                if ( !element.setAttribute ) {
            element = document.createElement('div');
          }
          if ( element.setAttribute && element.removeAttribute ) {
            element.setAttribute(eventName, '');
            isSupported = is(element[eventName], 'function');

                    if ( !is(element[eventName], 'undefined') ) {
              element[eventName] = undefined;
            }
            element.removeAttribute(eventName);
          }
        }

        element = null;
        return isSupported;
      }
      return isEventSupported;
    })(),


    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;

    if ( !is(_hasOwnProperty, 'undefined') &&
!is(_hasOwnProperty.call, 'undefined') ) {
      hasOwnProp = function (object, property) {
        return _hasOwnProperty.call(object, property);
      };
    }
    else {
      hasOwnProp = function (object, property) { 
        return ((property in object) &&
is(object.constructor.prototype[property], 'undefined'));
      };
    }


    if (!Function.prototype.bind) {
      Function.prototype.bind = function bind(that) {

        var target = this;

        if (typeof target != "function") {
            throw new TypeError();
        }

        var args = slice.call(arguments, 1),
            bound = function () {

            if (this instanceof bound) {

              var F = function(){};
              F.prototype = target.prototype;
              var self = new F();

              var result = target.apply(
                  self,
                  args.concat(slice.call(arguments))
              );
              if (Object(result) === result) {
                  return result;
              }
              return self;

            } else {

              return target.apply(
                  that,
                  args.concat(slice.call(arguments))
              );

            }

        };

        return bound;
      };
    }

    function setCss( str ) {
        mStyle.cssText = str;
    }

    function setCssAll( str1, str2 ) {
        return setCss(prefixes.join(str1 + ';') + ( str2 ||
'' ));
    }

    function is( obj, type ) {
        return typeof obj === type;
    }

    function contains( str, substr ) {
        return !!~('' + str).indexOf(substr);
    }

    function testProps( props, prefixed ) {
        for ( var i in props ) {
            var prop = props[i];
            if ( !contains(prop, "-") && mStyle[prop] !==
undefined ) {
                return prefixed == 'pfx' ? prop : true;
            }
        }
        return false;
    }

    function testDOMProps( props, obj, elem ) {
        for ( var i in props ) {
            var item = obj[props[i]];
            if ( item !== undefined) {

                            if (elem === false) return props[i];

                            if (is(item, 'function')){
                                return item.bind(elem || obj);
                }

                            return item;
            }
        }
        return false;
    }

    function testPropsAll( prop, prefixed, elem ) {

        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),
            props   = (prop + ' ' + cssomPrefixes.join(ucProp +
' ') + ucProp).split(' ');

            if(is(prefixed, "string") || is(prefixed,
"undefined")) {
          return testProps(props, prefixed);

            } else {
          props = (prop + ' ' + (domPrefixes).join(ucProp +
' ') + ucProp).split(' ');
          return testDOMProps(props, prefixed, elem);
        }
    }



    tests['canvas'] = function() {
        var elem = document.createElement('canvas');
        return !!(elem.getContext &&
elem.getContext('2d'));
    };

    tests['canvastext'] = function() {
        return !!(Modernizr['canvas'] &&
is(document.createElement('canvas').getContext('2d').fillText,
'function'));
    };
    tests['touch'] = function() {
        var bool;

        if(('ontouchstart' in window) || window.DocumentTouch
&& document instanceof DocumentTouch) {
          bool = true;
        } else {
          injectElementWithStyles(['@media
(',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''),
function( node ) {
            bool = node.offsetTop === 9;
          });
        }

        return bool;
    };

    tests['draganddrop'] = function() {
        var div = document.createElement('div');
        return ('draggable' in div) || ('ondragstart'
in div && 'ondrop' in div);
    };


    tests['csstransforms'] = function() {
        return !!testPropsAll('transform');
    };


    tests['svg'] = function() {
        return !!document.createElementNS &&
!!document.createElementNS(ns.svg, 'svg').createSVGRect;
    };

    tests['inlinesvg'] = function() {
      var div = document.createElement('div');
      div.innerHTML = '<svg/>';
      return (div.firstChild && div.firstChild.namespaceURI) ==
ns.svg;
    };



    tests['svgclippaths'] = function() {
        return !!document.createElementNS &&
/SVGClipPath/.test(toString.call(document.createElementNS(ns.svg,
'clipPath')));
    };

    for ( var feature in tests ) {
        if ( hasOwnProp(tests, feature) ) {
                                    featureName  = feature.toLowerCase();
            Modernizr[featureName] = tests[feature]();

            classes.push((Modernizr[featureName] ? '' :
'no-') + featureName);
        }
    }



     Modernizr.addTest = function ( feature, test ) {
       if ( typeof feature == 'object' ) {
         for ( var key in feature ) {
           if ( hasOwnProp( feature, key ) ) {
             Modernizr.addTest( key, feature[ key ] );
           }
         }
       } else {

         feature = feature.toLowerCase();

         if ( Modernizr[feature] !== undefined ) {
                                              return Modernizr;
         }

         test = typeof test == 'function' ? test() : test;

         if (typeof enableClasses !== "undefined" &&
enableClasses) {
           docElement.className += ' ' + (test ? '' :
'no-') + feature;
         }
         Modernizr[feature] = test;

       }

       return Modernizr; 
     };


    setCss('');
    modElem = inputElem = null;


    Modernizr._version      = version;

    Modernizr._prefixes     = prefixes;
    Modernizr._domPrefixes  = domPrefixes;
    Modernizr._cssomPrefixes  = cssomPrefixes;


    Modernizr.hasEvent      = isEventSupported;

    Modernizr.testProp      = function(prop){
        return testProps([prop]);
    };

    Modernizr.testAllProps  = testPropsAll;


    Modernizr.testStyles    = injectElementWithStyles;
    return Modernizr;

})(window, window.document);
// data uri test.
// https://github.com/Modernizr/Modernizr/issues/14

// This test is asynchronous. Watch out.


// in IE7 in HTTPS this can cause a Mixed Content security popup. 
//  github.com/Modernizr/Modernizr/issues/362
// To avoid that you can create a new iframe and inject this.. perhaps..


(function(){

  var datauri = new Image();


  datauri.onerror = function() {
      Modernizr.addTest('datauri', function () { return false;
});
  };  
  datauri.onload = function() {
      Modernizr.addTest('datauri', function () { return
(datauri.width == 1 && datauri.height == 1); });
  };

  datauri.src =
"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";

})();
;

  // Attach to jQuery object
  $.Jcrop = Jcrop;

  $.Jcrop.supportsCanvas = Modernizr.canvas;
  $.Jcrop.supportsCanvasText = Modernizr.canvastext;
  $.Jcrop.supportsDragAndDrop = Modernizr.draganddrop;
  $.Jcrop.supportsDataURI = Modernizr.datauri;
  $.Jcrop.supportsSVG = Modernizr.svg;
  $.Jcrop.supportsInlineSVG = Modernizr.inlinesvg;
  $.Jcrop.supportsSVGClipPaths = Modernizr.svgclippaths;
  $.Jcrop.supportsCSSTransforms = Modernizr.csstransforms;
  $.Jcrop.supportsTouch = Modernizr.touch;

})(jQuery);
PK\n�[�	���js/jquery.Jcrop.min.jsnu�[���/*!
Jcrop.min.js v2.0.4 - build: 20151117
 *  Copyright 2008-2015 Tapmodo Interactive LLC
 *  Free software under MIT License
 **/
!function(a){"use strict";var b=function(c,d){var
e=navigator.userAgent.toLowerCase();this.opt=a.extend({},b.defaults,d||{}),this.container=a(c),this.opt.is_msie=/msie/.test(e),this.opt.is_ie_lt9=/msie
[1-8]\./.test(e),this.container.addClass(this.opt.css_container),this.ui={},this.state=null,this.ui.multi=[],this.ui.selection=null,this.filter={},this.init(),this.setOptions(d),this.applySizeConstraints(),this.container.trigger("cropinit",this),this.opt.is_ie_lt9&&(this.opt.dragEventTarget=document.body)};a.extend(b,{component:{},filter:{},stage:{},registerComponent:function(a,c){b.component[a]=c},registerFilter:function(a,c){b.filter[a]=c},registerStageType:function(a,c){b.stage[a]=c},attach:function(b,c){var
d=new a.Jcrop(b,c);return d},imgCopy:function(a){var b=new Image;return
b.src=a.src,b},imageClone:function(c){return
a.Jcrop.supportsCanvas?b.canvasClone(c):b.imgCopy(c)},canvasClone:function(b){var
c=document.createElement("canvas"),d=c.getContext("2d");return
a(c).width(b.width).height(b.height),c.width=b.naturalWidth,c.height=b.naturalHeight,d.drawImage(b,0,0,b.naturalWidth,b.naturalHeight),c},propagate:function(a,b,c){for(var
d=0,e=a.length;e>d;d++)b.hasOwnProperty(a[d])&&(c[a[d]]=b[a[d]])},getLargestBox:function(a,b,c){return
b/c>a?[c*a,c]:[b,b/a]},stageConstructor:function(c,d,e){var
f=[];a.each(b.stage,function(a,b){f.push(b)}),f.sort(function(a,b){return
a.priority-b.priority});for(var
g=0,h=f.length;h>g;g++)if(f[g].isSupported(c,d)){f[g].create(c,d,function(a,b){"function"==typeof
e&&e(a,b)});break}},supportsColorFade:function(){return
a.fx.step.hasOwnProperty("backgroundColor")},wrapFromXywh:function(a){var
b={x:a[0],y:a[1],w:a[2],h:a[3]};return b.x2=b.x+b.w,b.y2=b.y+b.h,b}});var
c=function(){};a.extend(c,{isSupported:function(a,b){return!0},priority:100,create:function(a,b,d){var
e=new
c;e.element=a,d.call(this,e,b)},prototype:{attach:function(a){this.init(a),a.ui.stage=this},triggerEvent:function(b){return
a(this.element).trigger(b),this},getElement:function(){return
this.element}}}),b.registerStageType("Block",c);var
d=function(){};d.prototype=new
c,a.extend(d,{isSupported:function(a,b){return"IMG"==a.tagName?!0:void
0},priority:90,create:function(b,c,e){a.Jcrop.component.ImageLoader.attach(b,function(f,g){var
h=new d;h.element=a(b).wrap("<div
/>").parent(),h.element.width(f).height(g),h.imgsrc=b,"function"==typeof
e&&e.call(this,h,c)})}}),b.registerStageType("Image",d);var
e=function(){this.angle=0,this.scale=1,this.scaleMin=.2,this.scaleMax=1.25,this.offset=[0,0]};e.prototype=new
d,a.extend(e,{isSupported:function(b,c){return
a.Jcrop.supportsCanvas&&"IMG"==b.tagName?!0:void
0},priority:60,create:function(b,c,d){var
f=a(b),g=a.extend({},c);a.Jcrop.component.ImageLoader.attach(b,function(a,c){var
h=new
e;f.hide(),h.createCanvas(b,a,c),f.before(h.element),h.imgsrc=b,g.imgsrc=b,"function"==typeof
d&&(d(h,g),h.redraw())})}}),a.extend(e.prototype,{init:function(a){this.core=a},setOffset:function(a,b){return
this.offset=[a,b],this},setAngle:function(a){return
this.angle=a,this},setScale:function(a){return
this.scale=this.boundScale(a),this},boundScale:function(a){return
a<this.scaleMin?a=this.scaleMin:a>this.scaleMax&&(a=this.scaleMax),a},createCanvas:function(b,c,d){this.width=c,this.height=d,this.canvas=document.createElement("canvas"),this.canvas.width=c,this.canvas.height=d,this.$canvas=a(this.canvas).width("100%").height("100%"),this.context=this.canvas.getContext("2d"),this.fillstyle="rgb(0,0,0)",this.element=this.$canvas.wrap("<div
/>").parent().width(c).height(d)},triggerEvent:function(a){return
this.$canvas.trigger(a),this},clear:function(){return
this.context.fillStyle=this.fillstyle,this.context.fillRect(0,0,this.canvas.width,this.canvas.height),this},redraw:function(){return
this.context.save(),this.clear(),this.context.translate(parseInt(.5*this.width),parseInt(.5*this.height)),this.context.translate(this.offset[0]/this.core.opt.xscale,this.offset[1]/this.core.opt.yscale),this.context.rotate(this.angle*(Math.PI/180)),this.context.scale(this.scale,this.scale),this.context.translate(-parseInt(.5*this.width),-parseInt(.5*this.height)),this.context.drawImage(this.imgsrc,0,0,this.width,this.height),this.context.restore(),this.$canvas.trigger("cropredraw"),this},setFillStyle:function(a){return
this.fillstyle=a,this}}),b.registerStageType("Canvas",e);var
f=function(){this.minw=40,this.minh=40,this.maxw=0,this.maxh=0,this.core=null};a.extend(f.prototype,{tag:"backoff",priority:22,filter:function(a){var
b=this.bound;return
a.x<b.minx&&(a.x=b.minx,a.x2=a.w+a.x),a.y<b.miny&&(a.y=b.miny,a.y2=a.h+a.y),a.x2>b.maxx&&(a.x2=b.maxx,a.x=a.x2-a.w),a.y2>b.maxy&&(a.y2=b.maxy,a.y=a.y2-a.h),a},refresh:function(a){this.elw=a.core.container.width(),this.elh=a.core.container.height(),this.bound={minx:0+a.edge.w,miny:0+a.edge.n,maxx:this.elw+a.edge.e,maxy:this.elh+a.edge.s}}}),b.registerFilter("backoff",f);var
g=function(){this.core=null};a.extend(g.prototype,{tag:"constrain",priority:5,filter:function(a,b){return"move"==b?(a.x<this.minx&&(a.x=this.minx,a.x2=a.w+a.x),a.y<this.miny&&(a.y=this.miny,a.y2=a.h+a.y),a.x2>this.maxx&&(a.x2=this.maxx,a.x=a.x2-a.w),a.y2>this.maxy&&(a.y2=this.maxy,a.y=a.y2-a.h)):(a.x<this.minx&&(a.x=this.minx),a.y<this.miny&&(a.y=this.miny),a.x2>this.maxx&&(a.x2=this.maxx),a.y2>this.maxy&&(a.y2=this.maxy)),a.w=a.x2-a.x,a.h=a.y2-a.y,a},refresh:function(a){this.elw=a.core.container.width(),this.elh=a.core.container.height(),this.minx=0+a.edge.w,this.miny=0+a.edge.n,this.maxx=this.elw+a.edge.e,this.maxy=this.elh+a.edge.s}}),b.registerFilter("constrain",g);var
h=function(){this.core=null};a.extend(h.prototype,{tag:"extent",priority:12,offsetFromCorner:function(a,b,c){var
d=b[0],e=b[1];switch(a){case"bl":return[c.x2-d,c.y,d,e];case"tl":return[c.x2-d,c.y2-e,d,e];case"br":return[c.x,c.y,d,e];case"tr":return[c.x,c.y2-e,d,e]}},getQuadrant:function(a){var
b=a.opposite[0]-a.offsetx,c=a.opposite[1]-a.offsety;return
0>b&&0>c?"br":b>=0&&c>=0?"tl":0>b&&c>=0?"tr":"bl"},filter:function(a,c,d){if("move"==c)return
a;var
e=a.w,f=a.h,g=d.state,h=this.limits,i=g?this.getQuadrant(g):"br";return
h.minw&&e<h.minw&&(e=h.minw),h.minh&&f<h.minh&&(f=h.minh),h.maxw&&e>h.maxw&&(e=h.maxw),h.maxh&&f>h.maxh&&(f=h.maxh),e==a.w&&f==a.h?a:b.wrapFromXywh(this.offsetFromCorner(i,[e,f],a))},refresh:function(a){this.elw=a.core.container.width(),this.elh=a.core.container.height(),this.limits={minw:a.minSize[0],minh:a.minSize[1],maxw:a.maxSize[0],maxh:a.maxSize[1]}}}),b.registerFilter("extent",h);var
i=function(){this.stepx=1,this.stepy=1,this.core=null};a.extend(i.prototype,{tag:"grid",priority:19,filter:function(a){var
b={x:Math.round(a.x/this.stepx)*this.stepx,y:Math.round(a.y/this.stepy)*this.stepy,x2:Math.round(a.x2/this.stepx)*this.stepx,y2:Math.round(a.y2/this.stepy)*this.stepy};return
b.w=b.x2-b.x,b.h=b.y2-b.y,b}}),b.registerFilter("grid",i);var
j=function(){this.ratio=0,this.core=null};a.extend(j.prototype,{tag:"ratio",priority:15,offsetFromCorner:function(a,b,c){var
d=b[0],e=b[1];switch(a){case"bl":return[c.x2-d,c.y,d,e];case"tl":return[c.x2-d,c.y2-e,d,e];case"br":return[c.x,c.y,d,e];case"tr":return[c.x,c.y2-e,d,e]}},getBoundRatio:function(a,c){var
d=b.getLargestBox(this.ratio,a.w,a.h);return
b.wrapFromXywh(this.offsetFromCorner(c,d,a))},getQuadrant:function(a){var
b=a.opposite[0]-a.offsetx,c=a.opposite[1]-a.offsety;return
0>b&&0>c?"br":b>=0&&c>=0?"tl":0>b&&c>=0?"tr":"bl"},filter:function(a,b,c){if(!this.ratio)return
a;var
d=(a.w/a.h,c.state),e=d?this.getQuadrant(d):"br";if(b=b||"se","move"==b)return
a;switch(b){case"n":a.x2=this.elw,a.w=a.x2-a.x,e="tr";break;case"s":a.x2=this.elw,a.w=a.x2-a.x,e="br";break;case"e":a.y2=this.elh,a.h=a.y2-a.y,e="br";break;case"w":a.y2=this.elh,a.h=a.y2-a.y,e="bl"}return
this.getBoundRatio(a,e)},refresh:function(a){this.ratio=a.aspectRatio,this.elw=a.core.container.width(),this.elh=a.core.container.height()}}),b.registerFilter("ratio",j);var
k=function(){this.core=null};a.extend(k.prototype,{tag:"round",priority:90,filter:function(a){var
b={x:Math.round(a.x),y:Math.round(a.y),x2:Math.round(a.x2),y2:Math.round(a.y2)};return
b.w=b.x2-b.x,b.h=b.y2-b.y,b}}),b.registerFilter("round",k);var
l=function(a,b){this.color=b||"black",this.opacity=a||.5,this.core=null,this.shades={}};a.extend(l.prototype,{tag:"shader",fade:!0,fadeEasing:"swing",fadeSpeed:320,priority:95,init:function(){var
b=this;b.attached||(b.visible=!1,b.container=a("<div
/>").addClass(b.core.opt.css_shades).prependTo(this.core.container).hide(),b.elh=this.core.container.height(),b.elw=this.core.container.width(),b.shades={top:b.createShade(),right:b.createShade(),left:b.createShade(),bottom:b.createShade()},b.attached=!0)},destroy:function(){this.container.remove()},setColor:function(c,d){var
e=this;if(c==e.color)return e;this.color=c;var
f=b.supportsColorFade();return
a.each(e.shades,function(a,b){e.fade&&!d&&f?b.animate({backgroundColor:c},{queue:!1,duration:e.fadeSpeed,easing:e.fadeEasing}):b.css("backgroundColor",c)}),e},setOpacity:function(b,c){var
d=this;return
b==d.opacity?d:(d.opacity=b,a.each(d.shades,function(a,e){!d.fade||c?e.css({opacity:b}):e.animate({opacity:b},{queue:!1,duration:d.fadeSpeed,easing:d.fadeEasing})}),d)},createShade:function(){return
a("<div
/>").css({position:"absolute",backgroundColor:this.color,opacity:this.opacity}).appendTo(this.container)},refresh:function(a){var
b=this.core,c=this.shades;this.setColor(a.bgColor?a.bgColor:this.core.opt.bgColor),this.setOpacity(a.bgOpacity?a.bgOpacity:this.core.opt.bgOpacity),this.elh=b.container.height(),this.elw=b.container.width(),c.right.css("height",this.elh+"px"),c.left.css("height",this.elh+"px")},filter:function(a,b,c){if(!c.active)return
a;var d=this,e=d.shades;return
e.top.css({left:Math.round(a.x)+"px",width:Math.round(a.w)+"px",height:Math.round(a.y)+"px"}),e.bottom.css({top:Math.round(a.y2)+"px",left:Math.round(a.x)+"px",width:Math.round(a.w)+"px",height:d.elh-Math.round(a.y2)+"px"}),e.right.css({left:Math.round(a.x2)+"px",width:d.elw-Math.round(a.x2)+"px"}),e.left.css({width:Math.round(a.x)+"px"}),d.visible||(d.container.show(),d.visible=!0),a}}),b.registerFilter("shader",l);var
m=function(a){this.stage=a,this.core=a.core,this.cloneStagePosition()};m.prototype={cloneStagePosition:function(){var
a=this.stage;this.angle=a.angle,this.scale=a.scale,this.offset=a.offset},getElement:function(){var
b=this.stage;return a("<div
/>").css({position:"absolute",top:b.offset[0]+"px",left:b.offset[1]+"px",width:b.angle+"px",height:b.scale+"px"})},animate:function(a){var
b=this;this.scale=this.stage.boundScale(this.scale),b.stage.triggerEvent("croprotstart"),b.getElement().animate({top:b.offset[0]+"px",left:b.offset[1]+"px",width:b.angle+"px",height:b.scale+"px"},{easing:b.core.opt.animEasing,duration:b.core.opt.animDuration,complete:function(){b.stage.triggerEvent("croprotend"),"function"==typeof
a&&a.call(this)},progress:function(a){var
c,d={},e=a.tweens;for(c=0;c<e.length;c++)d[e[c].prop]=e[c].now;b.stage.setAngle(d.width).setScale(d.height).setOffset(d.top,d.left).redraw()}})}},b.stage.Canvas.prototype.getAnimator=function(){return
new m(this)},b.registerComponent("CanvasAnimator",m);var
o=function(a){this.selection=a,this.core=a.core};o.prototype={getElement:function(){var
b=this.selection.get();return a("<div
/>").css({position:"absolute",top:b.y+"px",left:b.x+"px",width:b.w+"px",height:b.h+"px"})},animate:function(a,b,c,d,e){var
f=this;f.selection.allowResize(!1),f.getElement().animate({top:b+"px",left:a+"px",width:c+"px",height:d+"px"},{easing:f.core.opt.animEasing,duration:f.core.opt.animDuration,complete:function(){f.selection.allowResize(!0),e&&e.call(this)},progress:function(a){var
b,c={},d=a.tweens;for(b=0;b<d.length;b++)c[d[b].prop]=d[b].now;var
e={x:parseInt(c.left),y:parseInt(c.top),w:parseInt(c.width),h:parseInt(c.height)};e.x2=e.x+e.w,e.y2=e.y+e.h,f.selection.updateRaw(e,"se")}})}},b.registerComponent("Animator",o);var
p=function(a,b,c){var
d=this;d.x=a.pageX,d.y=a.pageY,d.selection=b,d.eventTarget=b.core.opt.dragEventTarget,d.orig=b.get(),b.callFilterFunction("refresh");var
e=b.core.container.position();d.elx=e.left,d.ely=e.top,d.offsetx=0,d.offsety=0,d.ord=c,d.opposite=d.getOppositeCornerOffset(),d.initEvents(a)};p.prototype={getOppositeCornerOffset:function(){var
a=this.orig,b=this.x-this.elx-a.x,c=this.y-this.ely-a.y;switch(this.ord){case"nw":case"w":return[a.w-b,a.h-c];case"sw":return[a.w-b,-c];case"se":case"s":case"e":return[-b,-c];case"ne":case"n":return[-b,a.h-c]}return[null,null]},initEvents:function(b){a(this.eventTarget).on("mousemove.jcrop",this.createDragHandler()).on("mouseup.jcrop",this.createStopHandler())},dragEvent:function(a){this.offsetx=a.pageX-this.x,this.offsety=a.pageY-this.y,this.selection.updateRaw(this.getBox(),this.ord)},endDragEvent:function(a){var
b=this.selection;b.core.container.removeClass("jcrop-dragging"),b.element.trigger("cropend",[b,b.core.unscale(b.get())]),b.focus()},createStopHandler:function(){var
b=this;return function(c){return
a(b.eventTarget).off(".jcrop"),b.endDragEvent(c),!1}},createDragHandler:function(){var
a=this;return function(b){return
a.dragEvent(b),!1}},update:function(a,b){var
c=this;c.offsetx=a-c.x,c.offsety=b-c.y},resultWrap:function(a){var
b={x:Math.min(a[0],a[2]),y:Math.min(a[1],a[3]),x2:Math.max(a[0],a[2]),y2:Math.max(a[1],a[3])};return
b.w=b.x2-b.x,b.h=b.y2-b.y,b},getBox:function(){var
a=this,b=a.orig,c={x2:b.x+b.w,y2:b.y+b.h};switch(a.ord){case"n":return
a.resultWrap([b.x,a.offsety+b.y,c.x2,c.y2]);case"s":return
a.resultWrap([b.x,b.y,c.x2,a.offsety+c.y2]);case"e":return
a.resultWrap([b.x,b.y,a.offsetx+c.x2,c.y2]);case"w":return
a.resultWrap([b.x+a.offsetx,b.y,c.x2,c.y2]);case"sw":return
a.resultWrap([a.offsetx+b.x,b.y,c.x2,a.offsety+c.y2]);case"se":return
a.resultWrap([b.x,b.y,a.offsetx+c.x2,a.offsety+c.y2]);case"ne":return
a.resultWrap([b.x,a.offsety+b.y,a.offsetx+c.x2,c.y2]);case"nw":return
a.resultWrap([a.offsetx+b.x,a.offsety+b.y,c.x2,c.y2]);case"move":return
c.nx=b.x+a.offsetx,c.ny=b.y+a.offsety,a.resultWrap([c.nx,c.ny,c.nx+b.w,c.ny+b.h])}}},b.registerComponent("DragState",p);var
q=function(a){this.core=a};q.prototype={on:function(b,c){a(this).on(b,c)},off:function(b){a(this).off(b)},trigger:function(b){a(this).trigger(b)}},b.registerComponent("EventManager",q);var
r=function(a,b,c){this.src=a,b||(b=new
Image),this.element=b,this.callback=c,this.load()};a.extend(r,{attach:function(a,b){return
new r(a.src,a,b)},prototype:{getDimensions:function(){var
a=this.element;return
a.naturalWidth?[a.naturalWidth,a.naturalHeight]:a.width?[a.width,a.height]:null},fireCallback:function(){this.element.onload=null,"function"==typeof
this.callback&&this.callback.apply(this,this.getDimensions())},isLoaded:function(){return
this.element.complete},load:function(){var
a=this,b=a.element;b.src=a.src,a.isLoaded()?a.fireCallback():a.element.onload=function(b){a.fireCallback()}}}}),b.registerComponent("ImageLoader",r);var
s=function(a){this.core=a,this.init()};a.extend(s,{support:function(){return"ontouchstart"in
window||window.DocumentTouch&&document instanceof
DocumentTouch?!0:void 0},prototype:{init:function(){var
b=this,c=a.Jcrop.component.DragState.prototype;c.touch||(b.initEvents(),b.shimDragState(),b.shimStageDrag(),c.touch=!0)},shimDragState:function(){var
b=this;a.Jcrop.component.DragState.prototype.initEvents=function(c){"touch"==c.type.substr(0,5)?a(this.eventTarget).on("touchmove.jcrop.jcrop-touch",b.dragWrap(this.createDragHandler())).on("touchend.jcrop.jcrop-touch",this.createStopHandler()):a(this.eventTarget).on("mousemove.jcrop",this.createDragHandler()).on("mouseup.jcrop",this.createStopHandler())}},shimStageDrag:function(){this.core.container.addClass("jcrop-touch").on("touchstart.jcrop.jcrop-stage",this.dragWrap(this.core.ui.manager.startDragHandler()))},dragWrap:function(a){return
function(b){return
b.preventDefault(),b.stopPropagation(),"touch"==b.type.substr(0,5)?(b.pageX=b.originalEvent.changedTouches[0].pageX,b.pageY=b.originalEvent.changedTouches[0].pageY,a(b)):!1}},initEvents:function(){var
a=this,b=a.core;b.container.on("touchstart.jcrop.jcrop-touch","."+b.opt.css_drag,a.dragWrap(b.startDrag()))}}}),b.registerComponent("Touch",s);var
t=function(a){this.core=a,this.init()};a.extend(t,{defaults:{eventName:"keydown.jcrop",passthru:[9],debug:!1},prototype:{init:function(){a.extend(this,t.defaults),this.enable()},disable:function(){this.core.container.off(this.eventName)},enable:function(){var
b=this,c=b.core;c.container.on(b.eventName,function(d){var
e=d.shiftKey?16:2;if(a.inArray(d.keyCode,b.passthru)>=0)return!0;switch(d.keyCode){case
37:c.nudge(-e,0);break;case 38:c.nudge(0,-e);break;case
39:c.nudge(e,0);break;case 40:c.nudge(0,e);break;case 46:case 8:return
c.requestDelete(),!1;default:b.debug&&console.log("keycode:
"+d.keyCode)}d.metaKey||d.ctrlKey||d.preventDefault()})}}}),b.registerComponent("Keyboard",t);var
u=function(){};a.extend(u,{defaults:{minSize:[8,8],maxSize:[0,0],aspectRatio:0,edge:{n:0,s:0,e:0,w:0},bgColor:null,bgOpacity:null,last:null,state:null,active:!0,linked:!0,canDelete:!0,canDrag:!0,canResize:!0,canSelect:!0},prototype:{init:function(a){this.core=a,this.startup(),this.linked=this.core.opt.linked,this.attach(),this.setOptions(this.core.opt),a.container.trigger("cropcreate",[this])},attach:function(){},startup:function(){var
b=this,c=b.core.opt;a.extend(b,u.defaults),b.filter=b.core.getDefaultFilters(),b.element=a("<div
/>").addClass(c.css_selection).data({selection:b}),b.frame=a("<button
/>").addClass(c.css_button).data("ord","move").attr("type","button"),b.element.append(b.frame).appendTo(b.core.container),b.core.opt.is_msie&&b.frame.css({opacity:0,backgroundColor:"white"}),b.insertElements(),b.frame.on("focus.jcrop",function(a){b.core.setSelection(b),b.element.trigger("cropfocus",b),b.element.addClass("jcrop-focus")}).on("blur.jcrop",function(a){b.element.removeClass("jcrop-focus"),b.element.trigger("cropblur",b)})},propagate:["canDelete","canDrag","canResize","canSelect","minSize","maxSize","aspectRatio","edge"],setOptions:function(a){return
b.propagate(this.propagate,a,this),this.refresh(),this},refresh:function(){this.allowResize(),this.allowDrag(),this.allowSelect(),this.callFilterFunction("refresh"),this.updateRaw(this.get(),"se")},callFilterFunction:function(a,b){for(var
c=0;c<this.filter.length;c++)this.filter[c][a]&&this.filter[c][a](this);return
this},addFilter:function(a){a.core=this.core,this.hasFilter(a)||(this.filter.push(a),this.sortFilters(),a.init&&a.init(),this.refresh())},hasFilter:function(a){var
b,c=this.filter;for(b=0;b<c.length;b++)if(c[b]===a)return!0},sortFilters:function(){this.filter.sort(function(a,b){return
a.priority-b.priority})},clearFilters:function(){for(var
a,b=this.filter,a=0;a<b.length;a++)b[a].destroy&&b[a].destroy();this.filter=[]},removeFilter:function(a){for(var
b,c=this.filter,d=[],b=0;b<c.length;b++)c[b].tag&&c[b].tag==a||a===c[b]?c[b].destroy&&c[b].destroy():d.push(c[b]);this.filter=d},runFilters:function(a,b){for(var
c=0;c<this.filter.length;c++)a=this.filter[c].filter(a,b,this);return
a},endDrag:function(){this.state&&(a(document.body).off(".jcrop"),this.focus(),this.state=null)},startDrag:function(c,d){var
e=this;e.core;return
d=d||a(c.target).data("ord"),this.focus(),"move"==d&&e.element.hasClass(e.core.opt.css_nodrag)?!1:(this.state=new
b.component.DragState(c,this,d),!1)},allowSelect:function(a){return void
0===a&&(a=this.canSelect),a&&this.canSelect?this.frame.attr("disabled",!1):this.frame.attr("disabled","disabled"),this},allowDrag:function(a){var
b=this,c=b.core.opt;return void
0==a&&(a=b.canDrag),a&&b.canDrag?b.element.removeClass(c.css_nodrag):b.element.addClass(c.css_nodrag),this},allowResize:function(a){var
b=this,c=b.core.opt;return void
0==a&&(a=b.canResize),a&&b.canResize?b.element.removeClass(c.css_noresize):b.element.addClass(c.css_noresize),this},remove:function(){this.element.trigger("cropremove",this),this.element.remove()},toBack:function(){this.active=!1,this.element.removeClass("jcrop-current
jcrop-focus")},toFront:function(){this.active=!0,this.element.addClass("jcrop-current"),this.callFilterFunction("refresh"),this.refresh()},redraw:function(a){return
this.moveTo(a.x,a.y),this.resize(a.w,a.h),this.last=a,this},update:function(a,b){return
this.updateRaw(this.core.scale(a),b)},updateRaw:function(a,b){return
a=this.runFilters(a,b),this.redraw(a),this.element.trigger("cropmove",[this,this.core.unscale(a)]),this},animateTo:function(a,c){var
d=new
b.component.Animator(this),e=this.core.scale(b.wrapFromXywh(a));d.animate(e.x,e.y,e.w,e.h,c)},center:function(a){var
b=this.get(),c=this.core,d=c.container.width(),e=c.container.height(),f=[(d-b.w)/2,(e-b.h)/2,b.w,b.h];return
this[a?"setSelect":"animateTo"](f)},createElement:function(b,c){return
a("<div />").addClass(b+"
ord-"+c).data("ord",c)},moveTo:function(a,b){this.element.css({top:b+"px",left:a+"px"})},blur:function(){return
this.element.blur(),this},focus:function(){return
this.core.setSelection(this),this.frame.focus(),this},resize:function(a,b){this.element.css({width:a+"px",height:b+"px"})},get:function(){var
a=this.element,b=a.position(),c=a.width(),d=a.height(),e={x:b.left,y:b.top};return
e.x2=e.x+c,e.y2=e.y+d,e.w=c,e.h=d,e},insertElements:function(){var
a,b=this,c=(b.core,b.element),d=b.core.opt,e=d.borders,f=d.handles,g=d.dragbars;for(a=0;a<g.length;a++)c.append(b.createElement(d.css_dragbars,g[a]));for(a=0;a<f.length;a++)c.append(b.createElement(d.css_handles,f[a]));for(a=0;a<e.length;a++)c.append(b.createElement(d.css_borders,e[a]))}}}),b.registerComponent("Selection",u);var
v=function(b,c){a.extend(this,v.defaults,c||{}),this.manager=b,this.core=b.core};v.defaults={offset:[-8,-8],active:!0,minsize:[20,20]},a.extend(v.prototype,{start:function(c){var
d=this.core;if(d.opt.allowSelect){if(d.opt.multi&&d.opt.multiMax&&d.ui.multi.length>=d.opt.multiMax)return!1;var
e=a(c.currentTarget).offset(),f=c.pageX-e.left+this.offset[0],g=c.pageY-e.top+this.offset[1],h=d.ui.multi;if(!d.opt.multi)if(d.opt.multiCleanup){for(var
i=0;i<h.length;i++)h[i].remove();d.ui.multi=[]}else
d.removeSelection(d.ui.selection);d.container.addClass("jcrop-dragging");var
j=d.newSelection().updateRaw(b.wrapFromXywh([f,g,1,1]));return
j.element.trigger("cropstart",[j,this.core.unscale(j.get())]),j.startDrag(c,"se")}},end:function(a,b){this.drag(a,b);var
c=this.sel.get();this.core.container.removeClass("jcrop-dragging"),c.w<this.minsize[0]||c.h<this.minsize[1]?this.core.requestDelete():this.sel.focus()}}),b.registerComponent("StageDrag",v);var
w=function(a){this.core=a,this.ui=a.ui,this.init()};a.extend(w.prototype,{init:function(){this.setupEvents(),this.dragger=new
v(this)},tellConfigUpdate:function(a){for(var
b=0,c=this.ui.multi,d=c.length;d>b;b++)c[b].setOptions&&(c[b].linked||this.core.opt.linkCurrent&&c[b]==this.ui.selection)&&c[b].setOptions(a)},startDragHandler:function(){var
a=this;return
function(b){return!b.button||a.core.opt.is_ie_lt9?a.dragger.start(b):void
0}},removeEvents:function(){this.core.event.off(".jcrop-stage"),this.core.container.off(".jcrop-stage")},shimLegacyHandlers:function(b){var
c,d=this.core;a.each(d.opt.legacyHandlers,function(a,e){a in
b&&(c=b[a],d.container.off(".jcrop-"+a).on(e+".jcrop.jcrop-"+a,function(a,b,e){c.call(d,e)}),delete
b[a])})},setupEvents:function(){var
a=this,b=a.core;b.event.on("configupdate.jcrop-stage",function(c){a.shimLegacyHandlers(b.opt),a.tellConfigUpdate(b.opt),b.container.trigger("cropconfig",[b,b.opt])}),this.core.container.on("mousedown.jcrop.jcrop-stage",this.startDragHandler())}}),b.registerComponent("StageManager",w);var
x=function(){};a.extend(x,{defaults:{selection:null,fading:!0,fadeDelay:1e3,fadeDuration:1e3,autoHide:!1,width:80,height:80,_hiding:null},prototype:{recopyCanvas:function(){var
a=this.core.ui.stage,b=a.context;this.context.putImageData(b.getImageData(0,0,a.canvas.width,a.canvas.height),0,0)},init:function(b,c){var
d=this;this.core=b,a.extend(this,x.defaults,c),d.initEvents(),d.refresh(),d.insertElements(),d.selection?(d.renderSelection(d.selection),d.selectionTarget=d.selection.element[0]):d.core.ui.selection&&d.renderSelection(d.core.ui.selection),d.core.ui.stage.canvas&&(d.context=d.preview[0].getContext("2d"),d.core.container.on("cropredraw",function(a){d.recopyCanvas(),d.refresh()}))},updateImage:function(b){return
this.preview.remove(),this.preview=a(a.Jcrop.imageClone(b)),this.element.append(this.preview),this.refresh(),this},insertElements:function(){this.preview=a(a.Jcrop.imageClone(this.core.ui.stage.imgsrc)),this.element=a("<div
/>").addClass("jcrop-thumb").width(this.width).height(this.height).append(this.preview).appendTo(this.core.container)},resize:function(a,b){this.width=a,this.height=b,this.element.width(a).height(b),this.renderCoords(this.last)},refresh:function(){this.cw=this.core.opt.xscale*this.core.container.width(),this.ch=this.core.opt.yscale*this.core.container.height(),this.last&&this.renderCoords(this.last)},renderCoords:function(a){var
b=this.width/a.w,c=this.height/a.h;return
this.preview.css({width:Math.round(b*this.cw)+"px",height:Math.round(c*this.ch)+"px",marginLeft:"-"+Math.round(b*a.x)+"px",marginTop:"-"+Math.round(c*a.y)+"px"}),this.last=a,this},renderSelection:function(a){return
this.renderCoords(a.core.unscale(a.get()))},selectionStart:function(a){this.renderSelection(a)},show:function(){this._hiding&&clearTimeout(this._hiding),this.fading?this.element.stop().animate({opacity:1},{duration:80,queue:!1}):this.element.stop().css({opacity:1})},hide:function(){var
a=this;a.fading?a._hiding=setTimeout(function(){a._hiding=null,a.element.stop().animate({opacity:0},{duration:a.fadeDuration,queue:!1})},a.fadeDelay):a.element.hide()},initEvents:function(){var
a=this;a.core.container.on("croprotstart croprotend cropimage
cropstart cropmove
cropend",function(b,c,d){if(a.selectionTarget&&a.selectionTarget!==b.target)return!1;switch(b.type){case"cropimage":a.updateImage(d);break;case"cropstart":a.selectionStart(c);case"croprotstart":a.show();break;case"cropend":a.renderCoords(d);case"croprotend":a.autoHide&&a.hide();break;case"cropmove":a.renderCoords(d)}})}}}),b.registerComponent("Thumbnailer",x);var
y=function(){};y.prototype={init:function(b,c,d){c||(c=b.container),this.$btn=a(c),this.$targ=a(c),this.core=b,this.$btn.addClass("dialdrag").on("mousedown.dialdrag",this.mousedown()).data("dialdrag",this),a.isFunction(d)||(d=function(){}),this.callback=d,this.ondone=d},remove:function(){return
this.$btn.removeClass("dialdrag").off(".dialdrag").data("dialdrag",null),this},setTarget:function(b){return
this.$targ=a(b),this},getOffset:function(){var
a=this.$targ,b=a.offset();return[b.left+a.width()/2,b.top+a.height()/2]},relMouse:function(a){var
b=a.pageX-this.offset[0],c=a.pageY-this.offset[1],d=Math.atan2(c,b)*(180/Math.PI),e=Math.sqrt(Math.pow(b,2)+Math.pow(c,2));return[b,c,d,e]},mousedown:function(){function
b(b){a(window).off(".dialdrag"),d.ondone.call(d,d.relMouse(b)),d.core.container.trigger("croprotend")}function
c(a){d.callback.call(d,d.relMouse(a))}var d=this;return
function(e){d.offset=d.getOffset();var f=d.relMouse(e);return
d.angleOffset=-d.core.ui.stage.angle+f[2],d.distOffset=f[3],d.dragOffset=[f[0],f[1]],d.core.container.trigger("croprotstart"),a(window).on("mousemove.dialdrag",c).on("mouseup.dialdrag",b),d.callback.call(d,d.relMouse(e)),!1}}},b.registerComponent("DialDrag",y),b.defaults={edge:{n:0,s:0,e:0,w:0},setSelect:null,linked:!0,linkCurrent:!0,canDelete:!0,canSelect:!0,canDrag:!0,canResize:!0,eventManagerComponent:b.component.EventManager,keyboardComponent:b.component.Keyboard,dragstateComponent:b.component.DragState,stagemanagerComponent:b.component.StageManager,animatorComponent:b.component.Animator,selectionComponent:b.component.Selection,stageConstructor:b.stageConstructor,allowSelect:!0,multi:!1,multiMax:!1,multiCleanup:!0,animation:!0,animEasing:"swing",animDuration:400,fading:!0,fadeDuration:300,fadeEasing:"swing",bgColor:"black",bgOpacity:.5,applyFilters:["constrain","extent","backoff","ratio","shader","round"],borders:["e","w","s","n"],handles:["n","s","e","w","sw","ne","nw","se"],dragbars:["n","e","w","s"],dragEventTarget:window,xscale:1,yscale:1,boxWidth:null,boxHeight:null,css_nodrag:"jcrop-nodrag",css_drag:"jcrop-drag",css_container:"jcrop-active",css_shades:"jcrop-shades",css_selection:"jcrop-selection",css_borders:"jcrop-border",css_handles:"jcrop-handle
jcrop-drag",css_button:"jcrop-box
jcrop-drag",css_noresize:"jcrop-noresize",css_dragbars:"jcrop-dragbar
jcrop-drag",legacyHandlers:{onChange:"cropmove",onSelect:"cropend"}},a.extend(b.prototype,{init:function(){this.event=new
this.opt.eventManagerComponent(this),this.ui.keyboard=new
this.opt.keyboardComponent(this),this.ui.manager=new
this.opt.stagemanagerComponent(this),this.applyFilters(),a.Jcrop.supportsTouch&&new
a.Jcrop.component.Touch(this),this.initEvents()},applySizeConstraints:function(){var
c=this.opt,d=this.opt.imgsrc;if(d){var
e=d.naturalWidth||d.width,f=d.naturalHeight||d.height,g=c.boxWidth||e,h=c.boxHeight||f;if(d&&(e>g||f>h)){var
i=b.getLargestBox(e/f,g,h);a(d).width(i[0]).height(i[1]),this.resizeContainer(i[0],i[1]),this.opt.xscale=e/i[0],this.opt.yscale=f/i[1]}}if(this.opt.trueSize){var
j=this.opt.trueSize[0],k=this.opt.trueSize[1],l=this.getContainerSize();this.opt.xscale=j/l[0],this.opt.yscale=k/l[1]}},initComponent:function(a){if(b.component[a]){var
c=Array.prototype.slice.call(arguments),d=new b.component[a];return
c.shift(),c.unshift(this),d.init.apply(d,c),d}},setOptions:function(b,c){return
a.isPlainObject(b)||(b={}),a.extend(this.opt,b),this.opt.setSelect&&(this.ui.multi.length||this.newSelection(),this.setSelect(this.opt.setSelect),this.opt.setSelect=null),this.event.trigger("configupdate"),this},destroy:function(){this.opt.imgsrc?(this.container.before(this.opt.imgsrc),this.container.remove(),a(this.opt.imgsrc).removeData("Jcrop").show()):this.container.remove()},applyFilters:function(){for(var
b,c=0,d=this.opt.applyFilters,e=d.length;e>c;c++)a.Jcrop.filter[d[c]]&&(b=new
a.Jcrop.filter[d[c]]),b.core=this,b.init&&b.init(),this.filter[d[c]]=b},getDefaultFilters:function(){for(var
a=[],b=0,c=this.opt.applyFilters,d=c.length;d>b;b++)this.filter.hasOwnProperty(c[b])&&a.push(this.filter[c[b]]);return
a.sort(function(a,b){return
a.priority-b.priority}),a},setSelection:function(a){for(var
b=this.ui.multi,c=[],d=0;d<b.length;d++)b[d]!==a&&c.push(b[d]),b[d].toBack();return
c.unshift(a),this.ui.multi=c,this.ui.selection=a,a.toFront(),a},getSelection:function(a){var
b=this.ui.selection.get();return b},newSelection:function(a){return
a||(a=new
this.opt.selectionComponent),a.init(this),this.setSelection(a),a},hasSelection:function(a){for(var
b=0;b<this.ui.multi;b++)if(a===this.ui.multi[b])return!0},removeSelection:function(a){for(var
b,c=[],d=this.ui.multi,b=0;b<d.length;b++)a!==d[b]?c.push(d[b]):d[b].remove();return
this.ui.multi=c},addFilter:function(a){for(var
b=0,c=this.ui.multi,d=c.length;d>b;b++)c[b].addFilter(a);return
this},removeFilter:function(a){for(var
b=0,c=this.ui.multi,d=c.length;d>b;b++)c[b].removeFilter(a);return
this},blur:function(){return
this.ui.selection.blur(),this},focus:function(){return
this.ui.selection.focus(),this},initEvents:function(){var
a=this;a.container.on("selectstart",function(a){return!1}).on("mousedown","."+a.opt.css_drag,a.startDrag())},maxSelect:function(){this.setSelect([0,0,this.elw,this.elh])},nudge:function(a,b){var
c=this.ui.selection,d=c.get();d.x+=a,d.x2+=a,d.y+=b,d.y2+=b,d.x<0?(d.x2=d.w,d.x=0):d.x2>this.elw&&(d.x2=this.elw,d.x=d.x2-d.w),d.y<0?(d.y2=d.h,d.y=0):d.y2>this.elh&&(d.y2=this.elh,d.y=d.y2-d.h),c.element.trigger("cropstart",[c,this.unscale(d)]),c.updateRaw(d,"move"),c.element.trigger("cropend",[c,this.unscale(d)])},refresh:function(){for(var
a=0,b=this.ui.multi,c=b.length;c>a;a++)b[a].refresh()},blurAll:function(){for(var
a=this.ui.multi,b=0;b<a.length;b++)a[b]!==sel&&n.push(a[b]),a[b].toBack()},scale:function(a){var
b=this.opt.xscale,c=this.opt.yscale;return{x:a.x/b,y:a.y/c,x2:a.x2/b,y2:a.y2/c,
w:a.w/b,h:a.h/c}},unscale:function(a){var
b=this.opt.xscale,c=this.opt.yscale;return{x:a.x*b,y:a.y*c,x2:a.x2*b,y2:a.y2*c,w:a.w*b,h:a.h*c}},requestDelete:function(){return
this.ui.multi.length>1&&this.ui.selection.canDelete?this.deleteSelection():void
0},deleteSelection:function(){this.ui.selection&&(this.removeSelection(this.ui.selection),this.ui.multi.length&&this.ui.multi[0].focus(),this.ui.selection.refresh())},animateTo:function(a){return
this.ui.selection&&this.ui.selection.animateTo(a),this},setSelect:function(a){return
this.ui.selection&&this.ui.selection.update(b.wrapFromXywh(a)),this},startDrag:function(){var
b=this;return function(c){var
d=a(c.target),e=d.closest("."+b.opt.css_selection).data("selection"),f=d.data("ord");return
b.container.trigger("cropstart",[e,b.unscale(e.get())]),e.startDrag(c,f),!1}},getContainerSize:function(){return[this.container.width(),this.container.height()]},resizeContainer:function(a,b){this.container.width(a).height(b),this.refresh()},setImage:function(b,c){var
d=this,e=d.opt.imgsrc;return e?void new
a.Jcrop.component.ImageLoader(b,null,function(f,g){d.resizeContainer(f,g),e.src=b,a(e).width(f).height(g),d.applySizeConstraints(),d.refresh(),d.container.trigger("cropimage",[d,e]),"function"==typeof
c&&c.call(d,f,g)}):!1},update:function(a){this.ui.selection&&this.ui.selection.update(a)}}),a.fn.Jcrop=function(b,c){b=b||{};var
d=this.eq(0).data("Jcrop"),e=Array.prototype.slice.call(arguments);return"api"==b?d:d&&"string"==typeof
b?d[b]?(e.shift(),d[b].apply(d,e),d):!1:void this.each(function(){var
d=a(this),e=d.data("Jcrop");return
e?e.setOptions(b):(b.stageConstructor||(b.stageConstructor=a.Jcrop.stageConstructor),b.stageConstructor(this,b,function(b,e){var
f=e.setSelect;f&&delete e.setSelect;var
g=a.Jcrop.attach(b.element,e);"function"==typeof
b.attach&&b.attach(g),d.data("Jcrop",g),f&&(g.newSelection(),g.setSelect(f)),"function"==typeof
c&&c.call(g)})),this})};var z=function(a,b,c){function
d(a){r.cssText=a}function e(a,b){return typeof a===b}function
f(a,b){return!!~(""+a).indexOf(b)}function g(a,b){for(var d in
a){var
e=a[d];if(!f(e,"-")&&r[e]!==c)return"pfx"==b?e:!0}return!1}function
h(a,b,d){for(var f in a){var g=b[a[f]];if(g!==c)return
d===!1?a[f]:e(g,"function")?g.bind(d||b):g}return!1}function
i(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),f=(a+"
"+v.join(d+" ")+d).split(" ");return
e(b,"string")||e(b,"undefined")?g(f,b):(f=(a+"
"+w.join(d+" ")+d).split(" "),h(f,b,c))}var
j,k,l,m="2.7.1",n={},o=b.documentElement,p="modernizr",q=b.createElement(p),r=q.style,s={}.toString,t="
-webkit- -moz- -o- -ms- ".split(" "),u="Webkit Moz O
ms",v=u.split(" "),w=u.toLowerCase().split("
"),x={svg:"http://www.w3.org/2000/svg"},y={},z=[],A=z.slice,B=function(a,c,d,e){var
f,g,h,i,j=b.createElement("div"),k=b.body,l=k||b.createElement("body");if(parseInt(d,10))for(;d--;)h=b.createElement("div"),h.id=e?e[d]:p+(d+1),j.appendChild(h);return
f=["&#173;",'<style
id="s',p,'">',a,"</style>"].join(""),j.id=p,(k?j:l).innerHTML+=f,l.appendChild(j),k||(l.style.background="",l.style.overflow="hidden",i=o.style.overflow,o.style.overflow="hidden",o.appendChild(l)),g=c(j,a),k?j.parentNode.removeChild(j):(l.parentNode.removeChild(l),o.style.overflow=i),!!g},C=function(){function
a(a,f){f=f||b.createElement(d[a]||"div"),a="on"+a;var
g=a in f;return
g||(f.setAttribute||(f=b.createElement("div")),f.setAttribute&&f.removeAttribute&&(f.setAttribute(a,""),g=e(f[a],"function"),e(f[a],"undefined")||(f[a]=c),f.removeAttribute(a))),f=null,g}var
d={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return
a}(),D={}.hasOwnProperty;l=e(D,"undefined")||e(D.call,"undefined")?function(a,b){return
b in
a&&e(a.constructor.prototype[b],"undefined")}:function(a,b){return
D.call(a,b)},Function.prototype.bind||(Function.prototype.bind=function(a){var
b=this;if("function"!=typeof b)throw new TypeError;var
c=A.call(arguments,1),d=function(){if(this instanceof d){var
e=function(){};e.prototype=b.prototype;var f=new
e,g=b.apply(f,c.concat(A.call(arguments)));return Object(g)===g?g:f}return
b.apply(a,c.concat(A.call(arguments)))};return d}),y.canvas=function(){var
a=b.createElement("canvas");return!(!a.getContext||!a.getContext("2d"))},y.canvastext=function(){return!(!n.canvas||!e(b.createElement("canvas").getContext("2d").fillText,"function"))},y.touch=function(){var
c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof
DocumentTouch?c=!0:B(["@media
(",t.join("touch-enabled),("),p,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=9===a.offsetTop}),c},y.draganddrop=function(){var
a=b.createElement("div");return"draggable"in
a||"ondragstart"in a&&"ondrop"in
a},y.csstransforms=function(){return!!i("transform")},y.svg=function(){return!!b.createElementNS&&!!b.createElementNS(x.svg,"svg").createSVGRect},y.inlinesvg=function(){var
a=b.createElement("div");return
a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==x.svg},y.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(s.call(b.createElementNS(x.svg,"clipPath")))};for(var
E in
y)l(y,E)&&(k=E.toLowerCase(),n[k]=y[E](),z.push((n[k]?"":"no-")+k));return
n.addTest=function(a,b){if("object"==typeof a)for(var d in
a)l(a,d)&&n.addTest(d,a[d]);else{if(a=a.toLowerCase(),n[a]!==c)return
n;b="function"==typeof b?b():b,"undefined"!=typeof
enableClasses&&enableClasses&&(o.className+="
"+(b?"":"no-")+a),n[a]=b}return
n},d(""),q=j=null,n._version=m,n._prefixes=t,n._domPrefixes=w,n._cssomPrefixes=v,n.hasEvent=C,n.testProp=function(a){return
g([a])},n.testAllProps=i,n.testStyles=B,n}(window,window.document);!function(){var
a=new
Image;a.onerror=function(){z.addTest("datauri",function(){return!1})},a.onload=function(){z.addTest("datauri",function(){return
1==a.width&&1==a.height})},a.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}(),a.Jcrop=b,a.Jcrop.supportsCanvas=z.canvas,a.Jcrop.supportsCanvasText=z.canvastext,a.Jcrop.supportsDragAndDrop=z.draganddrop,a.Jcrop.supportsDataURI=z.datauri,a.Jcrop.supportsSVG=z.svg,a.Jcrop.supportsInlineSVG=z.inlinesvg,a.Jcrop.supportsSVGClipPaths=z.svgclippaths,a.Jcrop.supportsCSSTransforms=z.csstransforms,a.Jcrop.supportsTouch=z.touch}(jQuery);PK\n�[���j��js/keepalive-uncompressed.jsnu�[���/**
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license     GNU General Public License version 2 or later; see
LICENSE.txt
 */

/**
 * Keepalive javascript behavior
 *
 * Used for keeping the session alive
 *
 * @package  Joomla
 * @since    3.7.0
 */
!(function(){
	'use strict';

	document.addEventListener('DOMContentLoaded', function() {

		var keepaliveOptions  = Joomla.getOptions('system.keepalive'),
		    keepaliveUri      = keepaliveOptions && keepaliveOptions.uri
? keepaliveOptions.uri.replace(/&amp;/g, '&') :
'',
		    keepaliveInterval = keepaliveOptions &&
keepaliveOptions.interval ? keepaliveOptions.interval : 45 * 1000;

		// Fallback in case no keepalive uri was found.
		if (keepaliveUri === '')
		{
			var systemPaths = Joomla.getOptions('system.paths');

			keepaliveUri = (systemPaths ? systemPaths.root + '/index.php'
: window.location.pathname) + '?option=com_ajax&format=json';
		}

		window.setInterval(function() {
			Joomla.request({
				url: keepaliveUri,
				onSuccess: function(response, xhr)
				{
					// Do nothing
				},
				onError: function(xhr)
				{
					// Do nothing
				}
			});
		}, keepaliveInterval);

	});

})(window, document, Joomla);
PK\n�[�����js/keepalive.jsnu�[���!function(){"use
strict";document.addEventListener("DOMContentLoaded",function(){var
o=Joomla.getOptions("system.keepalive"),n=o&&o.uri?o.uri.replace(/&amp;/g,"&"):"",t=o&&o.interval?o.interval:45e3;if(""===n){var
e=Joomla.getOptions("system.paths");n=(e?e.root+"/index.php":window.location.pathname)+"?option=com_ajax&format=json"}window.setInterval(function(){Joomla.request({url:n,onSuccess:function(){},onError:function(){}})},t)})}(window,document,Joomla);
PK\n�[a���js/modal-fields-uncompressed.jsnu�[���/**
 * @copyright  Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

(function() {
	"use strict";

	/**
	 * Process modal fields in parent.
	 *
	 * @param   string  fieldPrefix  The fields to be updated prefix.
	 * @param   string  id           The new id for the item.
	 * @param   string  title        The new title for the item.
	 * @param   string  catid        Future usage.
	 * @param   object  object       Future usage.
	 * @param   string  url          Future usage.
	 * @param   string  language     Future usage.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	window.processModalParent = function (fieldPrefix, id, title, catid, url,
language, object)
	{
		var fieldId = document.getElementById(fieldPrefix + '_id'),
fieldTitle = document.getElementById(fieldPrefix + '_name');

		// Default values.
		id       = id || '';
		title    = title || '';
		catid    = catid || '';
		object   = object || '';
		url      = url || '';
		language = language || '';

		if (id)
		{
			fieldId.value    = id;
			fieldTitle.value = title;

			if (document.getElementById(fieldPrefix + '_select'))
			{
				jQuery('#' + fieldPrefix +
'_select').addClass('hidden');
			}
			if (document.getElementById(fieldPrefix + '_new'))
			{
				jQuery('#' + fieldPrefix +
'_new').addClass('hidden');
			}
			if (document.getElementById(fieldPrefix + '_edit'))
			{
				jQuery('#' + fieldPrefix +
'_edit').removeClass('hidden');
			}
			if (document.getElementById(fieldPrefix + '_clear'))
			{
				jQuery('#' + fieldPrefix +
'_clear').removeClass('hidden');
			}
			if (document.getElementById(fieldPrefix + '_propagate'))
			{
				jQuery('#' + fieldPrefix +
'_propagate').removeClass('hidden');
			}
		}
		else
		{
			fieldId.value    = '';
			fieldTitle.value = fieldId.getAttribute('data-text');

			if (document.getElementById(fieldPrefix + '_select'))
			{
				jQuery('#' + fieldPrefix +
'_select').removeClass('hidden');
			}
			if (document.getElementById(fieldPrefix + '_new'))
			{
				jQuery('#' + fieldPrefix +
'_new').removeClass('hidden');
			}
			if (document.getElementById(fieldPrefix + '_edit'))
			{
				jQuery('#' + fieldPrefix +
'_edit').addClass('hidden');
			}
			if (document.getElementById(fieldPrefix + '_clear'))
			{
				jQuery('#' + fieldPrefix +
'_clear').addClass('hidden');
			}
			if (document.getElementById(fieldPrefix + '_propagate'))
			{
				jQuery('#' + fieldPrefix +
'_propagate').addClass('hidden');
			}
		}

		if (fieldId.getAttribute('data-required') == '1')
		{
			document.formvalidator.validate(fieldId);
			document.formvalidator.validate(fieldTitle);
		}

		return false;
	}

	/**
	 * Process new/edit modal fields in child.
	 *
	 * @param   object  element       The modal footer button element.
	 * @param   string  fieldPrefix   The fields to be updated prefix.
	 * @param   string  action        Modal action (add, edit).
	 * @param   string  itemType      The item type (Article, Contact, etc).
	 * @param   string  task          Task to be done (apply, save, cancel).
	 * @param   string  formId        Id of the form field (defaults to
itemtype-form).
	 * @param   string  idFieldId     Id of the id field (defaults to
jform_id).
	 * @param   string  titleFieldId  Id of the title field (defaults to
jform_title).
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	window.processModalEdit = function (element, fieldPrefix, action,
itemType, task, formId, idFieldId, titleFieldId)
	{
		formId       = formId || itemType.toLowerCase() + '-form';
		idFieldId    = idFieldId || 'jform_id';
		titleFieldId = titleFieldId || 'jform_title';

		var modalId = element.parentNode.parentNode.id, submittedTask = task;

		// Set frame id.
		jQuery('#' + modalId + ' iframe').get(0).id =
'Frame_' + modalId;

		var iframeDocument = jQuery('#Frame_' +
modalId).contents().get(0);

		// If Close (cancel task), close the modal.
		if (task === 'cancel')
		{
			// Submit button on child iframe so we can check out.
			document.getElementById('Frame_' +
modalId).contentWindow.Joomla.submitbutton(itemType.toLowerCase() +
'.' + task);

			jQuery('#' + modalId).modal('hide');
		}
		// For Save (apply task) and Save & Close (save task).
		else
		{
			// Attach onload event to the iframe.
			jQuery('#Frame_' + modalId).on('load', function()
			{
				// Reload iframe document var value.
				iframeDocument = jQuery(this).contents().get(0);

				// Validate the child form and update parent form.
				if (iframeDocument.getElementById(idFieldId) &&
iframeDocument.getElementById(idFieldId).value != '0')
				{
					window.processModalParent(fieldPrefix,
iframeDocument.getElementById(idFieldId).value,
iframeDocument.getElementById(titleFieldId).value);

					// If Save & Close (save task), submit the edit close action (so
we don't have checked out items).
					if (task === 'save')
					{
						window.processModalEdit(element, fieldPrefix, 'edit',
itemType, 'cancel', formId, idFieldId, titleFieldId);
					}
				}

				// Show the iframe again for future modals or in case of error.
				jQuery('#' + modalId + '
iframe').removeClass('hidden');
			});

			// Submit button on child iframe.
			if
(iframeDocument.formvalidator.isValid(iframeDocument.getElementById(formId)))
			{
				// For Save & Close (save task) when creating we need to replace
the task as apply because of redirects after submit and hide the iframe.
				if (task === 'save')
				{
					submittedTask = 'apply';
				}

				document.getElementById('Frame_' +
modalId).contentWindow.Joomla.submitbutton(itemType.toLowerCase() +
'.' + submittedTask);
			}
		}

		return false;
	}

	/**
	 * Process select modal fields in child.
	 *
	 * @param   string  itemType     The item type (Article, Contact, etc).
	 * @param   string  fieldPrefix  The fields to be updated prefix.
	 * @param   string  id           The new id for the item.
	 * @param   string  title        The new title for the item.
	 * @param   string  catid        Future usage.
	 * @param   object  object       Future usage.
	 * @param   string  url          Future usage.
	 * @param   string  language     Future usage.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	window.processModalSelect = function(itemType, fieldPrefix, id, title,
catid, object, url, language) {
		window.processModalParent(fieldPrefix, id, title, catid, url, language,
object);
		jQuery('#ModalSelect' + itemType + '_' +
fieldPrefix).modal('hide');

		return false;
	}

}());PK]n�[��`��js/modal-fields.jsnu�[���!function(){"use
strict";window.processModalParent=function(e,t,d,n,a,o,r){var
l=document.getElementById(e+"_id"),m=document.getElementById(e+"_name");return
t=t||"",d=d||"",n=n||"",r=r||"",a=a||"",o=o||"",t?(l.value=t,m.value=d,document.getElementById(e+"_select")&&jQuery("#"+e+"_select").addClass("hidden"),document.getElementById(e+"_new")&&jQuery("#"+e+"_new").addClass("hidden"),document.getElementById(e+"_edit")&&jQuery("#"+e+"_edit").removeClass("hidden"),document.getElementById(e+"_clear")&&jQuery("#"+e+"_clear").removeClass("hidden"),document.getElementById(e+"_propagate")&&jQuery("#"+e+"_propagate").removeClass("hidden")):(l.value="",m.value=l.getAttribute("data-text"),document.getElementById(e+"_select")&&jQuery("#"+e+"_select").removeClass("hidden"),document.getElementById(e+"_new")&&jQuery("#"+e+"_new").removeClass("hidden"),document.getElementById(e+"_edit")&&jQuery("#"+e+"_edit").addClass("hidden"),document.getElementById(e+"_clear")&&jQuery("#"+e+"_clear").addClass("hidden"),document.getElementById(e+"_propagate")&&jQuery("#"+e+"_propagate").addClass("hidden")),"1"==l.getAttribute("data-required")&&(document.formvalidator.validate(l),document.formvalidator.validate(m)),!1},window.processModalEdit=function(e,t,d,n,a,o,r,l){o=o||n.toLowerCase()+"-form",r=r||"jform_id",l=l||"jform_title";var
m=e.parentNode.parentNode.id,u=a;jQuery("#"+m+"
iframe").get(0).id="Frame_"+m;var
i=jQuery("#Frame_"+m).contents().get(0);return"cancel"===a?(document.getElementById("Frame_"+m).contentWindow.Joomla.submitbutton(n.toLowerCase()+"."+a),jQuery("#"+m).modal("hide")):(jQuery("#Frame_"+m).on("load",function(){(i=jQuery(this).contents().get(0)).getElementById(r)&&"0"!=i.getElementById(r).value&&(window.processModalParent(t,i.getElementById(r).value,i.getElementById(l).value),"save"===a&&window.processModalEdit(e,t,"edit",n,"cancel",o,r,l)),jQuery("#"+m+"
iframe").removeClass("hidden")}),i.formvalidator.isValid(i.getElementById(o))&&("save"===a&&(u="apply"),document.getElementById("Frame_"+m).contentWindow.Joomla.submitbutton(n.toLowerCase()+"."+u))),!1},window.processModalSelect=function(e,t,d,n,a,o,r,l){return
window.processModalParent(t,d,n,a,r,l,o),jQuery("#ModalSelect"+e+"_"+t).modal("hide"),!1}}();PK]n�[�,�4�4js/modal-uncompressed.jsnu�[���/**
 * SqueezeBox - Expandable Lightbox
 *
 * Allows to open various content as modal,
 * centered and animated box.
 *
 * Dependencies: MooTools 1.4 or newer
 *
 * Inspired by
 *  ... Lokesh Dhakar	- The original Lightbox v2
 *
 * @version		1.3
 *
 * @license		MIT-style license
 * @author		Harald Kirschner <mail [at] digitarald.de>
 * @author		Rouven Weßling <me [at] rouvenwessling.de>
 * @copyright	Author
 */

var SqueezeBox = {

	presets: {
		onOpen: function(){},
		onClose: function(){},
		onUpdate: function(){},
		onResize: function(){},
		onMove: function(){},
		onShow: function(){},
		onHide: function(){},
		size: {x: 600, y: 450},
		sizeLoading: {x: 200, y: 150},
		marginInner: {x: 20, y: 20},
		marginImage: {x: 50, y: 75},
		handler: false,
		target: null,
		closable: true,
		closeBtn: true,
		zIndex: 65555,
		overlayOpacity: 0.7,
		classWindow: '',
		classOverlay: '',
		overlayFx: {},
		resizeFx: {},
		contentFx: {},
		parse: false, // 'rel'
		parseSecure: false,
		shadow: true,
		overlay: true,
		document: null,
		ajaxOptions: {}
	},

	initialize: function(presets) {
		if (this.options) return this;

		this.presets = Object.merge(this.presets, presets);
		this.doc = this.presets.document || document;
		this.options = {};
		this.setOptions(this.presets).build();
		this.bound = {
			window: this.reposition.bind(this, [null]),
			scroll: this.checkTarget.bind(this),
			close: this.close.bind(this),
			key: this.onKey.bind(this)
		};
		this.isOpen = this.isLoading = false;
		return this;
	},

	build: function() {
		this.overlay = new Element('div', {
			id: 'sbox-overlay',
			'aria-hidden': 'true',
			styles: { zIndex: this.options.zIndex},
			tabindex: -1
		});
		this.win = new Element('div', {
			id: 'sbox-window',
			role: 'dialog',
			'aria-hidden': 'true',
			styles: {zIndex: this.options.zIndex + 2}
		});
		if (this.options.shadow) {
			if (Browser.chrome
			|| (Browser.safari && Browser.version >= 3)
			|| (Browser.opera && Browser.version >= 10.5)
			|| (Browser.firefox && Browser.version >= 3.5)
			|| (Browser.ie && Browser.version >= 9)) {
				this.win.addClass('shadow');
			} else if (!Browser.ie6) {
				var shadow = new Element('div', {'class':
'sbox-bg-wrap'}).inject(this.win);
				var relay = function(e) {
					this.overlay.fireEvent('click', [e]);
				}.bind(this);
				['n', 'ne', 'e', 'se',
's', 'sw', 'w',
'nw'].each(function(dir) {
					new Element('div', {'class': 'sbox-bg
sbox-bg-' + dir}).inject(shadow).addEvent('click', relay);
				});
			}
		}
		this.content = new Element('div', {id:
'sbox-content'}).inject(this.win);
		this.closeBtn = new Element('a', {id:
'sbox-btn-close', href: '#', role:
'button'}).inject(this.win);
		this.closeBtn.setProperty('aria-controls',
'sbox-window');
		this.fx = {
			overlay: new Fx.Tween(this.overlay, Object.merge({
				property: 'opacity',
				onStart: Events.prototype.clearChain,
				duration: 250,
				link: 'cancel'
			}, this.options.overlayFx)).set(0),
			win: new Fx.Morph(this.win, Object.merge({
				onStart: Events.prototype.clearChain,
				unit: 'px',
				duration: 750,
				transition: Fx.Transitions.Quint.easeOut,
				link: 'cancel',
				unit: 'px'
			}, this.options.resizeFx)),
			content: new Fx.Tween(this.content, Object.merge({
				property: 'opacity',
				duration: 250,
				link: 'cancel'
			}, this.options.contentFx)).set(0)
		};
		document.id(this.doc.body).adopt(this.overlay, this.win);
	},

	assign: function(to, options) {
		return (document.id(to) || $$(to)).addEvent('click', function()
{
			return !SqueezeBox.fromElement(this, options);
		});
	},

	open: function(subject, options) {
		this.initialize();

		if (this.element != null) this.trash();
		this.element = document.id(subject) || false;

		this.setOptions(Object.merge(this.presets, options || {}));

		if (this.element && this.options.parse) {
			var obj = this.element.getProperty(this.options.parse);
			if (obj && (obj = JSON.decode(obj, this.options.parseSecure)))
this.setOptions(obj);
		}
		this.url = ((this.element) ? (this.element.get('href')) :
subject) || this.options.url || '';

		this.assignOptions();

		var handler = handler || this.options.handler;
		if (handler) return this.setContent(handler,
this.parsers[handler].call(this, true));
		var ret = false;
		return this.parsers.some(function(parser, key) {
			var content = parser.call(this);
			if (content) {
				ret = this.setContent(key, content);
				return true;
			}
			return false;
		}, this);
	},

	fromElement: function(from, options) {
		return this.open(from, options);
	},

	assignOptions: function() {
		this.overlay.addClass(this.options.classOverlay);
		this.win.addClass(this.options.classWindow);
	},

	close: function(e) {
		var stoppable = (typeOf(e) == 'domevent');
		if (stoppable) e.stop();
		if (!this.isOpen || (stoppable &&
!Function.from(this.options.closable).call(this, e))) return this;
		this.fx.overlay.start(0).chain(this.toggleOverlay.bind(this));
		this.win.setProperty('aria-hidden', 'true');
		this.fireEvent('onClose', [this.content]);
		this.trash();
		this.toggleListeners();
		this.isOpen = false;
		return this;
	},

	trash: function() {
		this.element = this.asset = null;
		this.content.empty();
		this.options = {};
		this.removeEvents().setOptions(this.presets).callChain();
	},

	onError: function() {
		this.asset = null;
		this.setContent('string', this.options.errorMsg || 'An
error occurred');
	},

	setContent: function(handler, content) {
		if (!this.handlers[handler]) return false;
		this.content.className = 'sbox-content-' + handler;
		this.applyTimer =
this.applyContent.delay(this.fx.overlay.options.duration, this,
this.handlers[handler].call(this, content));
		if (this.overlay.retrieve('opacity')) return this;
		this.toggleOverlay(true);
		this.fx.overlay.start(this.options.overlayOpacity);
		return this.reposition();
	},

	applyContent: function(content, size) {
		if (!this.isOpen && !this.applyTimer) return;
		this.applyTimer = clearTimeout(this.applyTimer);
		this.hideContent();
		if (!content) {
			this.toggleLoading(true);
		} else {
			if (this.isLoading) this.toggleLoading(false);
			this.fireEvent('onUpdate', [this.content], 20);
		}
		if (content) {
			if (['string', 'array'].contains(typeOf(content))) {
				this.content.set('html', content);
			} else {
				this.content.adopt(content);
			}
		}
		this.callChain();
		if (!this.isOpen) {
			this.toggleListeners(true);
			this.resize(size, true);
			this.isOpen = true;
			this.win.setProperty('aria-hidden', 'false');
			this.fireEvent('onOpen', [this.content]);
		} else {
			this.resize(size);
		}
	},

	resize: function(size, instantly) {
		this.showTimer = clearTimeout(this.showTimer || null);
		var box = this.doc.getSize(), scroll = this.doc.getScroll();
		this.size = Object.merge((this.isLoading) ? this.options.sizeLoading :
this.options.size, size);
		var parentSize = self.getSize();
		if (this.size.x == parentSize.x) {
			this.size.y = this.size.y - 50;
			this.size.x = this.size.x - 20;
		}
		if (box.x > 979) {
			var to = {
				width: this.size.x,
				height: this.size.y,
				left: (scroll.x + (box.x - this.size.x - this.options.marginInner.x) /
2).toInt(),
				top: (scroll.y + (box.y - this.size.y - this.options.marginInner.y) /
2).toInt()
			};
		} else {
			var to = {
				width: box.x - 40,
				height: box.y,
				left: (scroll.x + 10).toInt(),
				top: (scroll.y + 20).toInt()
			};
		}
		this.hideContent();
		if (!instantly) {
			this.fx.win.start(to).chain(this.showContent.bind(this));
		} else {
			this.win.setStyles(to);
			this.showTimer = this.showContent.delay(50, this);
		}
		return this.reposition();
	},

	toggleListeners: function(state) {
		var fn = (state) ? 'addEvent' : 'removeEvent';
		this.closeBtn[fn]('click', this.bound.close);
		this.overlay[fn]('click', this.bound.close);
		this.doc[fn]('keydown',
this.bound.key)[fn]('mousewheel', this.bound.scroll);
		this.doc.getWindow()[fn]('resize',
this.bound.window)[fn]('scroll', this.bound.window);
	},

	toggleLoading: function(state) {
		this.isLoading = state;
		this.win[(state) ? 'addClass' :
'removeClass']('sbox-loading');
		if (state) {
			this.win.setProperty('aria-busy', state);
			this.fireEvent('onLoading', [this.win]);
		}
	},

	toggleOverlay: function(state) {
		if (this.options.overlay) {
			var full = this.doc.getSize().x;
			this.overlay.set('aria-hidden', (state) ? 'false' :
'true');
			this.doc.body[(state) ? 'addClass' :
'removeClass']('body-overlayed');
			if (state) {
				this.scrollOffset = this.doc.getWindow().getSize().x - full;
			} else {
				this.doc.body.setStyle('margin-right', '');
			}
		}
	},

	showContent: function() {
		if (this.content.get('opacity'))
this.fireEvent('onShow', [this.win]);
		this.fx.content.start(1);
	},

	hideContent: function() {
		if (!this.content.get('opacity'))
this.fireEvent('onHide', [this.win]);
		this.fx.content.cancel().set(0);
	},

	onKey: function(e) {
		switch (e.key) {
			case 'esc': this.close(e);
			case 'up': case 'down': return false;
		}
	},

	checkTarget: function(e) {
		return e.target !== this.content &&
this.content.contains(e.target);
	},

	reposition: function() {
		var size = this.doc.getSize(), scroll = this.doc.getScroll(), ssize =
this.doc.getScrollSize();
		var over = this.overlay.getStyles('height');
		var j = parseInt(over.height);
		if (ssize.y > j && size.y >= j) {
			this.overlay.setStyles({
				width: ssize.x + 'px',
				height: ssize.y + 'px'
			});
			this.win.setStyles({
				left: (scroll.x + (size.x - this.win.offsetWidth) / 2 -
this.scrollOffset).toInt() + 'px',
				top: (scroll.y + (size.y - this.win.offsetHeight) / 2).toInt() +
'px'
			});
		}
		return this.fireEvent('onMove', [this.overlay, this.win]);
	},

	removeEvents: function(type){
		if (!this.$events) return this;
		if (!type) this.$events = null;
		else if (this.$events[type]) this.$events[type] = null;
		return this;
	},

	extend: function(properties) {
		return Object.append(this, properties);
	},

	handlers: new Hash(),

	parsers: new Hash()
};

SqueezeBox.extend(new Events(function(){})).extend(new
Options(function(){})).extend(new Chain(function(){}));

SqueezeBox.parsers.extend({

	image: function(preset) {
		return (preset || (/\.(?:jpg|png|gif)$/i).test(this.url)) ? this.url :
false;
	},

	clone: function(preset) {
		if (document.id(this.options.target)) return
document.id(this.options.target);
		if (this.element && !this.element.parentNode) return
this.element;
		var bits = this.url.match(/#([\w-]+)$/);
		return (bits) ? document.id(bits[1]) : (preset ? this.element : false);
	},

	ajax: function(preset) {
		return (preset || (this.url &&
!(/^(?:javascript|#)/i).test(this.url))) ? this.url : false;
	},

	iframe: function(preset) {
		return (preset || this.url) ? this.url : false;
	},

	string: function(preset) {
		return true;
	}
});

SqueezeBox.handlers.extend({

	image: function(url) {
		var size, tmp = new Image();
		this.asset = null;
		tmp.onload = tmp.onabort = tmp.onerror = (function() {
			tmp.onload = tmp.onabort = tmp.onerror = null;
			if (!tmp.width) {
				this.onError.delay(10, this);
				return;
			}
			var box = this.doc.getSize();
			box.x -= this.options.marginImage.x;
			box.y -= this.options.marginImage.y;
			size = {x: tmp.width, y: tmp.height};
			for (var i = 2; i--;) {
				if (size.x > box.x) {
					size.y *= box.x / size.x;
					size.x = box.x;
				} else if (size.y > box.y) {
					size.x *= box.y / size.y;
					size.y = box.y;
				}
			}
			size.x = size.x.toInt();
			size.y = size.y.toInt();
			this.asset = document.id(tmp);
			tmp = null;
			this.asset.width = size.x;
			this.asset.height = size.y;
			this.applyContent(this.asset, size);
		}).bind(this);
		tmp.src = url;
		if (tmp && tmp.onload && tmp.complete) tmp.onload();
		return (this.asset) ? [this.asset, size] : null;
	},

	clone: function(el) {
		if (el) return el.clone();
		return this.onError();
	},

	adopt: function(el) {
		if (el) return el;
		return this.onError();
	},

	ajax: function(url) {
		var options = this.options.ajaxOptions || {};
		this.asset = new Request.HTML(Object.merge({
			method: 'get',
			evalScripts: false
		}, this.options.ajaxOptions)).addEvents({
			onSuccess: function(resp) {
				this.applyContent(resp);
				if (options.evalScripts !== null && !options.evalScripts)
Browser.exec(this.asset.response.javascript);
				this.fireEvent('onAjax', [resp, this.asset]);
				this.asset = null;
			}.bind(this),
			onFailure: this.onError.bind(this)
		});
		this.asset.send.delay(10, this.asset, [{url: url}]);
	},

	iframe: function(url) {
		var box = this.doc.getSize();
		if (box.x > 979) {
			var modal_width = this.options.size.x;
			var modal_height = this.options.size.y;
		} else {
			var modal_width = box.x;
			var modal_height = box.y - 50;
		}
		this.asset = new Element('iframe', Object.merge({
			src: url,
			frameBorder: 0,
			width: modal_width,
			height: modal_height
		}, this.options.iframeOptions));
		if (this.options.iframePreload) {
			this.asset.addEvent('load', function() {
				this.applyContent(this.asset.setStyle('display',
''));
			}.bind(this));
			this.asset.setStyle('display',
'none').inject(this.content);
			return false;
		}
		return this.asset;
	},

	string: function(str) {
		return str;
	}
});

SqueezeBox.handlers.url = SqueezeBox.handlers.ajax;
SqueezeBox.parsers.url = SqueezeBox.parsers.ajax;
SqueezeBox.parsers.adopt = SqueezeBox.parsers.clone;
PK]n�[_���'�'js/modal.jsnu�[���/*
		MIT-style license
 @author		Harald Kirschner <mail [at] digitarald.de>
 @author		Rouven Weßling <me [at] rouvenwessling.de>
 @copyright	Author
*/
var
SqueezeBox={presets:{onOpen:function(){},onClose:function(){},onUpdate:function(){},onResize:function(){},onMove:function(){},onShow:function(){},onHide:function(){},size:{x:600,y:450},sizeLoading:{x:200,y:150},marginInner:{x:20,y:20},marginImage:{x:50,y:75},handler:false,target:null,closable:true,closeBtn:true,zIndex:65555,overlayOpacity:.7,classWindow:"",classOverlay:"",overlayFx:{},resizeFx:{},contentFx:{},parse:false,parseSecure:false,shadow:true,overlay:true,document:null,ajaxOptions:{}},initialize:function(e){if(this.options)return
this;this.presets=Object.merge(this.presets,e);this.doc=this.presets.document||document;this.options={};this.setOptions(this.presets).build();this.bound={window:this.reposition.bind(this,[null]),scroll:this.checkTarget.bind(this),close:this.close.bind(this),key:this.onKey.bind(this)};this.isOpen=this.isLoading=false;return
this},build:function(){this.overlay=new
Element("div",{id:"sbox-overlay","aria-hidden":"true",styles:{zIndex:this.options.zIndex},tabindex:-1});this.win=new
Element("div",{id:"sbox-window",role:"dialog","aria-hidden":"true",styles:{zIndex:this.options.zIndex+2}});if(this.options.shadow){if(Browser.chrome||Browser.safari&&Browser.version>=3||Browser.opera&&Browser.version>=10.5||Browser.firefox&&Browser.version>=3.5||Browser.ie&&Browser.version>=9){this.win.addClass("shadow")}else
if(!Browser.ie6){var e=(new
Element("div",{"class":"sbox-bg-wrap"})).inject(this.win);var
t=function(e){this.overlay.fireEvent("click",[e])}.bind(this);["n","ne","e","se","s","sw","w","nw"].each(function(n){(new
Element("div",{"class":"sbox-bg
sbox-bg-"+n})).inject(e).addEvent("click",t)})}}this.content=(new
Element("div",{id:"sbox-content"})).inject(this.win);this.closeBtn=(new
Element("a",{id:"sbox-btn-close",href:"#",role:"button"})).inject(this.win);this.closeBtn.setProperty("aria-controls","sbox-window");this.fx={overlay:(new
Fx.Tween(this.overlay,Object.merge({property:"opacity",onStart:Events.prototype.clearChain,duration:250,link:"cancel"},this.options.overlayFx))).set(0),win:new
Fx.Morph(this.win,Object.merge({onStart:Events.prototype.clearChain,unit:"px",duration:750,transition:Fx.Transitions.Quint.easeOut,link:"cancel",unit:"px"},this.options.resizeFx)),content:(new
Fx.Tween(this.content,Object.merge({property:"opacity",duration:250,link:"cancel"},this.options.contentFx))).set(0)};document.id(this.doc.body).adopt(this.overlay,this.win)},assign:function(e,t){return(document.id(e)||$$(e)).addEvent("click",function(){return!SqueezeBox.fromElement(this,t)})},open:function(e,t){this.initialize();if(this.element!=null)this.trash();this.element=document.id(e)||false;this.setOptions(Object.merge(this.presets,t||{}));if(this.element&&this.options.parse){var
n=this.element.getProperty(this.options.parse);if(n&&(n=JSON.decode(n,this.options.parseSecure)))this.setOptions(n)}this.url=(this.element?this.element.get("href"):e)||this.options.url||"";this.assignOptions();var
r=r||this.options.handler;if(r)return
this.setContent(r,this.parsers[r].call(this,true));var i=false;return
this.parsers.some(function(e,t){var
n=e.call(this);if(n){i=this.setContent(t,n);return true}return
false},this)},fromElement:function(e,t){return
this.open(e,t)},assignOptions:function(){this.overlay.addClass(this.options.classOverlay);this.win.addClass(this.options.classWindow)},close:function(e){var
t=typeOf(e)=="domevent";if(t)e.stop();if(!this.isOpen||t&&!Function.from(this.options.closable).call(this,e))return
this;this.fx.overlay.start(0).chain(this.toggleOverlay.bind(this));this.win.setProperty("aria-hidden","true");this.fireEvent("onClose",[this.content]);this.trash();this.toggleListeners();this.isOpen=false;return
this},trash:function(){this.element=this.asset=null;this.content.empty();this.options={};this.removeEvents().setOptions(this.presets).callChain()},onError:function(){this.asset=null;this.setContent("string",this.options.errorMsg||"An
error occurred")},setContent:function(e,t){if(!this.handlers[e])return
false;this.content.className="sbox-content-"+e;this.applyTimer=this.applyContent.delay(this.fx.overlay.options.duration,this,this.handlers[e].call(this,t));if(this.overlay.retrieve("opacity"))return
this;this.toggleOverlay(true);this.fx.overlay.start(this.options.overlayOpacity);return
this.reposition()},applyContent:function(e,t){if(!this.isOpen&&!this.applyTimer)return;this.applyTimer=clearTimeout(this.applyTimer);this.hideContent();if(!e){this.toggleLoading(true)}else{if(this.isLoading)this.toggleLoading(false);this.fireEvent("onUpdate",[this.content],20)}if(e){if(["string","array"].contains(typeOf(e))){this.content.set("html",e)}else
{this.content.adopt(e)}}this.callChain();if(!this.isOpen){this.toggleListeners(true);this.resize(t,true);this.isOpen=true;this.win.setProperty("aria-hidden","false");this.fireEvent("onOpen",[this.content])}else{this.resize(t)}},resize:function(e,t){this.showTimer=clearTimeout(this.showTimer||null);var
n=this.doc.getSize(),r=this.doc.getScroll();this.size=Object.merge(this.isLoading?this.options.sizeLoading:this.options.size,e);var
i=self.getSize();if(this.size.x==i.x){this.size.y=this.size.y-50;this.size.x=this.size.x-20}if(n.x>979){var
s={width:this.size.x,height:this.size.y,left:(r.x+(n.x-this.size.x-this.options.marginInner.x)/2).toInt(),top:(r.y+(n.y-this.size.y-this.options.marginInner.y)/2).toInt()}}else{var
s={width:n.x-40,height:n.y,left:(r.x+10).toInt(),top:(r.y+20).toInt()}}this.hideContent();if(!t){this.fx.win.start(s).chain(this.showContent.bind(this))}else{this.win.setStyles(s);this.showTimer=this.showContent.delay(50,this)}return
this.reposition()},toggleListeners:function(e){var
t=e?"addEvent":"removeEvent";this.closeBtn[t]("click",this.bound.close);this.overlay[t]("click",this.bound.close);this.doc[t]("keydown",this.bound.key)[t]("mousewheel",this.bound.scroll);this.doc.getWindow()[t]("resize",this.bound.window)[t]("scroll",this.bound.window)},toggleLoading:function(e){this.isLoading=e;this.win[e?"addClass":"removeClass"]("sbox-loading");if(e){this.win.setProperty("aria-busy",e);this.fireEvent("onLoading",[this.win])}},toggleOverlay:function(e){if(this.options.overlay){var
t=this.doc.getSize().x;this.overlay.set("aria-hidden",e?"false":"true");this.doc.body[e?"addClass":"removeClass"]("body-overlayed");if(e){this.scrollOffset=this.doc.getWindow().getSize().x-t}else{this.doc.body.setStyle("margin-right","")}}},showContent:function(){if(this.content.get("opacity"))this.fireEvent("onShow",[this.win]);this.fx.content.start(1)},hideContent:function(){if(!this.content.get("opacity"))this.fireEvent("onHide",[this.win]);this.fx.content.cancel().set(0)},onKey:function(e){switch(e.key){case"esc":this.close(e);case"up":case"down":return
false}},checkTarget:function(e){return
e.target!==this.content&&this.content.contains(e.target)},reposition:function(){var
e=this.doc.getSize(),t=this.doc.getScroll(),n=this.doc.getScrollSize();var
r=this.overlay.getStyles("height");var
i=parseInt(r.height);if(n.y>i&&e.y>=i){this.overlay.setStyles({width:n.x+"px",height:n.y+"px"});this.win.setStyles({left:(t.x+(e.x-this.win.offsetWidth)/2-this.scrollOffset).toInt()+"px",top:(t.y+(e.y-this.win.offsetHeight)/2).toInt()+"px"})}return
this.fireEvent("onMove",[this.overlay,this.win])},removeEvents:function(e){if(!this.$events)return
this;if(!e)this.$events=null;else
if(this.$events[e])this.$events[e]=null;return
this},extend:function(e){return Object.append(this,e)},handlers:new
Hash,parsers:new Hash};SqueezeBox.extend(new
Events(function(){})).extend(new Options(function(){})).extend(new
Chain(function(){}));SqueezeBox.parsers.extend({image:function(e){return
e||/\.(?:jpg|png|gif)$/i.test(this.url)?this.url:false},clone:function(e){if(document.id(this.options.target))return
document.id(this.options.target);if(this.element&&!this.element.parentNode)return
this.element;var t=this.url.match(/#([\w-]+)$/);return
t?document.id(t[1]):e?this.element:false},ajax:function(e){return
e||this.url&&!/^(?:javascript|#)/i.test(this.url)?this.url:false},iframe:function(e){return
e||this.url?this.url:false},string:function(e){return
true}});SqueezeBox.handlers.extend({image:function(e){var t,n=new
Image;this.asset=null;n.onload=n.onabort=n.onerror=function(){n.onload=n.onabort=n.onerror=null;if(!n.width){this.onError.delay(10,this);return}var
e=this.doc.getSize();e.x-=this.options.marginImage.x;e.y-=this.options.marginImage.y;t={x:n.width,y:n.height};for(var
r=2;r--;){if(t.x>e.x){t.y*=e.x/t.x;t.x=e.x}else
if(t.y>e.y){t.x*=e.y/t.y;t.y=e.y}}t.x=t.x.toInt();t.y=t.y.toInt();this.asset=document.id(n);n=null;this.asset.width=t.x;this.asset.height=t.y;this.applyContent(this.asset,t)}.bind(this);n.src=e;if(n&&n.onload&&n.complete)n.onload();return
this.asset?[this.asset,t]:null},clone:function(e){if(e)return
e.clone();return this.onError()},adopt:function(e){if(e)return e;return
this.onError()},ajax:function(e){var
t=this.options.ajaxOptions||{};this.asset=(new
Request.HTML(Object.merge({method:"get",evalScripts:false},this.options.ajaxOptions))).addEvents({onSuccess:function(e){this.applyContent(e);if(t.evalScripts!==null&&!t.evalScripts)Browser.exec(this.asset.response.javascript);this.fireEvent("onAjax",[e,this.asset]);this.asset=null}.bind(this),onFailure:this.onError.bind(this)});this.asset.send.delay(10,this.asset,[{url:e}])},iframe:function(e){var
t=this.doc.getSize();if(t.x>979){var n=this.options.size.x;var
r=this.options.size.y}else{var n=t.x;var r=t.y-50}this.asset=new
Element("iframe",Object.merge({src:e,frameBorder:0,width:n,height:r},this.options.iframeOptions));if(this.options.iframePreload){this.asset.addEvent("load",function(){this.applyContent(this.asset.setStyle("display",""))}.bind(this));this.asset.setStyle("display","none").inject(this.content);return
false}return this.asset},string:function(e){return
e}});SqueezeBox.handlers.url=SqueezeBox.handlers.ajax;SqueezeBox.parsers.url=SqueezeBox.parsers.ajax;SqueezeBox.parsers.adopt=SqueezeBox.parsers.clone;
PK]n�[V�A9��js/moduleorder.jsnu�[���!(function() {
	jQuery(document).ready(function($) {
		var $field = $('.module-ajax-ordering'),
			$url = $field.data('url'),
			$clientId = $field.data('client-id'),
			$moduleId = $field.data('module-id'),
			$element = document.getElementById($field.data('element')),
			$linkedField = $field.data('linked-field') ?
$field.data('linked-field') : 'jform_position',
			$linkedFieldEl = $('#' + $linkedField),
			$originalOrder = $field.data('ordering'),
			$originalPos = $linkedFieldEl.val(),
			$name = $field.data('name'),
			$attr = $field.data('client-attr') ?
$field.data('client-attr') : '',
			$id = $field.attr('id') + '_1',
			$orders = new Array(),
			getNewOrder = function() {
				$.ajax({
					type: "GET",
					dataType: "json",
					url: $url,
					data: {
						"client_id": $clientId,
						"module_id": $moduleId,
						"position" : $originalPos
					}
					})
					.fail(function (jqXHR, textStatus, error) {
						Joomla.renderMessages(Joomla.ajaxErrorsMessages(jqXHR, textStatus,
error));

						window.scrollTo(0, 0);
					})
					.done(function (response) {
						if (response.data)
						{
							// Check if everything is OK
							if (response.data.length > 0)
							{
								var i;
								for (i = 0; i < response.data.length; ++i) {
									$orders[i] = response.data[i].split(',');
								}

								// Remove previous <select>, it will be recreated by
writeDynaList()
								var $previous = $("#" + $id);
								if ($previous.data('chosen')){
									$previous.chosen('destroy');
								}
								$previous.remove();

								writeDynaList('name="' + $name + '"
id="' + $id +'"' + $attr, $orders, $originalPos,
$originalPos, $originalOrder, $element);

								// Add chosen to the element
								$("#" + $id).chosen();
							}
						}

						// Render messages, if any. There are only message in case of errors.
						if (typeof response.messages == 'object' &&
response.messages !== null)
						{
							Joomla.renderMessages(response.messages);
							window.scrollTo(0, 0);
						}
					});
			};

		// Initialize the field on document ready
		getNewOrder();

		// Event listener for the linked field
		$linkedFieldEl.on('change', function() {
			$originalPos = $linkedFieldEl.val();
			getNewOrder();
		});
	});
})();
PK]n�[7� MM
js/mootools-core-uncompressed.jsnu�[���/*
---
MooTools: the javascript framework

web build:
 - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0

packager build:
 - packager build Core/Core Core/Array Core/String Core/Number
Core/Function Core/Object Core/Event Core/Browser Core/Class
Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element
Core/Element.Style Core/Element.Event Core/Element.Delegation
Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph
Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON
Core/Cookie Core/JSON Core/DOMReady Core/Swiff

...
*/

/*
---

name: Core

description: The heart of MooTools.

license: MIT-style license.

copyright: Copyright (c) 2006-2012 [Valerio
Proietti](http://mad4milk.net/).

authors: The MooTools production team (http://mootools.net/developers/)

inspiration:
  - Class implementation inspired by
[Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006
Dean Edwards, [GNU Lesser General Public
License](http://opensource.org/licenses/lgpl-license.php)
  - Some functionality inspired by [Prototype.js](http://prototypejs.org)
Copyright (c) 2005-2007 Sam Stephenson, [MIT
License](http://opensource.org/licenses/mit-license.php)

provides: [Core, MooTools, Type, typeOf, instanceOf, Native]

...
*/

(function(){

this.MooTools = {
	version: '1.4.5',
	build: '74e34796f5f76640cdb98853004650aea1499d69'
};

// typeOf, instanceOf

var typeOf = this.typeOf = function(item){
	if (item == null) return 'null';
	if (item.$family != null) return item.$family();

	if (item.nodeName){
		if (item.nodeType == 1) return 'element';
		if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ?
'textnode' : 'whitespace';
	} else if (typeof item.length == 'number'){
		if (item.callee) return 'arguments';
		if ('item' in item) return 'collection';
	}

	return typeof item;
};

var instanceOf = this.instanceOf = function(item, object){
	if (item == null) return false;
	var constructor = item.$constructor || item.constructor;
	while (constructor){
		if (constructor === object) return true;
		constructor = constructor.parent;
	}
	/*<ltIE8>*/
	if (!item.hasOwnProperty) return false;
	/*</ltIE8>*/
	return item instanceof object;
};

// Function overloading

var Function = this.Function;

var enumerables = true;
for (var i in {toString: 1}) enumerables = null;
if (enumerables) enumerables = ['hasOwnProperty',
'valueOf', 'isPrototypeOf',
'propertyIsEnumerable', 'toLocaleString',
'toString', 'constructor'];

Function.prototype.overloadSetter = function(usePlural){
	var self = this;
	return function(a, b){
		if (a == null) return this;
		if (usePlural || typeof a != 'string'){
			for (var k in a) self.call(this, k, a[k]);
			if (enumerables) for (var i = enumerables.length; i--;){
				k = enumerables[i];
				if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
			}
		} else {
			self.call(this, a, b);
		}
		return this;
	};
};

Function.prototype.overloadGetter = function(usePlural){
	var self = this;
	return function(a){
		var args, result;
		if (typeof a != 'string') args = a;
		else if (arguments.length > 1) args = arguments;
		else if (usePlural) args = [a];
		if (args){
			result = {};
			for (var i = 0; i < args.length; i++) result[args[i]] =
self.call(this, args[i]);
		} else {
			result = self.call(this, a);
		}
		return result;
	};
};

Function.prototype.extend = function(key, value){
	this[key] = value;
}.overloadSetter();

Function.prototype.implement = function(key, value){
	this.prototype[key] = value;
}.overloadSetter();

// From

var slice = Array.prototype.slice;

Function.from = function(item){
	return (typeOf(item) == 'function') ? item : function(){
		return item;
	};
};

Array.from = function(item){
	if (item == null) return [];
	return (Type.isEnumerable(item) && typeof item !=
'string') ? (typeOf(item) == 'array') ? item :
slice.call(item) : [item];
};

Number.from = function(item){
	var number = parseFloat(item);
	return isFinite(number) ? number : null;
};

String.from = function(item){
	return item + '';
};

// hide, protect

Function.implement({

	hide: function(){
		this.$hidden = true;
		return this;
	},

	protect: function(){
		this.$protected = true;
		return this;
	}

});

// Type

var Type = this.Type = function(name, object){
	if (name){
		var lower = name.toLowerCase();
		var typeCheck = function(item){
			return (typeOf(item) == lower);
		};

		Type['is' + name] = typeCheck;
		if (object != null){
			object.prototype.$family = (function(){
				return lower;
			}).hide();
			
		}
	}

	if (object == null) return null;

	object.extend(this);
	object.$constructor = Type;
	object.prototype.$constructor = object;

	return object;
};

var toString = Object.prototype.toString;

Type.isEnumerable = function(item){
	return (item != null && typeof item.length == 'number'
&& toString.call(item) != '[object Function]' );
};

var hooks = {};

var hooksOf = function(object){
	var type = typeOf(object.prototype);
	return hooks[type] || (hooks[type] = []);
};

var implement = function(name, method){
	if (method && method.$hidden) return;

	var hooks = hooksOf(this);

	for (var i = 0; i < hooks.length; i++){
		var hook = hooks[i];
		if (typeOf(hook) == 'type') implement.call(hook, name, method);
		else hook.call(this, name, method);
	}

	var previous = this.prototype[name];
	if (previous == null || !previous.$protected) this.prototype[name] =
method;

	if (this[name] == null && typeOf(method) == 'function')
extend.call(this, name, function(item){
		return method.apply(item, slice.call(arguments, 1));
	});
};

var extend = function(name, method){
	if (method && method.$hidden) return;
	var previous = this[name];
	if (previous == null || !previous.$protected) this[name] = method;
};

Type.implement({

	implement: implement.overloadSetter(),

	extend: extend.overloadSetter(),

	alias: function(name, existing){
		implement.call(this, name, this.prototype[existing]);
	}.overloadSetter(),

	mirror: function(hook){
		hooksOf(this).push(hook);
		return this;
	}

});

new Type('Type', Type);

// Default Types

var force = function(name, object, methods){
	var isType = (object != Object),
		prototype = object.prototype;

	if (isType) object = new Type(name, object);

	for (var i = 0, l = methods.length; i < l; i++){
		var key = methods[i],
			generic = object[key],
			proto = prototype[key];

		if (generic) generic.protect();
		if (isType && proto) object.implement(key, proto.protect());
	}

	if (isType){
		var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);
		object.forEachMethod = function(fn){
			if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l;
i++){
				fn.call(prototype, prototype[methods[i]], methods[i]);
			}
			for (var key in prototype) fn.call(prototype, prototype[key], key)
		};
	}

	return force;
};

force('String', String, [
	'charAt', 'charCodeAt', 'concat',
'indexOf', 'lastIndexOf', 'match',
'quote', 'replace', 'search',
	'slice', 'split', 'substr',
'substring', 'trim', 'toLowerCase',
'toUpperCase'
])('Array', Array, [
	'pop', 'push', 'reverse', 'shift',
'sort', 'splice', 'unshift',
'concat', 'join', 'slice',
	'indexOf', 'lastIndexOf', 'filter',
'forEach', 'every', 'map', 'some',
'reduce', 'reduceRight'
])('Number', Number, [
	'toExponential', 'toFixed',
'toLocaleString', 'toPrecision'
])('Function', Function, [
	'apply', 'call', 'bind'
])('RegExp', RegExp, [
	'exec', 'test'
])('Object', Object, [
	'create', 'defineProperty',
'defineProperties', 'keys',
	'getPrototypeOf', 'getOwnPropertyDescriptor',
'getOwnPropertyNames',
	'preventExtensions', 'isExtensible', 'seal',
'isSealed', 'freeze', 'isFrozen'
])('Date', Date, ['now']);

Object.extend = extend.overloadSetter();

Date.extend('now', function(){
	return +(new Date);
});

new Type('Boolean', Boolean);

// fixes NaN returning as Number

Number.prototype.$family = function(){
	return isFinite(this) ? 'number' : 'null';
}.hide();

// Number.random

Number.extend('random', function(min, max){
	return Math.floor(Math.random() * (max - min + 1) + min);
});

// forEach, each

var hasOwnProperty = Object.prototype.hasOwnProperty;
Object.extend('forEach', function(object, fn, bind){
	for (var key in object){
		if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key,
object);
	}
});

Object.each = Object.forEach;

Array.implement({

	forEach: function(fn, bind){
		for (var i = 0, l = this.length; i < l; i++){
			if (i in this) fn.call(bind, this[i], i, this);
		}
	},

	each: function(fn, bind){
		Array.forEach(this, fn, bind);
		return this;
	}

});

// Array & Object cloning, Object merging and appending

var cloneOf = function(item){
	switch (typeOf(item)){
		case 'array': return item.clone();
		case 'object': return Object.clone(item);
		default: return item;
	}
};

Array.implement('clone', function(){
	var i = this.length, clone = new Array(i);
	while (i--) clone[i] = cloneOf(this[i]);
	return clone;
});

var mergeOne = function(source, key, current){
	switch (typeOf(current)){
		case 'object':
			if (typeOf(source[key]) == 'object') Object.merge(source[key],
current);
			else source[key] = Object.clone(current);
		break;
		case 'array': source[key] = current.clone(); break;
		default: source[key] = current;
	}
	return source;
};

Object.extend({

	merge: function(source, k, v){
		if (typeOf(k) == 'string') return mergeOne(source, k, v);
		for (var i = 1, l = arguments.length; i < l; i++){
			var object = arguments[i];
			for (var key in object) mergeOne(source, key, object[key]);
		}
		return source;
	},

	clone: function(object){
		var clone = {};
		for (var key in object) clone[key] = cloneOf(object[key]);
		return clone;
	},

	append: function(original){
		for (var i = 1, l = arguments.length; i < l; i++){
			var extended = arguments[i] || {};
			for (var key in extended) original[key] = extended[key];
		}
		return original;
	}

});

// Object-less types

['Object', 'WhiteSpace', 'TextNode',
'Collection', 'Arguments'].each(function(name){
	new Type(name);
});

// Unique ID

var UID = Date.now();

String.extend('uniqueID', function(){
	return (UID++).toString(36);
});



})();


/*
---

name: Array

description: Contains Array Prototypes like each, contains, and erase.

license: MIT-style license.

requires: Type

provides: Array

...
*/

Array.implement({

	/*<!ES5>*/
	every: function(fn, bind){
		for (var i = 0, l = this.length >>> 0; i < l; i++){
			if ((i in this) && !fn.call(bind, this[i], i, this)) return
false;
		}
		return true;
	},

	filter: function(fn, bind){
		var results = [];
		for (var value, i = 0, l = this.length >>> 0; i < l; i++) if
(i in this){
			value = this[i];
			if (fn.call(bind, value, i, this)) results.push(value);
		}
		return results;
	},

	indexOf: function(item, from){
		var length = this.length >>> 0;
		for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i
< length; i++){
			if (this[i] === item) return i;
		}
		return -1;
	},

	map: function(fn, bind){
		var length = this.length >>> 0, results = Array(length);
		for (var i = 0; i < length; i++){
			if (i in this) results[i] = fn.call(bind, this[i], i, this);
		}
		return results;
	},

	some: function(fn, bind){
		for (var i = 0, l = this.length >>> 0; i < l; i++){
			if ((i in this) && fn.call(bind, this[i], i, this)) return true;
		}
		return false;
	},
	/*</!ES5>*/

	clean: function(){
		return this.filter(function(item){
			return item != null;
		});
	},

	invoke: function(methodName){
		var args = Array.slice(arguments, 1);
		return this.map(function(item){
			return item[methodName].apply(item, args);
		});
	},

	associate: function(keys){
		var obj = {}, length = Math.min(this.length, keys.length);
		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
		return obj;
	},

	link: function(object){
		var result = {};
		for (var i = 0, l = this.length; i < l; i++){
			for (var key in object){
				if (object[key](this[i])){
					result[key] = this[i];
					delete object[key];
					break;
				}
			}
		}
		return result;
	},

	contains: function(item, from){
		return this.indexOf(item, from) != -1;
	},

	append: function(array){
		this.push.apply(this, array);
		return this;
	},

	getLast: function(){
		return (this.length) ? this[this.length - 1] : null;
	},

	getRandom: function(){
		return (this.length) ? this[Number.random(0, this.length - 1)] : null;
	},

	include: function(item){
		if (!this.contains(item)) this.push(item);
		return this;
	},

	combine: function(array){
		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
		return this;
	},

	erase: function(item){
		for (var i = this.length; i--;){
			if (this[i] === item) this.splice(i, 1);
		}
		return this;
	},

	empty: function(){
		this.length = 0;
		return this;
	},

	flatten: function(){
		var array = [];
		for (var i = 0, l = this.length; i < l; i++){
			var type = typeOf(this[i]);
			if (type == 'null') continue;
			array = array.concat((type == 'array' || type ==
'collection' || type == 'arguments' ||
instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
		}
		return array;
	},

	pick: function(){
		for (var i = 0, l = this.length; i < l; i++){
			if (this[i] != null) return this[i];
		}
		return null;
	},

	hexToRgb: function(array){
		if (this.length != 3) return null;
		var rgb = this.map(function(value){
			if (value.length == 1) value += value;
			return value.toInt(16);
		});
		return (array) ? rgb : 'rgb(' + rgb + ')';
	},

	rgbToHex: function(array){
		if (this.length < 3) return null;
		if (this.length == 4 && this[3] == 0 && !array) return
'transparent';
		var hex = [];
		for (var i = 0; i < 3; i++){
			var bit = (this[i] - 0).toString(16);
			hex.push((bit.length == 1) ? '0' + bit : bit);
		}
		return (array) ? hex : '#' + hex.join('');
	}

});




/*
---

name: String

description: Contains String Prototypes like camelCase, capitalize, test,
and toInt.

license: MIT-style license.

requires: Type

provides: String

...
*/

String.implement({

	test: function(regex, params){
		return ((typeOf(regex) == 'regexp') ? regex : new
RegExp('' + regex, params)).test(this);
	},

	contains: function(string, separator){
		return (separator) ? (separator + this + separator).indexOf(separator +
string + separator) > -1 : String(this).indexOf(string) > -1;
	},

	trim: function(){
		return String(this).replace(/^\s+|\s+$/g, '');
	},

	clean: function(){
		return String(this).replace(/\s+/g, ' ').trim();
	},

	camelCase: function(){
		return String(this).replace(/-\D/g, function(match){
			return match.charAt(1).toUpperCase();
		});
	},

	hyphenate: function(){
		return String(this).replace(/[A-Z]/g, function(match){
			return ('-' + match.charAt(0).toLowerCase());
		});
	},

	capitalize: function(){
		return String(this).replace(/\b[a-z]/g, function(match){
			return match.toUpperCase();
		});
	},

	escapeRegExp: function(){
		return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,
'\\$1');
	},

	toInt: function(base){
		return parseInt(this, base || 10);
	},

	toFloat: function(){
		return parseFloat(this);
	},

	hexToRgb: function(array){
		var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
		return (hex) ? hex.slice(1).hexToRgb(array) : null;
	},

	rgbToHex: function(array){
		var rgb = String(this).match(/\d{1,3}/g);
		return (rgb) ? rgb.rgbToHex(array) : null;
	},

	substitute: function(object, regexp){
		return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g),
function(match, name){
			if (match.charAt(0) == '\\') return match.slice(1);
			return (object[name] != null) ? object[name] : '';
		});
	}

});


/*
---

name: Number

description: Contains Number Prototypes like limit, round, times, and ceil.

license: MIT-style license.

requires: Type

provides: Number

...
*/

Number.implement({

	limit: function(min, max){
		return Math.min(max, Math.max(min, this));
	},

	round: function(precision){
		precision = Math.pow(10, precision || 0).toFixed(precision < 0 ?
-precision : 0);
		return Math.round(this * precision) / precision;
	},

	times: function(fn, bind){
		for (var i = 0; i < this; i++) fn.call(bind, i, this);
	},

	toFloat: function(){
		return parseFloat(this);
	},

	toInt: function(base){
		return parseInt(this, base || 10);
	}

});

Number.alias('each', 'times');

(function(math){
	var methods = {};
	math.each(function(name){
		if (!Number[name]) methods[name] = function(){
			return Math[name].apply(null, [this].concat(Array.from(arguments)));
		};
	});
	Number.implement(methods);
})(['abs', 'acos', 'asin', 'atan',
'atan2', 'ceil', 'cos', 'exp',
'floor', 'log', 'max', 'min',
'pow', 'sin', 'sqrt', 'tan']);


/*
---

name: Function

description: Contains Function Prototypes like create, bind, pass, and
delay.

license: MIT-style license.

requires: Type

provides: Function

...
*/

Function.extend({

	attempt: function(){
		for (var i = 0, l = arguments.length; i < l; i++){
			try {
				return arguments[i]();
			} catch (e){}
		}
		return null;
	}

});

Function.implement({

	attempt: function(args, bind){
		try {
			return this.apply(bind, Array.from(args));
		} catch (e){}

		return null;
	},

	/*<!ES5-bind>*/
	bind: function(that){
		var self = this,
			args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
			F = function(){};

		var bound = function(){
			var context = that, length = arguments.length;
			if (this instanceof bound){
				F.prototype = self.prototype;
				context = new F;
			}
			var result = (!args && !length)
				? self.call(context)
				: self.apply(context, args && length ?
args.concat(Array.slice(arguments)) : args || arguments);
			return context == that ? result : context;
		};
		return bound;
	},
	/*</!ES5-bind>*/

	pass: function(args, bind){
		var self = this;
		if (args != null) args = Array.from(args);
		return function(){
			return self.apply(bind, args || arguments);
		};
	},

	delay: function(delay, bind, args){
		return setTimeout(this.pass((args == null ? [] : args), bind), delay);
	},

	periodical: function(periodical, bind, args){
		return setInterval(this.pass((args == null ? [] : args), bind),
periodical);
	}

});




/*
---

name: Object

description: Object generic methods

license: MIT-style license.

requires: Type

provides: [Object, Hash]

...
*/

(function(){

var hasOwnProperty = Object.prototype.hasOwnProperty;

Object.extend({

	subset: function(object, keys){
		var results = {};
		for (var i = 0, l = keys.length; i < l; i++){
			var k = keys[i];
			if (k in object) results[k] = object[k];
		}
		return results;
	},

	map: function(object, fn, bind){
		var results = {};
		for (var key in object){
			if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind,
object[key], key, object);
		}
		return results;
	},

	filter: function(object, fn, bind){
		var results = {};
		for (var key in object){
			var value = object[key];
			if (hasOwnProperty.call(object, key) && fn.call(bind, value,
key, object)) results[key] = value;
		}
		return results;
	},

	every: function(object, fn, bind){
		for (var key in object){
			if (hasOwnProperty.call(object, key) && !fn.call(bind,
object[key], key)) return false;
		}
		return true;
	},

	some: function(object, fn, bind){
		for (var key in object){
			if (hasOwnProperty.call(object, key) && fn.call(bind,
object[key], key)) return true;
		}
		return false;
	},

	keys: function(object){
		var keys = [];
		for (var key in object){
			if (hasOwnProperty.call(object, key)) keys.push(key);
		}
		return keys;
	},

	values: function(object){
		var values = [];
		for (var key in object){
			if (hasOwnProperty.call(object, key)) values.push(object[key]);
		}
		return values;
	},

	getLength: function(object){
		return Object.keys(object).length;
	},

	keyOf: function(object, value){
		for (var key in object){
			if (hasOwnProperty.call(object, key) && object[key] === value)
return key;
		}
		return null;
	},

	contains: function(object, value){
		return Object.keyOf(object, value) != null;
	},

	toQueryString: function(object, base){
		var queryString = [];

		Object.each(object, function(value, key){
			if (base) key = base + '[' + key + ']';
			var result;
			switch (typeOf(value)){
				case 'object': result = Object.toQueryString(value, key);
break;
				case 'array':
					var qs = {};
					value.each(function(val, i){
						qs[i] = val;
					});
					result = Object.toQueryString(qs, key);
				break;
				default: result = key + '=' + encodeURIComponent(value);
			}
			if (value != null) queryString.push(result);
		});

		return queryString.join('&');
	}

});

})();




/*
---

name: Browser

description: The Browser Object. Contains Browser initialization, Window
and Document, and the Browser Hash.

license: MIT-style license.

requires: [Array, Function, Number, String]

provides: [Browser, Window, Document]

...
*/

(function(){

var document = this.document;
var window = document.window = this;

var ua = navigator.userAgent.toLowerCase(),
	platform = navigator.platform.toLowerCase(),
	UA =
ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/)
|| [null, 'unknown', 0],
	mode = UA[1] == 'ie' && document.documentMode;

var Browser = this.Browser = {

	extend: Function.prototype.extend,

	name: (UA[1] == 'version') ? UA[3] : UA[1],

	version: mode || parseFloat((UA[1] == 'opera' && UA[4])
? UA[4] : UA[2]),

	Platform: {
		name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' :
(ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) ||
['other'])[0]
	},

	Features: {
		xpath: !!(document.evaluate),
		air: !!(window.runtime),
		query: !!(document.querySelector),
		json: !!(window.JSON)
	},

	Plugins: {}

};

Browser[Browser.name] = true;
Browser[Browser.name + parseInt(Browser.version, 10)] = true;
Browser.Platform[Browser.Platform.name] = true;

// Request

Browser.Request = (function(){

	var XMLHTTP = function(){
		return new XMLHttpRequest();
	};

	var MSXML2 = function(){
		return new ActiveXObject('MSXML2.XMLHTTP');
	};

	var MSXML = function(){
		return new ActiveXObject('Microsoft.XMLHTTP');
	};

	return Function.attempt(function(){
		XMLHTTP();
		return XMLHTTP;
	}, function(){
		MSXML2();
		return MSXML2;
	}, function(){
		MSXML();
		return MSXML;
	});

})();

Browser.Features.xhr = !!(Browser.Request);

// Flash detection

var version = (Function.attempt(function(){
	return navigator.plugins['Shockwave Flash'].description;
}, function(){
	return new
ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
}) || '0 r0').match(/\d+/g);

Browser.Plugins.Flash = {
	version: Number(version[0] || '0.' + version[1]) || 0,
	build: Number(version[2]) || 0
};

// String scripts

Browser.exec = function(text){
	if (!text) return text;
	if (window.execScript){
		window.execScript(text);
	} else {
		var script = document.createElement('script');
		script.setAttribute('type', 'text/javascript');
		script.text = text;
		document.head.appendChild(script);
		document.head.removeChild(script);
	}
	return text;
};

String.implement('stripScripts', function(exec){
	var scripts = '';
	var text =
this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,
function(all, code){
		scripts += code + '\n';
		return '';
	});
	if (exec === true) Browser.exec(scripts);
	else if (typeOf(exec) == 'function') exec(scripts, text);
	return text;
});

// Window, Document

Browser.extend({
	Document: this.Document,
	Window: this.Window,
	Element: this.Element,
	Event: this.Event
});

this.Window = this.$constructor = new Type('Window',
function(){});

this.$family = Function.from('window').hide();

Window.mirror(function(name, method){
	window[name] = method;
});

this.Document = document.$constructor = new Type('Document',
function(){});

document.$family = Function.from('document').hide();

Document.mirror(function(name, method){
	document[name] = method;
});

document.html = document.documentElement;
if (!document.head) document.head =
document.getElementsByTagName('head')[0];

if (document.execCommand) try {
	document.execCommand("BackgroundImageCache", false, true);
} catch (e){}

/*<ltIE9>*/
if (this.attachEvent && !this.addEventListener){
	var unloadEvent = function(){
		this.detachEvent('onunload', unloadEvent);
		document.head = document.html = document.window = null;
	};
	this.attachEvent('onunload', unloadEvent);
}

// IE fails on collections and <select>.options (refers to
<select>)
var arrayFrom = Array.from;
try {
	arrayFrom(document.html.childNodes);
} catch(e){
	Array.from = function(item){
		if (typeof item != 'string' && Type.isEnumerable(item)
&& typeOf(item) != 'array'){
			var i = item.length, array = new Array(i);
			while (i--) array[i] = item[i];
			return array;
		}
		return arrayFrom(item);
	};

	var prototype = Array.prototype,
		slice = prototype.slice;
	['pop', 'push', 'reverse',
'shift', 'sort', 'splice',
'unshift', 'concat', 'join',
'slice'].each(function(name){
		var method = prototype[name];
		Array[name] = function(item){
			return method.apply(Array.from(item), slice.call(arguments, 1));
		};
	});
}
/*</ltIE9>*/



})();


/*
---

name: Event

description: Contains the Event Type, to make the event object
cross-browser.

license: MIT-style license.

requires: [Window, Document, Array, Function, String, Object]

provides: Event

...
*/

(function() {

var _keys = {};

var DOMEvent = this.DOMEvent = new Type('DOMEvent',
function(event, win){
	if (!win) win = window;
	event = event || win.event;
	if (event.$extended) return event;
	this.event = event;
	this.$extended = true;
	this.shift = event.shiftKey;
	this.control = event.ctrlKey;
	this.alt = event.altKey;
	this.meta = event.metaKey;
	var type = this.type = event.type;
	var target = event.target || event.srcElement;
	while (target && target.nodeType == 3) target = target.parentNode;
	this.target = document.id(target);

	if (type.indexOf('key') == 0){
		var code = this.code = (event.which || event.keyCode);
		this.key = _keys[code];
		if (type == 'keydown'){
			if (code > 111 && code < 124) this.key = 'f' +
(code - 111);
			else if (code > 95 && code < 106) this.key = code - 96;
		}
		if (this.key == null) this.key = String.fromCharCode(code).toLowerCase();
	} else if (type == 'click' || type == 'dblclick' ||
type == 'contextmenu' || type == 'DOMMouseScroll' ||
type.indexOf('mouse') == 0){
		var doc = win.document;
		doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ?
doc.html : doc.body;
		this.page = {
			x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
			y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
		};
		this.client = {
			x: (event.pageX != null) ? event.pageX - win.pageXOffset :
event.clientX,
			y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
		};
		if (type == 'DOMMouseScroll' || type == 'mousewheel')
			this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 :
-(event.detail || 0) / 3;

		this.rightClick = (event.which == 3 || event.button == 2);
		if (type == 'mouseover' || type == 'mouseout'){
			var related = event.relatedTarget || event[(type ==
'mouseover' ? 'from' : 'to') +
'Element'];
			while (related && related.nodeType == 3) related =
related.parentNode;
			this.relatedTarget = document.id(related);
		}
	} else if (type.indexOf('touch') == 0 ||
type.indexOf('gesture') == 0){
		this.rotation = event.rotation;
		this.scale = event.scale;
		this.targetTouches = event.targetTouches;
		this.changedTouches = event.changedTouches;
		var touches = this.touches = event.touches;
		if (touches && touches[0]){
			var touch = touches[0];
			this.page = {x: touch.pageX, y: touch.pageY};
			this.client = {x: touch.clientX, y: touch.clientY};
		}
	}

	if (!this.client) this.client = {};
	if (!this.page) this.page = {};
});

DOMEvent.implement({

	stop: function(){
		return this.preventDefault().stopPropagation();
	},

	stopPropagation: function(){
		if (this.event.stopPropagation) this.event.stopPropagation();
		else this.event.cancelBubble = true;
		return this;
	},

	preventDefault: function(){
		if (this.event.preventDefault) this.event.preventDefault();
		else this.event.returnValue = false;
		return this;
	}

});

DOMEvent.defineKey = function(code, key){
	_keys[code] = key;
	return this;
};

DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true);

DOMEvent.defineKeys({
	'38': 'up', '40': 'down',
'37': 'left', '39': 'right',
	'27': 'esc', '32': 'space',
'8': 'backspace', '9': 'tab',
	'46': 'delete', '13': 'enter'
});

})();






/*
---

name: Class

description: Contains the Class Function for easily creating, extending,
and implementing reusable Classes.

license: MIT-style license.

requires: [Array, String, Function, Number]

provides: Class

...
*/

(function(){

var Class = this.Class = new Type('Class', function(params){
	if (instanceOf(params, Function)) params = {initialize: params};

	var newClass = function(){
		reset(this);
		if (newClass.$prototyping) return this;
		this.$caller = null;
		var value = (this.initialize) ? this.initialize.apply(this, arguments) :
this;
		this.$caller = this.caller = null;
		return value;
	}.extend(this).implement(params);

	newClass.$constructor = Class;
	newClass.prototype.$constructor = newClass;
	newClass.prototype.parent = parent;

	return newClass;
});

var parent = function(){
	if (!this.$caller) throw new Error('The method "parent"
cannot be called.');
	var name = this.$caller.$name,
		parent = this.$caller.$owner.parent,
		previous = (parent) ? parent.prototype[name] : null;
	if (!previous) throw new Error('The method "' + name +
'" has no parent.');
	return previous.apply(this, arguments);
};

var reset = function(object){
	for (var key in object){
		var value = object[key];
		switch (typeOf(value)){
			case 'object':
				var F = function(){};
				F.prototype = value;
				object[key] = reset(new F);
			break;
			case 'array': object[key] = value.clone(); break;
		}
	}
	return object;
};

var wrap = function(self, key, method){
	if (method.$origin) method = method.$origin;
	var wrapper = function(){
		if (method.$protected && this.$caller == null) throw new
Error('The method "' + key + '" cannot be
called.');
		var caller = this.caller, current = this.$caller;
		this.caller = current; this.$caller = wrapper;
		var result = method.apply(this, arguments);
		this.$caller = current; this.caller = caller;
		return result;
	}.extend({$owner: self, $origin: method, $name: key});
	return wrapper;
};

var implement = function(key, value, retain){
	if (Class.Mutators.hasOwnProperty(key)){
		value = Class.Mutators[key].call(this, value);
		if (value == null) return this;
	}

	if (typeOf(value) == 'function'){
		if (value.$hidden) return this;
		this.prototype[key] = (retain) ? value : wrap(this, key, value);
	} else {
		Object.merge(this.prototype, key, value);
	}

	return this;
};

var getInstance = function(klass){
	klass.$prototyping = true;
	var proto = new klass;
	delete klass.$prototyping;
	return proto;
};

Class.implement('implement', implement.overloadSetter());

Class.Mutators = {

	Extends: function(parent){
		this.parent = parent;
		this.prototype = getInstance(parent);
	},

	Implements: function(items){
		Array.from(items).each(function(item){
			var instance = new item;
			for (var key in instance) implement.call(this, key, instance[key],
true);
		}, this);
	}
};

})();


/*
---

name: Class.Extras

description: Contains Utility Classes that can be implemented into your own
Classes to ease the execution of many common tasks.

license: MIT-style license.

requires: Class

provides: [Class.Extras, Chain, Events, Options]

...
*/

(function(){

this.Chain = new Class({

	$chain: [],

	chain: function(){
		this.$chain.append(Array.flatten(arguments));
		return this;
	},

	callChain: function(){
		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments)
: false;
	},

	clearChain: function(){
		this.$chain.empty();
		return this;
	}

});

var removeOn = function(string){
	return string.replace(/^on([A-Z])/, function(full, first){
		return first.toLowerCase();
	});
};

this.Events = new Class({

	$events: {},

	addEvent: function(type, fn, internal){
		type = removeOn(type);

		

		this.$events[type] = (this.$events[type] || []).include(fn);
		if (internal) fn.internal = true;
		return this;
	},

	addEvents: function(events){
		for (var type in events) this.addEvent(type, events[type]);
		return this;
	},

	fireEvent: function(type, args, delay){
		type = removeOn(type);
		var events = this.$events[type];
		if (!events) return this;
		args = Array.from(args);
		events.each(function(fn){
			if (delay) fn.delay(delay, this, args);
			else fn.apply(this, args);
		}, this);
		return this;
	},

	removeEvent: function(type, fn){
		type = removeOn(type);
		var events = this.$events[type];
		if (events && !fn.internal){
			var index =  events.indexOf(fn);
			if (index != -1) delete events[index];
		}
		return this;
	},

	removeEvents: function(events){
		var type;
		if (typeOf(events) == 'object'){
			for (type in events) this.removeEvent(type, events[type]);
			return this;
		}
		if (events) events = removeOn(events);
		for (type in this.$events){
			if (events && events != type) continue;
			var fns = this.$events[type];
			for (var i = fns.length; i--;) if (i in fns){
				this.removeEvent(type, fns[i]);
			}
		}
		return this;
	}

});

this.Options = new Class({

	setOptions: function(){
		var options = this.options = Object.merge.apply(null, [{},
this.options].append(arguments));
		if (this.addEvent) for (var option in options){
			if (typeOf(options[option]) != 'function' ||
!(/^on[A-Z]/).test(option)) continue;
			this.addEvent(option, options[option]);
			delete options[option];
		}
		return this;
	}

});

})();


/*
---
name: Slick.Parser
description: Standalone CSS3 Selector parser
provides: Slick.Parser
...
*/

;(function(){

var parsed,
	separatorIndex,
	combinatorIndex,
	reversed,
	cache = {},
	reverseCache = {},
	reUnescape = /\\/g;

var parse = function(expression, isReversed){
	if (expression == null) return null;
	if (expression.Slick === true) return expression;
	expression = ('' + expression).replace(/^\s+|\s+$/g,
'');
	reversed = !!isReversed;
	var currentCache = (reversed) ? reverseCache : cache;
	if (currentCache[expression]) return currentCache[expression];
	parsed = {
		Slick: true,
		expressions: [],
		raw: expression,
		reverse: function(){
			return parse(this.raw, true);
		}
	};
	separatorIndex = -1;
	while (expression != (expression = expression.replace(regexp, parser)));
	parsed.length = parsed.expressions.length;
	return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
};

var reverseCombinator = function(combinator){
	if (combinator === '!') return ' ';
	else if (combinator === ' ') return '!';
	else if ((/^!/).test(combinator)) return combinator.replace(/^!/,
'');
	else return '!' + combinator;
};

var reverse = function(expression){
	var expressions = expression.expressions;
	for (var i = 0; i < expressions.length; i++){
		var exp = expressions[i];
		var last = {parts: [], tag: '*', combinator:
reverseCombinator(exp[0].combinator)};

		for (var j = 0; j < exp.length; j++){
			var cexp = exp[j];
			if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
			cexp.combinator = cexp.reverseCombinator;
			delete cexp.reverseCombinator;
		}

		exp.reverse().push(last);
	}
	return expression;
};

var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008
Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT
License
	return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
		return '\\' + match;
	});
};

var regexp = new RegExp(
/*
#!/usr/bin/env ruby
puts "\t\t" +
DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
__END__
	"(?x)^(?:\
	  \\s* ( , ) \\s*               # Separator          \n\
	| \\s* ( <combinator>+ ) \\s*   # Combinator         \n\
	|      ( \\s+ )                 # CombinatorChildren \n\
	|      ( <unicode>+ | \\* )     # Tag                \n\
	| \\#  ( <unicode>+       )     # ID                 \n\
	| \\.  ( <unicode>+       )     # ClassName          \n\
	|                               # Attribute          \n\
	\\[  \
		\\s* (<unicode1>+)  (?:  \
			\\s* ([*^$!~|]?=)  (?:  \
				\\s* (?:\
					([\"']?)(.*?)\\9 \
				)\
			)  \
		)?  \\s*  \
	\\](?!\\]) \n\
	|   :+ ( <unicode>+ )(?:\
	\\( (?:\
		(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
	) \\)\
	)?\
	)"
*/
	"^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
	.replace(/<combinator>/, '[' +
escapeRegExp(">+~`!@$%^&={}\\;</") + ']')
	.replace(/<unicode>/g,
'(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
	.replace(/<unicode1>/g,
'(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
);

function parser(
	rawMatch,

	separator,
	combinator,
	combinatorChildren,

	tagName,
	id,
	className,

	attributeKey,
	attributeOperator,
	attributeQuote,
	attributeValue,

	pseudoMarker,
	pseudoClass,
	pseudoQuote,
	pseudoClassQuotedValue,
	pseudoClassValue
){
	if (separator || separatorIndex === -1){
		parsed.expressions[++separatorIndex] = [];
		combinatorIndex = -1;
		if (separator) return '';
	}

	if (combinator || combinatorChildren || combinatorIndex === -1){
		combinator = combinator || ' ';
		var currentSeparator = parsed.expressions[separatorIndex];
		if (reversed && currentSeparator[combinatorIndex])
			currentSeparator[combinatorIndex].reverseCombinator =
reverseCombinator(combinator);
		currentSeparator[++combinatorIndex] = {combinator: combinator, tag:
'*'};
	}

	var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];

	if (tagName){
		currentParsed.tag = tagName.replace(reUnescape, '');

	} else if (id){
		currentParsed.id = id.replace(reUnescape, '');

	} else if (className){
		className = className.replace(reUnescape, '');

		if (!currentParsed.classList) currentParsed.classList = [];
		if (!currentParsed.classes) currentParsed.classes = [];
		currentParsed.classList.push(className);
		currentParsed.classes.push({
			value: className,
			regexp: new RegExp('(^|\\s)' + escapeRegExp(className) +
'(\\s|$)')
		});

	} else if (pseudoClass){
		pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
		pseudoClassValue = pseudoClassValue ?
pseudoClassValue.replace(reUnescape, '') : null;

		if (!currentParsed.pseudos) currentParsed.pseudos = [];
		currentParsed.pseudos.push({
			key: pseudoClass.replace(reUnescape, ''),
			value: pseudoClassValue,
			type: pseudoMarker.length == 1 ? 'class' : 'element'
		});

	} else if (attributeKey){
		attributeKey = attributeKey.replace(reUnescape, '');
		attributeValue = (attributeValue || '').replace(reUnescape,
'');

		var test, regexp;

		switch (attributeOperator){
			case '^=' : regexp = new RegExp(       '^'+
escapeRegExp(attributeValue)            ); break;
			case '$=' : regexp = new RegExp(           
escapeRegExp(attributeValue) +'$'       ); break;
			case '~=' : regexp = new RegExp( '(^|\\s)'+
escapeRegExp(attributeValue) +'(\\s|$)' ); break;
			case '|=' : regexp = new RegExp(       '^'+
escapeRegExp(attributeValue) +'(-|$)'   ); break;
			case  '=' : test = function(value){
				return attributeValue == value;
			}; break;
			case '*=' : test = function(value){
				return value && value.indexOf(attributeValue) > -1;
			}; break;
			case '!=' : test = function(value){
				return attributeValue != value;
			}; break;
			default   : test = function(value){
				return !!value;
			};
		}

		if (attributeValue == '' &&
(/^[*$^]=$/).test(attributeOperator)) test = function(){
			return false;
		};

		if (!test) test = function(value){
			return value && regexp.test(value);
		};

		if (!currentParsed.attributes) currentParsed.attributes = [];
		currentParsed.attributes.push({
			key: attributeKey,
			operator: attributeOperator,
			value: attributeValue,
			test: test
		});

	}

	return '';
};

// Slick NS

var Slick = (this.Slick || {});

Slick.parse = function(expression){
	return parse(expression);
};

Slick.escapeRegExp = escapeRegExp;

if (!this.Slick) this.Slick = Slick;

}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ?
exports : /*</CommonJS>*/this);


/*
---
name: Slick.Finder
description: The new, superfast css selector engine.
provides: Slick.Finder
requires: Slick.Parser
...
*/

;(function(){

var local = {},
	featuresCache = {},
	toString = Object.prototype.toString;

// Feature / Bug detection

local.isNativeCode = function(fn){
	return (/\{\s*\[native code\]\s*\}/).test('' + fn);
};

local.isXML = function(document){
	return (!!document.xmlVersion) || (!!document.xml) ||
(toString.call(document) == '[object XMLDocument]') ||
	(document.nodeType == 9 && document.documentElement.nodeName !=
'HTML');
};

local.setDocument = function(document){

	// convert elements / window arguments to document. if document cannot be
extrapolated, the function returns.
	var nodeType = document.nodeType;
	if (nodeType == 9); // document
	else if (nodeType) document = document.ownerDocument; // node
	else if (document.navigator) document = document.document; // window
	else return;

	// check if it's the old document

	if (this.document === document) return;
	this.document = document;

	// check if we have done feature detection on this document before

	var root = document.documentElement,
		rootUid = this.getUIDXML(root),
		features = featuresCache[rootUid],
		feature;

	if (features){
		for (feature in features){
			this[feature] = features[feature];
		}
		return;
	}

	features = featuresCache[rootUid] = {};

	features.root = root;
	features.isXMLDocument = this.isXML(document);

	features.brokenStarGEBTN
	= features.starSelectsClosedQSA
	= features.idGetsName
	= features.brokenMixedCaseQSA
	= features.brokenGEBCN
	= features.brokenCheckedQSA
	= features.brokenEmptyAttributeQSA
	= features.isHTMLDocument
	= features.nativeMatchesSelector
	= false;

	var starSelectsClosed, starSelectsComments,
		brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
		brokenFormAttributeGetter;

	var selected, id = 'slick_uniqueid';
	var testNode = document.createElement('div');

	var testRoot = document.body ||
document.getElementsByTagName('body')[0] || root;
	testRoot.appendChild(testNode);

	// on non-HTML documents innerHTML and getElementsById doesnt work
properly
	try {
		testNode.innerHTML = '<a
id="'+id+'"></a>';
		features.isHTMLDocument = !!document.getElementById(id);
	} catch(e){};

	if (features.isHTMLDocument){

		testNode.style.display = 'none';

		// IE returns comment nodes for getElementsByTagName('*') for
some documents
		testNode.appendChild(document.createComment(''));
		starSelectsComments =
(testNode.getElementsByTagName('*').length > 1);

		// IE returns closed nodes (EG:"</foo>") for
getElementsByTagName('*') for some documents
		try {
			testNode.innerHTML = 'foo</foo>';
			selected = testNode.getElementsByTagName('*');
			starSelectsClosed = (selected && !!selected.length &&
selected[0].nodeName.charAt(0) == '/');
		} catch(e){};

		features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;

		// IE returns elements with the name instead of just id for
getElementsById for some documents
		try {
			testNode.innerHTML = '<a name="'+ id
+'"></a><b id="'+ id
+'"></b>';
			features.idGetsName = document.getElementById(id) ===
testNode.firstChild;
		} catch(e){};

		if (testNode.getElementsByClassName){

			// Safari 3.2 getElementsByClassName caches results
			try {
				testNode.innerHTML = '<a class="f"></a><a
class="b"></a>';
				testNode.getElementsByClassName('b').length;
				testNode.firstChild.className = 'b';
				cachedGetElementsByClassName =
(testNode.getElementsByClassName('b').length != 2);
			} catch(e){};

			// Opera 9.6 getElementsByClassName doesnt detects the class if its not
the first one
			try {
				testNode.innerHTML = '<a class="a"></a><a
class="f b a"></a>';
				brokenSecondClassNameGEBCN =
(testNode.getElementsByClassName('a').length != 2);
			} catch(e){};

			features.brokenGEBCN = cachedGetElementsByClassName ||
brokenSecondClassNameGEBCN;
		}

		if (testNode.querySelectorAll){
			// IE 8 returns closed nodes (EG:"</foo>") for
querySelectorAll('*') for some documents
			try {
				testNode.innerHTML = 'foo</foo>';
				selected = testNode.querySelectorAll('*');
				features.starSelectsClosedQSA = (selected && !!selected.length
&& selected[0].nodeName.charAt(0) == '/');
			} catch(e){};

			// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
			try {
				testNode.innerHTML = '<a
class="MiX"></a>';
				features.brokenMixedCaseQSA =
!testNode.querySelectorAll('.MiX').length;
			} catch(e){};

			// Webkit and Opera dont return selected options on querySelectorAll
			try {
				testNode.innerHTML = '<select><option
selected="selected">a</option></select>';
				features.brokenCheckedQSA =
(testNode.querySelectorAll(':checked').length == 0);
			} catch(e){};

			// IE returns incorrect results for attr[*^$]="" selectors on
querySelectorAll
			try {
				testNode.innerHTML = '<a
class=""></a>';
				features.brokenEmptyAttributeQSA =
(testNode.querySelectorAll('[class*=""]').length != 0);
			} catch(e){};

		}

		// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a
reference to the input
		try {
			testNode.innerHTML = '<form action="s"><input
id="action"/></form>';
			brokenFormAttributeGetter =
(testNode.firstChild.getAttribute('action') != 's');
		} catch(e){};

		// native matchesSelector function

		features.nativeMatchesSelector = root.matchesSelector ||
/*root.msMatchesSelector ||*/ root.mozMatchesSelector ||
root.webkitMatchesSelector;
		if (features.nativeMatchesSelector) try {
			// if matchesSelector trows errors on incorrect sintaxes we can use it
			features.nativeMatchesSelector.call(root, ':slick');
			features.nativeMatchesSelector = null;
		} catch(e){};

	}

	try {
		root.slick_expando = 1;
		delete root.slick_expando;
		features.getUID = this.getUIDHTML;
	} catch(e) {
		features.getUID = this.getUIDXML;
	}

	testRoot.removeChild(testNode);
	testNode = selected = testRoot = null;

	// getAttribute

	features.getAttribute = (features.isHTMLDocument &&
brokenFormAttributeGetter) ? function(node, name){
		var method = this.attributeGetters[name];
		if (method) return method.call(node);
		var attributeNode = node.getAttributeNode(name);
		return (attributeNode) ? attributeNode.nodeValue : null;
	} : function(node, name){
		var method = this.attributeGetters[name];
		return (method) ? method.call(node) : node.getAttribute(name);
	};

	// hasAttribute

	features.hasAttribute = (root &&
this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
		return node.hasAttribute(attribute);
	} : function(node, attribute) {
		node = node.getAttributeNode(attribute);
		return !!(node && (node.specified || node.nodeValue));
	};

	// contains
	// FIXME: Add specs: local.contains should be different for xml and html
documents?
	var nativeRootContains = root && this.isNativeCode(root.contains),
		nativeDocumentContains = document &&
this.isNativeCode(document.contains);

	features.contains = (nativeRootContains && nativeDocumentContains)
? function(context, node){
		return context.contains(node);
	} : (nativeRootContains && !nativeDocumentContains) ?
function(context, node){
		// IE8 does not have .contains on document.
		return context === node || ((context === document) ?
document.documentElement : context).contains(node);
	} : (root && root.compareDocumentPosition) ? function(context,
node){
		return context === node || !!(context.compareDocumentPosition(node) &
16);
	} : function(context, node){
		if (node) do {
			if (node === context) return true;
		} while ((node = node.parentNode));
		return false;
	};

	// document order sorting
	// credits to Sizzle (http://sizzlejs.com/)

	features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
		if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
		return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
	} : ('sourceIndex' in root) ? function(a, b){
		if (!a.sourceIndex || !b.sourceIndex) return 0;
		return a.sourceIndex - b.sourceIndex;
	} : (document.createRange) ? function(a, b){
		if (!a.ownerDocument || !b.ownerDocument) return 0;
		var aRange = a.ownerDocument.createRange(), bRange =
b.ownerDocument.createRange();
		aRange.setStart(a, 0);
		aRange.setEnd(a, 0);
		bRange.setStart(b, 0);
		bRange.setEnd(b, 0);
		return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
	} : null ;

	root = null;

	for (feature in features){
		this[feature] = features[feature];
	}
};

// Main Method

var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
	reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
	qsaFailExpCache = {};

local.search = function(context, expression, append, first){

	var found = this.found = (first) ? null : (append || []);

	if (!context) return found;
	else if (context.navigator) context = context.document; // Convert the
node from a window to a document
	else if (!context.nodeType) return found;

	// setup

	var parsed, i,
		uniques = this.uniques = {},
		hasOthers = !!(append && append.length),
		contextIsDocument = (context.nodeType == 9);

	if (this.document !== (contextIsDocument ? context :
context.ownerDocument)) this.setDocument(context);

	// avoid duplicating items already in the append array
	if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])]
= true;

	// expression checks

	if (typeof expression == 'string'){ // expression is a string

		/*<simple-selectors-override>*/
		var simpleSelector = expression.match(reSimpleSelector);
		simpleSelectors: if (simpleSelector) {

			var symbol = simpleSelector[1],
				name = simpleSelector[2],
				node, nodes;

			if (!symbol){

				if (name == '*' && this.brokenStarGEBTN) break
simpleSelectors;
				nodes = context.getElementsByTagName(name);
				if (first) return nodes[0] || null;
				for (i = 0; node = nodes[i++];){
					if (!(hasOthers && uniques[this.getUID(node)]))
found.push(node);
				}

			} else if (symbol == '#'){

				if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
				node = context.getElementById(name);
				if (!node) return found;
				if (this.idGetsName &&
node.getAttributeNode('id').nodeValue != name) break
simpleSelectors;
				if (first) return node || null;
				if (!(hasOthers && uniques[this.getUID(node)]))
found.push(node);

			} else if (symbol == '.'){

				if (!this.isHTMLDocument || ((!context.getElementsByClassName ||
this.brokenGEBCN) && context.querySelectorAll)) break
simpleSelectors;
				if (context.getElementsByClassName && !this.brokenGEBCN){
					nodes = context.getElementsByClassName(name);
					if (first) return nodes[0] || null;
					for (i = 0; node = nodes[i++];){
						if (!(hasOthers && uniques[this.getUID(node)]))
found.push(node);
					}
				} else {
					var matchClass = new RegExp('(^|\\s)'+
Slick.escapeRegExp(name) +'(\\s|$)');
					nodes = context.getElementsByTagName('*');
					for (i = 0; node = nodes[i++];){
						className = node.className;
						if (!(className && matchClass.test(className))) continue;
						if (first) return node;
						if (!(hasOthers && uniques[this.getUID(node)]))
found.push(node);
					}
				}

			}

			if (hasOthers) this.sort(found);
			return (first) ? null : found;

		}
		/*</simple-selectors-override>*/

		/*<query-selector-override>*/
		querySelector: if (context.querySelectorAll) {

			if (!this.isHTMLDocument
				|| qsaFailExpCache[expression]
				//TODO: only skip when expression is actually mixed case
				|| this.brokenMixedCaseQSA
				|| (this.brokenCheckedQSA &&
expression.indexOf(':checked') > -1)
				|| (this.brokenEmptyAttributeQSA &&
reEmptyAttribute.test(expression))
				|| (!contextIsDocument //Abort when !contextIsDocument and...
					//  there are multiple expressions in the selector
					//  since we currently only fix non-document rooted QSA for single
expression selectors
					&& expression.indexOf(',') > -1
				)
				|| Slick.disableQSA
			) break querySelector;

			var _expression = expression, _context = context;
			if (!contextIsDocument){
				// non-document rooted QSA
				// credits to Andrew Dupont
				var currentId = _context.getAttribute('id'), slickid =
'slickid__';
				_context.setAttribute('id', slickid);
				_expression = '#' + slickid + ' ' + _expression;
				context = _context.parentNode;
			}

			try {
				if (first) return context.querySelector(_expression) || null;
				else nodes = context.querySelectorAll(_expression);
			} catch(e) {
				qsaFailExpCache[expression] = 1;
				break querySelector;
			} finally {
				if (!contextIsDocument){
					if (currentId) _context.setAttribute('id', currentId);
					else _context.removeAttribute('id');
					context = _context;
				}
			}

			if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
				if (node.nodeName > '@' && !(hasOthers &&
uniques[this.getUID(node)])) found.push(node);
			} else for (i = 0; node = nodes[i++];){
				if (!(hasOthers && uniques[this.getUID(node)]))
found.push(node);
			}

			if (hasOthers) this.sort(found);
			return found;

		}
		/*</query-selector-override>*/

		parsed = this.Slick.parse(expression);
		if (!parsed.length) return found;
	} else if (expression == null){ // there is no expression
		return found;
	} else if (expression.Slick){ // expression is a parsed Slick object
		parsed = expression;
	} else if (this.contains(context.documentElement || context, expression)){
// expression is a node
		(found) ? found.push(expression) : found = expression;
		return found;
	} else { // other junk
		return found;
	}

	/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/

	// cache elements for the nth selectors

	this.posNTH = {};
	this.posNTHLast = {};
	this.posNTHType = {};
	this.posNTHTypeLast = {};

	/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/

	// if append is null and there is only a single selector with one
expression use pushArray, else use pushUID
	this.push = (!hasOthers && (first || (parsed.length == 1
&& parsed.expressions[0].length == 1))) ? this.pushArray :
this.pushUID;

	if (found == null) found = [];

	// default engine

	var j, m, n;
	var combinator, tag, id, classList, classes, attributes, pseudos;
	var currentItems, currentExpression, currentBit, lastBit, expressions =
parsed.expressions;

	search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0;
(currentBit = currentExpression[j]); j++){

		combinator = 'combinator:' + currentBit.combinator;
		if (!this[combinator]) continue search;

		tag        = (this.isXMLDocument) ? currentBit.tag :
currentBit.tag.toUpperCase();
		id         = currentBit.id;
		classList  = currentBit.classList;
		classes    = currentBit.classes;
		attributes = currentBit.attributes;
		pseudos    = currentBit.pseudos;
		lastBit    = (j === (currentExpression.length - 1));

		this.bitUniques = {};

		if (lastBit){
			this.uniques = uniques;
			this.found = found;
		} else {
			this.uniques = {};
			this.found = [];
		}

		if (j === 0){
			this[combinator](context, tag, id, classes, attributes, pseudos,
classList);
			if (first && lastBit && found.length) break search;
		} else {
			if (first && lastBit) for (m = 0, n = currentItems.length; m
< n; m++){
				this[combinator](currentItems[m], tag, id, classes, attributes,
pseudos, classList);
				if (found.length) break search;
			} else for (m = 0, n = currentItems.length; m < n; m++)
this[combinator](currentItems[m], tag, id, classes, attributes, pseudos,
classList);
		}

		currentItems = this.found;
	}

	// should sort if there are nodes in append and if you pass multiple
expressions.
	if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);

	return (first) ? (found[0] || null) : found;
};

// Utils

local.uidx = 1;
local.uidk = 'slick-uniqueid';

local.getUIDXML = function(node){
	var uid = node.getAttribute(this.uidk);
	if (!uid){
		uid = this.uidx++;
		node.setAttribute(this.uidk, uid);
	}
	return uid;
};

local.getUIDHTML = function(node){
	return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
};

// sort based on the setDocument documentSorter method.

local.sort = function(results){
	if (!this.documentSorter) return results;
	results.sort(this.documentSorter);
	return results;
};

/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/

local.cacheNTH = {};

local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;

local.parseNTHArgument = function(argument){
	var parsed = argument.match(this.matchNTH);
	if (!parsed) return false;
	var special = parsed[2] || false;
	var a = parsed[1] || 1;
	if (a == '-') a = -1;
	var b = +parsed[3] || 0;
	parsed =
		(special == 'n')	? {a: a, b: b} :
		(special == 'odd')	? {a: 2, b: 1} :
		(special == 'even')	? {a: 2, b: 0} : {a: 0, b: a};

	return (this.cacheNTH[argument] = parsed);
};

local.createNTHPseudo = function(child, sibling, positions, ofType){
	return function(node, argument){
		var uid = this.getUID(node);
		if (!this[positions][uid]){
			var parent = node.parentNode;
			if (!parent) return false;
			var el = parent[child], count = 1;
			if (ofType){
				var nodeName = node.nodeName;
				do {
					if (el.nodeName != nodeName) continue;
					this[positions][this.getUID(el)] = count++;
				} while ((el = el[sibling]));
			} else {
				do {
					if (el.nodeType != 1) continue;
					this[positions][this.getUID(el)] = count++;
				} while ((el = el[sibling]));
			}
		}
		argument = argument || 'n';
		var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
		if (!parsed) return false;
		var a = parsed.a, b = parsed.b, pos = this[positions][uid];
		if (a == 0) return b == pos;
		if (a > 0){
			if (pos < b) return false;
		} else {
			if (b < pos) return false;
		}
		return ((pos - b) % a) == 0;
	};
};

/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/

local.pushArray = function(node, tag, id, classes, attributes, pseudos){
	if (this.matchSelector(node, tag, id, classes, attributes, pseudos))
this.found.push(node);
};

local.pushUID = function(node, tag, id, classes, attributes, pseudos){
	var uid = this.getUID(node);
	if (!this.uniques[uid] && this.matchSelector(node, tag, id,
classes, attributes, pseudos)){
		this.uniques[uid] = true;
		this.found.push(node);
	}
};

local.matchNode = function(node, selector){
	if (this.isHTMLDocument && this.nativeMatchesSelector){
		try {
			return this.nativeMatchesSelector.call(node,
selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g,
'[$1="$2"]'));
		} catch(matchError) {}
	}

	var parsed = this.Slick.parse(selector);
	if (!parsed) return true;

	// simple (single) selectors
	var expressions = parsed.expressions, simpleExpCounter = 0, i;
	for (i = 0; (currentExpression = expressions[i]); i++){
		if (currentExpression.length == 1){
			var exp = currentExpression[0];
			if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag :
exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos))
return true;
			simpleExpCounter++;
		}
	}

	if (simpleExpCounter == parsed.length) return false;

	var nodes = this.search(this.document, parsed), item;
	for (i = 0; item = nodes[i++];){
		if (item === node) return true;
	}
	return false;
};

local.matchPseudo = function(node, name, argument){
	var pseudoName = 'pseudo:' + name;
	if (this[pseudoName]) return this[pseudoName](node, argument);
	var attribute = this.getAttribute(node, name);
	return (argument) ? argument == attribute : !!attribute;
};

local.matchSelector = function(node, tag, id, classes, attributes,
pseudos){
	if (tag){
		var nodeName = (this.isXMLDocument) ? node.nodeName :
node.nodeName.toUpperCase();
		if (tag == '*'){
			if (nodeName < '@') return false; // Fix for comment nodes
and closed nodes
		} else {
			if (nodeName != tag) return false;
		}
	}

	if (id && node.getAttribute('id') != id) return false;

	var i, part, cls;
	if (classes) for (i = classes.length; i--;){
		cls = this.getAttribute(node, 'class');
		if (!(cls && classes[i].regexp.test(cls))) return false;
	}
	if (attributes) for (i = attributes.length; i--;){
		part = attributes[i];
		if (part.operator ? !part.test(this.getAttribute(node, part.key)) :
!this.hasAttribute(node, part.key)) return false;
	}
	if (pseudos) for (i = pseudos.length; i--;){
		part = pseudos[i];
		if (!this.matchPseudo(node, part.key, part.value)) return false;
	}
	return true;
};

var combinators = {

	' ': function(node, tag, id, classes, attributes, pseudos,
classList){ // all child nodes, any level

		var i, item, children;

		if (this.isHTMLDocument){
			getById: if (id){
				item = this.document.getElementById(id);
				if ((!item && node.all) || (this.idGetsName && item
&& item.getAttributeNode('id').nodeValue != id)){
					// all[id] returns all the elements with that name or id inside node
					// if theres just one it will return the element, else it will be a
collection
					children = node.all[id];
					if (!children) return;
					if (!children[0]) children = [children];
					for (i = 0; item = children[i++];){
						var idNode = item.getAttributeNode('id');
						if (idNode && idNode.nodeValue == id){
							this.push(item, tag, null, classes, attributes, pseudos);
							break;
						}
					}
					return;
				}
				if (!item){
					// if the context is in the dom we return, else we will try GEBTN,
breaking the getById label
					if (this.contains(this.root, node)) return;
					else break getById;
				} else if (this.document !== node && !this.contains(node,
item)) return;
				this.push(item, tag, null, classes, attributes, pseudos);
				return;
			}
			getByClass: if (classes && node.getElementsByClassName
&& !this.brokenGEBCN){
				children = node.getElementsByClassName(classList.join(' '));
				if (!(children && children.length)) break getByClass;
				for (i = 0; item = children[i++];) this.push(item, tag, id, null,
attributes, pseudos);
				return;
			}
		}
		getByTag: {
			children = node.getElementsByTagName(tag);
			if (!(children && children.length)) break getByTag;
			if (!this.brokenStarGEBTN) tag = null;
			for (i = 0; item = children[i++];) this.push(item, tag, id, classes,
attributes, pseudos);
		}
	},

	'>': function(node, tag, id, classes, attributes, pseudos){
// direct children
		if ((node = node.firstChild)) do {
			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes,
pseudos);
		} while ((node = node.nextSibling));
	},

	'+': function(node, tag, id, classes, attributes, pseudos){ //
next sibling
		while ((node = node.nextSibling)) if (node.nodeType == 1){
			this.push(node, tag, id, classes, attributes, pseudos);
			break;
		}
	},

	'^': function(node, tag, id, classes, attributes, pseudos){ //
first child
		node = node.firstChild;
		if (node){
			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes,
pseudos);
			else this['combinator:+'](node, tag, id, classes, attributes,
pseudos);
		}
	},

	'~': function(node, tag, id, classes, attributes, pseudos){ //
next siblings
		while ((node = node.nextSibling)){
			if (node.nodeType != 1) continue;
			var uid = this.getUID(node);
			if (this.bitUniques[uid]) break;
			this.bitUniques[uid] = true;
			this.push(node, tag, id, classes, attributes, pseudos);
		}
	},

	'++': function(node, tag, id, classes, attributes, pseudos){ //
next sibling and previous sibling
		this['combinator:+'](node, tag, id, classes, attributes,
pseudos);
		this['combinator:!+'](node, tag, id, classes, attributes,
pseudos);
	},

	'~~': function(node, tag, id, classes, attributes, pseudos){ //
next siblings and previous siblings
		this['combinator:~'](node, tag, id, classes, attributes,
pseudos);
		this['combinator:!~'](node, tag, id, classes, attributes,
pseudos);
	},

	'!': function(node, tag, id, classes, attributes, pseudos){ //
all parent nodes up to document
		while ((node = node.parentNode)) if (node !== this.document)
this.push(node, tag, id, classes, attributes, pseudos);
	},

	'!>': function(node, tag, id, classes, attributes, pseudos){
// direct parent (one level)
		node = node.parentNode;
		if (node !== this.document) this.push(node, tag, id, classes, attributes,
pseudos);
	},

	'!+': function(node, tag, id, classes, attributes, pseudos){ //
previous sibling
		while ((node = node.previousSibling)) if (node.nodeType == 1){
			this.push(node, tag, id, classes, attributes, pseudos);
			break;
		}
	},

	'!^': function(node, tag, id, classes, attributes, pseudos){ //
last child
		node = node.lastChild;
		if (node){
			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes,
pseudos);
			else this['combinator:!+'](node, tag, id, classes, attributes,
pseudos);
		}
	},

	'!~': function(node, tag, id, classes, attributes, pseudos){ //
previous siblings
		while ((node = node.previousSibling)){
			if (node.nodeType != 1) continue;
			var uid = this.getUID(node);
			if (this.bitUniques[uid]) break;
			this.bitUniques[uid] = true;
			this.push(node, tag, id, classes, attributes, pseudos);
		}
	}

};

for (var c in combinators) local['combinator:' + c] =
combinators[c];

var pseudos = {

	/*<pseudo-selectors>*/

	'empty': function(node){
		var child = node.firstChild;
		return !(child && child.nodeType == 1) &&
!(node.innerText || node.textContent || '').length;
	},

	'not': function(node, expression){
		return !this.matchNode(node, expression);
	},

	'contains': function(node, text){
		return (node.innerText || node.textContent || '').indexOf(text)
> -1;
	},

	'first-child': function(node){
		while ((node = node.previousSibling)) if (node.nodeType == 1) return
false;
		return true;
	},

	'last-child': function(node){
		while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
		return true;
	},

	'only-child': function(node){
		var prev = node;
		while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return
false;
		var next = node;
		while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
		return true;
	},

	/*<nth-pseudo-selectors>*/

	'nth-child': local.createNTHPseudo('firstChild',
'nextSibling', 'posNTH'),

	'nth-last-child': local.createNTHPseudo('lastChild',
'previousSibling', 'posNTHLast'),

	'nth-of-type': local.createNTHPseudo('firstChild',
'nextSibling', 'posNTHType', true),

	'nth-last-of-type': local.createNTHPseudo('lastChild',
'previousSibling', 'posNTHTypeLast', true),

	'index': function(node, index){
		return this['pseudo:nth-child'](node, '' + (index +
1));
	},

	'even': function(node){
		return this['pseudo:nth-child'](node, '2n');
	},

	'odd': function(node){
		return this['pseudo:nth-child'](node, '2n+1');
	},

	/*</nth-pseudo-selectors>*/

	/*<of-type-pseudo-selectors>*/

	'first-of-type': function(node){
		var nodeName = node.nodeName;
		while ((node = node.previousSibling)) if (node.nodeName == nodeName)
return false;
		return true;
	},

	'last-of-type': function(node){
		var nodeName = node.nodeName;
		while ((node = node.nextSibling)) if (node.nodeName == nodeName) return
false;
		return true;
	},

	'only-of-type': function(node){
		var prev = node, nodeName = node.nodeName;
		while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName)
return false;
		var next = node;
		while ((next = next.nextSibling)) if (next.nodeName == nodeName) return
false;
		return true;
	},

	/*</of-type-pseudo-selectors>*/

	// custom pseudos

	'enabled': function(node){
		return !node.disabled;
	},

	'disabled': function(node){
		return node.disabled;
	},

	'checked': function(node){
		return node.checked || node.selected;
	},

	'focus': function(node){
		return this.isHTMLDocument && this.document.activeElement ===
node && (node.href || node.type || this.hasAttribute(node,
'tabindex'));
	},

	'root': function(node){
		return (node === this.root);
	},

	'selected': function(node){
		return node.selected;
	}

	/*</pseudo-selectors>*/
};

for (var p in pseudos) local['pseudo:' + p] = pseudos[p];

// attributes methods

var attributeGetters = local.attributeGetters = {

	'for': function(){
		return ('htmlFor' in this) ? this.htmlFor :
this.getAttribute('for');
	},

	'href': function(){
		return ('href' in this) ? this.getAttribute('href',
2) : this.getAttribute('href');
	},

	'style': function(){
		return (this.style) ? this.style.cssText :
this.getAttribute('style');
	},

	'tabindex': function(){
		var attributeNode = this.getAttributeNode('tabindex');
		return (attributeNode && attributeNode.specified) ?
attributeNode.nodeValue : null;
	},

	'type': function(){
		return this.getAttribute('type');
	},

	'maxlength': function(){
		var attributeNode = this.getAttributeNode('maxLength');
		return (attributeNode && attributeNode.specified) ?
attributeNode.nodeValue : null;
	}

};

attributeGetters.MAXLENGTH = attributeGetters.maxLength =
attributeGetters.maxlength;

// Slick

var Slick = local.Slick = (this.Slick || {});

Slick.version = '1.1.7';

// Slick finder

Slick.search = function(context, expression, append){
	return local.search(context, expression, append);
};

Slick.find = function(context, expression){
	return local.search(context, expression, null, true);
};

// Slick containment checker

Slick.contains = function(container, node){
	local.setDocument(container);
	return local.contains(container, node);
};

// Slick attribute getter

Slick.getAttribute = function(node, name){
	local.setDocument(node);
	return local.getAttribute(node, name);
};

Slick.hasAttribute = function(node, name){
	local.setDocument(node);
	return local.hasAttribute(node, name);
};

// Slick matcher

Slick.match = function(node, selector){
	if (!(node && selector)) return false;
	if (!selector || selector === node) return true;
	local.setDocument(node);
	return local.matchNode(node, selector);
};

// Slick attribute accessor

Slick.defineAttributeGetter = function(name, fn){
	local.attributeGetters[name] = fn;
	return this;
};

Slick.lookupAttributeGetter = function(name){
	return local.attributeGetters[name];
};

// Slick pseudo accessor

Slick.definePseudo = function(name, fn){
	local['pseudo:' + name] = function(node, argument){
		return fn.call(node, argument);
	};
	return this;
};

Slick.lookupPseudo = function(name){
	var pseudo = local['pseudo:' + name];
	if (pseudo) return function(argument){
		return pseudo.call(this, argument);
	};
	return null;
};

// Slick overrides accessor

Slick.override = function(regexp, fn){
	local.override(regexp, fn);
	return this;
};

Slick.isXML = local.isXML;

Slick.uidOf = function(node){
	return local.getUIDHTML(node);
};

if (!this.Slick) this.Slick = Slick;

}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ?
exports : /*</CommonJS>*/this);


/*
---

name: Element

description: One of the most important items in MooTools. Contains the
dollar function, the dollars function, and an handful of cross-browser,
time-saver methods to let you easily work with HTML Elements.

license: MIT-style license.

requires: [Window, Document, Array, String, Function, Object, Number,
Slick.Parser, Slick.Finder]

provides: [Element, Elements, $, $$, Iframe, Selectors]

...
*/

var Element = function(tag, props){
	var konstructor = Element.Constructors[tag];
	if (konstructor) return konstructor(props);
	if (typeof tag != 'string') return document.id(tag).set(props);

	if (!props) props = {};

	if (!(/^[\w-]+$/).test(tag)){
		var parsed = Slick.parse(tag).expressions[0][0];
		tag = (parsed.tag == '*') ? 'div' : parsed.tag;
		if (parsed.id && props.id == null) props.id = parsed.id;

		var attributes = parsed.attributes;
		if (attributes) for (var attr, i = 0, l = attributes.length; i < l;
i++){
			attr = attributes[i];
			if (props[attr.key] != null) continue;

			if (attr.value != null && attr.operator == '=')
props[attr.key] = attr.value;
			else if (!attr.value && !attr.operator) props[attr.key] = true;
		}

		if (parsed.classList && props['class'] == null)
props['class'] = parsed.classList.join(' ');
	}

	return document.newElement(tag, props);
};


if (Browser.Element){
	Element.prototype = Browser.Element.prototype;
	// IE8 and IE9 require the wrapping.
	Element.prototype._fireEvent = (function(fireEvent){
		return function(type, event){
			return fireEvent.call(this, type, event);
		};
	})(Element.prototype.fireEvent);
}

new Type('Element', Element).mirror(function(name){
	if (Array.prototype[name]) return;

	var obj = {};
	obj[name] = function(){
		var results = [], args = arguments, elements = true;
		for (var i = 0, l = this.length; i < l; i++){
			var element = this[i], result = results[i] =
element[name].apply(element, args);
			elements = (elements && typeOf(result) == 'element');
		}
		return (elements) ? new Elements(results) : results;
	};

	Elements.implement(obj);
});

if (!Browser.Element){
	Element.parent = Object;

	Element.Prototype = {
		'$constructor': Element,
		'$family': Function.from('element').hide()
	};

	Element.mirror(function(name, method){
		Element.Prototype[name] = method;
	});
}

Element.Constructors = {};



var IFrame = new Type('IFrame', function(){
	var params = Array.link(arguments, {
		properties: Type.isObject,
		iframe: function(obj){
			return (obj != null);
		}
	});

	var props = params.properties || {}, iframe;
	if (params.iframe) iframe = document.id(params.iframe);
	var onload = props.onload || function(){};
	delete props.onload;
	props.id = props.name = [props.id, props.name, iframe ? (iframe.id ||
iframe.name) : 'IFrame_' + String.uniqueID()].pick();
	iframe = new Element(iframe || 'iframe', props);

	var onLoad = function(){
		onload.call(iframe.contentWindow);
	};

	if (window.frames[props.id]) onLoad();
	else iframe.addListener('load', onLoad);
	return iframe;
});

var Elements = this.Elements = function(nodes){
	if (nodes && nodes.length){
		var uniques = {}, node;
		for (var i = 0; node = nodes[i++];){
			var uid = Slick.uidOf(node);
			if (!uniques[uid]){
				uniques[uid] = true;
				this.push(node);
			}
		}
	}
};

Elements.prototype = {length: 0};
Elements.parent = Array;

new Type('Elements', Elements).implement({

	filter: function(filter, bind){
		if (!filter) return this;
		return new Elements(Array.filter(this, (typeOf(filter) ==
'string') ? function(item){
			return item.match(filter);
		} : filter, bind));
	}.protect(),

	push: function(){
		var length = this.length;
		for (var i = 0, l = arguments.length; i < l; i++){
			var item = document.id(arguments[i]);
			if (item) this[length++] = item;
		}
		return (this.length = length);
	}.protect(),

	unshift: function(){
		var items = [];
		for (var i = 0, l = arguments.length; i < l; i++){
			var item = document.id(arguments[i]);
			if (item) items.push(item);
		}
		return Array.prototype.unshift.apply(this, items);
	}.protect(),

	concat: function(){
		var newElements = new Elements(this);
		for (var i = 0, l = arguments.length; i < l; i++){
			var item = arguments[i];
			if (Type.isEnumerable(item)) newElements.append(item);
			else newElements.push(item);
		}
		return newElements;
	}.protect(),

	append: function(collection){
		for (var i = 0, l = collection.length; i < l; i++)
this.push(collection[i]);
		return this;
	}.protect(),

	empty: function(){
		while (this.length) delete this[--this.length];
		return this;
	}.protect()

});



(function(){

// FF, IE
var splice = Array.prototype.splice, object = {'0': 0,
'1': 1, length: 2};

splice.call(object, 1, 1);
if (object[1] == 1) Elements.implement('splice', function(){
	var length = this.length;
	var result = splice.apply(this, arguments);
	while (length >= this.length) delete this[length--];
	return result;
}.protect());

Array.forEachMethod(function(method, name){
	Elements.implement(name, method);
});

Array.mirror(Elements);

/*<ltIE8>*/
var createElementAcceptsHTML;
try {
    createElementAcceptsHTML = (document.createElement('<input
name=x>').name == 'x');
} catch (e){}

var escapeQuotes = function(html){
	return ('' + html).replace(/&/g,
'&amp;').replace(/"/g, '&quot;');
};
/*</ltIE8>*/

Document.implement({

	newElement: function(tag, props){
		if (props && props.checked != null) props.defaultChecked =
props.checked;
		/*<ltIE8>*/// Fix for readonly name and type properties in IE <
8
		if (createElementAcceptsHTML && props){
			tag = '<' + tag;
			if (props.name) tag += ' name="' +
escapeQuotes(props.name) + '"';
			if (props.type) tag += ' type="' +
escapeQuotes(props.type) + '"';
			tag += '>';
			delete props.name;
			delete props.type;
		}
		/*</ltIE8>*/
		return this.id(this.createElement(tag)).set(props);
	}

});

})();

(function(){

Slick.uidOf(window);
Slick.uidOf(document);

Document.implement({

	newTextNode: function(text){
		return this.createTextNode(text);
	},

	getDocument: function(){
		return this;
	},

	getWindow: function(){
		return this.window;
	},

	id: (function(){

		var types = {

			string: function(id, nocash, doc){
				id = Slick.find(doc, '#' + id.replace(/(\W)/g,
'\\$1'));
				return (id) ? types.element(id, nocash) : null;
			},

			element: function(el, nocash){
				Slick.uidOf(el);
				if (!nocash && !el.$family &&
!(/^(?:object|embed)$/i).test(el.tagName)){
					var fireEvent = el.fireEvent;
					// wrapping needed in IE7, or else crash
					el._fireEvent = function(type, event){
						return fireEvent(type, event);
					};
					Object.append(el, Element.Prototype);
				}
				return el;
			},

			object: function(obj, nocash, doc){
				if (obj.toElement) return types.element(obj.toElement(doc), nocash);
				return null;
			}

		};

		types.textnode = types.whitespace = types.window = types.document =
function(zero){
			return zero;
		};

		return function(el, nocash, doc){
			if (el && el.$family && el.uniqueNumber) return el;
			var type = typeOf(el);
			return (types[type]) ? types[type](el, nocash, doc || document) : null;
		};

	})()

});

if (window.$ == null) Window.implement('$', function(el, nc){
	return document.id(el, nc, this.document);
});

Window.implement({

	getDocument: function(){
		return this.document;
	},

	getWindow: function(){
		return this;
	}

});

[Document, Element].invoke('implement', {

	getElements: function(expression){
		return Slick.search(this, expression, new Elements);
	},

	getElement: function(expression){
		return document.id(Slick.find(this, expression));
	}

});

var contains = {contains: function(element){
	return Slick.contains(this, element);
}};

if (!document.contains) Document.implement(contains);
if (!document.createElement('div').contains)
Element.implement(contains);



// tree walking

var injectCombinator = function(expression, combinator){
	if (!expression) return combinator;

	expression = Object.clone(Slick.parse(expression));

	var expressions = expression.expressions;
	for (var i = expressions.length; i--;)
		expressions[i][0].combinator = combinator;

	return expression;
};

Object.forEach({
	getNext: '~',
	getPrevious: '!~',
	getParent: '!'
}, function(combinator, method){
	Element.implement(method, function(expression){
		return this.getElement(injectCombinator(expression, combinator));
	});
});

Object.forEach({
	getAllNext: '~',
	getAllPrevious: '!~',
	getSiblings: '~~',
	getChildren: '>',
	getParents: '!'
}, function(combinator, method){
	Element.implement(method, function(expression){
		return this.getElements(injectCombinator(expression, combinator));
	});
});

Element.implement({

	getFirst: function(expression){
		return document.id(Slick.search(this, injectCombinator(expression,
'>'))[0]);
	},

	getLast: function(expression){
		return document.id(Slick.search(this, injectCombinator(expression,
'>')).getLast());
	},

	getWindow: function(){
		return this.ownerDocument.window;
	},

	getDocument: function(){
		return this.ownerDocument;
	},

	getElementById: function(id){
		return document.id(Slick.find(this, '#' + ('' +
id).replace(/(\W)/g, '\\$1')));
	},

	match: function(expression){
		return !expression || Slick.match(this, expression);
	}

});



if (window.$$ == null) Window.implement('$$', function(selector){
	if (arguments.length == 1){
		if (typeof selector == 'string') return
Slick.search(this.document, selector, new Elements);
		else if (Type.isEnumerable(selector)) return new Elements(selector);
	}
	return new Elements(arguments);
});

// Inserters

var inserters = {

	before: function(context, element){
		var parent = element.parentNode;
		if (parent) parent.insertBefore(context, element);
	},

	after: function(context, element){
		var parent = element.parentNode;
		if (parent) parent.insertBefore(context, element.nextSibling);
	},

	bottom: function(context, element){
		element.appendChild(context);
	},

	top: function(context, element){
		element.insertBefore(context, element.firstChild);
	}

};

inserters.inside = inserters.bottom;



// getProperty / setProperty

var propertyGetters = {}, propertySetters = {};

// properties

var properties = {};
Array.forEach([
	'type', 'value', 'defaultValue',
'accessKey', 'cellPadding', 'cellSpacing',
'colSpan',
	'frameBorder', 'rowSpan', 'tabIndex',
'useMap'
], function(property){
	properties[property.toLowerCase()] = property;
});

properties.html = 'innerHTML';
properties.text = (document.createElement('div').textContent ==
null) ? 'innerText': 'textContent';

Object.forEach(properties, function(real, key){
	propertySetters[key] = function(node, value){
		node[real] = value;
	};
	propertyGetters[key] = function(node){
		return node[real];
	};
});

// Booleans

var bools = [
	'compact', 'nowrap', 'ismap',
'declare', 'noshade', 'checked',
	'disabled', 'readOnly', 'multiple',
'selected', 'noresize',
	'defer', 'defaultChecked', 'autofocus',
'controls', 'autoplay',
	'loop'
];

var booleans = {};
Array.forEach(bools, function(bool){
	var lower = bool.toLowerCase();
	booleans[lower] = bool;
	propertySetters[lower] = function(node, value){
		node[bool] = !!value;
	};
	propertyGetters[lower] = function(node){
		return !!node[bool];
	};
});

// Special cases

Object.append(propertySetters, {

	'class': function(node, value){
		('className' in node) ? node.className = (value ||
'') : node.setAttribute('class', value);
	},

	'for': function(node, value){
		('htmlFor' in node) ? node.htmlFor = value :
node.setAttribute('for', value);
	},

	'style': function(node, value){
		(node.style) ? node.style.cssText = value :
node.setAttribute('style', value);
	},

	'value': function(node, value){
		node.value = (value != null) ? value : '';
	}

});

propertyGetters['class'] = function(node){
	return ('className' in node) ? node.className || null :
node.getAttribute('class');
};

/* <webkit> */
var el = document.createElement('button');
// IE sets type as readonly and throws
try { el.type = 'button'; } catch(e){}
if (el.type != 'button') propertySetters.type = function(node,
value){
	node.setAttribute('type', value);
};
el = null;
/* </webkit> */

/*<IE>*/
var input = document.createElement('input');
input.value = 't';
input.type = 'submit';
if (input.value != 't') propertySetters.type = function(node,
type){
	var value = node.value;
	node.type = type;
	node.value = value;
};
input = null;
/*</IE>*/

/* getProperty, setProperty */

/* <ltIE9> */
var pollutesGetAttribute = (function(div){
	div.random = 'attribute';
	return (div.getAttribute('random') == 'attribute');
})(document.createElement('div'));

/* <ltIE9> */

Element.implement({

	setProperty: function(name, value){
		var setter = propertySetters[name.toLowerCase()];
		if (setter){
			setter(this, value);
		} else {
			/* <ltIE9> */
			if (pollutesGetAttribute) var attributeWhiteList =
this.retrieve('$attributeWhiteList', {});
			/* </ltIE9> */

			if (value == null){
				this.removeAttribute(name);
				/* <ltIE9> */
				if (pollutesGetAttribute) delete attributeWhiteList[name];
				/* </ltIE9> */
			} else {
				this.setAttribute(name, '' + value);
				/* <ltIE9> */
				if (pollutesGetAttribute) attributeWhiteList[name] = true;
				/* </ltIE9> */
			}
		}
		return this;
	},

	setProperties: function(attributes){
		for (var attribute in attributes) this.setProperty(attribute,
attributes[attribute]);
		return this;
	},

	getProperty: function(name){
		var getter = propertyGetters[name.toLowerCase()];
		if (getter) return getter(this);
		/* <ltIE9> */
		if (pollutesGetAttribute){
			var attr = this.getAttributeNode(name), attributeWhiteList =
this.retrieve('$attributeWhiteList', {});
			if (!attr) return null;
			if (attr.expando && !attributeWhiteList[name]){
				var outer = this.outerHTML;
				// segment by the opening tag and find mention of attribute name
				if (outer.substr(0,
outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name)
< 0) return null;
				attributeWhiteList[name] = true;
			}
		}
		/* </ltIE9> */
		var result = Slick.getAttribute(this, name);
		return (!result && !Slick.hasAttribute(this, name)) ? null :
result;
	},

	getProperties: function(){
		var args = Array.from(arguments);
		return args.map(this.getProperty, this).associate(args);
	},

	removeProperty: function(name){
		return this.setProperty(name, null);
	},

	removeProperties: function(){
		Array.each(arguments, this.removeProperty, this);
		return this;
	},

	set: function(prop, value){
		var property = Element.Properties[prop];
		(property && property.set) ? property.set.call(this, value) :
this.setProperty(prop, value);
	}.overloadSetter(),

	get: function(prop){
		var property = Element.Properties[prop];
		return (property && property.get) ? property.get.apply(this) :
this.getProperty(prop);
	}.overloadGetter(),

	erase: function(prop){
		var property = Element.Properties[prop];
		(property && property.erase) ? property.erase.apply(this) :
this.removeProperty(prop);
		return this;
	},

	hasClass: function(className){
		return this.className.clean().contains(className, ' ');
	},

	addClass: function(className){
		if (!this.hasClass(className)) this.className = (this.className + '
' + className).clean();
		return this;
	},

	removeClass: function(className){
		this.className = this.className.replace(new RegExp('(^|\\s)' +
className + '(?:\\s|$)'), '$1');
		return this;
	},

	toggleClass: function(className, force){
		if (force == null) force = !this.hasClass(className);
		return (force) ? this.addClass(className) : this.removeClass(className);
	},

	adopt: function(){
		var parent = this, fragment, elements = Array.flatten(arguments), length
= elements.length;
		if (length > 1) parent = fragment = document.createDocumentFragment();

		for (var i = 0; i < length; i++){
			var element = document.id(elements[i], true);
			if (element) parent.appendChild(element);
		}

		if (fragment) this.appendChild(fragment);

		return this;
	},

	appendText: function(text, where){
		return this.grab(this.getDocument().newTextNode(text), where);
	},

	grab: function(el, where){
		inserters[where || 'bottom'](document.id(el, true), this);
		return this;
	},

	inject: function(el, where){
		inserters[where || 'bottom'](this, document.id(el, true));
		return this;
	},

	replaces: function(el){
		el = document.id(el, true);
		el.parentNode.replaceChild(this, el);
		return this;
	},

	wraps: function(el, where){
		el = document.id(el, true);
		return this.replaces(el).grab(el, where);
	},

	getSelected: function(){
		this.selectedIndex; // Safari 3.2.1
		return new Elements(Array.from(this.options).filter(function(option){
			return option.selected;
		}));
	},

	toQueryString: function(){
		var queryString = [];
		this.getElements('input, select, textarea').each(function(el){
			var type = el.type;
			if (!el.name || el.disabled || type == 'submit' || type ==
'reset' || type == 'file' || type == 'image')
return;

			var value = (el.get('tag') == 'select') ?
el.getSelected().map(function(opt){
				// IE
				return document.id(opt).get('value');
			}) : ((type == 'radio' || type == 'checkbox')
&& !el.checked) ? null : el.get('value');

			Array.from(value).each(function(val){
				if (typeof val != 'undefined')
queryString.push(encodeURIComponent(el.name) + '=' +
encodeURIComponent(val));
			});
		});
		return queryString.join('&');
	}

});

var collected = {}, storage = {};

var get = function(uid){
	return (storage[uid] || (storage[uid] = {}));
};

var clean = function(item){
	var uid = item.uniqueNumber;
	if (item.removeEvents) item.removeEvents();
	if (item.clearAttributes) item.clearAttributes();
	if (uid != null){
		delete collected[uid];
		delete storage[uid];
	}
	return item;
};

var formProps = {input: 'checked', option: 'selected',
textarea: 'value'};

Element.implement({

	destroy: function(){
		var children = clean(this).getElementsByTagName('*');
		Array.each(children, clean);
		Element.dispose(this);
		return null;
	},

	empty: function(){
		Array.from(this.childNodes).each(Element.dispose);
		return this;
	},

	dispose: function(){
		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
	},

	clone: function(contents, keepid){
		contents = contents !== false;
		var clone = this.cloneNode(contents), ce = [clone], te = [this], i;

		if (contents){
			ce.append(Array.from(clone.getElementsByTagName('*')));
			te.append(Array.from(this.getElementsByTagName('*')));
		}

		for (i = ce.length; i--;){
			var node = ce[i], element = te[i];
			if (!keepid) node.removeAttribute('id');
			/*<ltIE9>*/
			if (node.clearAttributes){
				node.clearAttributes();
				node.mergeAttributes(element);
				node.removeAttribute('uniqueNumber');
				if (node.options){
					var no = node.options, eo = element.options;
					for (var j = no.length; j--;) no[j].selected = eo[j].selected;
				}
			}
			/*</ltIE9>*/
			var prop = formProps[element.tagName.toLowerCase()];
			if (prop && element[prop]) node[prop] = element[prop];
		}

		/*<ltIE9>*/
		if (Browser.ie){
			var co = clone.getElementsByTagName('object'), to =
this.getElementsByTagName('object');
			for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
		}
		/*</ltIE9>*/
		return document.id(clone);
	}

});

[Element, Window, Document].invoke('implement', {

	addListener: function(type, fn){
		if (type == 'unload'){
			var old = fn, self = this;
			fn = function(){
				self.removeListener('unload', fn);
				old();
			};
		} else {
			collected[Slick.uidOf(this)] = this;
		}
		if (this.addEventListener) this.addEventListener(type, fn,
!!arguments[2]);
		else this.attachEvent('on' + type, fn);
		return this;
	},

	removeListener: function(type, fn){
		if (this.removeEventListener) this.removeEventListener(type, fn,
!!arguments[2]);
		else this.detachEvent('on' + type, fn);
		return this;
	},

	retrieve: function(property, dflt){
		var storage = get(Slick.uidOf(this)), prop = storage[property];
		if (dflt != null && prop == null) prop = storage[property] =
dflt;
		return prop != null ? prop : null;
	},

	store: function(property, value){
		var storage = get(Slick.uidOf(this));
		storage[property] = value;
		return this;
	},

	eliminate: function(property){
		var storage = get(Slick.uidOf(this));
		delete storage[property];
		return this;
	}

});

/*<ltIE9>*/
if (window.attachEvent && !window.addEventListener)
window.addListener('unload', function(){
	Object.each(collected, clean);
	if (window.CollectGarbage) CollectGarbage();
});
/*</ltIE9>*/

Element.Properties = {};



Element.Properties.style = {

	set: function(style){
		this.style.cssText = style;
	},

	get: function(){
		return this.style.cssText;
	},

	erase: function(){
		this.style.cssText = '';
	}

};

Element.Properties.tag = {

	get: function(){
		return this.tagName.toLowerCase();
	}

};

Element.Properties.html = {

	set: function(html){
		if (html == null) html = '';
		else if (typeOf(html) == 'array') html =
html.join('');
		this.innerHTML = html;
	},

	erase: function(){
		this.innerHTML = '';
	}

};

/*<ltIE9>*/
// technique by jdbarlett - http://jdbartlett.com/innershiv/
var div = document.createElement('div');
div.innerHTML = '<nav></nav>';
var supportsHTML5Elements = (div.childNodes.length == 1);
if (!supportsHTML5Elements){
	var tags = 'abbr article aside audio canvas datalist details
figcaption figure footer header hgroup mark meter nav output progress
section summary time video'.split(' '),
		fragment = document.createDocumentFragment(), l = tags.length;
	while (l--) fragment.createElement(tags[l]);
}
div = null;
/*</ltIE9>*/

/*<IE>*/
var supportsTableInnerHTML = Function.attempt(function(){
	var table = document.createElement('table');
	table.innerHTML = '<tr><td></td></tr>';
	return true;
});

/*<ltFF4>*/
var tr = document.createElement('tr'), html =
'<td></td>';
tr.innerHTML = html;
var supportsTRInnerHTML = (tr.innerHTML == html);
tr = null;
/*</ltFF4>*/

if (!supportsTableInnerHTML || !supportsTRInnerHTML ||
!supportsHTML5Elements){

	Element.Properties.html.set = (function(set){

		var translations = {
			table: [1, '<table>', '</table>'],
			select: [1, '<select>', '</select>'],
			tbody: [2, '<table><tbody>',
'</tbody></table>'],
			tr: [3, '<table><tbody><tr>',
'</tr></tbody></table>']
		};

		translations.thead = translations.tfoot = translations.tbody;

		return function(html){
			var wrap = translations[this.get('tag')];
			if (!wrap && !supportsHTML5Elements) wrap = [0, '',
''];
			if (!wrap) return set.call(this, html);

			var level = wrap[0], wrapper = document.createElement('div'),
target = wrapper;
			if (!supportsHTML5Elements) fragment.appendChild(wrapper);
			wrapper.innerHTML = [wrap[1], html,
wrap[2]].flatten().join('');
			while (level--) target = target.firstChild;
			this.empty().adopt(target.childNodes);
			if (!supportsHTML5Elements) fragment.removeChild(wrapper);
			wrapper = null;
		};

	})(Element.Properties.html.set);
}
/*</IE>*/

/*<ltIE9>*/
var testForm = document.createElement('form');
testForm.innerHTML =
'<select><option>s</option></select>';

if (testForm.firstChild.value != 's') Element.Properties.value =
{

	set: function(value){
		var tag = this.get('tag');
		if (tag != 'select') return this.setProperty('value',
value);
		var options = this.getElements('option');
		for (var i = 0; i < options.length; i++){
			var option = options[i],
				attr = option.getAttributeNode('value'),
				optionValue = (attr && attr.specified) ? option.value :
option.get('text');
			if (optionValue == value) return option.selected = true;
		}
	},

	get: function(){
		var option = this, tag = option.get('tag');

		if (tag != 'select' && tag != 'option')
return this.getProperty('value');

		if (tag == 'select' && !(option =
option.getSelected()[0])) return '';

		var attr = option.getAttributeNode('value');
		return (attr && attr.specified) ? option.value :
option.get('text');
	}

};
testForm = null;
/*</ltIE9>*/

/*<IE>*/
if
(document.createElement('div').getAttributeNode('id'))
Element.Properties.id = {
	set: function(id){
		this.id = this.getAttributeNode('id').value = id;
	},
	get: function(){
		return this.id || null;
	},
	erase: function(){
		this.id = this.getAttributeNode('id').value = '';
	}
};
/*</IE>*/

})();


/*
---

name: Element.Style

description: Contains methods for interacting with the styles of Elements
in a fashionable way.

license: MIT-style license.

requires: Element

provides: Element.Style

...
*/

(function(){

var html = document.html;

//<ltIE9>
// Check for oldIE, which does not remove styles when they're set to
null
var el = document.createElement('div');
el.style.color = 'red';
el.style.color = null;
var doesNotRemoveStyles = el.style.color == 'red';
el = null;
//</ltIE9>

Element.Properties.styles = {set: function(styles){
	this.setStyles(styles);
}};

var hasOpacity = (html.style.opacity != null),
	hasFilter = (html.style.filter != null),
	reAlpha = /alpha\(opacity=([\d.]+)\)/i;

var setVisibility = function(element, opacity){
	element.store('$opacity', opacity);
	element.style.visibility = opacity > 0 || opacity == null ?
'visible' : 'hidden';
};

var setOpacity = (hasOpacity ? function(element, opacity){
	element.style.opacity = opacity;
} : (hasFilter ? function(element, opacity){
	var style = element.style;
	if (!element.currentStyle || !element.currentStyle.hasLayout) style.zoom =
1;
	if (opacity == null || opacity == 1) opacity = '';
	else opacity = 'alpha(opacity=' + (opacity * 100).limit(0,
100).round() + ')';
	var filter = style.filter || element.getComputedStyle('filter')
|| '';
	style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) :
filter + opacity;
	if (!style.filter) style.removeAttribute('filter');
} : setVisibility));

var getOpacity = (hasOpacity ? function(element){
	var opacity = element.style.opacity ||
element.getComputedStyle('opacity');
	return (opacity == '') ? 1 : opacity.toFloat();
} : (hasFilter ? function(element){
	var filter = (element.style.filter ||
element.getComputedStyle('filter')),
		opacity;
	if (filter) opacity = filter.match(reAlpha);
	return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
} : function(element){
	var opacity = element.retrieve('$opacity');
	if (opacity == null) opacity = (element.style.visibility ==
'hidden' ? 0 : 1);
	return opacity;
}));

var floatName = (html.style.cssFloat == null) ? 'styleFloat' :
'cssFloat';

Element.implement({

	getComputedStyle: function(property){
		if (this.currentStyle) return this.currentStyle[property.camelCase()];
		var defaultView = Element.getDocument(this).defaultView,
			computed = defaultView ? defaultView.getComputedStyle(this, null) :
null;
		return (computed) ? computed.getPropertyValue((property == floatName) ?
'float' : property.hyphenate()) : null;
	},

	setStyle: function(property, value){
		if (property == 'opacity'){
			if (value != null) value = parseFloat(value);
			setOpacity(this, value);
			return this;
		}
		property = (property == 'float' ? floatName :
property).camelCase();
		if (typeOf(value) != 'string'){
			var map = (Element.Styles[property] || '@').split('
');
			value = Array.from(value).map(function(val, i){
				if (!map[i]) return '';
				return (typeOf(val) == 'number') ?
map[i].replace('@', Math.round(val)) : val;
			}).join(' ');
		} else if (value == String(Number(value))){
			value = Math.round(value);
		}
		this.style[property] = value;
		//<ltIE9>
		if ((value == '' || value == null) &&
doesNotRemoveStyles && this.style.removeAttribute){
			this.style.removeAttribute(property);
		}
		//</ltIE9>
		return this;
	},

	getStyle: function(property){
		if (property == 'opacity') return getOpacity(this);
		property = (property == 'float' ? floatName :
property).camelCase();
		var result = this.style[property];
		if (!result || property == 'zIndex'){
			result = [];
			for (var style in Element.ShortStyles){
				if (property != style) continue;
				for (var s in Element.ShortStyles[style])
result.push(this.getStyle(s));
				return result.join(' ');
			}
			result = this.getComputedStyle(property);
		}
		if (result){
			result = String(result);
			var color = result.match(/rgba?\([\d\s,]+\)/);
			if (color) result = result.replace(color[0], color[0].rgbToHex());
		}
		if (Browser.ie && isNaN(parseFloat(result))){
			if ((/^(height|width)$/).test(property)){
				var values = (property == 'width') ? ['left',
'right'] : ['top', 'bottom'], size = 0;
				values.each(function(value){
					size += this.getStyle('border-' + value +
'-width').toInt() + this.getStyle('padding-' +
value).toInt();
				}, this);
				return this['offset' + property.capitalize()] - size +
'px';
			}
			if (Browser.opera && String(result).indexOf('px') !=
-1) return result;
			if ((/^border(.+)Width|margin|padding/).test(property)) return
'0px';
		}
		return result;
	},

	setStyles: function(styles){
		for (var style in styles) this.setStyle(style, styles[style]);
		return this;
	},

	getStyles: function(){
		var result = {};
		Array.flatten(arguments).each(function(key){
			result[key] = this.getStyle(key);
		}, this);
		return result;
	}

});

Element.Styles = {
	left: '@px', top: '@px', bottom: '@px',
right: '@px',
	width: '@px', height: '@px', maxWidth:
'@px', maxHeight: '@px', minWidth: '@px',
minHeight: '@px',
	backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px
@px', color: 'rgb(@, @, @)',
	fontSize: '@px', letterSpacing: '@px', lineHeight:
'@px', clip: 'rect(@px @px @px @px)',
	margin: '@px @px @px @px', padding: '@px @px @px @px',
border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @,
@)',
	borderWidth: '@px @px @px @px', borderStyle: '@ @ @
@', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@,
@, @)',
	zIndex: '@', 'zoom': '@', fontWeight:
'@', textIndent: '@px', opacity: '@'
};





Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth:
{}, borderStyle: {}, borderColor: {}};

['Top', 'Right', 'Bottom',
'Left'].each(function(direction){
	var Short = Element.ShortStyles;
	var All = Element.Styles;
	['margin', 'padding'].each(function(style){
		var sd = style + direction;
		Short[style][sd] = All[sd] = '@px';
	});
	var bd = 'border' + direction;
	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd +
'Color';
	Short[bd] = {};
	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @,
@)';
});

})();


/*
---

name: Element.Event

description: Contains Element methods for dealing with events. This file
also includes mouseenter and mouseleave custom Element Events, if
necessary.

license: MIT-style license.

requires: [Element, Event]

provides: Element.Event

...
*/

(function(){

Element.Properties.events = {set: function(events){
	this.addEvents(events);
}};

[Element, Window, Document].invoke('implement', {

	addEvent: function(type, fn){
		var events = this.retrieve('events', {});
		if (!events[type]) events[type] = {keys: [], values: []};
		if (events[type].keys.contains(fn)) return this;
		events[type].keys.push(fn);
		var realType = type,
			custom = Element.Events[type],
			condition = fn,
			self = this;
		if (custom){
			if (custom.onAdd) custom.onAdd.call(this, fn, type);
			if (custom.condition){
				condition = function(event){
					if (custom.condition.call(this, event, type)) return fn.call(this,
event);
					return true;
				};
			}
			if (custom.base) realType = Function.from(custom.base).call(this, type);
		}
		var defn = function(){
			return fn.call(self);
		};
		var nativeEvent = Element.NativeEvents[realType];
		if (nativeEvent){
			if (nativeEvent == 2){
				defn = function(event){
					event = new DOMEvent(event, self.getWindow());
					if (condition.call(self, event) === false) event.stop();
				};
			}
			this.addListener(realType, defn, arguments[2]);
		}
		events[type].values.push(defn);
		return this;
	},

	removeEvent: function(type, fn){
		var events = this.retrieve('events');
		if (!events || !events[type]) return this;
		var list = events[type];
		var index = list.keys.indexOf(fn);
		if (index == -1) return this;
		var value = list.values[index];
		delete list.keys[index];
		delete list.values[index];
		var custom = Element.Events[type];
		if (custom){
			if (custom.onRemove) custom.onRemove.call(this, fn, type);
			if (custom.base) type = Function.from(custom.base).call(this, type);
		}
		return (Element.NativeEvents[type]) ? this.removeListener(type, value,
arguments[2]) : this;
	},

	addEvents: function(events){
		for (var event in events) this.addEvent(event, events[event]);
		return this;
	},

	removeEvents: function(events){
		var type;
		if (typeOf(events) == 'object'){
			for (type in events) this.removeEvent(type, events[type]);
			return this;
		}
		var attached = this.retrieve('events');
		if (!attached) return this;
		if (!events){
			for (type in attached) this.removeEvents(type);
			this.eliminate('events');
		} else if (attached[events]){
			attached[events].keys.each(function(fn){
				this.removeEvent(events, fn);
			}, this);
			delete attached[events];
		}
		return this;
	},

	fireEvent: function(type, args, delay){
		var events = this.retrieve('events');
		if (!events || !events[type]) return this;
		args = Array.from(args);

		events[type].keys.each(function(fn){
			if (delay) fn.delay(delay, this, args);
			else fn.apply(this, args);
		}, this);
		return this;
	},

	cloneEvents: function(from, type){
		from = document.id(from);
		var events = from.retrieve('events');
		if (!events) return this;
		if (!type){
			for (var eventType in events) this.cloneEvents(from, eventType);
		} else if (events[type]){
			events[type].keys.each(function(fn){
				this.addEvent(type, fn);
			}, this);
		}
		return this;
	}

});

Element.NativeEvents = {
	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse
buttons
	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2,
//mouse movement
	keydown: 2, keypress: 2, keyup: 2, //keyboard
	orientationchange: 2, // mobile
	touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
	gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2,
input: 2, //form elements
	load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded:
1, readystatechange: 1, //window
	error: 1, abort: 1, scroll: 1 //misc
};

Element.Events = {mousewheel: {
	base: (Browser.firefox) ? 'DOMMouseScroll' :
'mousewheel'
}};

if ('onmouseenter' in document.documentElement){
	Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2;
} else {
	var check = function(event){
		var related = event.relatedTarget;
		if (related == null) return true;
		if (!related) return false;
		return (related != this && related.prefix != 'xul'
&& typeOf(this) != 'document' &&
!this.contains(related));
	};

	Element.Events.mouseenter = {
		base: 'mouseover',
		condition: check
	};

	Element.Events.mouseleave = {
		base: 'mouseout',
		condition: check
	};
}

/*<ltIE9>*/
if (!window.addEventListener){
	Element.NativeEvents.propertychange = 2;
	Element.Events.change = {
		base: function(){
			var type = this.type;
			return (this.get('tag') == 'input' && (type
== 'radio' || type == 'checkbox')) ?
'propertychange' : 'change'
		},
		condition: function(event){
			return this.type != 'radio' || (event.event.propertyName ==
'checked' && this.checked);
		}
	}
}
/*</ltIE9>*/



})();


/*
---

name: Element.Delegation

description: Extends the Element native object to include the delegate
method for more efficient event management.

license: MIT-style license.

requires: [Element.Event]

provides: [Element.Delegation]

...
*/

(function(){

var eventListenerSupport = !!window.addEventListener;

Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2;

var bubbleUp = function(self, match, fn, event, target){
	while (target && target != self){
		if (match(target, event)) return fn.call(target, event, target);
		target = document.id(target.parentNode);
	}
};

var map = {
	mouseenter: {
		base: 'mouseover'
	},
	mouseleave: {
		base: 'mouseout'
	},
	focus: {
		base: 'focus' + (eventListenerSupport ? '' :
'in'),
		capture: true
	},
	blur: {
		base: eventListenerSupport ? 'blur' : 'focusout',
		capture: true
	}
};

/*<ltIE9>*/
var _key = '$delegation:';
var formObserver = function(type){

	return {

		base: 'focusin',

		remove: function(self, uid){
			var list = self.retrieve(_key + type + 'listeners', {})[uid];
			if (list && list.forms) for (var i = list.forms.length; i--;){
				list.forms[i].removeEvent(type, list.fns[i]);
			}
		},

		listen: function(self, match, fn, event, target, uid){
			var form = (target.get('tag') == 'form') ? target :
event.target.getParent('form');
			if (!form) return;

			var listeners = self.retrieve(_key + type + 'listeners', {}),
				listener = listeners[uid] || {forms: [], fns: []},
				forms = listener.forms, fns = listener.fns;

			if (forms.indexOf(form) != -1) return;
			forms.push(form);

			var _fn = function(event){
				bubbleUp(self, match, fn, event, target);
			};
			form.addEvent(type, _fn);
			fns.push(_fn);

			listeners[uid] = listener;
			self.store(_key + type + 'listeners', listeners);
		}
	};
};

var inputObserver = function(type){
	return {
		base: 'focusin',
		listen: function(self, match, fn, event, target){
			var events = {blur: function(){
				this.removeEvents(events);
			}};
			events[type] = function(event){
				bubbleUp(self, match, fn, event, target);
			};
			event.target.addEvents(events);
		}
	};
};

if (!eventListenerSupport) Object.append(map, {
	submit: formObserver('submit'),
	reset: formObserver('reset'),
	change: inputObserver('change'),
	select: inputObserver('select')
});
/*</ltIE9>*/

var proto = Element.prototype,
	addEvent = proto.addEvent,
	removeEvent = proto.removeEvent;

var relay = function(old, method){
	return function(type, fn, useCapture){
		if (type.indexOf(':relay') == -1) return old.call(this, type,
fn, useCapture);
		var parsed = Slick.parse(type).expressions[0][0];
		if (parsed.pseudos[0].key != 'relay') return old.call(this,
type, fn, useCapture);
		var newType = parsed.tag;
		parsed.pseudos.slice(1).each(function(pseudo){
			newType += ':' + pseudo.key + (pseudo.value ? '(' +
pseudo.value + ')' : '');
		});
		old.call(this, type, fn);
		return method.call(this, newType, parsed.pseudos[0].value, fn);
	};
};

var delegation = {

	addEvent: function(type, match, fn){
		var storage = this.retrieve('$delegates', {}), stored =
storage[type];
		if (stored) for (var _uid in stored){
			if (stored[_uid].fn == fn && stored[_uid].match == match) return
this;
		}

		var _type = type, _match = match, _fn = fn, _map = map[type] || {};
		type = _map.base || _type;

		match = function(target){
			return Slick.match(target, _match);
		};

		var elementEvent = Element.Events[_type];
		if (elementEvent && elementEvent.condition){
			var __match = match, condition = elementEvent.condition;
			match = function(target, event){
				return __match(target, event) && condition.call(target, event,
type);
			};
		}

		var self = this, uid = String.uniqueID();
		var delegator = _map.listen ? function(event, target){
			if (!target && event && event.target) target =
event.target;
			if (target) _map.listen(self, match, fn, event, target, uid);
		} : function(event, target){
			if (!target && event && event.target) target =
event.target;
			if (target) bubbleUp(self, match, fn, event, target);
		};

		if (!stored) stored = {};
		stored[uid] = {
			match: _match,
			fn: _fn,
			delegator: delegator
		};
		storage[_type] = stored;
		return addEvent.call(this, type, delegator, _map.capture);
	},

	removeEvent: function(type, match, fn, _uid){
		var storage = this.retrieve('$delegates', {}), stored =
storage[type];
		if (!stored) return this;

		if (_uid){
			var _type = type, delegator = stored[_uid].delegator, _map = map[type]
|| {};
			type = _map.base || _type;
			if (_map.remove) _map.remove(this, _uid);
			delete stored[_uid];
			storage[_type] = stored;
			return removeEvent.call(this, type, delegator);
		}

		var __uid, s;
		if (fn) for (__uid in stored){
			s = stored[__uid];
			if (s.match == match && s.fn == fn) return
delegation.removeEvent.call(this, type, match, fn, __uid);
		} else for (__uid in stored){
			s = stored[__uid];
			if (s.match == match) delegation.removeEvent.call(this, type, match,
s.fn, __uid);
		}
		return this;
	}

};

[Element, Window, Document].invoke('implement', {
	addEvent: relay(addEvent, delegation.addEvent),
	removeEvent: relay(removeEvent, delegation.removeEvent)
});

})();


/*
---

name: Element.Dimensions

description: Contains methods to work with size, scroll, or positioning of
Elements and the window object.

license: MIT-style license.

credits:
  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code
and smart browser fixes, [LGPL
License](http://www.gnu.org/licenses/lgpl.html).
  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/)
code, [BSD License](http://developer.yahoo.com/yui/license.html).

requires: [Element, Element.Style]

provides: [Element.Dimensions]

...
*/

(function(){

var element = document.createElement('div'),
	child = document.createElement('div');
element.style.height = '0';
element.appendChild(child);
var brokenOffsetParent = (child.offsetParent === element);
element = child = null;

var isOffset = function(el){
	return styleString(el, 'position') != 'static' ||
isBody(el);
};

var isOffsetStatic = function(el){
	return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
};

Element.implement({

	scrollTo: function(x, y){
		if (isBody(this)){
			this.getWindow().scrollTo(x, y);
		} else {
			this.scrollLeft = x;
			this.scrollTop = y;
		}
		return this;
	},

	getSize: function(){
		if (isBody(this)) return this.getWindow().getSize();
		return {x: this.offsetWidth, y: this.offsetHeight};
	},

	getScrollSize: function(){
		if (isBody(this)) return this.getWindow().getScrollSize();
		return {x: this.scrollWidth, y: this.scrollHeight};
	},

	getScroll: function(){
		if (isBody(this)) return this.getWindow().getScroll();
		return {x: this.scrollLeft, y: this.scrollTop};
	},

	getScrolls: function(){
		var element = this.parentNode, position = {x: 0, y: 0};
		while (element && !isBody(element)){
			position.x += element.scrollLeft;
			position.y += element.scrollTop;
			element = element.parentNode;
		}
		return position;
	},

	getOffsetParent: brokenOffsetParent ? function(){
		var element = this;
		if (isBody(element) || styleString(element, 'position') ==
'fixed') return null;

		var isOffsetCheck = (styleString(element, 'position') ==
'static') ? isOffsetStatic : isOffset;
		while ((element = element.parentNode)){
			if (isOffsetCheck(element)) return element;
		}
		return null;
	} : function(){
		var element = this;
		if (isBody(element) || styleString(element, 'position') ==
'fixed') return null;

		try {
			return element.offsetParent;
		} catch(e) {}
		return null;
	},

	getOffsets: function(){
		if (this.getBoundingClientRect && !Browser.Platform.ios){
			var bound = this.getBoundingClientRect(),
				html = document.id(this.getDocument().documentElement),
				htmlScroll = html.getScroll(),
				elemScrolls = this.getScrolls(),
				isFixed = (styleString(this, 'position') ==
'fixed');

			return {
				x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x)
- html.clientLeft,
				y: bound.top.toInt()  + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y)
- html.clientTop
			};
		}

		var element = this, position = {x: 0, y: 0};
		if (isBody(this)) return position;

		while (element && !isBody(element)){
			position.x += element.offsetLeft;
			position.y += element.offsetTop;

			if (Browser.firefox){
				if (!borderBox(element)){
					position.x += leftBorder(element);
					position.y += topBorder(element);
				}
				var parent = element.parentNode;
				if (parent && styleString(parent, 'overflow') !=
'visible'){
					position.x += leftBorder(parent);
					position.y += topBorder(parent);
				}
			} else if (element != this && Browser.safari){
				position.x += leftBorder(element);
				position.y += topBorder(element);
			}

			element = element.offsetParent;
		}
		if (Browser.firefox && !borderBox(this)){
			position.x -= leftBorder(this);
			position.y -= topBorder(this);
		}
		return position;
	},

	getPosition: function(relative){
		var offset = this.getOffsets(),
			scroll = this.getScrolls();
		var position = {
			x: offset.x - scroll.x,
			y: offset.y - scroll.y
		};

		if (relative && (relative = document.id(relative))){
			var relativePosition = relative.getPosition();
			return {x: position.x - relativePosition.x - leftBorder(relative), y:
position.y - relativePosition.y - topBorder(relative)};
		}
		return position;
	},

	getCoordinates: function(element){
		if (isBody(this)) return this.getWindow().getCoordinates();
		var position = this.getPosition(element),
			size = this.getSize();
		var obj = {
			left: position.x,
			top: position.y,
			width: size.x,
			height: size.y
		};
		obj.right = obj.left + obj.width;
		obj.bottom = obj.top + obj.height;
		return obj;
	},

	computePosition: function(obj){
		return {
			left: obj.x - styleNumber(this, 'margin-left'),
			top: obj.y - styleNumber(this, 'margin-top')
		};
	},

	setPosition: function(obj){
		return this.setStyles(this.computePosition(obj));
	}

});


[Document, Window].invoke('implement', {

	getSize: function(){
		var doc = getCompatElement(this);
		return {x: doc.clientWidth, y: doc.clientHeight};
	},

	getScroll: function(){
		var win = this.getWindow(), doc = getCompatElement(this);
		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset ||
doc.scrollTop};
	},

	getScrollSize: function(){
		var doc = getCompatElement(this),
			min = this.getSize(),
			body = this.getDocument().body;

		return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y:
Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
	},

	getPosition: function(){
		return {x: 0, y: 0};
	},

	getCoordinates: function(){
		var size = this.getSize();
		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y,
width: size.x};
	}

});

// private methods

var styleString = Element.getComputedStyle;

function styleNumber(element, style){
	return styleString(element, style).toInt() || 0;
}

function borderBox(element){
	return styleString(element, '-moz-box-sizing') ==
'border-box';
}

function topBorder(element){
	return styleNumber(element, 'border-top-width');
}

function leftBorder(element){
	return styleNumber(element, 'border-left-width');
}

function isBody(element){
	return (/^(?:body|html)$/i).test(element.tagName);
}

function getCompatElement(element){
	var doc = element.getDocument();
	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ?
doc.html : doc.body;
}

})();

//aliases
Element.alias({position: 'setPosition'}); //compatability

[Window, Document, Element].invoke('implement', {

	getHeight: function(){
		return this.getSize().y;
	},

	getWidth: function(){
		return this.getSize().x;
	},

	getScrollTop: function(){
		return this.getScroll().y;
	},

	getScrollLeft: function(){
		return this.getScroll().x;
	},

	getScrollHeight: function(){
		return this.getScrollSize().y;
	},

	getScrollWidth: function(){
		return this.getScrollSize().x;
	},

	getTop: function(){
		return this.getPosition().y;
	},

	getLeft: function(){
		return this.getPosition().x;
	}

});


/*
---

name: Fx

description: Contains the basic animation logic to be extended by all other
Fx Classes.

license: MIT-style license.

requires: [Chain, Events, Options]

provides: Fx

...
*/

(function(){

var Fx = this.Fx = new Class({

	Implements: [Chain, Events, Options],

	options: {
		/*
		onStart: nil,
		onCancel: nil,
		onComplete: nil,
		*/
		fps: 60,
		unit: false,
		duration: 500,
		frames: null,
		frameSkip: true,
		link: 'ignore'
	},

	initialize: function(options){
		this.subject = this.subject || this;
		this.setOptions(options);
	},

	getTransition: function(){
		return function(p){
			return -(Math.cos(Math.PI * p) - 1) / 2;
		};
	},

	step: function(now){
		if (this.options.frameSkip){
			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff /
this.frameInterval;
			this.time = now;
			this.frame += frames;
		} else {
			this.frame++;
		}

		if (this.frame < this.frames){
			var delta = this.transition(this.frame / this.frames);
			this.set(this.compute(this.from, this.to, delta));
		} else {
			this.frame = this.frames;
			this.set(this.compute(this.from, this.to, 1));
			this.stop();
		}
	},

	set: function(now){
		return now;
	},

	compute: function(from, to, delta){
		return Fx.compute(from, to, delta);
	},

	check: function(){
		if (!this.isRunning()) return true;
		switch (this.options.link){
			case 'cancel': this.cancel(); return true;
			case 'chain': this.chain(this.caller.pass(arguments, this));
return false;
		}
		return false;
	},

	start: function(from, to){
		if (!this.check(from, to)) return this;
		this.from = from;
		this.to = to;
		this.frame = (this.options.frameSkip) ? 0 : -1;
		this.time = null;
		this.transition = this.getTransition();
		var frames = this.options.frames, fps = this.options.fps, duration =
this.options.duration;
		this.duration = Fx.Durations[duration] || duration.toInt();
		this.frameInterval = 1000 / fps;
		this.frames = frames || Math.round(this.duration / this.frameInterval);
		this.fireEvent('start', this.subject);
		pushInstance.call(this, fps);
		return this;
	},

	stop: function(){
		if (this.isRunning()){
			this.time = null;
			pullInstance.call(this, this.options.fps);
			if (this.frames == this.frame){
				this.fireEvent('complete', this.subject);
				if (!this.callChain()) this.fireEvent('chainComplete',
this.subject);
			} else {
				this.fireEvent('stop', this.subject);
			}
		}
		return this;
	},

	cancel: function(){
		if (this.isRunning()){
			this.time = null;
			pullInstance.call(this, this.options.fps);
			this.frame = this.frames;
			this.fireEvent('cancel', this.subject).clearChain();
		}
		return this;
	},

	pause: function(){
		if (this.isRunning()){
			this.time = null;
			pullInstance.call(this, this.options.fps);
		}
		return this;
	},

	resume: function(){
		if ((this.frame < this.frames) && !this.isRunning())
pushInstance.call(this, this.options.fps);
		return this;
	},

	isRunning: function(){
		var list = instances[this.options.fps];
		return list && list.contains(this);
	}

});

Fx.compute = function(from, to, delta){
	return (to - from) * delta + from;
};

Fx.Durations = {'short': 250, 'normal': 500,
'long': 1000};

// global timers

var instances = {}, timers = {};

var loop = function(){
	var now = Date.now();
	for (var i = this.length; i--;){
		var instance = this[i];
		if (instance) instance.step(now);
	}
};

var pushInstance = function(fps){
	var list = instances[fps] || (instances[fps] = []);
	list.push(this);
	if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps),
list);
};

var pullInstance = function(fps){
	var list = instances[fps];
	if (list){
		list.erase(this);
		if (!list.length && timers[fps]){
			delete instances[fps];
			timers[fps] = clearInterval(timers[fps]);
		}
	}
};

})();


/*
---

name: Fx.CSS

description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph,
Fx.Elements.

license: MIT-style license.

requires: [Fx, Element.Style]

provides: Fx.CSS

...
*/

Fx.CSS = new Class({

	Extends: Fx,

	//prepares the base from/to object

	prepare: function(element, property, values){
		values = Array.from(values);
		var from = values[0], to = values[1];
		if (to == null){
			to = from;
			from = element.getStyle(property);
			var unit = this.options.unit;
			// adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299
			if (unit && from.slice(-unit.length) != unit &&
parseFloat(from) != 0){
				element.setStyle(property, to + unit);
				var value = element.getComputedStyle(property);
				// IE and Opera support pixelLeft or pixelWidth
				if (!(/px$/.test(value))){
					value = element.style[('pixel-' + property).camelCase()];
					if (value == null){
						// adapted from Dean Edwards'
http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
						var left = element.style.left;
						element.style.left = to + unit;
						value = element.style.pixelLeft;
						element.style.left = left;
					}
				}
				from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0);
				element.setStyle(property, from + unit);
			}
		}
		return {from: this.parse(from), to: this.parse(to)};
	},

	//parses a value into an array

	parse: function(value){
		value = Function.from(value)();
		value = (typeof value == 'string') ? value.split(' ')
: Array.from(value);
		return value.map(function(val){
			val = String(val);
			var found = false;
			Object.each(Fx.CSS.Parsers, function(parser, key){
				if (found) return;
				var parsed = parser.parse(val);
				if (parsed || parsed === 0) found = {value: parsed, parser: parser};
			});
			found = found || {value: val, parser: Fx.CSS.Parsers.String};
			return found;
		});
	},

	//computes by a from and to prepared objects, using their parsers.

	compute: function(from, to, delta){
		var computed = [];
		(Math.min(from.length, to.length)).times(function(i){
			computed.push({value: from[i].parser.compute(from[i].value, to[i].value,
delta), parser: from[i].parser});
		});
		computed.$family = Function.from('fx:css:value');
		return computed;
	},

	//serves the value as settable

	serve: function(value, unit){
		if (typeOf(value) != 'fx:css:value') value = this.parse(value);
		var returned = [];
		value.each(function(bit){
			returned = returned.concat(bit.parser.serve(bit.value, unit));
		});
		return returned;
	},

	//renders the change to an element

	render: function(element, property, value, unit){
		element.setStyle(property, this.serve(value, unit));
	},

	//searches inside the page css to find the values for a selector

	search: function(selector){
		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
		var to = {}, selectorTest = new RegExp('^' +
selector.escapeRegExp() + '$');
		Array.each(document.styleSheets, function(sheet, j){
			var href = sheet.href;
			if (href && href.contains('://') &&
!href.contains(document.domain)) return;
			var rules = sheet.rules || sheet.cssRules;
			Array.each(rules, function(rule, i){
				if (!rule.style) return;
				var selectorText = (rule.selectorText) ?
rule.selectorText.replace(/^\w+/, function(m){
					return m.toLowerCase();
				}) : null;
				if (!selectorText || !selectorTest.test(selectorText)) return;
				Object.each(Element.Styles, function(value, style){
					if (!rule.style[style] || Element.ShortStyles[style]) return;
					value = String(rule.style[style]);
					to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
				});
			});
		});
		return Fx.CSS.Cache[selector] = to;
	}

});

Fx.CSS.Cache = {};

Fx.CSS.Parsers = {

	Color: {
		parse: function(value){
			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1],
value[2], value[3]] : false;
		},
		compute: function(from, to, delta){
			return from.map(function(value, i){
				return Math.round(Fx.compute(from[i], to[i], delta));
			});
		},
		serve: function(value){
			return value.map(Number);
		}
	},

	Number: {
		parse: parseFloat,
		compute: Fx.compute,
		serve: function(value, unit){
			return (unit) ? value + unit : value;
		}
	},

	String: {
		parse: Function.from(false),
		compute: function(zero, one){
			return one;
		},
		serve: function(zero){
			return zero;
		}
	}

};




/*
---

name: Fx.Tween

description: Formerly Fx.Style, effect to transition any CSS property for
an element.

license: MIT-style license.

requires: Fx.CSS

provides: [Fx.Tween, Element.fade, Element.highlight]

...
*/

Fx.Tween = new Class({

	Extends: Fx.CSS,

	initialize: function(element, options){
		this.element = this.subject = document.id(element);
		this.parent(options);
	},

	set: function(property, now){
		if (arguments.length == 1){
			now = property;
			property = this.property || this.options.property;
		}
		this.render(this.element, property, now, this.options.unit);
		return this;
	},

	start: function(property, from, to){
		if (!this.check(property, from, to)) return this;
		var args = Array.flatten(arguments);
		this.property = this.options.property || args.shift();
		var parsed = this.prepare(this.element, this.property, args);
		return this.parent(parsed.from, parsed.to);
	}

});

Element.Properties.tween = {

	set: function(options){
		this.get('tween').cancel().setOptions(options);
		return this;
	},

	get: function(){
		var tween = this.retrieve('tween');
		if (!tween){
			tween = new Fx.Tween(this, {link: 'cancel'});
			this.store('tween', tween);
		}
		return tween;
	}

};

Element.implement({

	tween: function(property, from, to){
		this.get('tween').start(property, from, to);
		return this;
	},

	fade: function(how){
		var fade = this.get('tween'), method, args =
['opacity'].append(arguments), toggle;
		if (args[1] == null) args[1] = 'toggle';
		switch (args[1]){
			case 'in': method = 'start'; args[1] = 1; break;
			case 'out': method = 'start'; args[1] = 0; break;
			case 'show': method = 'set'; args[1] = 1; break;
			case 'hide': method = 'set'; args[1] = 0; break;
			case 'toggle':
				var flag = this.retrieve('fade:flag',
this.getStyle('opacity') == 1);
				method = 'start';
				args[1] = flag ? 0 : 1;
				this.store('fade:flag', !flag);
				toggle = true;
			break;
			default: method = 'start';
		}
		if (!toggle) this.eliminate('fade:flag');
		fade[method].apply(fade, args);
		var to = args[args.length - 1];
		if (method == 'set' || to != 0)
this.setStyle('visibility', to == 0 ? 'hidden' :
'visible');
		else fade.chain(function(){
			this.element.setStyle('visibility', 'hidden');
			this.callChain();
		});
		return this;
	},

	highlight: function(start, end){
		if (!end){
			end = this.retrieve('highlight:original',
this.getStyle('background-color'));
			end = (end == 'transparent') ? '#fff' : end;
		}
		var tween = this.get('tween');
		tween.start('background-color', start || '#ffff88',
end).chain(function(){
			this.setStyle('background-color',
this.retrieve('highlight:original'));
			tween.callChain();
		}.bind(this));
		return this;
	}

});


/*
---

name: Fx.Morph

description: Formerly Fx.Styles, effect to transition any number of CSS
properties for an element using an object of rules, or CSS based selector
rules.

license: MIT-style license.

requires: Fx.CSS

provides: Fx.Morph

...
*/

Fx.Morph = new Class({

	Extends: Fx.CSS,

	initialize: function(element, options){
		this.element = this.subject = document.id(element);
		this.parent(options);
	},

	set: function(now){
		if (typeof now == 'string') now = this.search(now);
		for (var p in now) this.render(this.element, p, now[p],
this.options.unit);
		return this;
	},

	compute: function(from, to, delta){
		var now = {};
		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
		return now;
	},

	start: function(properties){
		if (!this.check(properties)) return this;
		if (typeof properties == 'string') properties =
this.search(properties);
		var from = {}, to = {};
		for (var p in properties){
			var parsed = this.prepare(this.element, p, properties[p]);
			from[p] = parsed.from;
			to[p] = parsed.to;
		}
		return this.parent(from, to);
	}

});

Element.Properties.morph = {

	set: function(options){
		this.get('morph').cancel().setOptions(options);
		return this;
	},

	get: function(){
		var morph = this.retrieve('morph');
		if (!morph){
			morph = new Fx.Morph(this, {link: 'cancel'});
			this.store('morph', morph);
		}
		return morph;
	}

};

Element.implement({

	morph: function(props){
		this.get('morph').start(props);
		return this;
	}

});


/*
---

name: Fx.Transitions

description: Contains a set of advanced transitions to be used with any of
the Fx Classes.

license: MIT-style license.

credits:
  - Easing Equations by Robert Penner,
<http://www.robertpenner.com/easing/>, modified and optimized to be
used with MooTools.

requires: Fx

provides: Fx.Transitions

...
*/

Fx.implement({

	getTransition: function(){
		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
		if (typeof trans == 'string'){
			var data = trans.split(':');
			trans = Fx.Transitions;
			trans = trans[data[0]] || trans[data[0].capitalize()];
			if (data[1]) trans = trans['ease' + data[1].capitalize() +
(data[2] ? data[2].capitalize() : '')];
		}
		return trans;
	}

});

Fx.Transition = function(transition, params){
	params = Array.from(params);
	var easeIn = function(pos){
		return transition(pos, params);
	};
	return Object.append(easeIn, {
		easeIn: easeIn,
		easeOut: function(pos){
			return 1 - transition(1 - pos, params);
		},
		easeInOut: function(pos){
			return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2
* (1 - pos), params))) / 2;
		}
	});
};

Fx.Transitions = {

	linear: function(zero){
		return zero;
	}

};



Fx.Transitions.extend = function(transitions){
	for (var transition in transitions) Fx.Transitions[transition] = new
Fx.Transition(transitions[transition]);
};

Fx.Transitions.extend({

	Pow: function(p, x){
		return Math.pow(p, x && x[0] || 6);
	},

	Expo: function(p){
		return Math.pow(2, 8 * (p - 1));
	},

	Circ: function(p){
		return 1 - Math.sin(Math.acos(p));
	},

	Sine: function(p){
		return 1 - Math.cos(p * Math.PI / 2);
	},

	Back: function(p, x){
		x = x && x[0] || 1.618;
		return Math.pow(p, 2) * ((x + 1) * p - x);
	},

	Bounce: function(p){
		var value;
		for (var a = 0, b = 1; 1; a += b, b /= 2){
			if (p >= (7 - 4 * a) / 11){
				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
				break;
			}
		}
		return value;
	},

	Elastic: function(p, x){
		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x &&
x[0] || 1) / 3);
	}

});

['Quad', 'Cubic', 'Quart',
'Quint'].each(function(transition, i){
	Fx.Transitions[transition] = new Fx.Transition(function(p){
		return Math.pow(p, i + 2);
	});
});


/*
---

name: Request

description: Powerful all purpose Request Class. Uses XMLHTTPRequest.

license: MIT-style license.

requires: [Object, Element, Chain, Events, Options, Browser]

provides: Request

...
*/

(function(){

var empty = function(){},
	progressSupport = ('onprogress' in new Browser.Request);

var Request = this.Request = new Class({

	Implements: [Chain, Events, Options],

	options: {/*
		onRequest: function(){},
		onLoadstart: function(event, xhr){},
		onProgress: function(event, xhr){},
		onComplete: function(){},
		onCancel: function(){},
		onSuccess: function(responseText, responseXML){},
		onFailure: function(xhr){},
		onException: function(headerName, value){},
		onTimeout: function(){},
		user: '',
		password: '',*/
		url: '',
		data: '',
		headers: {
			'X-Requested-With': 'XMLHttpRequest',
			'Accept': 'text/javascript, text/html, application/xml,
text/xml, */*'
		},
		async: true,
		format: false,
		method: 'post',
		link: 'ignore',
		isSuccess: null,
		emulation: true,
		urlEncoded: true,
		encoding: 'utf-8',
		evalScripts: false,
		evalResponse: false,
		timeout: 0,
		noCache: false
	},

	initialize: function(options){
		this.xhr = new Browser.Request();
		this.setOptions(options);
		this.headers = this.options.headers;
	},

	onStateChange: function(){
		var xhr = this.xhr;
		if (xhr.readyState != 4 || !this.running) return;
		this.running = false;
		this.status = 0;
		Function.attempt(function(){
			var status = xhr.status;
			this.status = (status == 1223) ? 204 : status;
		}.bind(this));
		xhr.onreadystatechange = empty;
		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
		clearTimeout(this.timer);

		this.response = {text: this.xhr.responseText || '', xml:
this.xhr.responseXML};
		if (this.options.isSuccess.call(this, this.status))
			this.success(this.response.text, this.response.xml);
		else
			this.failure();
	},

	isSuccess: function(){
		var status = this.status;
		return (status >= 200 && status < 300);
	},

	isRunning: function(){
		return !!this.running;
	},

	processScripts: function(text){
		if (this.options.evalResponse ||
(/(ecma|java)script/).test(this.getHeader('Content-type')))
return Browser.exec(text);
		return text.stripScripts(this.options.evalScripts);
	},

	success: function(text, xml){
		this.onSuccess(this.processScripts(text), xml);
	},

	onSuccess: function(){
		this.fireEvent('complete',
arguments).fireEvent('success', arguments).callChain();
	},

	failure: function(){
		this.onFailure();
	},

	onFailure: function(){
		this.fireEvent('complete').fireEvent('failure',
this.xhr);
	},

	loadstart: function(event){
		this.fireEvent('loadstart', [event, this.xhr]);
	},

	progress: function(event){
		this.fireEvent('progress', [event, this.xhr]);
	},

	timeout: function(){
		this.fireEvent('timeout', this.xhr);
	},

	setHeader: function(name, value){
		this.headers[name] = value;
		return this;
	},

	getHeader: function(name){
		return Function.attempt(function(){
			return this.xhr.getResponseHeader(name);
		}.bind(this));
	},

	check: function(){
		if (!this.running) return true;
		switch (this.options.link){
			case 'cancel': this.cancel(); return true;
			case 'chain': this.chain(this.caller.pass(arguments, this));
return false;
		}
		return false;
	},

	send: function(options){
		if (!this.check(options)) return this;

		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
		this.running = true;

		var type = typeOf(options);
		if (type == 'string' || type == 'element') options =
{data: options};

		var old = this.options;
		options = Object.append({data: old.data, url: old.url, method:
old.method}, options);
		var data = options.data, url = String(options.url), method =
options.method.toLowerCase();

		switch (typeOf(data)){
			case 'element': data = document.id(data).toQueryString();
break;
			case 'object': case 'hash': data =
Object.toQueryString(data);
		}

		if (this.options.format){
			var format = 'format=' + this.options.format;
			data = (data) ? format + '&' + data : format;
		}

		if (this.options.emulation && !['get',
'post'].contains(method)){
			var _method = '_method=' + method;
			data = (data) ? _method + '&' + data : _method;
			method = 'post';
		}

		if (this.options.urlEncoded && ['post',
'put'].contains(method)){
			var encoding = (this.options.encoding) ? '; charset=' +
this.options.encoding : '';
			this.headers['Content-type'] =
'application/x-www-form-urlencoded' + encoding;
		}

		if (!url) url = document.location.pathname;

		var trimPosition = url.lastIndexOf('/');
		if (trimPosition > -1 && (trimPosition =
url.indexOf('#')) > -1) url = url.substr(0, trimPosition);

		if (this.options.noCache)
			url += (url.contains('?') ? '&' : '?')
+ String.uniqueID();

		if (data && method == 'get'){
			url += (url.contains('?') ? '&' : '?')
+ data;
			data = null;
		}

		var xhr = this.xhr;
		if (progressSupport){
			xhr.onloadstart = this.loadstart.bind(this);
			xhr.onprogress = this.progress.bind(this);
		}

		xhr.open(method.toUpperCase(), url, this.options.async,
this.options.user, this.options.password);
		if (this.options.user && 'withCredentials' in xhr)
xhr.withCredentials = true;

		xhr.onreadystatechange = this.onStateChange.bind(this);

		Object.each(this.headers, function(value, key){
			try {
				xhr.setRequestHeader(key, value);
			} catch (e){
				this.fireEvent('exception', [key, value]);
			}
		}, this);

		this.fireEvent('request');
		xhr.send(data);
		if (!this.options.async) this.onStateChange();
		else if (this.options.timeout) this.timer =
this.timeout.delay(this.options.timeout, this);
		return this;
	},

	cancel: function(){
		if (!this.running) return this;
		this.running = false;
		var xhr = this.xhr;
		xhr.abort();
		clearTimeout(this.timer);
		xhr.onreadystatechange = empty;
		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
		this.xhr = new Browser.Request();
		this.fireEvent('cancel');
		return this;
	}

});

var methods = {};
['get', 'post', 'put', 'delete',
'GET', 'POST', 'PUT',
'DELETE'].each(function(method){
	methods[method] = function(data){
		var object = {
			method: method
		};
		if (data != null) object.data = data;
		return this.send(object);
	};
});

Request.implement(methods);

Element.Properties.send = {

	set: function(options){
		var send = this.get('send').cancel();
		send.setOptions(options);
		return this;
	},

	get: function(){
		var send = this.retrieve('send');
		if (!send){
			send = new Request({
				data: this, link: 'cancel', method:
this.get('method') || 'post', url:
this.get('action')
			});
			this.store('send', send);
		}
		return send;
	}

};

Element.implement({

	send: function(url){
		var sender = this.get('send');
		sender.send({data: this, url: url || sender.options.url});
		return this;
	}

});

})();


/*
---

name: Request.HTML

description: Extends the basic Request Class with additional methods for
interacting with HTML responses.

license: MIT-style license.

requires: [Element, Request]

provides: Request.HTML

...
*/

Request.HTML = new Class({

	Extends: Request,

	options: {
		update: false,
		append: false,
		evalScripts: true,
		filter: false,
		headers: {
			Accept: 'text/html, application/xml, text/xml, */*'
		}
	},

	success: function(text){
		var options = this.options, response = this.response;

		response.html = text.stripScripts(function(script){
			response.javascript = script;
		});

		var match =
response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
		if (match) response.html = match[1];
		var temp = new Element('div').set('html',
response.html);

		response.tree = temp.childNodes;
		response.elements = temp.getElements(options.filter || '*');

		if (options.filter) response.tree = response.elements;
		if (options.update){
			var update = document.id(options.update).empty();
			if (options.filter) update.adopt(response.elements);
			else update.set('html', response.html);
		} else if (options.append){
			var append = document.id(options.append);
			if (options.filter) response.elements.reverse().inject(append);
			else append.adopt(temp.getChildren());
		}
		if (options.evalScripts) Browser.exec(response.javascript);

		this.onSuccess(response.tree, response.elements, response.html,
response.javascript);
	}

});

Element.Properties.load = {

	set: function(options){
		var load = this.get('load').cancel();
		load.setOptions(options);
		return this;
	},

	get: function(){
		var load = this.retrieve('load');
		if (!load){
			load = new Request.HTML({data: this, link: 'cancel', update:
this, method: 'get'});
			this.store('load', load);
		}
		return load;
	}

};

Element.implement({

	load: function(){
		this.get('load').send(Array.link(arguments, {data:
Type.isObject, url: Type.isString}));
		return this;
	}

});


/*
---

name: JSON

description: JSON encoder and decoder.

license: MIT-style license.

SeeAlso: <http://www.json.org/>

requires: [Array, String, Number, Function]

provides: JSON

...
*/

if (typeof JSON == 'undefined') this.JSON = {};



(function(){

var special = {'\b': '\\b', '\t':
'\\t', '\n': '\\n', '\f':
'\\f', '\r': '\\r', '"' :
'\\"', '\\': '\\\\'};

var escape = function(chr){
	return special[chr] || '\\u' + ('0000' +
chr.charCodeAt(0).toString(16)).slice(-4);
};

JSON.validate = function(string){
	string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
'@').
					replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
']').
					replace(/(?:^|:|,)(?:\s*\[)+/g, '');

	return (/^[\],:{}\s]*$/).test(string);
};

JSON.encode = JSON.stringify ? function(obj){
	return JSON.stringify(obj);
} : function(obj){
	if (obj && obj.toJSON) obj = obj.toJSON();

	switch (typeOf(obj)){
		case 'string':
			return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape)
+ '"';
		case 'array':
			return '[' + obj.map(JSON.encode).clean() + ']';
		case 'object': case 'hash':
			var string = [];
			Object.each(obj, function(value, key){
				var json = JSON.encode(value);
				if (json) string.push(JSON.encode(key) + ':' + json);
			});
			return '{' + string + '}';
		case 'number': case 'boolean': return '' +
obj;
		case 'null': return 'null';
	}

	return null;
};

JSON.decode = function(string, secure){
	if (!string || typeOf(string) != 'string') return null;

	if (secure || JSON.secure){
		if (JSON.parse) return JSON.parse(string);
		if (!JSON.validate(string)) throw new Error('JSON could not decode
the input; security is enabled and the value is not secure.');
	}

	return eval('(' + string + ')');
};

})();


/*
---

name: Request.JSON

description: Extends the basic Request Class with additional methods for
sending and receiving JSON data.

license: MIT-style license.

requires: [Request, JSON]

provides: Request.JSON

...
*/

Request.JSON = new Class({

	Extends: Request,

	options: {
		/*onError: function(text, error){},*/
		secure: true
	},

	initialize: function(options){
		this.parent(options);
		Object.append(this.headers, {
			'Accept': 'application/json',
			'X-Request': 'JSON'
		});
	},

	success: function(text){
		var json;
		try {
			json = this.response.json = JSON.decode(text, this.options.secure);
		} catch (error){
			this.fireEvent('error', [text, error]);
			return;
		}
		if (json == null) this.onFailure();
		else this.onSuccess(json, text);
	}

});


/*
---

name: Cookie

description: Class for creating, reading, and deleting browser Cookies.

license: MIT-style license.

credits:
  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).

requires: [Options, Browser]

provides: Cookie

...
*/

var Cookie = new Class({

	Implements: Options,

	options: {
		path: '/',
		domain: false,
		duration: false,
		secure: false,
		document: document,
		encode: true
	},

	initialize: function(key, options){
		this.key = key;
		this.setOptions(options);
	},

	write: function(value){
		if (this.options.encode) value = encodeURIComponent(value);
		if (this.options.domain) value += '; domain=' +
this.options.domain;
		if (this.options.path) value += '; path=' + this.options.path;
		if (this.options.duration){
			var date = new Date();
			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 *
1000);
			value += '; expires=' + date.toGMTString();
		}
		if (this.options.secure) value += '; secure';
		this.options.document.cookie = this.key + '=' + value;
		return this;
	},

	read: function(){
		var value = this.options.document.cookie.match('(?:^|;)\\s*' +
this.key.escapeRegExp() + '=([^;]*)');
		return (value) ? decodeURIComponent(value[1]) : null;
	},

	dispose: function(){
		new Cookie(this.key, Object.merge({}, this.options, {duration:
-1})).write('');
		return this;
	}

});

Cookie.write = function(key, value, options){
	return new Cookie(key, options).write(value);
};

Cookie.read = function(key){
	return new Cookie(key).read();
};

Cookie.dispose = function(key, options){
	return new Cookie(key, options).dispose();
};


/*
---

name: DOMReady

description: Contains the custom event domready.

license: MIT-style license.

requires: [Browser, Element, Element.Event]

provides: [DOMReady, DomReady]

...
*/

(function(window, document){

var ready,
	loaded,
	checks = [],
	shouldPoll,
	timer,
	testElement = document.createElement('div');

var domready = function(){
	clearTimeout(timer);
	if (ready) return;
	Browser.loaded = ready = true;
	document.removeListener('DOMContentLoaded',
domready).removeListener('readystatechange', check);

	document.fireEvent('domready');
	window.fireEvent('domready');
};

var check = function(){
	for (var i = checks.length; i--;) if (checks[i]()){
		domready();
		return true;
	}
	return false;
};

var poll = function(){
	clearTimeout(timer);
	if (!check()) timer = setTimeout(poll, 10);
};

document.addListener('DOMContentLoaded', domready);

/*<ltIE8>*/
// doScroll technique by Diego Perini
http://javascript.nwbox.com/IEContentLoaded/
// testElement.doScroll() throws when the DOM is not ready, only in the top
window
var doScrollWorks = function(){
	try {
		testElement.doScroll();
		return true;
	} catch (e){}
	return false;
};
// If doScroll works already, it can't be used to determine domready
//   e.g. in an iframe
if (testElement.doScroll && !doScrollWorks()){
	checks.push(doScrollWorks);
	shouldPoll = true;
}
/*</ltIE8>*/

if (document.readyState) checks.push(function(){
	var state = document.readyState;
	return (state == 'loaded' || state == 'complete');
});

if ('onreadystatechange' in document)
document.addListener('readystatechange', check);
else shouldPoll = true;

if (shouldPoll) poll();

Element.Events.domready = {
	onAdd: function(fn){
		if (ready) fn.call(this);
	}
};

// Make sure that domready fires before load
Element.Events.load = {
	base: 'load',
	onAdd: function(fn){
		if (loaded && this == window) fn.call(this);
	},
	condition: function(){
		if (this == window){
			domready();
			delete Element.Events.load;
		}
		return true;
	}
};

// This is based on the custom load event
window.addEvent('load', function(){
	loaded = true;
});

})(window, document);


/*
---

name: Swiff

description: Wrapper for embedding SWF movies. Supports External Interface
Communication.

license: MIT-style license.

credits:
  - Flash detection & Internet Explorer + Flash Player 9 fix inspired
by SWFObject.

requires: [Options, Object, Element]

provides: Swiff

...
*/

(function(){

var Swiff = this.Swiff = new Class({

	Implements: Options,

	options: {
		id: null,
		height: 1,
		width: 1,
		container: null,
		properties: {},
		params: {
			quality: 'high',
			allowScriptAccess: 'always',
			wMode: 'window',
			swLiveConnect: true
		},
		callBacks: {},
		vars: {}
	},

	toElement: function(){
		return this.object;
	},

	initialize: function(path, options){
		this.instance = 'Swiff_' + String.uniqueID();

		this.setOptions(options);
		options = this.options;
		var id = this.id = options.id || this.instance;
		var container = document.id(options.container);

		Swiff.CallBacks[this.instance] = {};

		var params = options.params, vars = options.vars, callBacks =
options.callBacks;
		var properties = Object.append({height: options.height, width:
options.width}, options.properties);

		var self = this;

		for (var callBack in callBacks){
			Swiff.CallBacks[this.instance][callBack] = (function(option){
				return function(){
					return option.apply(self.object, arguments);
				};
			})(callBacks[callBack]);
			vars[callBack] = 'Swiff.CallBacks.' + this.instance +
'.' + callBack;
		}

		params.flashVars = Object.toQueryString(vars);
		if (Browser.ie){
			properties.classid =
'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
			params.movie = path;
		} else {
			properties.type = 'application/x-shockwave-flash';
		}
		properties.data = path;

		var build = '<object id="' + id + '"';
		for (var property in properties) build += ' ' + property +
'="' + properties[property] + '"';
		build += '>';
		for (var param in params){
			if (params[param]) build += '<param name="' + param +
'" value="' + params[param] + '" />';
		}
		build += '</object>';
		this.object = ((container) ? container.empty() : new
Element('div')).set('html', build).firstChild;
	},

	replaces: function(element){
		element = document.id(element, true);
		element.parentNode.replaceChild(this.toElement(), element);
		return this;
	},

	inject: function(element){
		document.id(element, true).appendChild(this.toElement());
		return this;
	},

	remote: function(){
		return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));
	}

});

Swiff.CallBacks = {};

Swiff.remote = function(obj, fn){
	var rs = obj.CallFunction('<invoke name="' + fn +
'" returntype="javascript">' +
__flash__argumentsToXML(arguments, 2) + '</invoke>');
	return eval(rs);
};

})();

PK]n�[��=��G�Gjs/mootools-core.jsnu�[���(function(){this.MooTools={version:"1.4.5",build:"74e34796f5f76640cdb98853004650aea1499d69"};var
b=this.typeOf=function(b){if(null==b)return"null";if(null!=b.$family)return
b.$family();if(b.nodeName){if(1==b.nodeType)return"element";if(3==b.nodeType)return/\S/.test(b.nodeValue)?"textnode":"whitespace"}else
if("number"==typeof
b.length){if(b.callee)return"arguments";if("item"in
b)return"collection"}return typeof
b};this.instanceOf=function(b,a){if(null==b)return!1;for(var
c=b.$constructor||b.constructor;c;){if(c===
a)return!0;c=c.parent}return!b.hasOwnProperty?!1:b instanceof a};var
a=this.Function,c=!0,d;for(d
in{toString:1})c=null;c&&(c="hasOwnProperty,valueOf,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,constructor".split(","));a.prototype.overloadSetter=function(b){var
a=this;return function(h,k){if(null==h)return
this;if(b||"string"!=typeof h){for(var e in
h)a.call(this,e,h[e]);if(c)for(var
d=c.length;d--;)e=c[d],h.hasOwnProperty(e)&&a.call(this,e,h[e])}else
a.call(this,h,k);return this}};
a.prototype.overloadGetter=function(b){var a=this;return function(c){var
h,k;"string"!=typeof
c?h=c:1<arguments.length?h=arguments:b&&(h=[c]);if(h){k={};for(var
e=0;e<h.length;e++)k[h[e]]=a.call(this,h[e])}else
k=a.call(this,c);return
k}};a.prototype.extend=function(b,a){this[b]=a}.overloadSetter();a.prototype.implement=function(b,a){this.prototype[b]=a}.overloadSetter();var
e=Array.prototype.slice;a.from=function(a){return"function"==b(a)?a:function(){return
a}};Array.from=function(a){return null==
a?[]:f.isEnumerable(a)&&"string"!=typeof
a?"array"==b(a)?a:e.call(a):[a]};Number.from=function(b){b=parseFloat(b);return
isFinite(b)?b:null};String.from=function(b){return
b+""};a.implement({hide:function(){this.$hidden=!0;return
this},protect:function(){this.$protected=!0;return this}});var
f=this.Type=function(a,c){if(a){var
h=a.toLowerCase();f["is"+a]=function(a){return
b(a)==h};null!=c&&(c.prototype.$family=function(){return
h}.hide())}if(null==c)return null;c.extend(this);c.$constructor=f;return
c.prototype.$constructor=
c},g=Object.prototype.toString;f.isEnumerable=function(b){return
null!=b&&"number"==typeof b.length&&"[object
Function]"!=g.call(b)};var i={},j=function(a){a=b(a.prototype);return
i[a]||(i[a]=[])},m=function(a,c){if(!c||!c.$hidden){for(var
k=j(this),d=0;d<k.length;d++){var
o=k[d];"type"==b(o)?m.call(o,a,c):o.call(this,a,c)}k=this.prototype[a];if(null==k||!k.$protected)this.prototype[a]=c;null==this[a]&&"function"==b(c)&&h.call(this,a,function(b){return
c.apply(b,e.call(arguments,1))})}},h=function(b,
a){if(!a||!a.$hidden){var
c=this[b];if(null==c||!c.$protected)this[b]=a}};f.implement({implement:m.overloadSetter(),extend:h.overloadSetter(),alias:function(b,a){m.call(this,b,this.prototype[a])}.overloadSetter(),mirror:function(b){j(this).push(b);return
this}});new f("Type",f);var k=function(b,a,c){var
h=a!=Object,e=a.prototype;h&&(a=new f(b,a));for(var
b=0,d=c.length;b<d;b++){var
o=c[b],q=a[o],g=e[o];q&&q.protect();h&&g&&a.implement(o,g.protect())}if(h){var
j=e.propertyIsEnumerable(c[0]);a.forEachMethod=
function(b){if(!j)for(var
a=0,h=c.length;a<h;a++)b.call(e,e[c[a]],c[a]);for(var k in
e)b.call(e,e[k],k)}}return
k};k("String",String,"charAt,charCodeAt,concat,indexOf,lastIndexOf,match,quote,replace,search,slice,split,substr,substring,trim,toLowerCase,toUpperCase".split(","))("Array",Array,"pop,push,reverse,shift,sort,splice,unshift,concat,join,slice,indexOf,lastIndexOf,filter,forEach,every,map,some,reduce,reduceRight".split(","))("Number",Number,["toExponential","toFixed","toLocaleString","toPrecision"])("Function",
a,["apply","call","bind"])("RegExp",RegExp,["exec","test"])("Object",Object,"create,defineProperty,defineProperties,keys,getPrototypeOf,getOwnPropertyDescriptor,getOwnPropertyNames,preventExtensions,isExtensible,seal,isSealed,freeze,isFrozen".split(","))("Date",Date,["now"]);Object.extend=h.overloadSetter();Date.extend("now",function(){return+new
Date});new
f("Boolean",Boolean);Number.prototype.$family=function(){return
isFinite(this)?"number":"null"}.hide();Number.extend("random",function(b,a){return
Math.floor(Math.random()*
(a-b+1)+b)});var
o=Object.prototype.hasOwnProperty;Object.extend("forEach",function(b,a,c){for(var
h in
b)o.call(b,h)&&a.call(c,b[h],h,b)});Object.each=Object.forEach;Array.implement({forEach:function(b,a){for(var
c=0,h=this.length;c<h;c++)c in
this&&b.call(a,this[c],c,this)},each:function(b,a){Array.forEach(this,b,a);return
this}});var q=function(a){switch(b(a)){case "array":return
a.clone();case "object":return Object.clone(a);default:return
a}};Array.implement("clone",function(){for(var b=this.length,
a=Array(b);b--;)a[b]=q(this[b]);return a});var
u=function(a,c,h){switch(b(h)){case
"object":"object"==b(a[c])?Object.merge(a[c],h):a[c]=Object.clone(h);break;case
"array":a[c]=h.clone();break;default:a[c]=h}return
a};Object.extend({merge:function(a,c,h){if("string"==b(c))return
u(a,c,h);for(var k=1,e=arguments.length;k<e;k++){var
d=arguments[k],o;for(o in d)u(a,o,d[o])}return a},clone:function(b){var
a={},c;for(c in b)a[c]=q(b[c]);return a},append:function(b){for(var
a=1,c=arguments.length;a<c;a++){var h=
arguments[a]||{},k;for(k in h)b[k]=h[k]}return
b}});["Object","WhiteSpace","TextNode","Collection","Arguments"].each(function(b){new
f(b)});var
r=Date.now();String.extend("uniqueID",function(){return(r++).toString(36)})})();
Array.implement({every:function(b,a){for(var
c=0,d=this.length>>>0;c<d;c++)if(c in
this&&!b.call(a,this[c],c,this))return!1;return!0},filter:function(b,a){for(var
c=[],d,e=0,f=this.length>>>0;e<f;e++)e in
this&&(d=this[e],b.call(a,d,e,this)&&c.push(d));return
c},indexOf:function(b,a){for(var
c=this.length>>>0,d=0>a?Math.max(0,c+a):a||0;d<c;d++)if(this[d]===b)return
d;return-1},map:function(b,a){for(var
c=this.length>>>0,d=Array(c),e=0;e<c;e++)e in
this&&(d[e]=b.call(a,this[e],e,this));return d},some:function(b,
a){for(var c=0,d=this.length>>>0;c<d;c++)if(c in
this&&b.call(a,this[c],c,this))return!0;return!1},clean:function(){return
this.filter(function(b){return null!=b})},invoke:function(b){var
a=Array.slice(arguments,1);return this.map(function(c){return
c[b].apply(c,a)})},associate:function(b){for(var
a={},c=Math.min(this.length,b.length),d=0;d<c;d++)a[b[d]]=this[d];return
a},link:function(b){for(var a={},c=0,d=this.length;c<d;c++)for(var e in
b)if(b[e](this[c])){a[e]=this[c];delete b[e];break}return a},
contains:function(b,a){return-1!=this.indexOf(b,a)},append:function(b){this.push.apply(this,b);return
this},getLast:function(){return
this.length?this[this.length-1]:null},getRandom:function(){return
this.length?this[Number.random(0,this.length-1)]:null},include:function(b){this.contains(b)||this.push(b);return
this},combine:function(b){for(var
a=0,c=b.length;a<c;a++)this.include(b[a]);return
this},erase:function(b){for(var
a=this.length;a--;)this[a]===b&&this.splice(a,1);return
this},empty:function(){this.length=
0;return this},flatten:function(){for(var
b=[],a=0,c=this.length;a<c;a++){var
d=typeOf(this[a]);"null"!=d&&(b=b.concat("array"==d||"collection"==d||"arguments"==d||instanceOf(this[a],Array)?Array.flatten(this[a]):this[a]))}return
b},pick:function(){for(var
b=0,a=this.length;b<a;b++)if(null!=this[b])return this[b];return
null},hexToRgb:function(b){if(3!=this.length)return null;var
a=this.map(function(b){1==b.length&&(b+=b);return
b.toInt(16)});return
b?a:"rgb("+a+")"},rgbToHex:function(b){if(3>this.length)return
null;
if(4==this.length&&0==this[3]&&!b)return"transparent";for(var
a=[],c=0;3>c;c++){var
d=(this[c]-0).toString(16);a.push(1==d.length?"0"+d:d)}return
b?a:"#"+a.join("")}});
String.implement({test:function(b,a){return("regexp"==typeOf(b)?b:RegExp(""+b,a)).test(this)},contains:function(b,a){return
a?-1<(a+this+a).indexOf(a+b+a):-1<(""+this).indexOf(b)},trim:function(){return(""+this).replace(/^\s+|\s+$/g,"")},clean:function(){return(""+this).replace(/\s+/g,"
").trim()},camelCase:function(){return(""+this).replace(/-\D/g,function(b){return
b.charAt(1).toUpperCase()})},hyphenate:function(){return(""+this).replace(/[A-Z]/g,function(b){return"-"+b.charAt(0).toLowerCase()})},
capitalize:function(){return(""+this).replace(/\b[a-z]/g,function(b){return
b.toUpperCase()})},escapeRegExp:function(){return(""+this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1")},toInt:function(b){return
parseInt(this,b||10)},toFloat:function(){return
parseFloat(this)},hexToRgb:function(b){var
a=(""+this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return
a?a.slice(1).hexToRgb(b):null},rgbToHex:function(b){var
a=(""+this).match(/\d{1,3}/g);return
a?a.rgbToHex(b):null},substitute:function(b,a){return(""+
this).replace(a||/\\?\{([^{}]+)\}/g,function(a,d){return"\\"==a.charAt(0)?a.slice(1):null!=b[d]?b[d]:""})}});Number.implement({limit:function(b,a){return
Math.min(a,Math.max(b,this))},round:function(b){b=Math.pow(10,b||0).toFixed(0>b?-b:0);return
Math.round(this*b)/b},times:function(b,a){for(var
c=0;c<this;c++)b.call(a,c,this)},toFloat:function(){return
parseFloat(this)},toInt:function(b){return
parseInt(this,b||10)}});Number.alias("each","times");
(function(b){var a={};b.each(function(b){Number[b]||(a[b]=function(){return
Math[b].apply(null,[this].concat(Array.from(arguments)))})});Number.implement(a)})("abs,acos,asin,atan,atan2,ceil,cos,exp,floor,log,max,min,pow,sin,sqrt,tan".split(","));Function.extend({attempt:function(){for(var
b=0,a=arguments.length;b<a;b++)try{return
arguments[b]()}catch(c){}return null}});
Function.implement({attempt:function(b,a){try{return
this.apply(a,Array.from(b))}catch(c){}return null},bind:function(b){var
a=this,c=1<arguments.length?Array.slice(arguments,1):null,d=function(){},e=function(){var
f=b,g=arguments.length;this instanceof
e&&(d.prototype=a.prototype,f=new
d);g=!c&&!g?a.call(f):a.apply(f,c&&g?c.concat(Array.slice(arguments)):c||arguments);return
f==b?g:f};return e},pass:function(b,a){var
c=this;null!=b&&(b=Array.from(b));return function(){return
c.apply(a,b||arguments)}},
delay:function(b,a,c){return
setTimeout(this.pass(null==c?[]:c,a),b)},periodical:function(b,a,c){return
setInterval(this.pass(null==c?[]:c,a),b)}});
(function(){var
b=Object.prototype.hasOwnProperty;Object.extend({subset:function(b,c){for(var
d={},e=0,f=c.length;e<f;e++){var g=c[e];g in
b&&(d[g]=b[g])}return d},map:function(a,c,d){var e={},f;for(f in
a)b.call(a,f)&&(e[f]=c.call(d,a[f],f,a));return
e},filter:function(a,c,d){var e={},f;for(f in a){var
g=a[f];b.call(a,f)&&c.call(d,g,f,a)&&(e[f]=g)}return
e},every:function(a,c,d){for(var e in
a)if(b.call(a,e)&&!c.call(d,a[e],e))return!1;return!0},some:function(a,c,d){for(var
e in a)if(b.call(a,e)&&
c.call(d,a[e],e))return!0;return!1},keys:function(a){var c=[],d;for(d in
a)b.call(a,d)&&c.push(d);return c},values:function(a){var
c=[],d;for(d in a)b.call(a,d)&&c.push(a[d]);return
c},getLength:function(b){return
Object.keys(b).length},keyOf:function(a,c){for(var d in
a)if(b.call(a,d)&&a[d]===c)return d;return
null},contains:function(b,c){return
null!=Object.keyOf(b,c)},toQueryString:function(b,c){var
d=[];Object.each(b,function(b,a){c&&(a=c+"["+a+"]");var
g;switch(typeOf(b)){case "object":g=Object.toQueryString(b,
a);break;case "array":var
i={};b.each(function(b,a){i[a]=b});g=Object.toQueryString(i,a);break;default:g=a+"="+encodeURIComponent(b)}null!=b&&d.push(g)});return
d.join("&")}})})();
(function(){var
b=this.document,a=b.window=this,c=navigator.userAgent.toLowerCase(),d=navigator.platform.toLowerCase(),e=c.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/)||[null,"unknown",0],f=this.Browser={extend:Function.prototype.extend,name:"version"==e[1]?e[3]:e[1],version:"ie"==e[1]&&b.documentMode||parseFloat("opera"==e[1]&&e[4]?e[4]:e[2]),Platform:{name:c.match(/ip(?:ad|od|hone)/)?"ios":(c.match(/(?:webos|android)/)||d.match(/mac|win|linux/)||
["other"])[0]},Features:{xpath:!!b.evaluate,air:!!a.runtime,query:!!b.querySelector,json:!!a.JSON},Plugins:{}};f[f.name]=!0;f[f.name+parseInt(f.version,10)]=!0;f.Platform[f.Platform.name]=!0;f.Request=function(){var
b=function(){return new XMLHttpRequest},a=function(){return new
ActiveXObject("MSXML2.XMLHTTP")},c=function(){return new
ActiveXObject("Microsoft.XMLHTTP")};return
Function.attempt(function(){b();return b},function(){a();return
a},function(){c();return c})}();f.Features.xhr=!!f.Request;
c=(Function.attempt(function(){return navigator.plugins["Shockwave
Flash"].description},function(){return(new
ActiveXObject("ShockwaveFlash.ShockwaveFlash")).GetVariable("$version")})||"0
r0").match(/\d+/g);f.Plugins.Flash={version:Number(c[0]||"0."+c[1])||0,build:Number(c[2])||0};f.exec=function(c){if(!c)return
c;if(a.execScript)a.execScript(c);else{var
h=b.createElement("script");h.setAttribute("type","text/javascript");h.text=c;b.head.appendChild(h);b.head.removeChild(h)}return
c};String.implement("stripScripts",
function(b){var
a="",c=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(b,c){a+=c+"\n";return""});!0===b?f.exec(a):"function"==typeOf(b)&&b(a,c);return
c});f.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event});this.Window=this.$constructor=new
Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(b,c){a[b]=c});this.Document=b.$constructor=new
Type("Document",function(){});b.$family=Function.from("document").hide();
Document.mirror(function(a,c){b[a]=c});b.html=b.documentElement;b.head||(b.head=b.getElementsByTagName("head")[0]);if(b.execCommand)try{b.execCommand("BackgroundImageCache",!1,!0)}catch(g){}if(this.attachEvent&&!this.addEventListener){var
i=function(){this.detachEvent("onunload",i);b.head=b.html=b.window=null};this.attachEvent("onunload",i)}var
j=Array.from;try{j(b.html.childNodes)}catch(m){Array.from=function(b){if(typeof
b!="string"&&Type.isEnumerable(b)&&typeOf(b)!="array"){for(var
a=b.length,
c=Array(a);a--;)c[a]=b[a];return c}return j(b)};var
h=Array.prototype,k=h.slice;"pop,push,reverse,shift,sort,splice,unshift,concat,join,slice".split(",").each(function(b){var
a=h[b];Array[b]=function(b){return
a.apply(Array.from(b),k.call(arguments,1))}})}})();
(function(){var b={},a=this.DOMEvent=new
Type("DOMEvent",function(a,d){d||(d=window);a=a||d.event;if(a.$extended)return
a;this.event=a;this.$extended=!0;this.shift=a.shiftKey;this.control=a.ctrlKey;this.alt=a.altKey;this.meta=a.metaKey;for(var
e=this.type=a.type,f=a.target||a.srcElement;f&&3==f.nodeType;)f=f.parentNode;this.target=document.id(f);if(0==e.indexOf("key")){if(f=this.code=a.which||a.keyCode,this.key=b[f],"keydown"==e&&(111<f&&124>f?this.key="f"+(f-111):95<f&&106>f&&(this.key=f-96)),null==
this.key)this.key=String.fromCharCode(f).toLowerCase()}else
if("click"==e||"dblclick"==e||"contextmenu"==e||"DOMMouseScroll"==e||0==e.indexOf("mouse")){f=d.document;f=!f.compatMode||"CSS1Compat"==f.compatMode?f.html:f.body;this.page={x:null!=a.pageX?a.pageX:a.clientX+f.scrollLeft,y:null!=a.pageY?a.pageY:a.clientY+f.scrollTop};this.client={x:null!=a.pageX?a.pageX-d.pageXOffset:a.clientX,y:null!=a.pageY?a.pageY-d.pageYOffset:a.clientY};if("DOMMouseScroll"==e||"mousewheel"==e)this.wheel=a.wheelDelta?
a.wheelDelta/120:-(a.detail||0)/3;this.rightClick=3==a.which||2==a.button;if("mouseover"==e||"mouseout"==e){for(e=a.relatedTarget||a[("mouseover"==e?"from":"to")+"Element"];e&&3==e.nodeType;)e=e.parentNode;this.relatedTarget=document.id(e)}}else
if(0==e.indexOf("touch")||0==e.indexOf("gesture"))if(this.rotation=a.rotation,this.scale=a.scale,this.targetTouches=a.targetTouches,this.changedTouches=a.changedTouches,(e=this.touches=a.touches)&&e[0])e=e[0],this.page={x:e.pageX,y:e.pageY},this.client={x:e.clientX,
y:e.clientY};this.client||(this.client={});this.page||(this.page={})});a.implement({stop:function(){return
this.preventDefault().stopPropagation()},stopPropagation:function(){this.event.stopPropagation?this.event.stopPropagation():this.event.cancelBubble=!0;return
this},preventDefault:function(){this.event.preventDefault?this.event.preventDefault():this.event.returnValue=!1;return
this}});a.defineKey=function(a,d){b[a]=d;return
this};a.defineKeys=a.defineKey.overloadSetter(!0);a.defineKeys({38:"up",
40:"down",37:"left",39:"right",27:"esc",32:"space",8:"backspace",9:"tab",46:"delete",13:"enter"})})();
(function(){var b=this.Class=new
Type("Class",function(e){instanceOf(e,Function)&&(e={initialize:e});var
d=function(){c(this);if(d.$prototyping)return this;this.$caller=null;var
a=this.initialize?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;return
a}.extend(this).implement(e);d.$constructor=b;d.prototype.$constructor=d;d.prototype.parent=a;return
d}),a=function(){if(!this.$caller)throw Error('The method
"parent" cannot be called.');var
a=this.$caller.$name,b=this.$caller.$owner.parent,
b=b?b.prototype[a]:null;if(!b)throw Error('The method
"'+a+'" has no parent.');return
b.apply(this,arguments)},c=function(a){for(var b in a){var
e=a[b];switch(typeOf(e)){case "object":var
d=function(){};d.prototype=e;a[b]=c(new d);break;case
"array":a[b]=e.clone()}}return
a},d=function(a,b,c){c.$origin&&(c=c.$origin);var
e=function(){if(c.$protected&&this.$caller==null)throw
Error('The method "'+b+'" cannot be
called.');var
a=this.caller,h=this.$caller;this.caller=h;this.$caller=e;var
k=c.apply(this,
arguments);this.$caller=h;this.caller=a;return
k}.extend({$owner:a,$origin:c,$name:b});return
e},e=function(a,c,e){if(b.Mutators.hasOwnProperty(a)&&(c=b.Mutators[a].call(this,c),null==c))return
this;if("function"==typeOf(c)){if(c.$hidden)return
this;this.prototype[a]=e?c:d(this,a,c)}else
Object.merge(this.prototype,a,c);return
this};b.implement("implement",e.overloadSetter());b.Mutators={Extends:function(a){this.parent=a;a.$prototyping=!0;var
b=new a;delete
a.$prototyping;this.prototype=b},Implements:function(a){Array.from(a).each(function(a){var
a=
new a,b;for(b in a)e.call(this,b,a[b],!0)},this)}}})();
(function(){this.Chain=new
Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments));return
this},callChain:function(){return
this.$chain.length?this.$chain.shift().apply(this,arguments):!1},clearChain:function(){this.$chain.empty();return
this}});var b=function(a){return
a.replace(/^on([A-Z])/,function(a,b){return
b.toLowerCase()})};this.Events=new
Class({$events:{},addEvent:function(a,c,d){a=b(a);this.$events[a]=(this.$events[a]||[]).include(c);d&&(c.internal=!0);return
this},
addEvents:function(a){for(var b in a)this.addEvent(b,a[b]);return
this},fireEvent:function(a,c,d){a=b(a);a=this.$events[a];if(!a)return
this;c=Array.from(c);a.each(function(a){d?a.delay(d,this,c):a.apply(this,c)},this);return
this},removeEvent:function(a,c){var
a=b(a),d=this.$events[a];if(d&&!c.internal){var
e=d.indexOf(c);-1!=e&&delete d[e]}return
this},removeEvents:function(a){var
c;if("object"==typeOf(a)){for(c in
a)this.removeEvent(c,a[c]);return this}a&&(a=b(a));for(c in
this.$events)if(!(a&&
a!=c))for(var d=this.$events[c],e=d.length;e--;)e in
d&&this.removeEvent(c,d[e]);return this}});this.Options=new
Class({setOptions:function(){var
a=this.options=Object.merge.apply(null,[{},this.options].append(arguments));if(this.addEvent)for(var
b in
a)"function"==typeOf(a[b])&&/^on[A-Z]/.test(b)&&(this.addEvent(b,a[b]),delete
a[b]);return this}})})();
(function(){function
b(b,h,o,l,f,q,j,g,x,F,t,B,A,D,v,z){if(h||-1===c)if(a.expressions[++c]=[],d=-1,h)return"";if(o||l||-1===d)o=o||"
",b=a.expressions[c],e&&b[d]&&(b[d].reverseCombinator=m(o)),b[++d]={combinator:o,tag:"*"};o=a.expressions[c][d];if(f)o.tag=f.replace(i,"");else
if(q)o.id=q.replace(i,"");else
if(j)j=j.replace(i,""),o.classList||(o.classList=[]),o.classes||(o.classes=[]),o.classList.push(j),o.classes.push({value:j,regexp:RegExp("(^|\\s)"+k(j)+"(\\s|$)")});else
if(A)z=(z=z||v)?z.replace(i,
""):null,o.pseudos||(o.pseudos=[]),o.pseudos.push({key:A.replace(i,""),value:z,type:1==B.length?"class":"element"});else
if(g){var
g=g.replace(i,""),t=(t||"").replace(i,""),y,E;switch(x){case
"^=":E=RegExp("^"+k(t));break;case
"$=":E=RegExp(k(t)+"$");break;case
"~=":E=RegExp("(^|\\s)"+k(t)+"(\\s|$)");break;case
"|=":E=RegExp("^"+k(t)+"(-|$)");break;case
"=":y=function(a){return t==a};break;case
"*=":y=function(a){return
a&&-1<a.indexOf(t)};break;case
"!=":y=function(a){return t!=a};break;default:y=
function(a){return!!a}}""==t&&/^[*$^]=$/.test(x)&&(y=function(){return!1});y||(y=function(a){return
a&&E.test(a)});o.attributes||(o.attributes=[]);o.attributes.push({key:g,operator:x,value:t,test:y})}return""}var
a,c,d,e,f={},g={},i=/\\/g,j=function(k,d){if(null==k)return
null;if(!0===k.Slick)return k;var
k=(""+k).replace(/^\s+|\s+$/g,""),q=(e=!!d)?g:f;if(q[k])return
q[k];a={Slick:!0,expressions:[],raw:k,reverse:function(){return
j(this.raw,!0)}};for(c=-1;k!=(k=k.replace(o,b)););a.length=a.expressions.length;
return q[a.raw]=e?h(a):a},m=function(a){return"!"===a?"
":"
"===a?"!":/^!/.test(a)?a.replace(/^!/,""):"!"+a},h=function(a){for(var
b=a.expressions,c=0;c<b.length;c++){for(var
h=b[c],k={parts:[],tag:"*",combinator:m(h[0].combinator)},e=0;e<h.length;e++){var
d=h[e];d.reverseCombinator||(d.reverseCombinator="
");d.combinator=d.reverseCombinator;delete
d.reverseCombinator}h.reverse().push(k)}return a},k=function(a){return
a.replace(/[-[\]{}()*+?.\\^$|,#\s]/g,function(a){return"\\"+a})},o=RegExp("^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(/<combinator>/,
"["+k(">+~`!@$%^&={}\\;</")+"]").replace(/<unicode>/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(/<unicode1>/g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")),q=this.Slick||{};q.parse=function(a){return
j(a)};q.escapeRegExp=k;this.Slick||(this.Slick=q)}).apply("undefined"!=typeof
exports?exports:this);
(function(){var
b={},a={},c=Object.prototype.toString;b.isNativeCode=function(a){return/\{\s*\[native
code\]\s*\}/.test(""+a)};b.isXML=function(a){return!!a.xmlVersion||!!a.xml||"[object
XMLDocument]"==c.call(a)||9==a.nodeType&&"HTML"!=a.documentElement.nodeName};b.setDocument=function(b){var
c=b.nodeType;if(9!=c)if(c)b=b.ownerDocument;else
if(b.navigator)b=b.document;else
return;if(this.document!==b){this.document=b;var
c=b.documentElement,e=this.getUIDXML(c),d=a[e],f;if(!d){d=a[e]={};d.root=c;d.isXMLDocument=
this.isXML(b);d.brokenStarGEBTN=d.starSelectsClosedQSA=d.idGetsName=d.brokenMixedCaseQSA=d.brokenGEBCN=d.brokenCheckedQSA=d.brokenEmptyAttributeQSA=d.isHTMLDocument=d.nativeMatchesSelector=!1;var
j,m,l,s,g,n=b.createElement("div"),i=b.body||b.getElementsByTagName("body")[0]||c;i.appendChild(n);try{n.innerHTML='<a
id="slick_uniqueid"></a>',d.isHTMLDocument=!!b.getElementById("slick_uniqueid")}catch(x){}if(d.isHTMLDocument){n.style.display="none";n.appendChild(b.createComment(""));e=1<n.getElementsByTagName("*").length;
try{n.innerHTML="foo</foo>",j=(g=n.getElementsByTagName("*"))&&!!g.length&&"/"==g[0].nodeName.charAt(0)}catch(F){}d.brokenStarGEBTN=e||j;try{n.innerHTML='<a
name="slick_uniqueid"></a><b
id="slick_uniqueid"></b>',d.idGetsName=b.getElementById("slick_uniqueid")===n.firstChild}catch(t){}if(n.getElementsByClassName){try{n.innerHTML='<a
class="f"></a><a
class="b"></a>',n.getElementsByClassName("b").length,n.firstChild.className="b",l=2!=n.getElementsByClassName("b").length}catch(B){}try{n.innerHTML='<a
class="a"></a><a class="f b
a"></a>',
m=2!=n.getElementsByClassName("a").length}catch(A){}d.brokenGEBCN=l||m}if(n.querySelectorAll){try{n.innerHTML="foo</foo>",g=n.querySelectorAll("*"),d.starSelectsClosedQSA=g&&!!g.length&&"/"==g[0].nodeName.charAt(0)}catch(D){}try{n.innerHTML='<a
class="MiX"></a>',d.brokenMixedCaseQSA=!n.querySelectorAll(".MiX").length}catch(v){}try{n.innerHTML='<select><option
selected="selected">a</option></select>',d.brokenCheckedQSA=0==n.querySelectorAll(":checked").length}catch(z){}try{n.innerHTML='<a
class=""></a>',
d.brokenEmptyAttributeQSA=0!=n.querySelectorAll('[class*=""]').length}catch(y){}}try{n.innerHTML='<form
action="s"><input
id="action"/></form>',s="s"!=n.firstChild.getAttribute("action")}catch(E){}d.nativeMatchesSelector=c.matchesSelector||c.mozMatchesSelector||c.webkitMatchesSelector;if(d.nativeMatchesSelector)try{d.nativeMatchesSelector.call(c,":slick"),d.nativeMatchesSelector=null}catch(G){}}try{c.slick_expando=1,delete
c.slick_expando,d.getUID=this.getUIDHTML}catch(H){d.getUID=this.getUIDXML}i.removeChild(n);
n=g=i=null;d.getAttribute=d.isHTMLDocument&&s?function(a,b){var
c=this.attributeGetters[b];return
c?c.call(a):(c=a.getAttributeNode(b))?c.nodeValue:null}:function(a,b){var
c=this.attributeGetters[b];return
c?c.call(a):a.getAttribute(b)};d.hasAttribute=c&&this.isNativeCode(c.hasAttribute)?function(a,b){return
a.hasAttribute(b)}:function(a,b){a=a.getAttributeNode(b);return!(!a||!a.specified&&!a.nodeValue)};j=c&&this.isNativeCode(c.contains);m=b&&this.isNativeCode(b.contains);d.contains=j&&m?function(a,
b){return a.contains(b)}:j&&!m?function(a,c){return
a===c||(a===b?b.documentElement:a).contains(c)}:c&&c.compareDocumentPosition?function(a,b){return
a===b||!!(a.compareDocumentPosition(b)&16)}:function(a,b){if(b){do
if(b===a)return!0;while(b=b.parentNode)}return!1};d.documentSorter=c.compareDocumentPosition?function(a,b){return!a.compareDocumentPosition||!b.compareDocumentPosition?0:a.compareDocumentPosition(b)&4?-1:a===b?0:1}:"sourceIndex"in
c?function(a,b){return!a.sourceIndex||!b.sourceIndex?
0:a.sourceIndex-b.sourceIndex}:b.createRange?function(a,b){if(!a.ownerDocument||!b.ownerDocument)return
0;var
c=a.ownerDocument.createRange(),h=b.ownerDocument.createRange();c.setStart(a,0);c.setEnd(a,0);h.setStart(b,0);h.setEnd(b,0);return
c.compareBoundaryPoints(Range.START_TO_END,h)}:null;c=null}for(f in
d)this[f]=d[f]}};var
d=/^([#.]?)((?:[\w-]+|\*))$/,e=/\[.+[*$^]=(?:""|'')?\]/,f={};b.search=function(a,b,c,j){var
g=this.found=j?null:c||[];if(a)if(a.navigator)a=a.document;else{if(!a.nodeType)return
g}else return g;
var
r,i,l=this.uniques={},c=!(!c||!c.length),s=9==a.nodeType;this.document!==(s?a:a.ownerDocument)&&this.setDocument(a);if(c)for(i=g.length;i--;)l[this.getUID(g[i])]=!0;if("string"==typeof
b){var p=b.match(d);a:if(p){i=p[1];var
n=p[2];if(i)if("#"==i){if(!this.isHTMLDocument||!s)break
a;p=a.getElementById(n);if(!p)return
g;if(this.idGetsName&&p.getAttributeNode("id").nodeValue!=n)break
a;if(j)return
p||null;(!c||!l[this.getUID(p)])&&g.push(p)}else{if("."==i){if(!this.isHTMLDocument||(!a.getElementsByClassName||
this.brokenGEBCN)&&a.querySelectorAll)break
a;if(a.getElementsByClassName&&!this.brokenGEBCN){r=a.getElementsByClassName(n);if(j)return
r[0]||null;for(i=0;p=r[i++];)(!c||!l[this.getUID(p)])&&g.push(p)}else{var
C=RegExp("(^|\\s)"+m.escapeRegExp(n)+"(\\s|$)");r=a.getElementsByTagName("*");for(i=0;p=r[i++];)if((className=p.className)&&C.test(className)){if(j)return
p;(!c||!l[this.getUID(p)])&&g.push(p)}}}}else{if("*"==n&&this.brokenStarGEBTN)break
a;r=a.getElementsByTagName(n);if(j)return r[0]||null;
for(i=0;p=r[i++];)(!c||!l[this.getUID(p)])&&g.push(p)}c&&this.sort(g);return
j?null:g}a:if(a.querySelectorAll&&this.isHTMLDocument&&!f[b]&&!this.brokenMixedCaseQSA&&!(this.brokenCheckedQSA&&-1<b.indexOf(":checked")||this.brokenEmptyAttributeQSA&&e.test(b)||!s&&-1<b.indexOf(",")||m.disableQSA)){i=b;p=a;if(!s){var
x=p.getAttribute("id");p.setAttribute("id","slickid__");i="#slickid__
"+i;a=p.parentNode}try{if(j)return
a.querySelector(i)||null;r=a.querySelectorAll(i)}catch(F){f[b]=1;break
a}finally{s||
(x?p.setAttribute("id",x):p.removeAttribute("id"),a=p)}if(this.starSelectsClosedQSA)for(i=0;p=r[i++];)"@"<p.nodeName&&(!c||!l[this.getUID(p)])&&g.push(p);else
for(i=0;p=r[i++];)(!c||!l[this.getUID(p)])&&g.push(p);c&&this.sort(g);return
g}r=this.Slick.parse(b);if(!r.length)return g}else{if(null==b)return
g;if(b.Slick)r=b;else{if(this.contains(a.documentElement||a,b))g?g.push(b):g=b;return
g}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=!c&&(j||1==r.length&&
1==r.expressions[0].length)?this.pushArray:this.pushUID;null==g&&(g=[]);var
t,B,A,D,v,z,y=r.expressions;i=0;a:for(;z=y[i];i++)for(b=0;v=z[b];b++){x="combinator:"+v.combinator;if(!this[x])continue
a;s=this.isXMLDocument?v.tag:v.tag.toUpperCase();p=v.id;n=v.classList;A=v.classes;D=v.attributes;v=v.pseudos;t=b===z.length-1;this.bitUniques={};t?(this.uniques=l,this.found=g):(this.uniques={},this.found=[]);if(0===b){if(this[x](a,s,p,A,D,v,n),j&&t&&g.length)break
a}else if(j&&t){t=0;for(B=C.length;t<B;t++)if(this[x](C[t],
s,p,A,D,v,n),g.length)break
a}else{t=0;for(B=C.length;t<B;t++)this[x](C[t],s,p,A,D,v,n)}C=this.found}(c||1<r.expressions.length)&&this.sort(g);return
j?g[0]||null:g};b.uidx=1;b.uidk="slick-uniqueid";b.getUIDXML=function(a){var
b=a.getAttribute(this.uidk);b||(b=this.uidx++,a.setAttribute(this.uidk,b));return
b};b.getUIDHTML=function(a){return
a.uniqueNumber||(a.uniqueNumber=this.uidx++)};b.sort=function(a){if(!this.documentSorter)return
a;a.sort(this.documentSorter);return a};b.cacheNTH={};b.matchNTH=
/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;b.parseNTHArgument=function(a){var
b=a.match(this.matchNTH);if(!b)return!1;var
c=b[2]||!1,d=b[1]||1;"-"==d&&(d=-1);b=+b[3]||0;b="n"==c?{a:d,b:b}:"odd"==c?{a:2,b:1}:"even"==c?{a:2,b:0}:{a:0,b:d};return
this.cacheNTH[a]=b};b.createNTHPseudo=function(a,b,c,d){return
function(e,f){var g=this.getUID(e);if(!this[c][g]){var
l=e.parentNode;if(!l)return!1;var l=l[a],s=1;if(d){var j=e.nodeName;do
l.nodeName==j&&(this[c][this.getUID(l)]=s++);while(l=l[b])}else{do
1==l.nodeType&&
(this[c][this.getUID(l)]=s++);while(l=l[b])}}f=f||"n";s=this.cacheNTH[f]||this.parseNTHArgument(f);if(!s)return!1;l=s.a;s=s.b;g=this[c][g];if(0==l)return
s==g;if(0<l){if(g<s)return!1}else if(s<g)return!1;return
0==(g-s)%l}};b.pushArray=function(a,b,c,d,e,f){this.matchSelector(a,b,c,d,e,f)&&this.found.push(a)};b.pushUID=function(a,b,c,d,e,f){var
g=this.getUID(a);!this.uniques[g]&&this.matchSelector(a,b,c,d,e,f)&&(this.uniques[g]=!0,this.found.push(a))};b.matchNode=function(a,b){if(this.isHTMLDocument&&
this.nativeMatchesSelector)try{return
this.nativeMatchesSelector.call(a,b.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g,'[$1="$2"]'))}catch(c){}var
d=this.Slick.parse(b);if(!d)return!0;var
e=d.expressions,f=0,g;for(g=0;currentExpression=e[g];g++)if(1==currentExpression.length){var
l=currentExpression[0];if(this.matchSelector(a,this.isXMLDocument?l.tag:l.tag.toUpperCase(),l.id,l.classes,l.attributes,l.pseudos))return!0;f++}if(f==d.length)return!1;d=this.search(this.document,d);for(g=0;e=d[g++];)if(e===
a)return!0;return!1};b.matchPseudo=function(a,b,c){var
d="pseudo:"+b;if(this[d])return
this[d](a,c);a=this.getAttribute(a,b);return
c?c==a:!!a};b.matchSelector=function(a,b,c,d,e,f){if(b){var
g=this.isXMLDocument?a.nodeName:a.nodeName.toUpperCase();if("*"==b){if("@">g)return!1}else
if(g!=b)return!1}if(c&&a.getAttribute("id")!=c)return!1;if(d)for(b=d.length;b--;)if(c=this.getAttribute(a,"class"),!c||!d[b].regexp.test(c))return!1;if(e)for(b=e.length;b--;)if(d=e[b],d.operator?!d.test(this.getAttribute(a,
d.key)):!this.hasAttribute(a,d.key))return!1;if(f)for(b=f.length;b--;)if(d=f[b],!this.matchPseudo(a,d.key,d.value))return!1;return!0};var
g={" ":function(a,b,c,d,e,f,g){var
l;if(this.isHTMLDocument){if(c){l=this.document.getElementById(c);if(!l&&a.all||this.idGetsName&&l&&l.getAttributeNode("id").nodeValue!=c){g=a.all[c];if(!g)return;g[0]||(g=[g]);for(a=0;l=g[a++];){var
s=l.getAttributeNode("id");if(s&&s.nodeValue==c){this.push(l,b,null,d,e,f);break}}return}if(l){if(this.document!==a&&!this.contains(a,
l))return;this.push(l,b,null,d,e,f);return}if(this.contains(this.root,a))return}if(d&&a.getElementsByClassName&&!this.brokenGEBCN&&(g=a.getElementsByClassName(g.join("
")))&&g.length){for(a=0;l=g[a++];)this.push(l,b,c,null,e,f);return}}if((g=a.getElementsByTagName(b))&&g.length){this.brokenStarGEBTN||(b=null);for(a=0;l=g[a++];)this.push(l,b,c,d,e,f)}},">":function(a,b,c,d,e,f){if(a=a.firstChild){do
1==a.nodeType&&this.push(a,b,c,d,e,f);while(a=a.nextSibling)}},"+":function(a,b,c,d,e,f){for(;a=a.nextSibling;)if(1==
a.nodeType){this.push(a,b,c,d,e,f);break}},"^":function(a,b,c,d,e,f){if(a=a.firstChild)if(1==a.nodeType)this.push(a,b,c,d,e,f);else
this["combinator:+"](a,b,c,d,e,f)},"~":function(a,b,c,d,e,f){for(;a=a.nextSibling;)if(1==a.nodeType){var
g=this.getUID(a);if(this.bitUniques[g])break;this.bitUniques[g]=!0;this.push(a,b,c,d,e,f)}},"++":function(a,b,c,d,e,f){this["combinator:+"](a,b,c,d,e,f);this["combinator:!+"](a,b,c,d,e,f)},"~~":function(a,b,c,d,e,f){this["combinator:~"](a,b,c,d,e,f);this["combinator:!~"](a,
b,c,d,e,f)},"!":function(a,b,c,d,e,f){for(;a=a.parentNode;)a!==this.document&&this.push(a,b,c,d,e,f)},"!>":function(a,b,c,d,e,f){a=a.parentNode;a!==this.document&&this.push(a,b,c,d,e,f)},"!+":function(a,b,c,d,e,f){for(;a=a.previousSibling;)if(1==a.nodeType){this.push(a,b,c,d,e,f);break}},"!^":function(a,b,c,d,e,f){if(a=a.lastChild)if(1==a.nodeType)this.push(a,b,c,d,e,f);else
this["combinator:!+"](a,b,c,d,e,f)},"!~":function(a,b,c,d,e,f){for(;a=a.previousSibling;)if(1==a.nodeType){var
g=this.getUID(a);
if(this.bitUniques[g])break;this.bitUniques[g]=!0;this.push(a,b,c,d,e,f)}}},i;for(i
in g)b["combinator:"+i]=g[i];var g={empty:function(a){var
b=a.firstChild;return!(b&&1==b.nodeType)&&!(a.innerText||a.textContent||"").length},not:function(a,b){return!this.matchNode(a,b)},contains:function(a,b){return-1<(a.innerText||a.textContent||"").indexOf(b)},"first-child":function(a){for(;a=a.previousSibling;)if(1==a.nodeType)return!1;return!0},"last-child":function(a){for(;a=a.nextSibling;)if(1==a.nodeType)return!1;
return!0},"only-child":function(a){for(var
b=a;b=b.previousSibling;)if(1==b.nodeType)return!1;for(;a=a.nextSibling;)if(1==a.nodeType)return!1;return!0},"nth-child":b.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":b.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":b.createNTHPseudo("firstChild","nextSibling","posNTHType",!0),"nth-last-of-type":b.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",!0),index:function(a,b){return
this["pseudo:nth-child"](a,
""+(b+1))},even:function(a){return
this["pseudo:nth-child"](a,"2n")},odd:function(a){return
this["pseudo:nth-child"](a,"2n+1")},"first-of-type":function(a){for(var
b=a.nodeName;a=a.previousSibling;)if(a.nodeName==b)return!1;return!0},"last-of-type":function(a){for(var
b=a.nodeName;a=a.nextSibling;)if(a.nodeName==b)return!1;return!0},"only-of-type":function(a){for(var
b=a,c=a.nodeName;b=b.previousSibling;)if(b.nodeName==c)return!1;for(;a=a.nextSibling;)if(a.nodeName==c)return!1;return!0},enabled:function(a){return!a.disabled},
disabled:function(a){return a.disabled},checked:function(a){return
a.checked||a.selected},focus:function(a){return
this.isHTMLDocument&&this.document.activeElement===a&&(a.href||a.type||this.hasAttribute(a,"tabindex"))},root:function(a){return
a===this.root},selected:function(a){return a.selected}},j;for(j in
g)b["pseudo:"+j]=g[j];j=b.attributeGetters={"for":function(){return"htmlFor"in
this?this.htmlFor:this.getAttribute("for")},href:function(){return"href"in
this?this.getAttribute("href",2):this.getAttribute("href")},
style:function(){return
this.style?this.style.cssText:this.getAttribute("style")},tabindex:function(){var
a=this.getAttributeNode("tabindex");return
a&&a.specified?a.nodeValue:null},type:function(){return
this.getAttribute("type")},maxlength:function(){var
a=this.getAttributeNode("maxLength");return
a&&a.specified?a.nodeValue:null}};j.MAXLENGTH=j.maxLength=j.maxlength;var
m=b.Slick=this.Slick||{};m.version="1.1.7";m.search=function(a,c,d){return
b.search(a,c,d)};m.find=function(a,c){return b.search(a,
c,null,!0)};m.contains=function(a,c){b.setDocument(a);return
b.contains(a,c)};m.getAttribute=function(a,c){b.setDocument(a);return
b.getAttribute(a,c)};m.hasAttribute=function(a,c){b.setDocument(a);return
b.hasAttribute(a,c)};m.match=function(a,c){if(!a||!c)return!1;if(!c||c===a)return!0;b.setDocument(a);return
b.matchNode(a,c)};m.defineAttributeGetter=function(a,c){b.attributeGetters[a]=c;return
this};m.lookupAttributeGetter=function(a){return
b.attributeGetters[a]};m.definePseudo=function(a,c){b["pseudo:"+
a]=function(a,b){return c.call(a,b)};return
this};m.lookupPseudo=function(a){var c=b["pseudo:"+a];return
c?function(a){return
c.call(this,a)}:null};m.override=function(a,c){b.override(a,c);return
this};m.isXML=b.isXML;m.uidOf=function(a){return
b.getUIDHTML(a)};this.Slick||(this.Slick=m)}).apply("undefined"!=typeof
exports?exports:this);
var Element=function(b,a){var c=Element.Constructors[b];if(c)return
c(a);if("string"!=typeof b)return
document.id(b).set(a);a||(a={});if(!/^[\w-]+$/.test(b)){c=Slick.parse(b).expressions[0][0];b="*"==c.tag?"div":c.tag;c.id&&null==a.id&&(a.id=c.id);var
d=c.attributes;if(d)for(var
e,f=0,g=d.length;f<g;f++)e=d[f],null==a[e.key]&&(null!=e.value&&"="==e.operator?a[e.key]=e.value:!e.value&&!e.operator&&(a[e.key]=!0));c.classList&&null==a["class"]&&(a["class"]=c.classList.join("
"))}return document.newElement(b,
a)};Browser.Element&&(Element.prototype=Browser.Element.prototype,Element.prototype._fireEvent=function(b){return
function(a,c){return b.call(this,a,c)}}(Element.prototype.fireEvent));(new
Type("Element",Element)).mirror(function(b){if(!Array.prototype[b]){var
a={};a[b]=function(){for(var
a=[],d=arguments,e=true,f=0,g=this.length;f<g;f++)var
i=this[f],i=a[f]=i[b].apply(i,d),e=e&&typeOf(i)=="element";return
e?new Elements(a):a};Elements.implement(a)}});
Browser.Element||(Element.parent=Object,Element.Prototype={$constructor:Element,$family:Function.from("element").hide()},Element.mirror(function(b,a){Element.Prototype[b]=a}));Element.Constructors={};
var IFrame=new Type("IFrame",function(){var
b=Array.link(arguments,{properties:Type.isObject,iframe:function(a){return
a!=null}}),a=b.properties||{},c;b.iframe&&(c=document.id(b.iframe));var
d=a.onload||function(){};delete
a.onload;a.id=a.name=[a.id,a.name,c?c.id||c.name:"IFrame_"+String.uniqueID()].pick();c=new
Element(c||"iframe",a);b=function(){d.call(c.contentWindow)};window.frames[a.id]?b():c.addListener("load",b);return
c}),Elements=this.Elements=function(b){if(b&&b.length)for(var
a={},c,d=
0;c=b[d++];){var
e=Slick.uidOf(c);if(!a[e]){a[e]=true;this.push(c)}}};Elements.prototype={length:0};Elements.parent=Array;
(new
Type("Elements",Elements)).implement({filter:function(b,a){return!b?this:new
Elements(Array.filter(this,typeOf(b)=="string"?function(a){return
a.match(b)}:b,a))}.protect(),push:function(){for(var
b=this.length,a=0,c=arguments.length;a<c;a++){var
d=document.id(arguments[a]);d&&(this[b++]=d)}return
this.length=b}.protect(),unshift:function(){for(var
b=[],a=0,c=arguments.length;a<c;a++){var
d=document.id(arguments[a]);d&&b.push(d)}return
Array.prototype.unshift.apply(this,b)}.protect(),concat:function(){for(var
b=
new Elements(this),a=0,c=arguments.length;a<c;a++){var
d=arguments[a];Type.isEnumerable(d)?b.append(d):b.push(d)}return
b}.protect(),append:function(b){for(var
a=0,c=b.length;a<c;a++)this.push(b[a]);return
this}.protect(),empty:function(){for(;this.length;)delete
this[--this.length];return this}.protect()});
(function(){var
b=Array.prototype.splice,a={"0":0,1:1,length:2};b.call(a,1,1);a[1]==1&&Elements.implement("splice",function(){for(var
a=this.length,c=b.apply(this,arguments);a>=this.length;)delete
this[a--];return
c}.protect());Array.forEachMethod(function(a,b){Elements.implement(b,a)});Array.mirror(Elements);var
c;try{c=document.createElement("<input
name=x>").name=="x"}catch(d){}var
e=function(a){return(""+a).replace(/&/g,"&amp;").replace(/"/g,"&quot;")};Document.implement({newElement:function(a,
b){if(b&&b.checked!=null)b.defaultChecked=b.checked;if(c&&b){a="<"+a;b.name&&(a=a+('
name="'+e(b.name)+'"'));b.type&&(a=a+('
type="'+e(b.type)+'"'));a=a+">";delete
b.name;delete b.type}return this.id(this.createElement(a)).set(b)}})})();
(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(a){return
this.createTextNode(a)},getDocument:function(){return
this},getWindow:function(){return this.window},id:function(){var
a={string:function(b,c,d){return(b=Slick.find(d,"#"+b.replace(/(\W)/g,"\\$1")))?a.element(b,c):null},element:function(a,b){Slick.uidOf(a);if(!b&&!a.$family&&!/^(?:object|embed)$/i.test(a.tagName)){var
c=a.fireEvent;a._fireEvent=function(a,b){return
c(a,b)};Object.append(a,Element.Prototype)}return a},
object:function(b,c,d){return
b.toElement?a.element(b.toElement(d),c):null}};a.textnode=a.whitespace=a.window=a.document=function(a){return
a};return
function(b,c,d){if(b&&b.$family&&b.uniqueNumber)return
b;var e=typeOf(b);return
a[e]?a[e](b,c,d||document):null}}()});window.$==null&&Window.implement("$",function(a,b){return
document.id(a,b,this.document)});Window.implement({getDocument:function(){return
this.document},getWindow:function(){return
this}});[Document,Element].invoke("implement",{getElements:function(a){return
Slick.search(this,
a,new Elements)},getElement:function(a){return
document.id(Slick.find(this,a))}});var b={contains:function(a){return
Slick.contains(this,a)}};document.contains||Document.implement(b);document.createElement("div").contains||Element.implement(b);var
a=function(a,b){if(!a)return b;for(var
a=Object.clone(Slick.parse(a)),c=a.expressions,d=c.length;d--;)c[d][0].combinator=b;return
a};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(b,c){Element.implement(c,function(c){return
this.getElement(a(c,
b))})});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(b,c){Element.implement(c,function(c){return
this.getElements(a(c,b))})});Element.implement({getFirst:function(b){return
document.id(Slick.search(this,a(b,">"))[0])},getLast:function(b){return
document.id(Slick.search(this,a(b,">")).getLast())},getWindow:function(){return
this.ownerDocument.window},getDocument:function(){return
this.ownerDocument},getElementById:function(a){return
document.id(Slick.find(this,
"#"+(""+a).replace(/(\W)/g,"\\$1")))},match:function(a){return!a||Slick.match(this,a)}});window.$$==null&&Window.implement("$$",function(a){if(arguments.length==1){if(typeof
a=="string")return Slick.search(this.document,a,new
Elements);if(Type.isEnumerable(a))return new Elements(a)}return new
Elements(arguments)});var c={before:function(a,b){var
c=b.parentNode;c&&c.insertBefore(a,b)},after:function(a,b){var
c=b.parentNode;c&&c.insertBefore(a,b.nextSibling)},bottom:function(a,b){b.appendChild(a)},
top:function(a,b){b.insertBefore(a,b.firstChild)}};c.inside=c.bottom;var
d={},e={},f={};Array.forEach(["type","value","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","rowSpan","tabIndex","useMap"],function(a){f[a.toLowerCase()]=a});f.html="innerHTML";f.text=document.createElement("div").textContent==null?"innerText":"textContent";Object.forEach(f,function(a,b){e[b]=function(b,c){b[a]=c};d[b]=function(b){return
b[a]}});Array.forEach(["compact","nowrap","ismap","declare",
"noshade","checked","disabled","readOnly","multiple","selected","noresize","defer","defaultChecked","autofocus","controls","autoplay","loop"],function(a){var
b=a.toLowerCase();e[b]=function(b,c){b[a]=!!c};d[b]=function(b){return!!b[a]}});Object.append(e,{"class":function(a,b){"className"in
a?a.className=b||"":a.setAttribute("class",b)},"for":function(a,b){"htmlFor"in
a?a.htmlFor=b:a.setAttribute("for",b)},style:function(a,b){a.style?a.style.cssText=b:a.setAttribute("style",b)},value:function(a,b){a.value=
b!=null?b:""}});d["class"]=function(a){return"className"in
a?a.className||null:a.getAttribute("class")};b=document.createElement("button");try{b.type="button"}catch(g){}if(b.type!="button")e.type=function(a,b){a.setAttribute("type",b)};b=null;b=document.createElement("input");b.value="t";b.type="submit";if(b.value!="t")e.type=function(a,b){var
c=a.value;a.type=b;a.value=c};var
b=null,i=function(a){a.random="attribute";return
a.getAttribute("random")=="attribute"}(document.createElement("div"));Element.implement({setProperty:function(a,
b){var c=e[a.toLowerCase()];if(c)c(this,b);else{if(i)var
d=this.retrieve("$attributeWhiteList",{});if(b==null){this.removeAttribute(a);i&&delete
d[a]}else{this.setAttribute(a,""+b);i&&(d[a]=true)}}return
this},setProperties:function(a){for(var b in
a)this.setProperty(b,a[b]);return this},getProperty:function(a){var
b=d[a.toLowerCase()];if(b)return b(this);if(i){var
c=this.getAttributeNode(a),b=this.retrieve("$attributeWhiteList",{});if(!c)return
null;if(c.expando&&!b[a]){c=this.outerHTML;if(c.substr(0,
c.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(a)<0)return
null;b[a]=true}}b=Slick.getAttribute(this,a);return!b&&!Slick.hasAttribute(this,a)?null:b},getProperties:function(){var
a=Array.from(arguments);return
a.map(this.getProperty,this).associate(a)},removeProperty:function(a){return
this.setProperty(a,null)},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return
this},set:function(a,b){var
c=Element.Properties[a];c&&c.set?c.set.call(this,b):this.setProperty(a,b)}.overloadSetter(),
get:function(a){var b=Element.Properties[a];return
b&&b.get?b.get.apply(this):this.getProperty(a)}.overloadGetter(),erase:function(a){var
b=Element.Properties[a];b&&b.erase?b.erase.apply(this):this.removeProperty(a);return
this},hasClass:function(a){return this.className.clean().contains(a,"
")},addClass:function(a){if(!this.hasClass(a))this.className=(this.className+"
"+a).clean();return
this},removeClass:function(a){this.className=this.className.replace(RegExp("(^|\\s)"+a+"(?:\\s|$)"),"$1");return
this},
toggleClass:function(a,b){b==null&&(b=!this.hasClass(a));return
b?this.addClass(a):this.removeClass(a)},adopt:function(){var
a=this,b,c=Array.flatten(arguments),d=c.length;d>1&&(a=b=document.createDocumentFragment());for(var
e=0;e<d;e++){var
f=document.id(c[e],true);f&&a.appendChild(f)}b&&this.appendChild(b);return
this},appendText:function(a,b){return
this.grab(this.getDocument().newTextNode(a),b)},grab:function(a,b){c[b||"bottom"](document.id(a,true),this);return
this},inject:function(a,b){c[b||
"bottom"](this,document.id(a,true));return
this},replaces:function(a){a=document.id(a,true);a.parentNode.replaceChild(this,a);return
this},wraps:function(a,b){a=document.id(a,true);return
this.replaces(a).grab(a,b)},getSelected:function(){this.selectedIndex;return
new Elements(Array.from(this.options).filter(function(a){return
a.selected}))},toQueryString:function(){var
a=[];this.getElements("input, select,
textarea").each(function(b){var
c=b.type;if(b.name&&!b.disabled&&!(c=="submit"||c=="reset"||
c=="file"||c=="image")){c=b.get("tag")=="select"?b.getSelected().map(function(a){return
document.id(a).get("value")}):(c=="radio"||c=="checkbox")&&!b.checked?null:b.get("value");Array.from(c).each(function(c){typeof
c!="undefined"&&a.push(encodeURIComponent(b.name)+"="+encodeURIComponent(c))})}});return
a.join("&")}});var j={},m={},h=function(a){return
m[a]||(m[a]={})},k=function(a){var
b=a.uniqueNumber;a.removeEvents&&a.removeEvents();a.clearAttributes&&a.clearAttributes();if(b!=null){delete
j[b];
delete m[b]}return
a},o={input:"checked",option:"selected",textarea:"value"};Element.implement({destroy:function(){var
a=k(this).getElementsByTagName("*");Array.each(a,k);Element.dispose(this);return
null},empty:function(){Array.from(this.childNodes).each(Element.dispose);return
this},dispose:function(){return
this.parentNode?this.parentNode.removeChild(this):this},clone:function(a,b){var
a=a!==false,c=this.cloneNode(a),d=[c],e=[this],f;if(a){d.append(Array.from(c.getElementsByTagName("*")));e.append(Array.from(this.getElementsByTagName("*")))}for(f=
d.length;f--;){var
k=d[f],g=e[f];b||k.removeAttribute("id");if(k.clearAttributes){k.clearAttributes();k.mergeAttributes(g);k.removeAttribute("uniqueNumber");if(k.options)for(var
j=k.options,m=g.options,h=j.length;h--;)j[h].selected=m[h].selected}(j=o[g.tagName.toLowerCase()])&&g[j]&&(k[j]=g[j])}if(Browser.ie){d=c.getElementsByTagName("object");e=this.getElementsByTagName("object");for(f=d.length;f--;)d[f].outerHTML=e[f].outerHTML}return
document.id(c)}});[Element,Window,Document].invoke("implement",
{addListener:function(a,b,c){if(a=="unload")var
d=b,e=this,b=function(){e.removeListener("unload",b);d()};else
j[Slick.uidOf(this)]=this;this.addEventListener?this.addEventListener(a,b,!!c):this.attachEvent("on"+a,b);return
this},removeListener:function(a,b,c){this.removeEventListener?this.removeEventListener(a,b,!!c):this.detachEvent("on"+a,b);return
this},retrieve:function(a,b){var
c=h(Slick.uidOf(this)),d=c[a];b!=null&&d==null&&(d=c[a]=b);return
d!=null?d:null},store:function(a,b){h(Slick.uidOf(this))[a]=
b;return this},eliminate:function(a){delete h(Slick.uidOf(this))[a];return
this}});window.attachEvent&&!window.addEventListener&&window.addListener("unload",function(){Object.each(j,k);window.CollectGarbage&&CollectGarbage()});Element.Properties={};Element.Properties.style={set:function(a){this.style.cssText=a},get:function(){return
this.style.cssText},erase:function(){this.style.cssText=""}};Element.Properties.tag={get:function(){return
this.tagName.toLowerCase()}};Element.Properties.html={set:function(a){a==
null?a="":typeOf(a)=="array"&&(a=a.join(""));this.innerHTML=a},erase:function(){this.innerHTML=""}};b=document.createElement("div");b.innerHTML="<nav></nav>";var
q=b.childNodes.length==1;if(!q)for(var
b=["abbr","article","aside","audio","canvas","datalist","details","figcaption","figure","footer","header","hgroup","mark","meter","nav","output","progress","section","summary","time","video"],u=document.createDocumentFragment(),r=b.length;r--;)u.createElement(b[r]);b=null;b=Function.attempt(function(){document.createElement("table").innerHTML=
"<tr><td></td></tr>";return
true});r=document.createElement("tr");r.innerHTML="<td></td>";var
w=r.innerHTML=="<td></td>",r=null;if(!b||!w||!q)Element.Properties.html.set=function(a){var
b={table:[1,"<table>","</table>"],select:[1,"<select>","</select>"],tbody:[2,"<table><tbody>","</tbody></table>"],tr:[3,"<table><tbody><tr>","</tr></tbody></table>"]};b.thead=b.tfoot=b.tbody;return
function(c){var
d=b[this.get("tag")];!d&&!q&&(d=[0,"",""]);if(!d)return
a.call(this,c);var e=d[0],f=document.createElement("div"),
k=f;q||u.appendChild(f);for(f.innerHTML=[d[1],c,d[2]].flatten().join("");e--;)k=k.firstChild;this.empty().adopt(k.childNodes);q||u.removeChild(f)}}(Element.Properties.html.set);b=document.createElement("form");b.innerHTML="<select><option>s</option></select>";if(b.firstChild.value!="s")Element.Properties.value={set:function(a){if(this.get("tag")!="select")return
this.setProperty("value",a);for(var
b=this.getElements("option"),c=0;c<b.length;c++){var
d=b[c],e=d.getAttributeNode("value");if((e&&e.specified?
d.value:d.get("text"))==a)return
d.selected=true}},get:function(){var
a=this,b=a.get("tag");if(b!="select"&&b!="option")return
this.getProperty("value");if(b=="select"&&!(a=a.getSelected()[0]))return"";return(b=a.getAttributeNode("value"))&&b.specified?a.value:a.get("text")}};b=null;if(document.createElement("div").getAttributeNode("id"))Element.Properties.id={set:function(a){this.id=this.getAttributeNode("id").value=a},get:function(){return
this.id||null},erase:function(){this.id=this.getAttributeNode("id").value=
""}}})();
(function(){var
b=document.html,a=document.createElement("div");a.style.color="red";a.style.color=null;var
c=a.style.color=="red",a=null;Element.Properties.styles={set:function(a){this.setStyles(a)}};var
a=b.style.opacity!=null,d=b.style.filter!=null,e=/alpha\(opacity=([\d.]+)\)/i,f=a?function(a,b){a.style.opacity=b}:d?function(a,b){var
c=a.style;if(!a.currentStyle||!a.currentStyle.hasLayout)c.zoom=1;var
b=b==null||b==1?"":"alpha(opacity="+(b*100).limit(0,100).round()+")",d=c.filter||a.getComputedStyle("filter")||"";
c.filter=e.test(d)?d.replace(e,b):d+b;c.filter||c.removeAttribute("filter")}:function(a,b){a.store("$opacity",b);a.style.visibility=b>0||b==null?"visible":"hidden"},g=a?function(a){a=a.style.opacity||a.getComputedStyle("opacity");return
a==""?1:a.toFloat()}:d?function(a){var
a=a.style.filter||a.getComputedStyle("filter"),b;a&&(b=a.match(e));return
b==null||a==null?1:b[1]/100}:function(a){var
b=a.retrieve("$opacity");b==null&&(b=a.style.visibility=="hidden"?0:1);return
b},i=b.style.cssFloat==null?
"styleFloat":"cssFloat";Element.implement({getComputedStyle:function(a){if(this.currentStyle)return
this.currentStyle[a.camelCase()];var
b=Element.getDocument(this).defaultView;return(b=b?b.getComputedStyle(this,null):null)?b.getPropertyValue(a==i?"float":a.hyphenate()):null},setStyle:function(a,b){if(a=="opacity"){b!=null&&(b=parseFloat(b));f(this,b);return
this}a=(a=="float"?i:a).camelCase();if(typeOf(b)!="string")var
d=(Element.Styles[a]||"@").split("
"),b=Array.from(b).map(function(a,b){return!d[b]?
"":typeOf(a)=="number"?d[b].replace("@",Math.round(a)):a}).join("
");else
b==""+Number(b)&&(b=Math.round(b));this.style[a]=b;(b==""||b==null)&&c&&this.style.removeAttribute&&this.style.removeAttribute(a);return
this},getStyle:function(a){if(a=="opacity")return g(this);var
a=(a=="float"?i:a).camelCase(),b=this.style[a];if(!b||a=="zIndex"){var
b=[],c;for(c in Element.ShortStyles)if(a==c){for(var d in
Element.ShortStyles[c])b.push(this.getStyle(d));return b.join("
")}b=this.getComputedStyle(a)}if(b){b=
""+b;(c=b.match(/rgba?\([\d\s,]+\)/))&&(b=b.replace(c[0],c[0].rgbToHex()))}if(Browser.ie&&isNaN(parseFloat(b))){if(/^(height|width)$/.test(a)){var
e=0;(a=="width"?["left","right"]:["top","bottom"]).each(function(a){e=e+(this.getStyle("border-"+a+"-width").toInt()+this.getStyle("padding-"+a).toInt())},this);return
this["offset"+a.capitalize()]-e+"px"}if(Browser.opera&&(""+b).indexOf("px")!=-1)return
b;if(/^border(.+)Width|margin|padding/.test(a))return"0px"}return
b},setStyles:function(a){for(var b in a)this.setStyle(b,
a[b]);return this},getStyles:function(){var
a={};Array.flatten(arguments).each(function(b){a[b]=this.getStyle(b)},this);return
a}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@,
@, @)",backgroundPosition:"@px @px",color:"rgb(@, @,
@)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px
@px @px @px)",margin:"@px @px @px @px",padding:"@px @px
@px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @
rgb(@, @, @)",
borderWidth:"@px @px @px @px",borderStyle:"@ @ @
@",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @,
@)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"};Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(a){var
b=Element.ShortStyles,c=Element.Styles;["margin","padding"].each(function(d){var
e=d+a;b[d][e]=c[e]="@px"});var
d="border"+a;b.border[d]=c[d]="@px @ rgb(@, @, @)";var
e=
d+"Width",f=d+"Style",g=d+"Color";b[d]={};b.borderWidth[e]=b[d][e]=c[e]="@px";b.borderStyle[f]=b[d][f]=c[f]="@";b.borderColor[g]=b[d][g]=c[g]="rgb(@,
@, @)"})})();
(function(){Element.Properties.events={set:function(a){this.addEvents(a)}};[Element,Window,Document].invoke("implement",{addEvent:function(a,b,d){var
e=this.retrieve("events",{});e[a]||(e[a]={keys:[],values:[]});if(e[a].keys.contains(b))return
this;e[a].keys.push(b);var
f=a,g=Element.Events[a],i=b,j=this;if(g){g.onAdd&&g.onAdd.call(this,b,a);g.condition&&(i=function(d){return
g.condition.call(this,d,a)?b.call(this,d):true});g.base&&(f=Function.from(g.base).call(this,a))}var
m=function(){return b.call(j)},
h=Element.NativeEvents[f];if(h){h==2&&(m=function(a){a=new
DOMEvent(a,j.getWindow());i.call(j,a)===false&&a.stop()});this.addListener(f,m,d)}e[a].values.push(m);return
this},removeEvent:function(a,b,d){var
e=this.retrieve("events");if(!e||!e[a])return this;var
f=e[a],g=f.keys.indexOf(b);if(g==-1)return this;e=f.values[g];delete
f.keys[g];delete
f.values[g];if(f=Element.Events[a]){f.onRemove&&f.onRemove.call(this,b,a);f.base&&(a=Function.from(f.base).call(this,a))}return
Element.NativeEvents[a]?this.removeListener(a,
e,d):this},addEvents:function(a){for(var b in
a)this.addEvent(b,a[b]);return this},removeEvents:function(a){var
b;if(typeOf(a)=="object"){for(b in
a)this.removeEvent(b,a[b]);return this}var
d=this.retrieve("events");if(!d)return
this;if(a){if(d[a]){d[a].keys.each(function(b){this.removeEvent(a,b)},this);delete
d[a]}}else{for(b in
d)this.removeEvents(b);this.eliminate("events")}return
this},fireEvent:function(a,b,d){var
e=this.retrieve("events");if(!e||!e[a])return
this;b=Array.from(b);e[a].keys.each(function(a){d?
a.delay(d,this,b):a.apply(this,b)},this);return
this},cloneEvents:function(a,b){var
a=document.id(a),d=a.retrieve("events");if(!d)return
this;if(b)d[b]&&d[b].keys.each(function(a){this.addEvent(b,a)},this);else
for(var e in d)this.cloneEvents(a,e);return
this}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,
touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};Element.Events={mousewheel:{base:Browser.firefox?"DOMMouseScroll":"mousewheel"}};if("onmouseenter"in
document.documentElement)Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2;else{var
b=function(a){a=a.relatedTarget;return a==null?true:!a?
false:a!=this&&a.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(a)};Element.Events.mouseenter={base:"mouseover",condition:b};Element.Events.mouseleave={base:"mouseout",condition:b}}if(!window.addEventListener){Element.NativeEvents.propertychange=2;Element.Events.change={base:function(){var
a=this.type;return
this.get("tag")=="input"&&(a=="radio"||a=="checkbox")?"propertychange":"change"},condition:function(a){return
this.type!="radio"||a.event.propertyName=="checked"&&this.checked}}}})();
(function(){var
b,a=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2;var
c=function(a,b,c,d,e){for(;e&&e!=a;){if(b(e,d))return
c.call(e,d,e);e=document.id(e.parentNode)}},d={mouseenter:{base:"mouseover"},mouseleave:{base:"mouseout"},focus:{base:"focus"+(a?"":"in"),capture:true},blur:{base:a?"blur":"focusout",capture:true}},e=function(a){return{base:"focusin",remove:function(b,c){var
d=b.retrieve("$delegation:"+a+"listeners",{})[c];if(d&&d.forms)for(var
e=d.forms.length;e--;)d.forms[e].removeEvent(a,
d.fns[e])},listen:function(b,d,e,f,g,i){if(f=g.get("tag")=="form"?g:f.target.getParent("form")){var
r=b.retrieve("$delegation:"+a+"listeners",{}),w=r[i]||{forms:[],fns:[]},l=w.forms,s=w.fns;if(l.indexOf(f)==-1){l.push(f);l=function(a){c(b,d,e,a,g)};f.addEvent(a,l);s.push(l);r[i]=w;b.store("$delegation:"+a+"listeners",r)}}}}},f=function(a){return{base:"focusin",listen:function(b,d,e,f,g){var
i={blur:function(){this.removeEvents(i)}};i[a]=function(a){c(b,d,e,a,g)};f.target.addEvents(i)}}};a||Object.append(d,
{submit:e("submit"),reset:e("reset"),change:f("change"),select:f("select")});var
a=Element.prototype,g=a.addEvent,i=a.removeEvent,a=function(a,b){return
function(c,d,e){if(c.indexOf(":relay")==-1)return
a.call(this,c,d,e);var
f=Slick.parse(c).expressions[0][0];if(f.pseudos[0].key!="relay")return
a.call(this,c,d,e);var
g=f.tag;f.pseudos.slice(1).each(function(a){g=g+(":"+a.key+(a.value?"("+a.value+")":""))});a.call(this,c,d);return
b.call(this,g,f.pseudos[0].value,d)}};b=function(a,c,e,f){var
g=this.retrieve("$delegates",
{}),q=g[a];if(!q)return this;if(f){var
c=a,e=q[f].delegator,u=d[a]||{},a=u.base||c;u.remove&&u.remove(this,f);delete
q[f];g[c]=q;return i.call(this,a,e)}if(e)for(u in
q){f=q[u];if(f.match==c&&f.fn==e)return b.call(this,a,c,e,u)}else
for(u in q){f=q[u];f.match==c&&b.call(this,a,c,f.fn,u)}return
this};[Element,Window,Document].invoke("implement",{addEvent:a(g,function(a,b,e){var
f=this.retrieve("$delegates",{}),i=f[a];if(i)for(var q in
i)if(i[q].fn==e&&i[q].match==b)return this;q=a;var u=b,r=d[a]||
{},a=r.base||q,b=function(a){return
Slick.match(a,u)},w=Element.Events[q];if(w&&w.condition)var
l=b,s=w.condition,b=function(b,c){return l(b,c)&&s.call(b,c,a)};var
p=this,n=String.uniqueID(),w=r.listen?function(a,c){if(!c&&a&&a.target)c=a.target;c&&r.listen(p,b,e,a,c,n)}:function(a,d){if(!d&&a&&a.target)d=a.target;d&&c(p,b,e,a,d)};i||(i={});i[n]={match:u,fn:e,delegator:w};f[q]=i;return
g.call(this,a,w,r.capture)}),removeEvent:a(i,b)})})();
(function(){function b(a){return
h(a,"-moz-box-sizing")=="border-box"}function
a(a){return h(a,"border-top-width").toInt()||0}function
c(a){return h(a,"border-left-width").toInt()||0}function
d(a){return/^(?:body|html)$/i.test(a.tagName)}function
e(a){a=a.getDocument();return!a.compatMode||a.compatMode=="CSS1Compat"?a.html:a.body}var
f=document.createElement("div"),g=document.createElement("div");f.style.height="0";f.appendChild(g);var
i=g.offsetParent===f,f=g=null,j=function(a){return
h(a,"position")!=
"static"||d(a)},m=function(a){return
j(a)||/^(?:table|td|th)$/i.test(a.tagName)};Element.implement({scrollTo:function(a,b){if(d(this))this.getWindow().scrollTo(a,b);else{this.scrollLeft=a;this.scrollTop=b}return
this},getSize:function(){return
d(this)?this.getWindow().getSize():{x:this.offsetWidth,y:this.offsetHeight}},getScrollSize:function(){return
d(this)?this.getWindow().getScrollSize():{x:this.scrollWidth,y:this.scrollHeight}},getScroll:function(){return
d(this)?this.getWindow().getScroll():
{x:this.scrollLeft,y:this.scrollTop}},getScrolls:function(){for(var
a=this.parentNode,b={x:0,y:0};a&&!d(a);){b.x=b.x+a.scrollLeft;b.y=b.y+a.scrollTop;a=a.parentNode}return
b},getOffsetParent:i?function(){var
a=this;if(d(a)||h(a,"position")=="fixed")return
null;for(var
b=h(a,"position")=="static"?m:j;a=a.parentNode;)if(b(a))return
a;return
null}:function(){if(d(this)||h(this,"position")=="fixed")return
null;try{return this.offsetParent}catch(a){}return
null},getOffsets:function(){if(this.getBoundingClientRect&&
!Browser.Platform.ios){var
e=this.getBoundingClientRect(),f=document.id(this.getDocument().documentElement),g=f.getScroll(),i=this.getScrolls(),j=h(this,"position")=="fixed";return{x:e.left.toInt()+i.x+(j?0:g.x)-f.clientLeft,y:e.top.toInt()+i.y+(j?0:g.y)-f.clientTop}}e=this;f={x:0,y:0};if(d(this))return
f;for(;e&&!d(e);){f.x=f.x+e.offsetLeft;f.y=f.y+e.offsetTop;if(Browser.firefox){if(!b(e)){f.x=f.x+c(e);f.y=f.y+a(e)}if((g=e.parentNode)&&h(g,"overflow")!="visible"){f.x=f.x+c(g);f.y=f.y+a(g)}}else
if(e!=
this&&Browser.safari){f.x=f.x+c(e);f.y=f.y+a(e)}e=e.offsetParent}if(Browser.firefox&&!b(this)){f.x=f.x-c(this);f.y=f.y-a(this)}return
f},getPosition:function(b){var
d=this.getOffsets(),e=this.getScrolls(),d={x:d.x-e.x,y:d.y-e.y};if(b&&(b=document.id(b))){e=b.getPosition();return{x:d.x-e.x-c(b),y:d.y-e.y-a(b)}}return
d},getCoordinates:function(a){if(d(this))return
this.getWindow().getCoordinates();var
a=this.getPosition(a),b=this.getSize(),a={left:a.x,top:a.y,width:b.x,height:b.y};a.right=a.left+a.width;
a.bottom=a.top+a.height;return
a},computePosition:function(a){return{left:a.x-(h(this,"margin-left").toInt()||0),top:a.y-(h(this,"margin-top").toInt()||0)}},setPosition:function(a){return
this.setStyles(this.computePosition(a))}});[Document,Window].invoke("implement",{getSize:function(){var
a=e(this);return{x:a.clientWidth,y:a.clientHeight}},getScroll:function(){var
a=this.getWindow(),b=e(this);return{x:a.pageXOffset||b.scrollLeft,y:a.pageYOffset||b.scrollTop}},getScrollSize:function(){var
a=e(this),
b=this.getSize(),c=this.getDocument().body;return{x:Math.max(a.scrollWidth,c.scrollWidth,b.x),y:Math.max(a.scrollHeight,c.scrollHeight,b.y)}},getPosition:function(){return{x:0,y:0}},getCoordinates:function(){var
a=this.getSize();return{top:0,left:0,bottom:a.y,right:a.x,height:a.y,width:a.x}}});var
h=Element.getComputedStyle})();Element.alias({position:"setPosition"});
[Window,Document,Element].invoke("implement",{getHeight:function(){return
this.getSize().y},getWidth:function(){return
this.getSize().x},getScrollTop:function(){return
this.getScroll().y},getScrollLeft:function(){return
this.getScroll().x},getScrollHeight:function(){return
this.getScrollSize().y},getScrollWidth:function(){return
this.getScrollSize().x},getTop:function(){return
this.getPosition().y},getLeft:function(){return this.getPosition().x}});
(function(){var b=this.Fx=new
Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(a){this.subject=this.subject||this;this.setOptions(a)},getTransition:function(){return
function(a){return-(Math.cos(Math.PI*a)-1)/2}},step:function(a){if(this.options.frameSkip){var
b=(this.time!=null?a-this.time:0)/this.frameInterval;this.time=a;this.frame=this.frame+b}else
this.frame++;if(this.frame<this.frames)this.set(this.compute(this.from,
this.to,this.transition(this.frame/this.frames)));else{this.frame=this.frames;this.set(this.compute(this.from,this.to,1));this.stop()}},set:function(a){return
a},compute:function(a,c,d){return
b.compute(a,c,d)},check:function(){if(!this.isRunning())return
true;switch(this.options.link){case "cancel":this.cancel();return
true;case
"chain":this.chain(this.caller.pass(arguments,this))}return
false},start:function(a,c){if(!this.check(a,c))return
this;this.from=a;this.to=c;this.frame=this.options.frameSkip?
0:-1;this.time=null;this.transition=this.getTransition();var
d=this.options.frames,f=this.options.fps,h=this.options.duration;this.duration=b.Durations[h]||h.toInt();this.frameInterval=1E3/f;this.frames=d||Math.round(this.duration/this.frameInterval);this.fireEvent("start",this.subject);e.call(this,f);return
this},stop:function(){if(this.isRunning()){this.time=null;f.call(this,this.options.fps);if(this.frames==this.frame){this.fireEvent("complete",this.subject);this.callChain()||this.fireEvent("chainComplete",
this.subject)}else this.fireEvent("stop",this.subject)}return
this},cancel:function(){if(this.isRunning()){this.time=null;f.call(this,this.options.fps);this.frame=this.frames;this.fireEvent("cancel",this.subject).clearChain()}return
this},pause:function(){if(this.isRunning()){this.time=null;f.call(this,this.options.fps)}return
this},resume:function(){this.frame<this.frames&&!this.isRunning()&&e.call(this,this.options.fps);return
this},isRunning:function(){var b=a[this.options.fps];return
b&&b.contains(this)}});
b.compute=function(a,b,c){return(b-a)*c+a};b.Durations={"short":250,normal:500,"long":1E3};var
a={},c={},d=function(){for(var a=Date.now(),b=this.length;b--;){var
c=this[b];c&&c.step(a)}},e=function(b){var
e=a[b]||(a[b]=[]);e.push(this);c[b]||(c[b]=d.periodical(Math.round(1E3/b),e))},f=function(b){var
d=a[b];if(d){d.erase(this);if(!d.length&&c[b]){delete
a[b];c[b]=clearInterval(c[b])}}}})();
Fx.CSS=new Class({Extends:Fx,prepare:function(b,a,c){var
c=Array.from(c),d=c[0],c=c[1];if(c==null){var
c=d,d=b.getStyle(a),e=this.options.unit;if(e&&d.slice(-e.length)!=e&&parseFloat(d)!=0){b.setStyle(a,c+e);var
f=b.getComputedStyle(a);if(!/px$/.test(f)){f=b.style[("pixel-"+a).camelCase()];if(f==null){var
g=b.style.left;b.style.left=c+e;f=b.style.pixelLeft;b.style.left=g}}d=(c||1)/(parseFloat(f)||1)*(parseFloat(d)||0);b.setStyle(a,d+e)}}return{from:this.parse(d),to:this.parse(c)}},parse:function(b){b=
Function.from(b)();b=typeof b=="string"?b.split("
"):Array.from(b);return b.map(function(a){var
a=""+a,b=false;Object.each(Fx.CSS.Parsers,function(d){if(!b){var
e=d.parse(a);if(e||e===0)b={value:e,parser:d}}});return
b=b||{value:a,parser:Fx.CSS.Parsers.String}})},compute:function(b,a,c){var
d=[];Math.min(b.length,a.length).times(function(e){d.push({value:b[e].parser.compute(b[e].value,a[e].value,c),parser:b[e].parser})});d.$family=Function.from("fx:css:value");return
d},serve:function(b,a){typeOf(b)!=
"fx:css:value"&&(b=this.parse(b));var
c=[];b.each(function(b){c=c.concat(b.parser.serve(b.value,a))});return
c},render:function(b,a,c,d){b.setStyle(a,this.serve(c,d))},search:function(b){if(Fx.CSS.Cache[b])return
Fx.CSS.Cache[b];var
a={},c=RegExp("^"+b.escapeRegExp()+"$");Array.each(document.styleSheets,function(b){var
e=b.href;if(!e||!e.contains("://")||e.contains(document.domain))Array.each(b.rules||b.cssRules,function(b){if(b.style){var
d=b.selectorText?b.selectorText.replace(/^\w+/,function(a){return
a.toLowerCase()}):
null;d&&c.test(d)&&Object.each(Element.Styles,function(c,d){if(b.style[d]&&!Element.ShortStyles[d]){c=""+b.style[d];a[d]=/^rgb/.test(c)?c.rgbToHex():c}})}})});return
Fx.CSS.Cache[b]=a}});Fx.CSS.Cache={};
Fx.CSS.Parsers={Color:{parse:function(b){return
b.match(/^#[0-9a-f]{3,6}$/i)?b.hexToRgb(true):(b=b.match(/(\d+),\s*(\d+),\s*(\d+)/))?[b[1],b[2],b[3]]:false},compute:function(b,a,c){return
b.map(function(d,e){return
Math.round(Fx.compute(b[e],a[e],c))})},serve:function(b){return
b.map(Number)}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return
a?b+a:b}},String:{parse:Function.from(!1),compute:function(b,a){return
a},serve:function(b){return b}}};
Fx.Tween=new
Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a)},set:function(b,a){if(arguments.length==1){a=b;b=this.property||this.options.property}this.render(this.element,b,a,this.options.unit);return
this},start:function(b,a,c){if(!this.check(b,a,c))return this;var
d=Array.flatten(arguments);this.property=this.options.property||d.shift();d=this.prepare(this.element,this.property,d);return
this.parent(d.from,d.to)}});
Element.Properties.tween={set:function(b){this.get("tween").cancel().setOptions(b);return
this},get:function(){var b=this.retrieve("tween");if(!b){b=new
Fx.Tween(this,{link:"cancel"});this.store("tween",b)}return
b}};
Element.implement({tween:function(b,a,c){this.get("tween").start(b,a,c);return
this},fade:function(b){var
a=this.get("tween"),c,d=["opacity"].append(arguments),e;d[1]==null&&(d[1]="toggle");switch(d[1]){case
"in":c="start";d[1]=1;break;case
"out":c="start";d[1]=0;break;case
"show":c="set";d[1]=1;break;case
"hide":c="set";d[1]=0;break;case
"toggle":e=this.retrieve("fade:flag",this.getStyle("opacity")==1);c="start";d[1]=e?0:1;this.store("fade:flag",!e);e=true;break;default:c="start"}e||this.eliminate("fade:flag");
a[c].apply(a,d);d=d[d.length-1];c=="set"||d!=0?this.setStyle("visibility",d==0?"hidden":"visible"):a.chain(function(){this.element.setStyle("visibility","hidden");this.callChain()});return
this},highlight:function(b,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));a=a=="transparent"?"#fff":a}var
c=this.get("tween");c.start("background-color",b||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));c.callChain()}.bind(this));
return this}});
Fx.Morph=new
Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a)},set:function(b){typeof
b=="string"&&(b=this.search(b));for(var a in
b)this.render(this.element,a,b[a],this.options.unit);return
this},compute:function(b,a,c){var d={},e;for(e in
b)d[e]=this.parent(b[e],a[e],c);return
d},start:function(b){if(!this.check(b))return this;typeof
b=="string"&&(b=this.search(b));var a={},c={},d;for(d in
b){var e=this.prepare(this.element,d,b[d]);a[d]=e.from;
c[d]=e.to}return
this.parent(a,c)}});Element.Properties.morph={set:function(b){this.get("morph").cancel().setOptions(b);return
this},get:function(){var b=this.retrieve("morph");if(!b){b=new
Fx.Morph(this,{link:"cancel"});this.store("morph",b)}return
b}};Element.implement({morph:function(b){this.get("morph").start(b);return
this}});
Fx.implement({getTransition:function(){var
b=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof
b=="string"){var
a=b.split(":"),b=Fx.Transitions,b=b[a[0]]||b[a[0].capitalize()];a[1]&&(b=b["ease"+a[1].capitalize()+(a[2]?a[2].capitalize():"")])}return
b}});Fx.Transition=function(b,a){var a=Array.from(a),c=function(c){return
b(c,a)};return Object.append(c,{easeIn:c,easeOut:function(c){return
1-b(1-c,a)},easeInOut:function(c){return(c<=0.5?b(2*c,a):2-b(2*(1-c),a))/2}})};Fx.Transitions={linear:function(b){return
b}};
Fx.Transitions.extend=function(b){for(var a in b)Fx.Transitions[a]=new
Fx.Transition(b[a])};
Fx.Transitions.extend({Pow:function(b,a){return
Math.pow(b,a&&a[0]||6)},Expo:function(b){return
Math.pow(2,8*(b-1))},Circ:function(b){return
1-Math.sin(Math.acos(b))},Sine:function(b){return
1-Math.cos(b*Math.PI/2)},Back:function(b,a){a=a&&a[0]||1.618;return
Math.pow(b,2)*((a+1)*b-a)},Bounce:function(b){for(var
a,c=0,d=1;;c=c+d,d=d/2)if(b>=(7-4*c)/11){a=d*d-Math.pow((11-6*c-11*b)/4,2);break}return
a},Elastic:function(b,a){return
Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3)}});
["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new
Fx.Transition(function(b){return Math.pow(b,a+2)})});
(function(){var b=function(){},a="onprogress"in new
Browser.Request,c=this.Request=new
Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript,
text/html, application/xml, text/xml,
*/*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(a){this.xhr=new
Browser.Request;this.setOptions(a);
this.headers=this.options.headers},onStateChange:function(){var
c=this.xhr;if(c.readyState==4&&this.running){this.running=false;this.status=0;Function.attempt(function(){var
a=c.status;this.status=a==1223?204:a}.bind(this));c.onreadystatechange=b;if(a)c.onprogress=c.onloadstart=b;clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};this.options.isSuccess.call(this,this.status)?this.success(this.response.text,this.response.xml):this.failure()}},isSuccess:function(){var
a=
this.status;return
a>=200&&a<300},isRunning:function(){return!!this.running},processScripts:function(a){return
this.options.evalResponse||/(ecma|java)script/.test(this.getHeader("Content-type"))?Browser.exec(a):a.stripScripts(this.options.evalScripts)},success:function(a,b){this.onSuccess(this.processScripts(a),b)},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain()},failure:function(){this.onFailure()},onFailure:function(){this.fireEvent("complete").fireEvent("failure",
this.xhr)},loadstart:function(a){this.fireEvent("loadstart",[a,this.xhr])},progress:function(a){this.fireEvent("progress",[a,this.xhr])},timeout:function(){this.fireEvent("timeout",this.xhr)},setHeader:function(a,b){this.headers[a]=b;return
this},getHeader:function(a){return Function.attempt(function(){return
this.xhr.getResponseHeader(a)}.bind(this))},check:function(){if(!this.running)return
true;switch(this.options.link){case "cancel":this.cancel();return
true;case "chain":this.chain(this.caller.pass(arguments,
this))}return false},send:function(b){if(!this.check(b))return
this;this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var
c=typeOf(b);if(c=="string"||c=="element")b={data:b};var
c=this.options,b=Object.append({data:c.data,url:c.url,method:c.method},b),c=b.data,d=""+b.url,b=b.method.toLowerCase();switch(typeOf(c)){case
"element":c=document.id(c).toQueryString();break;case
"object":case
"hash":c=Object.toQueryString(c)}if(this.options.format)var
i="format="+this.options.format,
c=c?i+"&"+c:i;if(this.options.emulation&&!["get","post"].contains(b)){b="_method="+b;c=c?b+"&"+c:b;b="post"}this.options.urlEncoded&&["post","put"].contains(b)&&(this.headers["Content-type"]="application/x-www-form-urlencoded"+(this.options.encoding?";
charset="+this.options.encoding:""));if(!d)d=document.location.pathname;i=d.lastIndexOf("/");if(i>-1&&(i=d.indexOf("#"))>-1)d=d.substr(0,i);this.options.noCache&&(d=d+((d.contains("?")?"&":"?")+String.uniqueID()));if(c&&b=="get"){d=d+((d.contains("?")?
"&":"?")+c);c=null}var
j=this.xhr;if(a){j.onloadstart=this.loadstart.bind(this);j.onprogress=this.progress.bind(this)}j.open(b.toUpperCase(),d,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials"in
j)j.withCredentials=true;j.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(a,b){try{j.setRequestHeader(b,a)}catch(c){this.fireEvent("exception",[b,a])}},this);this.fireEvent("request");j.send(c);if(this.options.async){if(this.options.timeout)this.timer=
this.timeout.delay(this.options.timeout,this)}else
this.onStateChange();return this},cancel:function(){if(!this.running)return
this;this.running=false;var
c=this.xhr;c.abort();clearTimeout(this.timer);c.onreadystatechange=b;if(a)c.onprogress=c.onloadstart=b;this.xhr=new
Browser.Request;this.fireEvent("cancel");return
this}}),d={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(a){d[a]=function(b){var
c={method:a};if(b!=null)c.data=b;return
this.send(c)}});c.implement(d);Element.Properties.send=
{set:function(a){this.get("send").cancel().setOptions(a);return
this},get:function(){var a=this.retrieve("send");if(!a){a=new
c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")});this.store("send",a)}return
a}};Element.implement({send:function(a){var
b=this.get("send");b.send({data:this,url:a||b.options.url});return
this}})})();
Request.HTML=new
Class({Extends:Request,options:{update:!1,append:!1,evalScripts:!0,filter:!1,headers:{Accept:"text/html,
application/xml, text/xml, */*"}},success:function(b){var
a=this.options,c=this.response;c.html=b.stripScripts(function(a){c.javascript=a});if(b=c.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i))c.html=b[1];b=(new
Element("div")).set("html",c.html);c.tree=b.childNodes;c.elements=b.getElements(a.filter||"*");if(a.filter)c.tree=c.elements;if(a.update){b=document.id(a.update).empty();
a.filter?b.adopt(c.elements):b.set("html",c.html)}else
if(a.append){var
d=document.id(a.append);a.filter?c.elements.reverse().inject(d):d.adopt(b.getChildren())}a.evalScripts&&Browser.exec(c.javascript);this.onSuccess(c.tree,c.elements,c.html,c.javascript)}});Element.Properties.load={set:function(b){this.get("load").cancel().setOptions(b);return
this},get:function(){var b=this.retrieve("load");if(!b){b=new
Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",b)}return
b}};
Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return
this}});"undefined"==typeof JSON&&(this.JSON={});
(function(){var
b={"\u0008":"\\b","\t":"\\t","\n":"\\n","\u000c":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},a=function(a){return
b[a]||"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)};JSON.validate=function(a){a=a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"");return/^[\],:{}\s]*$/.test(a)};JSON.encode=JSON.stringify?function(a){return
JSON.stringify(a)}:function(b){b&&b.toJSON&&
(b=b.toJSON());switch(typeOf(b)){case
"string":return'"'+b.replace(/[\x00-\x1f\\"]/g,a)+'"';case
"array":return"["+b.map(JSON.encode).clean()+"]";case
"object":case "hash":var
d=[];Object.each(b,function(a,b){var
c=JSON.encode(a);c&&d.push(JSON.encode(b)+":"+c)});return"{"+d+"}";case
"number":case "boolean":return""+b;case
"null":return"null"}return
null};JSON.decode=function(a,b){if(!a||typeOf(a)!="string")return
null;if(b||JSON.secure){if(JSON.parse)return
JSON.parse(a);if(!JSON.validate(a))throw Error("JSON could not decode
the input; security is enabled and the value is not secure.");
}return eval("("+a+")")}})();Request.JSON=new
Class({Extends:Request,options:{secure:!0},initialize:function(b){this.parent(b);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"})},success:function(b){var
a;try{a=this.response.json=JSON.decode(b,this.options.secure)}catch(c){this.fireEvent("error",[b,c]);return}if(a==null)this.onFailure();else
this.onSuccess(a,b)}});
var Cookie=new
Class({Implements:Options,options:{path:"/",domain:!1,duration:!1,secure:!1,document:document,encode:!0},initialize:function(b,a){this.key=b;this.setOptions(a)},write:function(b){this.options.encode&&(b=encodeURIComponent(b));this.options.domain&&(b=b+(";
domain="+this.options.domain));this.options.path&&(b=b+(";
path="+this.options.path));if(this.options.duration){var a=new
Date;a.setTime(a.getTime()+this.options.duration*864E5);b=b+(";
expires="+a.toGMTString())}this.options.secure&&
(b=b+";
secure");this.options.document.cookie=this.key+"="+b;return
this},read:function(){var
b=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");return
b?decodeURIComponent(b[1]):null},dispose:function(){(new
Cookie(this.key,Object.merge({},this.options,{duration:-1}))).write("");return
this}});Cookie.write=function(b,a,c){return(new
Cookie(b,c)).write(a)};Cookie.read=function(b){return(new
Cookie(b)).read()};Cookie.dispose=function(b,a){return(new
Cookie(b,a)).dispose()};
(function(b,a){var
c,d,e=[],f,g,i=a.createElement("div"),j=function(){clearTimeout(g);if(!c){Browser.loaded=c=true;a.removeListener("DOMContentLoaded",j).removeListener("readystatechange",m);a.fireEvent("domready");b.fireEvent("domready")}},m=function(){for(var
a=e.length;a--;)if(e[a]()){j();return true}return
false},h=function(){clearTimeout(g);m()||(g=setTimeout(h,10))};a.addListener("DOMContentLoaded",j);var
k=function(){try{i.doScroll();return true}catch(a){}return
false};if(i.doScroll&&!k()){e.push(k);
f=true}a.readyState&&e.push(function(){var b=a.readyState;return
b=="loaded"||b=="complete"});"onreadystatechange"in
a?a.addListener("readystatechange",m):f=true;f&&h();Element.Events.domready={onAdd:function(a){c&&a.call(this)}};Element.Events.load={base:"load",onAdd:function(a){d&&this==b&&a.call(this)},condition:function(){if(this==b){j();delete
Element.Events.load}return
true}};b.addEvent("load",function(){d=true})})(window,document);
(function(){var b=this.Swiff=new
Class({Implements:Options,options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"window",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return
this.object},initialize:function(a,c){this.instance="Swiff_"+String.uniqueID();this.setOptions(c);var
c=this.options,d=this.id=c.id||this.instance,e=document.id(c.container);b.CallBacks[this.instance]={};var
f=c.params,g=c.vars,i=c.callBacks,j=
Object.append({height:c.height,width:c.width},c.properties),m=this,h;for(h
in i){b.CallBacks[this.instance][h]=function(a){return function(){return
a.apply(m.object,arguments)}}(i[h]);g[h]="Swiff.CallBacks."+this.instance+"."+h}f.flashVars=Object.toQueryString(g);if(Browser.ie){j.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";f.movie=a}else
j.type="application/x-shockwave-flash";j.data=a;var
d='<object id="'+d+'"',k;for(k in
j)d=d+(" "+k+'="'+j[k]+'"');var
d=d+">",o;for(o in f)f[o]&&(d=d+('<param
name="'+
o+'" value="'+f[o]+'"
/>'));this.object=(e?e.empty():new
Element("div")).set("html",d+"</object>").firstChild},replaces:function(a){a=document.id(a,true);a.parentNode.replaceChild(this.toElement(),a);return
this},inject:function(a){document.id(a,true).appendChild(this.toElement());return
this},remote:function(){return
b.remote.apply(b,[this.toElement()].append(arguments))}});b.CallBacks={};b.remote=function(a,b){var
d=a.CallFunction('<invoke name="'+b+'"
returntype="javascript">'+__flash__argumentsToXML(arguments,
2)+"</invoke>");return
eval(d)}})();PK]n�['�/��R�R
js/mootools-more-uncompressed.jsnu�[���// MooTools: the
javascript framework.
// Load this file's selection again by visiting:
http://mootools.net/more/065f2f092ece4e3b32bb5214464cf926 
// Or build this file again with packager using: packager build More/More
More/Events.Pseudos More/Class.Refactor More/Class.Binds More/Class.Occlude
More/Chain.Wait More/Array.Extras More/Date More/Date.Extras
More/Number.Format More/Object.Extras More/String.Extras
More/String.QueryString More/URI More/URI.Relative More/Hash
More/Hash.Extras More/Element.Forms More/Elements.From
More/Element.Event.Pseudos More/Element.Event.Pseudos.Keys
More/Element.Measure More/Element.Pin More/Element.Position
More/Element.Shortcuts More/Form.Request More/Form.Request.Append
More/Form.Validator More/Form.Validator.Inline More/Form.Validator.Extras
More/OverText More/Fx.Elements More/Fx.Accordion More/Fx.Move
More/Fx.Reveal More/Fx.Scroll More/Fx.Slide More/Fx.SmoothScroll
More/Fx.Sort More/Drag More/Drag.Move More/Slider More/Sortables
More/Request.JSONP More/Request.Queue More/Request.Periodical More/Assets
More/Color More/Group More/Hash.Cookie More/IframeShim More/Table
More/HtmlTable More/HtmlTable.Zebra More/HtmlTable.Sort
More/HtmlTable.Select More/Keyboard More/Keyboard.Extras More/Mask
More/Scroller More/Tips More/Spinner More/Locale More/Locale.Set.From
More/Locale.en-US.Date More/Locale.en-US.Form.Validator
More/Locale.en-US.Number More/Locale.ar.Date More/Locale.ar.Form.Validator
More/Locale.ca-CA.Date More/Locale.ca-CA.Form.Validator
More/Locale.cs-CZ.Date More/Locale.cs-CZ.Form.Validator
More/Locale.da-DK.Date More/Locale.da-DK.Form.Validator
More/Locale.de-CH.Date More/Locale.de-CH.Form.Validator
More/Locale.de-DE.Date More/Locale.de-DE.Form.Validator
More/Locale.de-DE.Number More/Locale.en-GB.Date More/Locale.es-AR.Date
More/Locale.es-AR.Form.Validator More/Locale.es-ES.Date
More/Locale.es-ES.Form.Validator More/Locale.et-EE.Date
More/Locale.et-EE.Form.Validator More/Locale.EU.Number More/Locale.fa.Date
More/Locale.fa.Form.Validator More/Locale.fi-FI.Date
More/Locale.fi-FI.Form.Validator More/Locale.fi-FI.Number
More/Locale.fr-FR.Date More/Locale.fr-FR.Form.Validator
More/Locale.fr-FR.Number More/Locale.he-IL.Date
More/Locale.he-IL.Form.Validator More/Locale.he-IL.Number
More/Locale.hu-HU.Date More/Locale.hu-HU.Form.Validator
More/Locale.it-IT.Date More/Locale.it-IT.Form.Validator
More/Locale.ja-JP.Date More/Locale.ja-JP.Form.Validator
More/Locale.ja-JP.Number More/Locale.nl-NL.Date
More/Locale.nl-NL.Form.Validator More/Locale.nl-NL.Number
More/Locale.no-NO.Date More/Locale.no-NO.Form.Validator
More/Locale.pl-PL.Date More/Locale.pl-PL.Form.Validator
More/Locale.pt-BR.Date More/Locale.pt-BR.Form.Validator
More/Locale.pt-PT.Date More/Locale.pt-PT.Form.Validator
More/Locale.ru-RU-unicode.Date More/Locale.ru-RU-unicode.Form.Validator
More/Locale.si-SI.Date More/Locale.si-SI.Form.Validator
More/Locale.sv-SE.Date More/Locale.sv-SE.Form.Validator
More/Locale.uk-UA.Date More/Locale.uk-UA.Form.Validator
More/Locale.zh-CH.Date More/Locale.zh-CH.Form.Validator
/*
---

script: More.js

name: More

description: MooTools More

license: MIT-style license

authors:
  - Guillermo Rauch
  - Thomas Aylott
  - Scott Kyle
  - Arian Stolwijk
  - Tim Wienk
  - Christoph Pojer
  - Aaron Newton
  - Jacob Thornton

requires:
  - Core/MooTools

provides: [MooTools.More]

...
*/

MooTools.More = {
	'version': '1.4.0.1',
	'build': 'a4244edf2aa97ac8a196fc96082dd35af1abab87'
};


/*
---

name: Events.Pseudos

description: Adds the functionality to add pseudo events

license: MIT-style license

authors:
  - Arian Stolwijk

requires: [Core/Class.Extras, Core/Slick.Parser, More/MooTools.More]

provides: [Events.Pseudos]

...
*/

(function(){

Events.Pseudos = function(pseudos, addEvent, removeEvent){

	var storeKey = '_monitorEvents:';

	var storageOf = function(object){
		return {
			store: object.store ? function(key, value){
				object.store(storeKey + key, value);
			} : function(key, value){
				(object._monitorEvents || (object._monitorEvents = {}))[key] = value;
			},
			retrieve: object.retrieve ? function(key, dflt){
				return object.retrieve(storeKey + key, dflt);
			} : function(key, dflt){
				if (!object._monitorEvents) return dflt;
				return object._monitorEvents[key] || dflt;
			}
		};
	};

	var splitType = function(type){
		if (type.indexOf(':') == -1 || !pseudos) return null;

		var parsed = Slick.parse(type).expressions[0][0],
			parsedPseudos = parsed.pseudos,
			l = parsedPseudos.length,
			splits = [];

		while (l--){
			var pseudo = parsedPseudos[l].key,
				listener = pseudos[pseudo];
			if (listener != null) splits.push({
				event: parsed.tag,
				value: parsedPseudos[l].value,
				pseudo: pseudo,
				original: type,
				listener: listener
			});
		}
		return splits.length ? splits : null;
	};

	return {

		addEvent: function(type, fn, internal){
			var split = splitType(type);
			if (!split) return addEvent.call(this, type, fn, internal);

			var storage = storageOf(this),
				events = storage.retrieve(type, []),
				eventType = split[0].event,
				args = Array.slice(arguments, 2),
				stack = fn,
				self = this;

			split.each(function(item){
				var listener = item.listener,
					stackFn = stack;
				if (listener == false) eventType += ':' + item.pseudo +
'(' + item.value + ')';
				else stack = function(){
					listener.call(self, item, stackFn, arguments, stack);
				};
			});

			events.include({type: eventType, event: fn, monitor: stack});
			storage.store(type, events);

			if (type != eventType) addEvent.apply(this, [type, fn].concat(args));
			return addEvent.apply(this, [eventType, stack].concat(args));
		},

		removeEvent: function(type, fn){
			var split = splitType(type);
			if (!split) return removeEvent.call(this, type, fn);

			var storage = storageOf(this),
				events = storage.retrieve(type);
			if (!events) return this;

			var args = Array.slice(arguments, 2);

			removeEvent.apply(this, [type, fn].concat(args));
			events.each(function(monitor, i){
				if (!fn || monitor.event == fn) removeEvent.apply(this, [monitor.type,
monitor.monitor].concat(args));
				delete events[i];
			}, this);

			storage.store(type, events);
			return this;
		}

	};

};

var pseudos = {

	once: function(split, fn, args, monitor){
		fn.apply(this, args);
		this.removeEvent(split.event, monitor)
			.removeEvent(split.original, fn);
	},

	throttle: function(split, fn, args){
		if (!fn._throttled){
			fn.apply(this, args);
			fn._throttled = setTimeout(function(){
				fn._throttled = false;
			}, split.value || 250);
		}
	},

	pause: function(split, fn, args){
		clearTimeout(fn._pause);
		fn._pause = fn.delay(split.value || 250, this, args);
	}

};

Events.definePseudo = function(key, listener){
	pseudos[key] = listener;
	return this;
};

Events.lookupPseudo = function(key){
	return pseudos[key];
};

var proto = Events.prototype;
Events.implement(Events.Pseudos(pseudos, proto.addEvent,
proto.removeEvent));

['Request', 'Fx'].each(function(klass){
	if (this[klass]) this[klass].implement(Events.prototype);
});

})();


/*
---

script: Class.Refactor.js

name: Class.Refactor

description: Extends a class onto itself with new property, preserving any
items attached to the class's namespace.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Class
  - /MooTools.More

# Some modules declare themselves dependent on Class.Refactor
provides: [Class.refactor, Class.Refactor]

...
*/

Class.refactor = function(original, refactors){

	Object.each(refactors, function(item, name){
		var origin = original.prototype[name];
		origin = (origin && origin.$origin) || origin || function(){};
		original.implement(name, (typeof item == 'function') ?
function(){
			var old = this.previous;
			this.previous = origin;
			var value = item.apply(this, arguments);
			this.previous = old;
			return value;
		} : item);
	});

	return original;

};


/*
---

script: Class.Binds.js

name: Class.Binds

description: Automagically binds specified methods in a class to the
instance of the class.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Class
  - /MooTools.More

provides: [Class.Binds]

...
*/

Class.Mutators.Binds = function(binds){
	if (!this.prototype.initialize) this.implement('initialize',
function(){});
	return Array.from(binds).concat(this.prototype.Binds || []);
};

Class.Mutators.initialize = function(initialize){
	return function(){
		Array.from(this.Binds).each(function(name){
			var original = this[name];
			if (original) this[name] = original.bind(this);
		}, this);
		return initialize.apply(this, arguments);
	};
};


/*
---

script: Class.Occlude.js

name: Class.Occlude

description: Prevents a class from being applied to a DOM element twice.

license: MIT-style license.

authors:
  - Aaron Newton

requires:
  - Core/Class
  - Core/Element
  - /MooTools.More

provides: [Class.Occlude]

...
*/

Class.Occlude = new Class({

	occlude: function(property, element){
		element = document.id(element || this.element);
		var instance = element.retrieve(property || this.property);
		if (instance && !this.occluded)
			return (this.occluded = instance);

		this.occluded = false;
		element.store(property || this.property, this);
		return this.occluded;
	}

});


/*
---

script: Chain.Wait.js

name: Chain.Wait

description: value, Adds a method to inject pauses between chained events.

license: MIT-style license.

authors:
  - Aaron Newton

requires:
  - Core/Chain
  - Core/Element
  - Core/Fx
  - /MooTools.More

provides: [Chain.Wait]

...
*/

(function(){

	var wait = {
		wait: function(duration){
			return this.chain(function(){
				this.callChain.delay(duration == null ? 500 : duration, this);
				return this;
			}.bind(this));
		}
	};

	Chain.implement(wait);

	if (this.Fx) Fx.implement(wait);

	if (this.Element && Element.implement && this.Fx){
		Element.implement({

			chains: function(effects){
				Array.from(effects || ['tween', 'morph',
'reveal']).each(function(effect){
					effect = this.get(effect);
					if (!effect) return;
					effect.setOptions({
						link:'chain'
					});
				}, this);
				return this;
			},

			pauseFx: function(duration, effect){
				this.chains(effect).get(effect || 'tween').wait(duration);
				return this;
			}

		});
	}

})();


/*
---

script: Array.Extras.js

name: Array.Extras

description: Extends the Array native object to include useful methods to
work with arrays.

license: MIT-style license

authors:
  - Christoph Pojer
  - Sebastian Markbåge

requires:
  - Core/Array
  - MooTools.More

provides: [Array.Extras]

...
*/

(function(nil){

Array.implement({

	min: function(){
		return Math.min.apply(null, this);
	},

	max: function(){
		return Math.max.apply(null, this);
	},

	average: function(){
		return this.length ? this.sum() / this.length : 0;
	},

	sum: function(){
		var result = 0, l = this.length;
		if (l){
			while (l--) result += this[l];
		}
		return result;
	},

	unique: function(){
		return [].combine(this);
	},

	shuffle: function(){
		for (var i = this.length; i && --i;){
			var temp = this[i], r = Math.floor(Math.random() * ( i + 1 ));
			this[i] = this[r];
			this[r] = temp;
		}
		return this;
	},

	reduce: function(fn, value){
		for (var i = 0, l = this.length; i < l; i++){
			if (i in this) value = value === nil ? this[i] : fn.call(null, value,
this[i], i, this);
		}
		return value;
	},

	reduceRight: function(fn, value){
		var i = this.length;
		while (i--){
			if (i in this) value = value === nil ? this[i] : fn.call(null, value,
this[i], i, this);
		}
		return value;
	}

});

})();


/*
---

script: Object.Extras.js

name: Object.Extras

description: Extra Object generics, like getFromPath which allows a path
notation to child elements.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Object
  - /MooTools.More

provides: [Object.Extras]

...
*/

(function(){

var defined = function(value){
	return value != null;
};

var hasOwnProperty = Object.prototype.hasOwnProperty;

Object.extend({

	getFromPath: function(source, parts){
		if (typeof parts == 'string') parts =
parts.split('.');
		for (var i = 0, l = parts.length; i < l; i++){
			if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];
			else return null;
		}
		return source;
	},

	cleanValues: function(object, method){
		method = method || defined;
		for (var key in object) if (!method(object[key])){
			delete object[key];
		}
		return object;
	},

	erase: function(object, key){
		if (hasOwnProperty.call(object, key)) delete object[key];
		return object;
	},

	run: function(object){
		var args = Array.slice(arguments, 1);
		for (var key in object) if (object[key].apply){
			object[key].apply(object, args);
		}
		return object;
	}

});

})();


/*
---

script: Locale.js

name: Locale

description: Provides methods for localization.

license: MIT-style license

authors:
  - Aaron Newton
  - Arian Stolwijk

requires:
  - Core/Events
  - /Object.Extras
  - /MooTools.More

provides: [Locale, Lang]

...
*/

(function(){

var current = null,
	locales = {},
	inherits = {};

var getSet = function(set){
	if (instanceOf(set, Locale.Set)) return set;
	else return locales[set];
};

var Locale = this.Locale = {

	define: function(locale, set, key, value){
		var name;
		if (instanceOf(locale, Locale.Set)){
			name = locale.name;
			if (name) locales[name] = locale;
		} else {
			name = locale;
			if (!locales[name]) locales[name] = new Locale.Set(name);
			locale = locales[name];
		}

		if (set) locale.define(set, key, value);

		

		if (!current) current = locale;

		return locale;
	},

	use: function(locale){
		locale = getSet(locale);

		if (locale){
			current = locale;

			this.fireEvent('change', locale);

			
		}

		return this;
	},

	getCurrent: function(){
		return current;
	},

	get: function(key, args){
		return (current) ? current.get(key, args) : '';
	},

	inherit: function(locale, inherits, set){
		locale = getSet(locale);

		if (locale) locale.inherit(inherits, set);
		return this;
	},

	list: function(){
		return Object.keys(locales);
	}

};

Object.append(Locale, new Events);

Locale.Set = new Class({

	sets: {},

	inherits: {
		locales: [],
		sets: {}
	},

	initialize: function(name){
		this.name = name || '';
	},

	define: function(set, key, value){
		var defineData = this.sets[set];
		if (!defineData) defineData = {};

		if (key){
			if (typeOf(key) == 'object') defineData =
Object.merge(defineData, key);
			else defineData[key] = value;
		}
		this.sets[set] = defineData;

		return this;
	},

	get: function(key, args, _base){
		var value = Object.getFromPath(this.sets, key);
		if (value != null){
			var type = typeOf(value);
			if (type == 'function') value = value.apply(null,
Array.from(args));
			else if (type == 'object') value = Object.clone(value);
			return value;
		}

		// get value of inherited locales
		var index = key.indexOf('.'),
			set = index < 0 ? key : key.substr(0, index),
			names = (this.inherits.sets[set] ||
[]).combine(this.inherits.locales).include('en-US');
		if (!_base) _base = [];

		for (var i = 0, l = names.length; i < l; i++){
			if (_base.contains(names[i])) continue;
			_base.include(names[i]);

			var locale = locales[names[i]];
			if (!locale) continue;

			value = locale.get(key, args, _base);
			if (value != null) return value;
		}

		return '';
	},

	inherit: function(names, set){
		names = Array.from(names);

		if (set && !this.inherits.sets[set]) this.inherits.sets[set] =
[];

		var l = names.length;
		while (l--) (set ? this.inherits.sets[set] :
this.inherits.locales).unshift(names[l]);

		return this;
	}

});



})();


/*
---

name: Locale.en-US.Date

description: Date messages for US English.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - /Locale

provides: [Locale.en-US.Date]

...
*/

Locale.define('en-US', 'Date', {

	months: ['January', 'February', 'March',
'April', 'May', 'June', 'July',
'August', 'September', 'October',
'November', 'December'],
	months_abbr: ['Jan', 'Feb', 'Mar',
'Apr', 'May', 'Jun', 'Jul',
'Aug', 'Sep', 'Oct', 'Nov',
'Dec'],
	days: ['Sunday', 'Monday', 'Tuesday',
'Wednesday', 'Thursday', 'Friday',
'Saturday'],
	days_abbr: ['Sun', 'Mon', 'Tue',
'Wed', 'Thu', 'Fri', 'Sat'],

	// Culture's date order: MM/DD/YYYY
	dateOrder: ['month', 'date', 'year'],
	shortDate: '%m/%d/%Y',
	shortTime: '%I:%M%p',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 0,

	// Date.Extras
	ordinal: function(dayOfMonth){
		// 1st, 2nd, 3rd, etc.
		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th'
: ['th', 'st', 'nd', 'rd',
'th'][Math.min(dayOfMonth % 10, 4)];
	},

	lessThanMinuteAgo: 'less than a minute ago',
	minuteAgo: 'about a minute ago',
	minutesAgo: '{delta} minutes ago',
	hourAgo: 'about an hour ago',
	hoursAgo: 'about {delta} hours ago',
	dayAgo: '1 day ago',
	daysAgo: '{delta} days ago',
	weekAgo: '1 week ago',
	weeksAgo: '{delta} weeks ago',
	monthAgo: '1 month ago',
	monthsAgo: '{delta} months ago',
	yearAgo: '1 year ago',
	yearsAgo: '{delta} years ago',

	lessThanMinuteUntil: 'less than a minute from now',
	minuteUntil: 'about a minute from now',
	minutesUntil: '{delta} minutes from now',
	hourUntil: 'about an hour from now',
	hoursUntil: 'about {delta} hours from now',
	dayUntil: '1 day from now',
	daysUntil: '{delta} days from now',
	weekUntil: '1 week from now',
	weeksUntil: '{delta} weeks from now',
	monthUntil: '1 month from now',
	monthsUntil: '{delta} months from now',
	yearUntil: '1 year from now',
	yearsUntil: '{delta} years from now'

});


/*
---

script: Date.js

name: Date

description: Extends the Date native object to include methods useful in
managing dates.

license: MIT-style license

authors:
  - Aaron Newton
  - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/
  - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de
  - Scott Kyle - scott [at] appden.com; http://appden.com

requires:
  - Core/Array
  - Core/String
  - Core/Number
  - MooTools.More
  - Locale
  - Locale.en-US.Date

provides: [Date]

...
*/

(function(){

var Date = this.Date;

var DateMethods = Date.Methods = {
	ms: 'Milliseconds',
	year: 'FullYear',
	min: 'Minutes',
	mo: 'Month',
	sec: 'Seconds',
	hr: 'Hours'
};

['Date', 'Day', 'FullYear',
'Hours', 'Milliseconds', 'Minutes',
'Month', 'Seconds', 'Time',
'TimezoneOffset',
	'Week', 'Timezone', 'GMTOffset',
'DayOfYear', 'LastMonth', 'LastDayOfMonth',
'UTCDate', 'UTCDay', 'UTCFullYear',
	'AMPM', 'Ordinal', 'UTCHours',
'UTCMilliseconds', 'UTCMinutes', 'UTCMonth',
'UTCSeconds', 'UTCMilliseconds'].each(function(method){
	Date.Methods[method.toLowerCase()] = method;
});

var pad = function(n, digits, string){
	if (digits == 1) return n;
	return n < Math.pow(10, digits - 1) ? (string || '0') +
pad(n, digits - 1, string) : n;
};

Date.implement({

	set: function(prop, value){
		prop = prop.toLowerCase();
		var method = DateMethods[prop] && 'set' +
DateMethods[prop];
		if (method && this[method]) this[method](value);
		return this;
	}.overloadSetter(),

	get: function(prop){
		prop = prop.toLowerCase();
		var method = DateMethods[prop] && 'get' +
DateMethods[prop];
		if (method && this[method]) return this[method]();
		return null;
	}.overloadGetter(),

	clone: function(){
		return new Date(this.get('time'));
	},

	increment: function(interval, times){
		interval = interval || 'day';
		times = times != null ? times : 1;

		switch (interval){
			case 'year':
				return this.increment('month', times * 12);
			case 'month':
				var d = this.get('date');
				this.set('date', 1).set('mo',
this.get('mo') + times);
				return this.set('date',
d.min(this.get('lastdayofmonth')));
			case 'week':
				return this.increment('day', times * 7);
			case 'day':
				return this.set('date', this.get('date') + times);
		}

		if (!Date.units[interval]) throw new Error(interval + ' is not a
supported interval');

		return this.set('time', this.get('time') + times *
Date.units[interval]());
	},

	decrement: function(interval, times){
		return this.increment(interval, -1 * (times != null ? times : 1));
	},

	isLeapYear: function(){
		return Date.isLeapYear(this.get('year'));
	},

	clearTime: function(){
		return this.set({hr: 0, min: 0, sec: 0, ms: 0});
	},

	diff: function(date, resolution){
		if (typeOf(date) == 'string') date = Date.parse(date);

		return ((date - this) / Date.units[resolution || 'day'](3,
3)).round(); // non-leap year, 30-day month
	},

	getLastDayOfMonth: function(){
		return Date.daysInMonth(this.get('mo'),
this.get('year'));
	},

	getDayOfYear: function(){
		return (Date.UTC(this.get('year'), this.get('mo'),
this.get('date') + 1)
			- Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
	},

	setDay: function(day, firstDayOfWeek){
		if (firstDayOfWeek == null){
			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
			if (firstDayOfWeek === '') firstDayOfWeek = 1;
		}

		day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;
		var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;

		return this.increment('day', day - currentDay);
	},

	getWeek: function(firstDayOfWeek){
		if (firstDayOfWeek == null){
			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
			if (firstDayOfWeek === '') firstDayOfWeek = 1;
		}

		var date = this,
			dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,
			dividend = 0,
			firstDayOfYear;

		if (firstDayOfWeek == 1){
			// ISO-8601, week belongs to year that has the most days of the week
(i.e. has the thursday of the week)
			var month = date.get('month'),
				startOfWeek = date.get('date') - dayOfWeek;

			if (month == 11 && startOfWeek > 28) return 1; // Week 1 of
next year

			if (month == 0 && startOfWeek < -2){
				// Use a date from last year to determine the week
				date = new Date(date).decrement('day', dayOfWeek);
				dayOfWeek = 0;
			}

			firstDayOfYear = new Date(date.get('year'), 0,
1).get('day') || 7;
			if (firstDayOfYear > 4) dividend = -7; // First week of the year is
not week 1
		} else {
			// In other cultures the first week of the year is always week 1 and the
last week always 53 or 54.
			// Days in the same week can have a different weeknumber if the week
spreads across two years.
			firstDayOfYear = new Date(date.get('year'), 0,
1).get('day');
		}

		dividend += date.get('dayofyear');
		dividend += 6 - dayOfWeek; // Add days so we calculate the current
date's week as a full week
		dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for
first week of the year not being a full week

		return (dividend / 7);
	},

	getOrdinal: function(day){
		return Date.getMsg('ordinal', day ||
this.get('date'));
	},

	getTimezone: function(){
		return this.toString()
			.replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
			.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,
'$1$2$3');
	},

	getGMTOffset: function(){
		var off = this.get('timezoneOffset');
		return ((off > 0) ? '-' : '+') + pad((off.abs() /
60).floor(), 2) + pad(off % 60, 2);
	},

	setAMPM: function(ampm){
		ampm = ampm.toUpperCase();
		var hr = this.get('hr');
		if (hr > 11 && ampm == 'AM') return
this.decrement('hour', 12);
		else if (hr < 12 && ampm == 'PM') return
this.increment('hour', 12);
		return this;
	},

	getAMPM: function(){
		return (this.get('hr') < 12) ? 'AM' :
'PM';
	},

	parse: function(str){
		this.set('time', Date.parse(str));
		return this;
	},

	isValid: function(date){
		if (!date) date = this;
		return typeOf(date) == 'date' &&
!isNaN(date.valueOf());
	},

	format: function(format){
		if (!this.isValid()) return 'invalid date';

		if (!format) format = '%x %X';
		if (typeof format == 'string') format =
formats[format.toLowerCase()] || format;
		if (typeof format == 'function') return format(this);

		var d = this;
		return format.replace(/%([a-z%])/gi,
			function($0, $1){
				switch ($1){
					case 'a': return
Date.getMsg('days_abbr')[d.get('day')];
					case 'A': return
Date.getMsg('days')[d.get('day')];
					case 'b': return
Date.getMsg('months_abbr')[d.get('month')];
					case 'B': return
Date.getMsg('months')[d.get('month')];
					case 'c': return d.format('%a %b %d %H:%M:%S %Y');
					case 'd': return pad(d.get('date'), 2);
					case 'e': return pad(d.get('date'), 2, '
');
					case 'H': return pad(d.get('hr'), 2);
					case 'I': return pad((d.get('hr') % 12) || 12, 2);
					case 'j': return pad(d.get('dayofyear'), 3);
					case 'k': return pad(d.get('hr'), 2, '
');
					case 'l': return pad((d.get('hr') % 12) || 12, 2,
' ');
					case 'L': return pad(d.get('ms'), 3);
					case 'm': return pad((d.get('mo') + 1), 2);
					case 'M': return pad(d.get('min'), 2);
					case 'o': return d.get('ordinal');
					case 'p': return Date.getMsg(d.get('ampm'));
					case 's': return Math.round(d / 1000);
					case 'S': return pad(d.get('seconds'), 2);
					case 'T': return d.format('%H:%M:%S');
					case 'U': return pad(d.get('week'), 2);
					case 'w': return d.get('day');
					case 'x': return
d.format(Date.getMsg('shortDate'));
					case 'X': return
d.format(Date.getMsg('shortTime'));
					case 'y': return
d.get('year').toString().substr(2);
					case 'Y': return d.get('year');
					case 'z': return d.get('GMTOffset');
					case 'Z': return d.get('Timezone');
				}
				return $1;
			}
		);
	},

	toISOString: function(){
		return this.format('iso8601');
	}

}).alias({
	toJSON: 'toISOString',
	compare: 'diff',
	strftime: 'format'
});

// The day and month abbreviations are standardized, so we cannot use
simply %a and %b because they will get localized
var rfcDayAbbr = ['Sun', 'Mon', 'Tue',
'Wed', 'Thu', 'Fri', 'Sat'],
	rfcMonthAbbr = ['Jan', 'Feb', 'Mar',
'Apr', 'May', 'Jun', 'Jul',
'Aug', 'Sep', 'Oct', 'Nov',
'Dec'];

var formats = {
	db: '%Y-%m-%d %H:%M:%S',
	compact: '%Y%m%dT%H%M%S',
	'short': '%d %b %H:%M',
	'long': '%B %d, %Y %H:%M',
	rfc822: function(date){
		return rfcDayAbbr[date.get('day')] + date.format(', %d
') + rfcMonthAbbr[date.get('month')] + date.format(' %Y
%H:%M:%S %Z');
	},
	rfc2822: function(date){
		return rfcDayAbbr[date.get('day')] + date.format(', %d
') + rfcMonthAbbr[date.get('month')] + date.format(' %Y
%H:%M:%S %z');
	},
	iso8601: function(date){
		return (
			date.getUTCFullYear() + '-' +
			pad(date.getUTCMonth() + 1, 2) + '-' +
			pad(date.getUTCDate(), 2) + 'T' +
			pad(date.getUTCHours(), 2) + ':' +
			pad(date.getUTCMinutes(), 2) + ':' +
			pad(date.getUTCSeconds(), 2) + '.' +
			pad(date.getUTCMilliseconds(), 3) + 'Z'
		);
	}
};

var parsePatterns = [],
	nativeParse = Date.parse;

var parseWord = function(type, word, num){
	var ret = -1,
		translated = Date.getMsg(type + 's');
	switch (typeOf(word)){
		case 'object':
			ret = translated[word.get(type)];
			break;
		case 'number':
			ret = translated[word];
			if (!ret) throw new Error('Invalid ' + type + ' index:
' + word);
			break;
		case 'string':
			var match = translated.filter(function(name){
				return this.test(name);
			}, new RegExp('^' + word, 'i'));
			if (!match.length) throw new Error('Invalid ' + type + '
string');
			if (match.length > 1) throw new Error('Ambiguous ' + type);
			ret = match[0];
	}

	return (num) ? translated.indexOf(ret) : ret;
};

var startCentury = 1900,
	startYear = 70;

Date.extend({

	getMsg: function(key, args){
		return Locale.get('Date.' + key, args);
	},

	units: {
		ms: Function.from(1),
		second: Function.from(1000),
		minute: Function.from(60000),
		hour: Function.from(3600000),
		day: Function.from(86400000),
		week: Function.from(608400000),
		month: function(month, year){
			var d = new Date;
			return Date.daysInMonth(month != null ? month : d.get('mo'),
year != null ? year : d.get('year')) * 86400000;
		},
		year: function(year){
			year = year || new Date().get('year');
			return Date.isLeapYear(year) ? 31622400000 : 31536000000;
		}
	},

	daysInMonth: function(month, year){
		return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31][month];
	},

	isLeapYear: function(year){
		return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400
=== 0);
	},

	parse: function(from){
		var t = typeOf(from);
		if (t == 'number') return new Date(from);
		if (t != 'string') return from;
		from = from.clean();
		if (!from.length) return null;

		var parsed;
		parsePatterns.some(function(pattern){
			var bits = pattern.re.exec(from);
			return (bits) ? (parsed = pattern.handler(bits)) : false;
		});

		if (!(parsed && parsed.isValid())){
			parsed = new Date(nativeParse(from));
			if (!(parsed && parsed.isValid())) parsed = new
Date(from.toInt());
		}
		return parsed;
	},

	parseDay: function(day, num){
		return parseWord('day', day, num);
	},

	parseMonth: function(month, num){
		return parseWord('month', month, num);
	},

	parseUTC: function(value){
		var localDate = new Date(value);
		var utcSeconds = Date.UTC(
			localDate.get('year'),
			localDate.get('mo'),
			localDate.get('date'),
			localDate.get('hr'),
			localDate.get('min'),
			localDate.get('sec'),
			localDate.get('ms')
		);
		return new Date(utcSeconds);
	},

	orderIndex: function(unit){
		return Date.getMsg('dateOrder').indexOf(unit) + 1;
	},

	defineFormat: function(name, format){
		formats[name] = format;
		return this;
	},

	

	defineParser: function(pattern){
		parsePatterns.push((pattern.re && pattern.handler) ? pattern :
build(pattern));
		return this;
	},

	defineParsers: function(){
		Array.flatten(arguments).each(Date.defineParser);
		return this;
	},

	define2DigitYearStart: function(year){
		startYear = year % 100;
		startCentury = year - startYear;
		return this;
	}

}).extend({
	defineFormats: Date.defineFormat.overloadSetter()
});

var regexOf = function(type){
	return new RegExp('(?:' + Date.getMsg(type).map(function(name){
		return name.substr(0, 3);
	}).join('|') + ')[a-z]*');
};

var replacers = function(key){
	switch (key){
		case 'T':
			return '%H:%M:%S';
		case 'x': // iso8601 covers yyyy-mm-dd, so just check if month
is first
			return ((Date.orderIndex('month') == 1) ?
'%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';
		case 'X':
			return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';
	}
	return null;
};

var keys = {
	d: /[0-2]?[0-9]|3[01]/,
	H: /[01]?[0-9]|2[0-3]/,
	I: /0?[1-9]|1[0-2]/,
	M: /[0-5]?\d/,
	s: /\d+/,
	o: /[a-z]*/,
	p: /[ap]\.?m\.?/,
	y: /\d{2}|\d{4}/,
	Y: /\d{4}/,
	z: /Z|[+-]\d{2}(?::?\d{2})?/
};

keys.m = keys.I;
keys.S = keys.M;

var currentLanguage;

var recompile = function(language){
	currentLanguage = language;

	keys.a = keys.A = regexOf('days');
	keys.b = keys.B = regexOf('months');

	parsePatterns.each(function(pattern, i){
		if (pattern.format) parsePatterns[i] = build(pattern.format);
	});
};

var build = function(format){
	if (!currentLanguage) return {format: format};

	var parsed = [];
	var re = (format.source || format) // allow format to be regex
	 .replace(/%([a-z])/gi,
		function($0, $1){
			return replacers($1) || $0;
		}
	).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
	 .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and
commas
	 .replace(/%([a-z%])/gi,
		function($0, $1){
			var p = keys[$1];
			if (!p) return $1;
			parsed.push($1);
			return '(' + p.source + ')';
		}
	).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle
unicode words

	return {
		format: format,
		re: new RegExp('^' + re + '$', 'i'),
		handler: function(bits){
			bits = bits.slice(1).associate(parsed);
			var date = new Date().clearTime(),
				year = bits.y || bits.Y;

			if (year != null) handle.call(date, 'y', year); // need to
start in the right year
			if ('d' in bits) handle.call(date, 'd', 1);
			if ('m' in bits || bits.b || bits.B) handle.call(date,
'm', 1);

			for (var key in bits) handle.call(date, key, bits[key]);
			return date;
		}
	};
};

var handle = function(key, value){
	if (!value) return this;

	switch (key){
		case 'a': case 'A': return this.set('day',
Date.parseDay(value, true));
		case 'b': case 'B': return this.set('mo',
Date.parseMonth(value, true));
		case 'd': return this.set('date', value);
		case 'H': case 'I': return this.set('hr',
value);
		case 'm': return this.set('mo', value - 1);
		case 'M': return this.set('min', value);
		case 'p': return this.set('ampm',
value.replace(/\./g, ''));
		case 'S': return this.set('sec', value);
		case 's': return this.set('ms', ('0.' +
value) * 1000);
		case 'w': return this.set('day', value);
		case 'Y': return this.set('year', value);
		case 'y':
			value = +value;
			if (value < 100) value += startCentury + (value < startYear ? 100
: 0);
			return this.set('year', value);
		case 'z':
			if (value == 'Z') value = '+00';
			var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
			offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] ||
0)) + this.getTimezoneOffset();
			return this.set('time', this - offset * 60000);
	}

	return this;
};

Date.defineParsers(
	'%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31",
"1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
	'%Y%m%d(T%H(%M%S?)?)?', // "19991231",
"19991231T1159", compact
	'%x( %X)?', // "12/31", "12.31.99",
"12-31-1999", "12/31/2008 11:59 PM"
	'%d%o( %b( %Y)?)?( %X)?', // "31st", "31st
December", "31 Dec 1999", "31 Dec 1999 11:59pm"
	'%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day
switched
	'%Y %b( %d%o( %X)?)?', // Same as above with year coming first
	'%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000
2009"
	'%T', // %H:%M:%S
	'%H:%M( ?%p)?' // "11:05pm", "11:05 am" and
"11:05"
);

Locale.addEvent('change', function(language){
	if (Locale.get('Date')) recompile(language);
}).fireEvent('change', Locale.getCurrent());

})();


/*
---

script: Date.Extras.js

name: Date.Extras

description: Extends the Date native object to include extra methods (on
top of those in Date.js).

license: MIT-style license

authors:
  - Aaron Newton
  - Scott Kyle

requires:
  - /Date

provides: [Date.Extras]

...
*/

Date.implement({

	timeDiffInWords: function(to){
		return Date.distanceOfTimeInWords(this, to || new Date);
	},

	timeDiff: function(to, separator){
		if (to == null) to = new Date;
		var delta = ((to - this) / 1000).floor().abs();

		var vals = [],
			durations = [60, 60, 24, 365, 0],
			names = ['s', 'm', 'h', 'd',
'y'],
			value, duration;

		for (var item = 0; item < durations.length; item++){
			if (item && !delta) break;
			value = delta;
			if ((duration = durations[item])){
				value = (delta % duration);
				delta = (delta / duration).floor();
			}
			vals.unshift(value + (names[item] || ''));
		}

		return vals.join(separator || ':');
	}

}).extend({

	distanceOfTimeInWords: function(from, to){
		return Date.getTimePhrase(((to - from) / 1000).toInt());
	},

	getTimePhrase: function(delta){
		var suffix = (delta < 0) ? 'Until' : 'Ago';
		if (delta < 0) delta *= -1;

		var units = {
			minute: 60,
			hour: 60,
			day: 24,
			week: 7,
			month: 52 / 12,
			year: 12,
			eon: Infinity
		};

		var msg = 'lessThanMinute';

		for (var unit in units){
			var interval = units[unit];
			if (delta < 1.5 * interval){
				if (delta > 0.75 * interval) msg = unit;
				break;
			}
			delta /= interval;
			msg = unit + 's';
		}

		delta = delta.round();
		return Date.getMsg(msg + suffix, delta).substitute({delta: delta});
	}

}).defineParsers(

	{
		// "today", "tomorrow", "yesterday"
		re: /^(?:tod|tom|yes)/i,
		handler: function(bits){
			var d = new Date().clearTime();
			switch (bits[0]){
				case 'tom': return d.increment();
				case 'yes': return d.decrement();
				default: return d;
			}
		}
	},

	{
		// "next Wednesday", "last Thursday"
		re: /^(next|last) ([a-z]+)$/i,
		handler: function(bits){
			var d = new Date().clearTime();
			var day = d.getDay();
			var newDay = Date.parseDay(bits[2], true);
			var addDays = newDay - day;
			if (newDay <= day) addDays += 7;
			if (bits[1] == 'last') addDays -= 7;
			return d.set('date', d.getDate() + addDays);
		}
	}

).alias('timeAgoInWords', 'timeDiffInWords');


/*
---

name: Locale.en-US.Number

description: Number messages for US English.

license: MIT-style license

authors:
  - Arian Stolwijk

requires:
  - /Locale

provides: [Locale.en-US.Number]

...
*/

Locale.define('en-US', 'Number', {

	decimal: '.',
	group: ',',

/* 	Commented properties are the defaults for Number.format
	decimals: 0,
	precision: 0,
	scientific: null,

	prefix: null,
	suffic: null,

	// Negative/Currency/percentage will mixin Number
	negative: {
		prefix: '-'
	},*/

	currency: {
//		decimals: 2,
		prefix: '$ '
	}/*,

	percentage: {
		decimals: 2,
		suffix: '%'
	}*/

});




/*
---
name: Number.Format
description: Extends the Number Type object to include a number formatting
method.
license: MIT-style license
authors: [Arian Stolwijk]
requires: [Core/Number, Locale.en-US.Number]
# Number.Extras is for compatibility
provides: [Number.Format, Number.Extras]
...
*/


Number.implement({

	format: function(options){
		// Thanks dojo and YUI for some inspiration
		var value = this;
		options = options ? Object.clone(options) : {};
		var getOption = function(key){
			if (options[key] != null) return options[key];
			return Locale.get('Number.' + key);
		};

		var negative = value < 0,
			decimal = getOption('decimal'),
			precision = getOption('precision'),
			group = getOption('group'),
			decimals = getOption('decimals');

		if (negative){
			var negativeLocale = getOption('negative') || {};
			if (negativeLocale.prefix == null && negativeLocale.suffix ==
null) negativeLocale.prefix = '-';
			['prefix', 'suffix'].each(function(key){
				if (negativeLocale[key]) options[key] = getOption(key) +
negativeLocale[key];
			});

			value = -value;
		}

		var prefix = getOption('prefix'),
			suffix = getOption('suffix');

		if (decimals !== '' && decimals >= 0 &&
decimals <= 20) value = value.toFixed(decimals);
		if (precision >= 1 && precision <= 21) value =
(+value).toPrecision(precision);

		value += '';
		var index;
		if (getOption('scientific') === false &&
value.indexOf('e') > -1){
			var match = value.split('e'),
				zeros = +match[1];
			value = match[0].replace('.', '');

			if (zeros < 0){
				zeros = -zeros - 1;
				index = match[0].indexOf('.');
				if (index > -1) zeros -= index - 1;
				while (zeros--) value = '0' + value;
				value = '0.' + value;
			} else {
				index = match[0].lastIndexOf('.');
				if (index > -1) zeros -= match[0].length - index - 1;
				while (zeros--) value += '0';
			}
		}

		if (decimal != '.') value = value.replace('.',
decimal);

		if (group){
			index = value.lastIndexOf(decimal);
			index = (index > -1) ? index : value.length;
			var newOutput = value.substring(index),
				i = index;

			while (i--){
				if ((index - i - 1) % 3 == 0 && i != (index - 1)) newOutput =
group + newOutput;
				newOutput = value.charAt(i) + newOutput;
			}

			value = newOutput;
		}

		if (prefix) value = prefix + value;
		if (suffix) value += suffix;

		return value;
	},

	formatCurrency: function(decimals){
		var locale = Locale.get('Number.currency') || {};
		if (locale.scientific == null) locale.scientific = false;
		locale.decimals = decimals != null ? decimals
			: (locale.decimals == null ? 2 : locale.decimals);

		return this.format(locale);
	},

	formatPercentage: function(decimals){
		var locale = Locale.get('Number.percentage') || {};
		if (locale.suffix == null) locale.suffix = '%';
		locale.decimals = decimals != null ? decimals
			: (locale.decimals == null ? 2 : locale.decimals);

		return this.format(locale);
	}

});


/*
---

script: String.Extras.js

name: String.Extras

description: Extends the String native object to include methods useful in
managing various kinds of strings (query strings, urls, html, etc).

license: MIT-style license

authors:
  - Aaron Newton
  - Guillermo Rauch
  - Christopher Pitt

requires:
  - Core/String
  - Core/Array
  - MooTools.More

provides: [String.Extras]

...
*/

(function(){

var special = {
	'a': /[àáâãäåăą]/g,
	'A': /[ÀÁÂÃÄÅĂĄ]/g,
	'c': /[ćčç]/g,
	'C': /[ĆČÇ]/g,
	'd': /[ďđ]/g,
	'D': /[ĎÐ]/g,
	'e': /[èéêëěę]/g,
	'E': /[ÈÉÊËĚĘ]/g,
	'g': /[ğ]/g,
	'G': /[Ğ]/g,
	'i': /[ìíîï]/g,
	'I': /[ÌÍÎÏ]/g,
	'l': /[ĺľł]/g,
	'L': /[ĹĽŁ]/g,
	'n': /[ñňń]/g,
	'N': /[ÑŇŃ]/g,
	'o': /[òóôõöøő]/g,
	'O': /[ÒÓÔÕÖØ]/g,
	'r': /[řŕ]/g,
	'R': /[ŘŔ]/g,
	's': /[ššş]/g,
	'S': /[ŠŞŚ]/g,
	't': /[ťţ]/g,
	'T': /[ŤŢ]/g,
	'ue': /[ü]/g,
	'UE': /[Ü]/g,
	'u': /[ùúûůµ]/g,
	'U': /[ÙÚÛŮ]/g,
	'y': /[ÿý]/g,
	'Y': /[ŸÝ]/g,
	'z': /[žźż]/g,
	'Z': /[ŽŹŻ]/g,
	'th': /[þ]/g,
	'TH': /[Þ]/g,
	'dh': /[ð]/g,
	'DH': /[Ð]/g,
	'ss': /[ß]/g,
	'oe': /[œ]/g,
	'OE': /[Œ]/g,
	'ae': /[æ]/g,
	'AE': /[Æ]/g
},

tidy = {
	' ': /[\xa0\u2002\u2003\u2009]/g,
	'*': /[\xb7]/g,
	'\'': /[\u2018\u2019]/g,
	'"': /[\u201c\u201d]/g,
	'...': /[\u2026]/g,
	'-': /[\u2013]/g,
//	'--': /[\u2014]/g,
	'&raquo;': /[\uFFFD]/g
};

var walk = function(string, replacements){
	var result = string, key;
	for (key in replacements) result = result.replace(replacements[key], key);
	return result;
};

var getRegexForTag = function(tag, contents){
	tag = tag || '';
	var regstr = contents ? "<" + tag +
"(?!\\w)[^>]*>([\\s\\S]*?)<\/" + tag +
"(?!\\w)>" : "<\/?" + tag +
"([^>]+)?>",
		reg = new RegExp(regstr, "gi");
	return reg;
};

String.implement({

	standardize: function(){
		return walk(this, special);
	},

	repeat: function(times){
		return new Array(times + 1).join(this);
	},

	pad: function(length, str, direction){
		if (this.length >= length) return this;

		var pad = (str == null ? ' ' : '' + str)
			.repeat(length - this.length)
			.substr(0, length - this.length);

		if (!direction || direction == 'right') return this + pad;
		if (direction == 'left') return pad + this;

		return pad.substr(0, (pad.length / 2).floor()) + this + pad.substr(0,
(pad.length / 2).ceil());
	},

	getTags: function(tag, contents){
		return this.match(getRegexForTag(tag, contents)) || [];
	},

	stripTags: function(tag, contents){
		return this.replace(getRegexForTag(tag, contents), '');
	},

	tidy: function(){
		return walk(this, tidy);
	},

	truncate: function(max, trail, atChar){
		var string = this;
		if (trail == null && arguments.length == 1) trail =
'…';
		if (string.length > max){
			string = string.substring(0, max);
			if (atChar){
				var index = string.lastIndexOf(atChar);
				if (index != -1) string = string.substr(0, index);
			}
			if (trail) string += trail;
		}
		return string;
	}

});

})();


/*
---

script: String.QueryString.js

name: String.QueryString

description: Methods for dealing with URI query strings.

license: MIT-style license

authors:
  - Sebastian Markbåge
  - Aaron Newton
  - Lennart Pilon
  - Valerio Proietti

requires:
  - Core/Array
  - Core/String
  - /MooTools.More

provides: [String.QueryString]

...
*/

String.implement({

	parseQueryString: function(decodeKeys, decodeValues){
		if (decodeKeys == null) decodeKeys = true;
		if (decodeValues == null) decodeValues = true;

		var vars = this.split(/[&;]/),
			object = {};
		if (!vars.length) return object;

		vars.each(function(val){
			var index = val.indexOf('=') + 1,
				value = index ? val.substr(index) : '',
				keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g)
: [val],
				obj = object;
			if (!keys) return;
			if (decodeValues) value = decodeURIComponent(value);
			keys.each(function(key, i){
				if (decodeKeys) key = decodeURIComponent(key);
				var current = obj[key];

				if (i < keys.length - 1) obj = obj[key] = current || {};
				else if (typeOf(current) == 'array') current.push(value);
				else obj[key] = current != null ? [current, value] : value;
			});
		});

		return object;
	},

	cleanQueryString: function(method){
		return this.split('&').filter(function(val){
			var index = val.indexOf('='),
				key = index < 0 ? '' : val.substr(0, index),
				value = val.substr(index + 1);

			return method ? method.call(null, key, value) : (value || value === 0);
		}).join('&');
	}

});


/*
---

script: URI.js

name: URI

description: Provides methods useful in managing the window location and
uris.

license: MIT-style license

authors:
  - Sebastian Markbåge
  - Aaron Newton

requires:
  - Core/Object
  - Core/Class
  - Core/Class.Extras
  - Core/Element
  - /String.QueryString

provides: [URI]

...
*/

(function(){

var toString = function(){
	return this.get('value');
};

var URI = this.URI = new Class({

	Implements: Options,

	options: {
		/*base: false*/
	},

	regex:
/^(?:(\w+):)?(?:\/\/(?:(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)?(\.\.?$|(?:[^?#\/]*\/)*)([^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
	parts: ['scheme', 'user', 'password',
'host', 'port', 'directory',
'file', 'query', 'fragment'],
	schemes: {http: 80, https: 443, ftp: 21, rtsp: 554, mms: 1755, file: 0},

	initialize: function(uri, options){
		this.setOptions(options);
		var base = this.options.base || URI.base;
		if (!uri) uri = base;

		if (uri && uri.parsed) this.parsed = Object.clone(uri.parsed);
		else this.set('value', uri.href || uri.toString(), base ? new
URI(base) : false);
	},

	parse: function(value, base){
		var bits = value.match(this.regex);
		if (!bits) return false;
		bits.shift();
		return this.merge(bits.associate(this.parts), base);
	},

	merge: function(bits, base){
		if ((!bits || !bits.scheme) && (!base || !base.scheme)) return
false;
		if (base){
			this.parts.every(function(part){
				if (bits[part]) return false;
				bits[part] = base[part] || '';
				return true;
			});
		}
		bits.port = bits.port || this.schemes[bits.scheme.toLowerCase()];
		bits.directory = bits.directory ? this.parseDirectory(bits.directory,
base ? base.directory : '') : '/';
		return bits;
	},

	parseDirectory: function(directory, baseDirectory){
		directory = (directory.substr(0, 1) == '/' ? '' :
(baseDirectory || '/')) + directory;
		if (!directory.test(URI.regs.directoryDot)) return directory;
		var result = [];
		directory.replace(URI.regs.endSlash,
'').split('/').each(function(dir){
			if (dir == '..' && result.length > 0) result.pop();
			else if (dir != '.') result.push(dir);
		});
		return result.join('/') + '/';
	},

	combine: function(bits){
		return bits.value || bits.scheme + '://' +
			(bits.user ? bits.user + (bits.password ? ':' + bits.password
: '') + '@' : '') +
			(bits.host || '') + (bits.port && bits.port !=
this.schemes[bits.scheme] ? ':' + bits.port : '') +
			(bits.directory || '/') + (bits.file || '') +
			(bits.query ? '?' + bits.query : '') +
			(bits.fragment ? '#' + bits.fragment : '');
	},

	set: function(part, value, base){
		if (part == 'value'){
			var scheme = value.match(URI.regs.scheme);
			if (scheme) scheme = scheme[1];
			if (scheme && this.schemes[scheme.toLowerCase()] == null)
this.parsed = { scheme: scheme, value: value };
			else this.parsed = this.parse(value, (base || this).parsed) || (scheme ?
{ scheme: scheme, value: value } : { value: value });
		} else if (part == 'data'){
			this.setData(value);
		} else {
			this.parsed[part] = value;
		}
		return this;
	},

	get: function(part, base){
		switch (part){
			case 'value': return this.combine(this.parsed, base ?
base.parsed : false);
			case 'data' : return this.getData();
		}
		return this.parsed[part] || '';
	},

	go: function(){
		document.location.href = this.toString();
	},

	toURI: function(){
		return this;
	},

	getData: function(key, part){
		var qs = this.get(part || 'query');
		if (!(qs || qs === 0)) return key ? null : {};
		var obj = qs.parseQueryString();
		return key ? obj[key] : obj;
	},

	setData: function(values, merge, part){
		if (typeof values == 'string'){
			var data = this.getData();
			data[arguments[0]] = arguments[1];
			values = data;
		} else if (merge){
			values = Object.merge(this.getData(), values);
		}
		return this.set(part || 'query', Object.toQueryString(values));
	},

	clearData: function(part){
		return this.set(part || 'query', '');
	},

	toString: toString,
	valueOf: toString

});

URI.regs = {
	endSlash: /\/$/,
	scheme: /^(\w+):/,
	directoryDot: /\.\/|\.$/
};

URI.base = new URI(Array.from(document.getElements('base[href]',
true)).getLast(), {base: document.location});

String.implement({

	toURI: function(options){
		return new URI(this, options);
	}

});

})();


/*
---

script: URI.Relative.js

name: URI.Relative

description: Extends the URI class to add methods for computing relative
and absolute urls.

license: MIT-style license

authors:
  - Sebastian Markbåge


requires:
  - /Class.refactor
  - /URI

provides: [URI.Relative]

...
*/

URI = Class.refactor(URI, {

	combine: function(bits, base){
		if (!base || bits.scheme != base.scheme || bits.host != base.host ||
bits.port != base.port)
			return this.previous.apply(this, arguments);
		var end = bits.file + (bits.query ? '?' + bits.query :
'') + (bits.fragment ? '#' + bits.fragment :
'');

		if (!base.directory) return (bits.directory || (bits.file ? ''
: './')) + end;

		var baseDir = base.directory.split('/'),
			relDir = bits.directory.split('/'),
			path = '',
			offset;

		var i = 0;
		for (offset = 0; offset < baseDir.length && offset <
relDir.length && baseDir[offset] == relDir[offset]; offset++);
		for (i = 0; i < baseDir.length - offset - 1; i++) path +=
'../';
		for (i = offset; i < relDir.length - 1; i++) path += relDir[i] +
'/';

		return (path || (bits.file ? '' : './')) + end;
	},

	toAbsolute: function(base){
		base = new URI(base);
		if (base) base.set('directory',
'').set('file', '');
		return this.toRelative(base);
	},

	toRelative: function(base){
		return this.get('value', new URI(base));
	}

});


/*
---

name: Hash

description: Contains Hash Prototypes. Provides a means for overcoming the
JavaScript practical impossibility of extending native Objects.

license: MIT-style license.

requires:
  - Core/Object
  - /MooTools.More

provides: [Hash]

...
*/

(function(){

if (this.Hash) return;

var Hash = this.Hash = new Type('Hash', function(object){
	if (typeOf(object) == 'hash') object =
Object.clone(object.getClean());
	for (var key in object) this[key] = object[key];
	return this;
});

this.$H = function(object){
	return new Hash(object);
};

Hash.implement({

	forEach: function(fn, bind){
		Object.forEach(this, fn, bind);
	},

	getClean: function(){
		var clean = {};
		for (var key in this){
			if (this.hasOwnProperty(key)) clean[key] = this[key];
		}
		return clean;
	},

	getLength: function(){
		var length = 0;
		for (var key in this){
			if (this.hasOwnProperty(key)) length++;
		}
		return length;
	}

});

Hash.alias('each', 'forEach');

Hash.implement({

	has: Object.prototype.hasOwnProperty,

	keyOf: function(value){
		return Object.keyOf(this, value);
	},

	hasValue: function(value){
		return Object.contains(this, value);
	},

	extend: function(properties){
		Hash.each(properties || {}, function(value, key){
			Hash.set(this, key, value);
		}, this);
		return this;
	},

	combine: function(properties){
		Hash.each(properties || {}, function(value, key){
			Hash.include(this, key, value);
		}, this);
		return this;
	},

	erase: function(key){
		if (this.hasOwnProperty(key)) delete this[key];
		return this;
	},

	get: function(key){
		return (this.hasOwnProperty(key)) ? this[key] : null;
	},

	set: function(key, value){
		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
		return this;
	},

	empty: function(){
		Hash.each(this, function(value, key){
			delete this[key];
		}, this);
		return this;
	},

	include: function(key, value){
		if (this[key] == undefined) this[key] = value;
		return this;
	},

	map: function(fn, bind){
		return new Hash(Object.map(this, fn, bind));
	},

	filter: function(fn, bind){
		return new Hash(Object.filter(this, fn, bind));
	},

	every: function(fn, bind){
		return Object.every(this, fn, bind);
	},

	some: function(fn, bind){
		return Object.some(this, fn, bind);
	},

	getKeys: function(){
		return Object.keys(this);
	},

	getValues: function(){
		return Object.values(this);
	},

	toQueryString: function(base){
		return Object.toQueryString(this, base);
	}

});

Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});


})();



/*
---

script: Hash.Extras.js

name: Hash.Extras

description: Extends the Hash Type to include getFromPath which allows a
path notation to child elements.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - /Hash
  - /Object.Extras

provides: [Hash.Extras]

...
*/

Hash.implement({

	getFromPath: function(notation){
		return Object.getFromPath(this, notation);
	},

	cleanValues: function(method){
		return new Hash(Object.cleanValues(this, method));
	},

	run: function(){
		Object.run(arguments);
	}

});


/*
---

script: Element.Forms.js

name: Element.Forms

description: Extends the Element native object to include methods useful in
managing inputs.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Element
  - /String.Extras
  - /MooTools.More

provides: [Element.Forms]

...
*/

Element.implement({

	tidy: function(){
		this.set('value', this.get('value').tidy());
	},

	getTextInRange: function(start, end){
		return this.get('value').substring(start, end);
	},

	getSelectedText: function(){
		if (this.setSelectionRange) return
this.getTextInRange(this.getSelectionStart(), this.getSelectionEnd());
		return document.selection.createRange().text;
	},

	getSelectedRange: function(){
		if (this.selectionStart != null){
			return {
				start: this.selectionStart,
				end: this.selectionEnd
			};
		}

		var pos = {
			start: 0,
			end: 0
		};
		var range = this.getDocument().selection.createRange();
		if (!range || range.parentElement() != this) return pos;
		var duplicate = range.duplicate();

		if (this.type == 'text'){
			pos.start = 0 - duplicate.moveStart('character', -100000);
			pos.end = pos.start + range.text.length;
		} else {
			var value = this.get('value');
			var offset = value.length;
			duplicate.moveToElementText(this);
			duplicate.setEndPoint('StartToEnd', range);
			if (duplicate.text.length) offset -= value.match(/[\n\r]*$/)[0].length;
			pos.end = offset - duplicate.text.length;
			duplicate.setEndPoint('StartToStart', range);
			pos.start = offset - duplicate.text.length;
		}
		return pos;
	},

	getSelectionStart: function(){
		return this.getSelectedRange().start;
	},

	getSelectionEnd: function(){
		return this.getSelectedRange().end;
	},

	setCaretPosition: function(pos){
		if (pos == 'end') pos = this.get('value').length;
		this.selectRange(pos, pos);
		return this;
	},

	getCaretPosition: function(){
		return this.getSelectedRange().start;
	},

	selectRange: function(start, end){
		if (this.setSelectionRange){
			this.focus();
			this.setSelectionRange(start, end);
		} else {
			var value = this.get('value');
			var diff = value.substr(start, end - start).replace(/\r/g,
'').length;
			start = value.substr(0, start).replace(/\r/g, '').length;
			var range = this.createTextRange();
			range.collapse(true);
			range.moveEnd('character', start + diff);
			range.moveStart('character', start);
			range.select();
		}
		return this;
	},

	insertAtCursor: function(value, select){
		var pos = this.getSelectedRange();
		var text = this.get('value');
		this.set('value', text.substring(0, pos.start) + value +
text.substring(pos.end, text.length));
		if (select !== false) this.selectRange(pos.start, pos.start +
value.length);
		else this.setCaretPosition(pos.start + value.length);
		return this;
	},

	insertAroundCursor: function(options, select){
		options = Object.append({
			before: '',
			defaultMiddle: '',
			after: ''
		}, options);

		var value = this.getSelectedText() || options.defaultMiddle;
		var pos = this.getSelectedRange();
		var text = this.get('value');

		if (pos.start == pos.end){
			this.set('value', text.substring(0, pos.start) +
options.before + value + options.after + text.substring(pos.end,
text.length));
			this.selectRange(pos.start + options.before.length, pos.end +
options.before.length + value.length);
		} else {
			var current = text.substring(pos.start, pos.end);
			this.set('value', text.substring(0, pos.start) +
options.before + current + options.after + text.substring(pos.end,
text.length));
			var selStart = pos.start + options.before.length;
			if (select !== false) this.selectRange(selStart, selStart +
current.length);
			else this.setCaretPosition(selStart + text.length);
		}
		return this;
	}

});


/*
---

script: Elements.From.js

name: Elements.From

description: Returns a collection of elements from a string of html.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/String
  - Core/Element
  - /MooTools.More

provides: [Elements.from, Elements.From]

...
*/

Elements.from = function(text, excludeScripts){
	if (excludeScripts || excludeScripts == null) text = text.stripScripts();

	var container, match = text.match(/^\s*<(t[dhr]|tbody|tfoot|thead)/i);

	if (match){
		container = new Element('table');
		var tag = match[1].toLowerCase();
		if (['td', 'th', 'tr'].contains(tag)){
			container = new Element('tbody').inject(container);
			if (tag != 'tr') container = new
Element('tr').inject(container);
		}
	}

	return (container || new Element('div')).set('html',
text).getChildren();
};


/*
---

name: Element.Event.Pseudos

description: Adds the functionality to add pseudo events for Elements

license: MIT-style license

authors:
  - Arian Stolwijk

requires: [Core/Element.Event, Core/Element.Delegation, Events.Pseudos]

provides: [Element.Event.Pseudos, Element.Delegation]

...
*/

(function(){

var pseudos = {relay: false},
	copyFromEvents = ['once', 'throttle',
'pause'],
	count = copyFromEvents.length;

while (count--) pseudos[copyFromEvents[count]] =
Events.lookupPseudo(copyFromEvents[count]);

DOMEvent.definePseudo = function(key, listener){
	pseudos[key] = listener;
	return this;
};

var proto = Element.prototype;
[Element, Window, Document].invoke('implement',
Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));

})();


/*
---

name: Element.Event.Pseudos.Keys

description: Adds functionality fire events if certain keycombinations are
pressed

license: MIT-style license

authors:
  - Arian Stolwijk

requires: [Element.Event.Pseudos]

provides: [Element.Event.Pseudos.Keys]

...
*/

(function(){

var keysStoreKey = '$moo:keys-pressed',
	keysKeyupStoreKey = '$moo:keys-keyup';


DOMEvent.definePseudo('keys', function(split, fn, args){

	var event = args[0],
		keys = [],
		pressed = this.retrieve(keysStoreKey, []);

	keys.append(split.value.replace('++', function(){
		keys.push('+'); // shift++ and shift+++a
		return '';
	}).split('+'));

	pressed.include(event.key);

	if (keys.every(function(key){
		return pressed.contains(key);
	})) fn.apply(this, args);

	this.store(keysStoreKey, pressed);

	if (!this.retrieve(keysKeyupStoreKey)){
		var keyup = function(event){
			(function(){
				pressed = this.retrieve(keysStoreKey, []).erase(event.key);
				this.store(keysStoreKey, pressed);
			}).delay(0, this); // Fix for IE
		};
		this.store(keysKeyupStoreKey, keyup).addEvent('keyup', keyup);
	}

});

DOMEvent.defineKeys({
	'16': 'shift',
	'17': 'control',
	'18': 'alt',
	'20': 'capslock',
	'33': 'pageup',
	'34': 'pagedown',
	'35': 'end',
	'36': 'home',
	'144': 'numlock',
	'145': 'scrolllock',
	'186': ';',
	'187': '=',
	'188': ',',
	'190': '.',
	'191': '/',
	'192': '`',
	'219': '[',
	'220': '\\',
	'221': ']',
	'222': "'",
	'107': '+'
}).defineKey(Browser.firefox ? 109 : 189, '-');

})();


/*
---

script: Element.Measure.js

name: Element.Measure

description: Extends the Element native object to include methods useful in
measuring dimensions.

credits: "Element.measure / .expose methods by Daniel Steigerwald
License: MIT-style license. Copyright: Copyright (c) 2008 Daniel
Steigerwald, daniel.steigerwald.cz"

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Element.Style
  - Core/Element.Dimensions
  - /MooTools.More

provides: [Element.Measure]

...
*/

(function(){

var getStylesList = function(styles, planes){
	var list = [];
	Object.each(planes, function(directions){
		Object.each(directions, function(edge){
			styles.each(function(style){
				list.push(style + '-' + edge + (style == 'border' ?
'-width' : ''));
			});
		});
	});
	return list;
};

var calculateEdgeSize = function(edge, styles){
	var total = 0;
	Object.each(styles, function(value, style){
		if (style.test(edge)) total = total + value.toInt();
	});
	return total;
};

var isVisible = function(el){
	return !!(!el || el.offsetHeight || el.offsetWidth);
};


Element.implement({

	measure: function(fn){
		if (isVisible(this)) return fn.call(this);
		var parent = this.getParent(),
			toMeasure = [];
		while (!isVisible(parent) && parent != document.body){
			toMeasure.push(parent.expose());
			parent = parent.getParent();
		}
		var restore = this.expose(),
			result = fn.call(this);
		restore();
		toMeasure.each(function(restore){
			restore();
		});
		return result;
	},

	expose: function(){
		if (this.getStyle('display') != 'none') return
function(){};
		var before = this.style.cssText;
		this.setStyles({
			display: 'block',
			position: 'absolute',
			visibility: 'hidden'
		});
		return function(){
			this.style.cssText = before;
		}.bind(this);
	},

	getDimensions: function(options){
		options = Object.merge({computeSize: false}, options);
		var dim = {x: 0, y: 0};

		var getSize = function(el, options){
			return (options.computeSize) ? el.getComputedSize(options) :
el.getSize();
		};

		var parent = this.getParent('body');

		if (parent && this.getStyle('display') ==
'none'){
			dim = this.measure(function(){
				return getSize(this, options);
			});
		} else if (parent){
			try { //safari sometimes crashes here, so catch it
				dim = getSize(this, options);
			}catch(e){}
		}

		return Object.append(dim, (dim.x || dim.x === 0) ? {
				width: dim.x,
				height: dim.y
			} : {
				x: dim.width,
				y: dim.height
			}
		);
	},

	getComputedSize: function(options){
		

		options = Object.merge({
			styles: ['padding','border'],
			planes: {
				height: ['top','bottom'],
				width: ['left','right']
			},
			mode: 'both'
		}, options);

		var styles = {},
			size = {width: 0, height: 0},
			dimensions;

		if (options.mode == 'vertical'){
			delete size.width;
			delete options.planes.width;
		} else if (options.mode == 'horizontal'){
			delete size.height;
			delete options.planes.height;
		}

		getStylesList(options.styles, options.planes).each(function(style){
			styles[style] = this.getStyle(style).toInt();
		}, this);

		Object.each(options.planes, function(edges, plane){

			var capitalized = plane.capitalize(),
				style = this.getStyle(plane);

			if (style == 'auto' && !dimensions) dimensions =
this.getDimensions();

			style = styles[plane] = (style == 'auto') ? dimensions[plane]
: style.toInt();
			size['total' + capitalized] = style;

			edges.each(function(edge){
				var edgesize = calculateEdgeSize(edge, styles);
				size['computed' + edge.capitalize()] = edgesize;
				size['total' + capitalized] += edgesize;
			});

		}, this);

		return Object.append(size, styles);
	}

});

})();


/*
---

script: Element.Pin.js

name: Element.Pin

description: Extends the Element native object to include the pin method
useful for fixed positioning for elements.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Element.Event
  - Core/Element.Dimensions
  - Core/Element.Style
  - /MooTools.More

provides: [Element.Pin]

...
*/

(function(){
	var supportsPositionFixed = false,
		supportTested = false;

	var testPositionFixed = function(){
		var test = new Element('div').setStyles({
			position: 'fixed',
			top: 0,
			right: 0
		}).inject(document.body);
		supportsPositionFixed = (test.offsetTop === 0);
		test.dispose();
		supportTested = true;
	};

	Element.implement({

		pin: function(enable, forceScroll){
			if (!supportTested) testPositionFixed();
			if (this.getStyle('display') == 'none') return this;

			var pinnedPosition,
				scroll = window.getScroll(),
				parent,
				scrollFixer;

			if (enable !== false){
				pinnedPosition = this.getPosition(supportsPositionFixed ? document.body
: this.getOffsetParent());
				if (!this.retrieve('pin:_pinned')){
					var currentPosition = {
						top: pinnedPosition.y - scroll.y,
						left: pinnedPosition.x - scroll.x
					};

					if (supportsPositionFixed && !forceScroll){
						this.setStyle('position',
'fixed').setStyles(currentPosition);
					} else {

						parent = this.getOffsetParent();
						var position = this.getPosition(parent),
							styles = this.getStyles('left', 'top');

						if (parent && styles.left == 'auto' || styles.top
== 'auto') this.setPosition(position);
						if (this.getStyle('position') == 'static')
this.setStyle('position', 'absolute');

						position = {
							x: styles.left.toInt() - scroll.x,
							y: styles.top.toInt() - scroll.y
						};

						scrollFixer = function(){
							if (!this.retrieve('pin:_pinned')) return;
							var scroll = window.getScroll();
							this.setStyles({
								left: position.x + scroll.x,
								top: position.y + scroll.y
							});
						}.bind(this);

						this.store('pin:_scrollFixer', scrollFixer);
						window.addEvent('scroll', scrollFixer);
					}
					this.store('pin:_pinned', true);
				}

			} else {
				if (!this.retrieve('pin:_pinned')) return this;

				parent = this.getParent();
				var offsetParent = (parent.getComputedStyle('position') !=
'static' ? parent : parent.getOffsetParent());

				pinnedPosition = this.getPosition(offsetParent);

				this.store('pin:_pinned', false);
				scrollFixer = this.retrieve('pin:_scrollFixer');
				if (!scrollFixer){
					this.setStyles({
						position: 'absolute',
						top: pinnedPosition.y + scroll.y,
						left: pinnedPosition.x + scroll.x
					});
				} else {
					this.store('pin:_scrollFixer', null);
					window.removeEvent('scroll', scrollFixer);
				}
				this.removeClass('isPinned');
			}
			return this;
		},

		unpin: function(){
			return this.pin(false);
		},

		togglePin: function(){
			return this.pin(!this.retrieve('pin:_pinned'));
		}

	});



})();


/*
---

script: Element.Position.js

name: Element.Position

description: Extends the Element native object to include methods useful
positioning elements relative to others.

license: MIT-style license

authors:
  - Aaron Newton
  - Jacob Thornton

requires:
  - Core/Options
  - Core/Element.Dimensions
  - Element.Measure

provides: [Element.Position]

...
*/

(function(original){

var local = Element.Position = {

	options: {/*
		edge: false,
		returnPos: false,
		minimum: {x: 0, y: 0},
		maximum: {x: 0, y: 0},
		relFixedPosition: false,
		ignoreMargins: false,
		ignoreScroll: false,
		allowNegative: false,*/
		relativeTo: document.body,
		position: {
			x: 'center', //left, center, right
			y: 'center' //top, center, bottom
		},
		offset: {x: 0, y: 0}
	},

	getOptions: function(element, options){
		options = Object.merge({}, local.options, options);
		local.setPositionOption(options);
		local.setEdgeOption(options);
		local.setOffsetOption(element, options);
		local.setDimensionsOption(element, options);
		return options;
	},

	setPositionOption: function(options){
		options.position = local.getCoordinateFromValue(options.position);
	},

	setEdgeOption: function(options){
		var edgeOption = local.getCoordinateFromValue(options.edge);
		options.edge = edgeOption ? edgeOption :
			(options.position.x == 'center' && options.position.y
== 'center') ? {x: 'center', y: 'center'} :
			{x: 'left', y: 'top'};
	},

	setOffsetOption: function(element, options){
		var parentOffset = {x: 0, y: 0},
			offsetParent = element.measure(function(){
				return document.id(this.getOffsetParent());
			}),
			parentScroll = offsetParent.getScroll();

		if (!offsetParent || offsetParent == element.getDocument().body) return;
		parentOffset = offsetParent.measure(function(){
			var position = this.getPosition();
			if (this.getStyle('position') == 'fixed'){
				var scroll = window.getScroll();
				position.x += scroll.x;
				position.y += scroll.y;
			}
			return position;
		});

		options.offset = {
			parentPositioned: offsetParent != document.id(options.relativeTo),
			x: options.offset.x - parentOffset.x + parentScroll.x,
			y: options.offset.y - parentOffset.y + parentScroll.y
		};
	},

	setDimensionsOption: function(element, options){
		options.dimensions = element.getDimensions({
			computeSize: true,
			styles: ['padding', 'border', 'margin']
		});
	},

	getPosition: function(element, options){
		var position = {};
		options = local.getOptions(element, options);
		var relativeTo = document.id(options.relativeTo) || document.body;

		local.setPositionCoordinates(options, position, relativeTo);
		if (options.edge) local.toEdge(position, options);

		var offset = options.offset;
		position.left = ((position.x >= 0 || offset.parentPositioned ||
options.allowNegative) ? position.x : 0).toInt();
		position.top = ((position.y >= 0 || offset.parentPositioned ||
options.allowNegative) ? position.y : 0).toInt();

		local.toMinMax(position, options);

		if (options.relFixedPosition || relativeTo.getStyle('position')
== 'fixed') local.toRelFixedPosition(relativeTo, position);
		if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position);
		if (options.ignoreMargins) local.toIgnoreMargins(position, options);

		position.left = Math.ceil(position.left);
		position.top = Math.ceil(position.top);
		delete position.x;
		delete position.y;

		return position;
	},

	setPositionCoordinates: function(options, position, relativeTo){
		var offsetY = options.offset.y,
			offsetX = options.offset.x,
			calc = (relativeTo == document.body) ? window.getScroll() :
relativeTo.getPosition(),
			top = calc.y,
			left = calc.x,
			winSize = window.getSize();

		switch(options.position.x){
			case 'left': position.x = left + offsetX; break;
			case 'right': position.x = left + offsetX +
relativeTo.offsetWidth; break;
			default: position.x = left + ((relativeTo == document.body ? winSize.x :
relativeTo.offsetWidth) / 2) + offsetX; break;
		}

		switch(options.position.y){
			case 'top': position.y = top + offsetY; break;
			case 'bottom': position.y = top + offsetY +
relativeTo.offsetHeight; break;
			default: position.y = top + ((relativeTo == document.body ? winSize.y :
relativeTo.offsetHeight) / 2) + offsetY; break;
		}
	},

	toMinMax: function(position, options){
		var xy = {left: 'x', top: 'y'}, value;
		['minimum', 'maximum'].each(function(minmax){
			['left', 'top'].each(function(lr){
				value = options[minmax] ? options[minmax][xy[lr]] : null;
				if (value != null && ((minmax == 'minimum') ?
position[lr] < value : position[lr] > value)) position[lr] = value;
			});
		});
	},

	toRelFixedPosition: function(relativeTo, position){
		var winScroll = window.getScroll();
		position.top += winScroll.y;
		position.left += winScroll.x;
	},

	toIgnoreScroll: function(relativeTo, position){
		var relScroll = relativeTo.getScroll();
		position.top -= relScroll.y;
		position.left -= relScroll.x;
	},

	toIgnoreMargins: function(position, options){
		position.left += options.edge.x == 'right'
			? options.dimensions['margin-right']
			: (options.edge.x != 'center'
				? -options.dimensions['margin-left']
				: -options.dimensions['margin-left'] +
((options.dimensions['margin-right'] +
options.dimensions['margin-left']) / 2));

		position.top += options.edge.y == 'bottom'
			? options.dimensions['margin-bottom']
			: (options.edge.y != 'center'
				? -options.dimensions['margin-top']
				: -options.dimensions['margin-top'] +
((options.dimensions['margin-bottom'] +
options.dimensions['margin-top']) / 2));
	},

	toEdge: function(position, options){
		var edgeOffset = {},
			dimensions = options.dimensions,
			edge = options.edge;

		switch(edge.x){
			case 'left': edgeOffset.x = 0; break;
			case 'right': edgeOffset.x = -dimensions.x -
dimensions.computedRight - dimensions.computedLeft; break;
			// center
			default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break;
		}

		switch(edge.y){
			case 'top': edgeOffset.y = 0; break;
			case 'bottom': edgeOffset.y = -dimensions.y -
dimensions.computedTop - dimensions.computedBottom; break;
			// center
			default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2));
break;
		}

		position.x += edgeOffset.x;
		position.y += edgeOffset.y;
	},

	getCoordinateFromValue: function(option){
		if (typeOf(option) != 'string') return option;
		option = option.toLowerCase();

		return {
			x: option.test('left') ? 'left'
				: (option.test('right') ? 'right' :
'center'),
			y: option.test(/upper|top/) ? 'top'
				: (option.test('bottom') ? 'bottom' :
'center')
		};
	}

};

Element.implement({

	position: function(options){
		if (options && (options.x != null || options.y != null)){
			return (original ? original.apply(this, arguments) : this);
		}
		var position = this.setStyle('position',
'absolute').calculatePosition(options);
		return (options && options.returnPos) ? position :
this.setStyles(position);
	},

	calculatePosition: function(options){
		return local.getPosition(this, options);
	}

});

})(Element.prototype.position);


/*
---

script: Element.Shortcuts.js

name: Element.Shortcuts

description: Extends the Element native object to include some shortcut
methods.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Element.Style
  - /MooTools.More

provides: [Element.Shortcuts]

...
*/

Element.implement({

	isDisplayed: function(){
		return this.getStyle('display') != 'none';
	},

	isVisible: function(){
		var w = this.offsetWidth,
			h = this.offsetHeight;
		return (w == 0 && h == 0) ? false : (w > 0 && h >
0) ? true : this.style.display != 'none';
	},

	toggle: function(){
		return this[this.isDisplayed() ? 'hide' : 'show']();
	},

	hide: function(){
		var d;
		try {
			//IE fails here if the element is not in the dom
			d = this.getStyle('display');
		} catch(e){}
		if (d == 'none') return this;
		return this.store('element:_originalDisplay', d ||
'').setStyle('display', 'none');
	},

	show: function(display){
		if (!display && this.isDisplayed()) return this;
		display = display || this.retrieve('element:_originalDisplay')
|| 'block';
		return this.setStyle('display', (display == 'none') ?
'block' : display);
	},

	swapClass: function(remove, add){
		return this.removeClass(remove).addClass(add);
	}

});

Document.implement({

	clearSelection: function(){
		if (window.getSelection){
			var selection = window.getSelection();
			if (selection && selection.removeAllRanges)
selection.removeAllRanges();
		} else if (document.selection && document.selection.empty){
			try {
				//IE fails here if selected element is not in dom
				document.selection.empty();
			} catch(e){}
		}
	}

});


/*
---

script: IframeShim.js

name: IframeShim

description: Defines IframeShim, a class for obscuring select lists and
flash objects in IE.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Element.Event
  - Core/Element.Style
  - Core/Options
  - Core/Events
  - /Element.Position
  - /Class.Occlude

provides: [IframeShim]

...
*/

var IframeShim = new Class({

	Implements: [Options, Events, Class.Occlude],

	options: {
		className: 'iframeShim',
		src: 'javascript:false;document.write("");',
		display: false,
		zIndex: null,
		margin: 0,
		offset: {x: 0, y: 0},
		browsers: (Browser.ie6 || (Browser.firefox && Browser.version
< 3 && Browser.Platform.mac))
	},

	property: 'IframeShim',

	initialize: function(element, options){
		this.element = document.id(element);
		if (this.occlude()) return this.occluded;
		this.setOptions(options);
		this.makeShim();
		return this;
	},

	makeShim: function(){
		if (this.options.browsers){
			var zIndex = this.element.getStyle('zIndex').toInt();

			if (!zIndex){
				zIndex = 1;
				var pos = this.element.getStyle('position');
				if (pos == 'static' || !pos)
this.element.setStyle('position', 'relative');
				this.element.setStyle('zIndex', zIndex);
			}
			zIndex = ((this.options.zIndex != null || this.options.zIndex === 0)
&& zIndex > this.options.zIndex) ? this.options.zIndex : zIndex
- 1;
			if (zIndex < 0) zIndex = 1;
			this.shim = new Element('iframe', {
				src: this.options.src,
				scrolling: 'no',
				frameborder: 0,
				styles: {
					zIndex: zIndex,
					position: 'absolute',
					border: 'none',
					filter:
'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'
				},
				'class': this.options.className
			}).store('IframeShim', this);
			var inject = (function(){
				this.shim.inject(this.element, 'after');
				this[this.options.display ? 'show' : 'hide']();
				this.fireEvent('inject');
			}).bind(this);
			if (!IframeShim.ready) window.addEvent('load', inject);
			else inject();
		} else {
			this.position = this.hide = this.show = this.dispose =
Function.from(this);
		}
	},

	position: function(){
		if (!IframeShim.ready || !this.shim) return this;
		var size = this.element.measure(function(){
			return this.getSize();
		});
		if (this.options.margin != undefined){
			size.x = size.x - (this.options.margin * 2);
			size.y = size.y - (this.options.margin * 2);
			this.options.offset.x += this.options.margin;
			this.options.offset.y += this.options.margin;
		}
		this.shim.set({width: size.x, height: size.y}).position({
			relativeTo: this.element,
			offset: this.options.offset
		});
		return this;
	},

	hide: function(){
		if (this.shim) this.shim.setStyle('display', 'none');
		return this;
	},

	show: function(){
		if (this.shim) this.shim.setStyle('display',
'block');
		return this.position();
	},

	dispose: function(){
		if (this.shim) this.shim.dispose();
		return this;
	},

	destroy: function(){
		if (this.shim) this.shim.destroy();
		return this;
	}

});

window.addEvent('load', function(){
	IframeShim.ready = true;
});


/*
---

script: Mask.js

name: Mask

description: Creates a mask element to cover another.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Options
  - Core/Events
  - Core/Element.Event
  - /Class.Binds
  - /Element.Position
  - /IframeShim

provides: [Mask]

...
*/

var Mask = new Class({

	Implements: [Options, Events],

	Binds: ['position'],

	options: {/*
		onShow: function(){},
		onHide: function(){},
		onDestroy: function(){},
		onClick: function(event){},
		inject: {
			where: 'after',
			target: null,
		},
		hideOnClick: false,
		id: null,
		destroyOnHide: false,*/
		style: {},
		'class': 'mask',
		maskMargins: false,
		useIframeShim: true,
		iframeShimOptions: {}
	},

	initialize: function(target, options){
		this.target = document.id(target) || document.id(document.body);
		this.target.store('mask', this);
		this.setOptions(options);
		this.render();
		this.inject();
	},

	render: function(){
		this.element = new Element('div', {
			'class': this.options['class'],
			id: this.options.id || 'mask-' + String.uniqueID(),
			styles: Object.merge({}, this.options.style, {
				display: 'none'
			}),
			events: {
				click: function(event){
					this.fireEvent('click', event);
					if (this.options.hideOnClick) this.hide();
				}.bind(this)
			}
		});

		this.hidden = true;
	},

	toElement: function(){
		return this.element;
	},

	inject: function(target, where){
		where = where || (this.options.inject ? this.options.inject.where :
'') || this.target == document.body ? 'inside' :
'after';
		target = target || (this.options.inject &&
this.options.inject.target) || this.target;

		this.element.inject(target, where);

		if (this.options.useIframeShim){
			this.shim = new IframeShim(this.element,
this.options.iframeShimOptions);

			this.addEvents({
				show: this.shim.show.bind(this.shim),
				hide: this.shim.hide.bind(this.shim),
				destroy: this.shim.destroy.bind(this.shim)
			});
		}
	},

	position: function(){
		this.resize(this.options.width, this.options.height);

		this.element.position({
			relativeTo: this.target,
			position: 'topLeft',
			ignoreMargins: !this.options.maskMargins,
			ignoreScroll: this.target == document.body
		});

		return this;
	},

	resize: function(x, y){
		var opt = {
			styles: ['padding', 'border']
		};
		if (this.options.maskMargins) opt.styles.push('margin');

		var dim = this.target.getComputedSize(opt);
		if (this.target == document.body){
			this.element.setStyles({width: 0, height: 0});
			var win = window.getScrollSize();
			if (dim.totalHeight < win.y) dim.totalHeight = win.y;
			if (dim.totalWidth < win.x) dim.totalWidth = win.x;
		}
		this.element.setStyles({
			width: Array.pick([x, dim.totalWidth, dim.x]),
			height: Array.pick([y, dim.totalHeight, dim.y])
		});

		return this;
	},

	show: function(){
		if (!this.hidden) return this;

		window.addEvent('resize', this.position);
		this.position();
		this.showMask.apply(this, arguments);

		return this;
	},

	showMask: function(){
		this.element.setStyle('display', 'block');
		this.hidden = false;
		this.fireEvent('show');
	},

	hide: function(){
		if (this.hidden) return this;

		window.removeEvent('resize', this.position);
		this.hideMask.apply(this, arguments);
		if (this.options.destroyOnHide) return this.destroy();

		return this;
	},

	hideMask: function(){
		this.element.setStyle('display', 'none');
		this.hidden = true;
		this.fireEvent('hide');
	},

	toggle: function(){
		this[this.hidden ? 'show' : 'hide']();
	},

	destroy: function(){
		this.hide();
		this.element.destroy();
		this.fireEvent('destroy');
		this.target.eliminate('mask');
	}

});

Element.Properties.mask = {

	set: function(options){
		var mask = this.retrieve('mask');
		if (mask) mask.destroy();
		return this.eliminate('mask').store('mask:options',
options);
	},

	get: function(){
		var mask = this.retrieve('mask');
		if (!mask){
			mask = new Mask(this, this.retrieve('mask:options'));
			this.store('mask', mask);
		}
		return mask;
	}

};

Element.implement({

	mask: function(options){
		if (options) this.set('mask', options);
		this.get('mask').show();
		return this;
	},

	unmask: function(){
		this.get('mask').hide();
		return this;
	}

});


/*
---

script: Spinner.js

name: Spinner

description: Adds a semi-transparent overlay over a dom element with a
spinnin ajax icon.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Fx.Tween
  - Core/Request
  - /Class.refactor
  - /Mask

provides: [Spinner]

...
*/

var Spinner = new Class({

	Extends: Mask,

	Implements: Chain,

	options: {/*
		message: false,*/
		'class': 'spinner',
		containerPosition: {},
		content: {
			'class': 'spinner-content'
		},
		messageContainer: {
			'class': 'spinner-msg'
		},
		img: {
			'class': 'spinner-img'
		},
		fxOptions: {
			link: 'chain'
		}
	},

	initialize: function(target, options){
		this.target = document.id(target) || document.id(document.body);
		this.target.store('spinner', this);
		this.setOptions(options);
		this.render();
		this.inject();

		// Add this to events for when noFx is true; parent methods handle
hide/show.
		var deactivate = function(){ this.active = false; }.bind(this);
		this.addEvents({
			hide: deactivate,
			show: deactivate
		});
	},

	render: function(){
		this.parent();

		this.element.set('id', this.options.id || 'spinner-'
+ String.uniqueID());

		this.content = document.id(this.options.content) || new
Element('div', this.options.content);
		this.content.inject(this.element);

		if (this.options.message){
			this.msg = document.id(this.options.message) || new
Element('p',
this.options.messageContainer).appendText(this.options.message);
			this.msg.inject(this.content);
		}

		if (this.options.img){
			this.img = document.id(this.options.img) || new Element('div',
this.options.img);
			this.img.inject(this.content);
		}

		this.element.set('tween', this.options.fxOptions);
	},

	show: function(noFx){
		if (this.active) return this.chain(this.show.bind(this));
		if (!this.hidden){
			this.callChain.delay(20, this);
			return this;
		}

		this.active = true;

		return this.parent(noFx);
	},

	showMask: function(noFx){
		var pos = function(){
			this.content.position(Object.merge({
				relativeTo: this.element
			}, this.options.containerPosition));
		}.bind(this);

		if (noFx){
			this.parent();
			pos();
		} else {
			if (!this.options.style.opacity) this.options.style.opacity =
this.element.getStyle('opacity').toFloat();
			this.element.setStyles({
				display: 'block',
				opacity: 0
			}).tween('opacity', this.options.style.opacity);
			pos();
			this.hidden = false;
			this.fireEvent('show');
			this.callChain();
		}
	},

	hide: function(noFx){
		if (this.active) return this.chain(this.hide.bind(this));
		if (this.hidden){
			this.callChain.delay(20, this);
			return this;
		}
		this.active = true;
		return this.parent(noFx);
	},

	hideMask: function(noFx){
		if (noFx) return this.parent();
		this.element.tween('opacity',
0).get('tween').chain(function(){
			this.element.setStyle('display', 'none');
			this.hidden = true;
			this.fireEvent('hide');
			this.callChain();
		}.bind(this));
	},

	destroy: function(){
		this.content.destroy();
		this.parent();
		this.target.eliminate('spinner');
	}

});

Request = Class.refactor(Request, {

	options: {
		useSpinner: false,
		spinnerOptions: {},
		spinnerTarget: false
	},

	initialize: function(options){
		this._send = this.send;
		this.send = function(options){
			var spinner = this.getSpinner();
			if (spinner) spinner.chain(this._send.pass(options, this)).show();
			else this._send(options);
			return this;
		};
		this.previous(options);
	},

	getSpinner: function(){
		if (!this.spinner){
			var update = document.id(this.options.spinnerTarget) ||
document.id(this.options.update);
			if (this.options.useSpinner && update){
				update.set('spinner', this.options.spinnerOptions);
				var spinner = this.spinner = update.get('spinner');
				['complete', 'exception',
'cancel'].each(function(event){
					this.addEvent(event, spinner.hide.bind(spinner));
				}, this);
			}
		}
		return this.spinner;
	}

});

Element.Properties.spinner = {

	set: function(options){
		var spinner = this.retrieve('spinner');
		if (spinner) spinner.destroy();
		return
this.eliminate('spinner').store('spinner:options',
options);
	},

	get: function(){
		var spinner = this.retrieve('spinner');
		if (!spinner){
			spinner = new Spinner(this, this.retrieve('spinner:options'));
			this.store('spinner', spinner);
		}
		return spinner;
	}

};

Element.implement({

	spin: function(options){
		if (options) this.set('spinner', options);
		this.get('spinner').show();
		return this;
	},

	unspin: function(){
		this.get('spinner').hide();
		return this;
	}

});


/*
---

script: Form.Request.js

name: Form.Request

description: Handles the basic functionality of submitting a form and
updating a dom element with the result.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Request.HTML
  - /Class.Binds
  - /Class.Occlude
  - /Spinner
  - /String.QueryString
  - /Element.Delegation

provides: [Form.Request]

...
*/

if (!window.Form) window.Form = {};

(function(){

	Form.Request = new Class({

		Binds: ['onSubmit', 'onFormValidate'],

		Implements: [Options, Events, Class.Occlude],

		options: {/*
			onFailure: function(){},
			onSuccess: function(){}, // aliased to onComplete,
			onSend: function(){}*/
			requestOptions: {
				evalScripts: true,
				useSpinner: true,
				emulation: false,
				link: 'ignore'
			},
			sendButtonClicked: true,
			extraData: {},
			resetForm: true
		},

		property: 'form.request',

		initialize: function(form, target, options){
			this.element = document.id(form);
			if (this.occlude()) return this.occluded;
			this.setOptions(options)
				.setTarget(target)
				.attach();
		},

		setTarget: function(target){
			this.target = document.id(target);
			if (!this.request){
				this.makeRequest();
			} else {
				this.request.setOptions({
					update: this.target
				});
			}
			return this;
		},

		toElement: function(){
			return this.element;
		},

		makeRequest: function(){
			var self = this;
			this.request = new Request.HTML(Object.merge({
					update: this.target,
					emulation: false,
					spinnerTarget: this.element,
					method: this.element.get('method') || 'post'
			}, this.options.requestOptions)).addEvents({
				success: function(tree, elements, html, javascript){
					['complete', 'success'].each(function(evt){
						self.fireEvent(evt, [self.target, tree, elements, html, javascript]);
					});
				},
				failure: function(){
					self.fireEvent('complete',
arguments).fireEvent('failure', arguments);
				},
				exception: function(){
					self.fireEvent('failure', arguments);
				}
			});
			return this.attachReset();
		},

		attachReset: function(){
			if (!this.options.resetForm) return this;
			this.request.addEvent('success', function(){
				Function.attempt(function(){
					this.element.reset();
				}.bind(this));
				if (window.OverText) OverText.update();
			}.bind(this));
			return this;
		},

		attach: function(attach){
			var method = (attach != false) ? 'addEvent' :
'removeEvent';
			this.element[method]('click:relay(button,
input[type=submit])', this.saveClickedButton.bind(this));

			var fv = this.element.retrieve('validator');
			if (fv) fv[method]('onFormValidate', this.onFormValidate);
			else this.element[method]('submit', this.onSubmit);

			return this;
		},

		detach: function(){
			return this.attach(false);
		},

		//public method
		enable: function(){
			return this.attach();
		},

		//public method
		disable: function(){
			return this.detach();
		},

		onFormValidate: function(valid, form, event){
			//if there's no event, then this wasn't a submit event
			if (!event) return;
			var fv = this.element.retrieve('validator');
			if (valid || (fv && !fv.options.stopOnFailure)){
				event.stop();
				this.send();
			}
		},

		onSubmit: function(event){
			var fv = this.element.retrieve('validator');
			if (fv){
				//form validator was created after Form.Request
				this.element.removeEvent('submit', this.onSubmit);
				fv.addEvent('onFormValidate', this.onFormValidate);
				this.element.validate();
				return;
			}
			if (event) event.stop();
			this.send();
		},

		saveClickedButton: function(event, target){
			var targetName = target.get('name');
			if (!targetName || !this.options.sendButtonClicked) return;
			this.options.extraData[targetName] = target.get('value') ||
true;
			this.clickedCleaner = function(){
				delete this.options.extraData[targetName];
				this.clickedCleaner = function(){};
			}.bind(this);
		},

		clickedCleaner: function(){},

		send: function(){
			var str = this.element.toQueryString().trim(),
				data = Object.toQueryString(this.options.extraData);

			if (str) str += "&" + data;
			else str = data;

			this.fireEvent('send', [this.element,
str.parseQueryString()]);
			this.request.send({
				data: str,
				url: this.options.requestOptions.url ||
this.element.get('action')
			});
			this.clickedCleaner();
			return this;
		}

	});

	Element.implement('formUpdate', function(update, options){
		var fq = this.retrieve('form.request');
		if (!fq){
			fq = new Form.Request(this, update, options);
		} else {
			if (update) fq.setTarget(update);
			if (options) fq.setOptions(options).makeRequest();
		}
		fq.send();
		return this;
	});

})();


/*
---

script: Fx.Reveal.js

name: Fx.Reveal

description: Defines Fx.Reveal, a class that shows and hides elements with
a transition.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Fx.Morph
  - /Element.Shortcuts
  - /Element.Measure

provides: [Fx.Reveal]

...
*/

(function(){


var hideTheseOf = function(object){
	var hideThese = object.options.hideInputs;
	if (window.OverText){
		var otClasses = [null];
		OverText.each(function(ot){
			otClasses.include('.' + ot.options.labelClass);
		});
		if (otClasses) hideThese += otClasses.join(', ');
	}
	return (hideThese) ? object.element.getElements(hideThese) : null;
};


Fx.Reveal = new Class({

	Extends: Fx.Morph,

	options: {/*
		onShow: function(thisElement){},
		onHide: function(thisElement){},
		onComplete: function(thisElement){},
		heightOverride: null,
		widthOverride: null,*/
		link: 'cancel',
		styles: ['padding', 'border', 'margin'],
		transitionOpacity: !Browser.ie6,
		mode: 'vertical',
		display: function(){
			return this.element.get('tag') != 'tr' ?
'block' : 'table-row';
		},
		opacity: 1,
		hideInputs: Browser.ie ? 'select, input, textarea, object,
embed' : null
	},

	dissolve: function(){
		if (!this.hiding && !this.showing){
			if (this.element.getStyle('display') != 'none'){
				this.hiding = true;
				this.showing = false;
				this.hidden = true;
				this.cssText = this.element.style.cssText;

				var startStyles = this.element.getComputedSize({
					styles: this.options.styles,
					mode: this.options.mode
				});
				if (this.options.transitionOpacity) startStyles.opacity =
this.options.opacity;

				var zero = {};
				Object.each(startStyles, function(style, name){
					zero[name] = [style, 0];
				});

				this.element.setStyles({
					display: Function.from(this.options.display).call(this),
					overflow: 'hidden'
				});

				var hideThese = hideTheseOf(this);
				if (hideThese) hideThese.setStyle('visibility',
'hidden');

				this.$chain.unshift(function(){
					if (this.hidden){
						this.hiding = false;
						this.element.style.cssText = this.cssText;
						this.element.setStyle('display', 'none');
						if (hideThese) hideThese.setStyle('visibility',
'visible');
					}
					this.fireEvent('hide', this.element);
					this.callChain();
				}.bind(this));

				this.start(zero);
			} else {
				this.callChain.delay(10, this);
				this.fireEvent('complete', this.element);
				this.fireEvent('hide', this.element);
			}
		} else if (this.options.link == 'chain'){
			this.chain(this.dissolve.bind(this));
		} else if (this.options.link == 'cancel' &&
!this.hiding){
			this.cancel();
			this.dissolve();
		}
		return this;
	},

	reveal: function(){
		if (!this.showing && !this.hiding){
			if (this.element.getStyle('display') == 'none'){
				this.hiding = false;
				this.showing = true;
				this.hidden = false;
				this.cssText = this.element.style.cssText;

				var startStyles;
				this.element.measure(function(){
					startStyles = this.element.getComputedSize({
						styles: this.options.styles,
						mode: this.options.mode
					});
				}.bind(this));
				if (this.options.heightOverride != null) startStyles.height =
this.options.heightOverride.toInt();
				if (this.options.widthOverride != null) startStyles.width =
this.options.widthOverride.toInt();
				if (this.options.transitionOpacity){
					this.element.setStyle('opacity', 0);
					startStyles.opacity = this.options.opacity;
				}

				var zero = {
					height: 0,
					display: Function.from(this.options.display).call(this)
				};
				Object.each(startStyles, function(style, name){
					zero[name] = 0;
				});
				zero.overflow = 'hidden';

				this.element.setStyles(zero);

				var hideThese = hideTheseOf(this);
				if (hideThese) hideThese.setStyle('visibility',
'hidden');

				this.$chain.unshift(function(){
					this.element.style.cssText = this.cssText;
					this.element.setStyle('display',
Function.from(this.options.display).call(this));
					if (!this.hidden) this.showing = false;
					if (hideThese) hideThese.setStyle('visibility',
'visible');
					this.callChain();
					this.fireEvent('show', this.element);
				}.bind(this));

				this.start(startStyles);
			} else {
				this.callChain();
				this.fireEvent('complete', this.element);
				this.fireEvent('show', this.element);
			}
		} else if (this.options.link == 'chain'){
			this.chain(this.reveal.bind(this));
		} else if (this.options.link == 'cancel' &&
!this.showing){
			this.cancel();
			this.reveal();
		}
		return this;
	},

	toggle: function(){
		if (this.element.getStyle('display') == 'none'){
			this.reveal();
		} else {
			this.dissolve();
		}
		return this;
	},

	cancel: function(){
		this.parent.apply(this, arguments);
		if (this.cssText != null) this.element.style.cssText = this.cssText;
		this.hiding = false;
		this.showing = false;
		return this;
	}

});

Element.Properties.reveal = {

	set: function(options){
		this.get('reveal').cancel().setOptions(options);
		return this;
	},

	get: function(){
		var reveal = this.retrieve('reveal');
		if (!reveal){
			reveal = new Fx.Reveal(this);
			this.store('reveal', reveal);
		}
		return reveal;
	}

};

Element.Properties.dissolve = Element.Properties.reveal;

Element.implement({

	reveal: function(options){
		this.get('reveal').setOptions(options).reveal();
		return this;
	},

	dissolve: function(options){
		this.get('reveal').setOptions(options).dissolve();
		return this;
	},

	nix: function(options){
		var params = Array.link(arguments, {destroy: Type.isBoolean, options:
Type.isObject});
		this.get('reveal').setOptions(options).dissolve().chain(function(){
			this[params.destroy ? 'destroy' : 'dispose']();
		}.bind(this));
		return this;
	},

	wink: function(){
		var params = Array.link(arguments, {duration: Type.isNumber, options:
Type.isObject});
		var reveal = this.get('reveal').setOptions(params.options);
		reveal.reveal().chain(function(){
			(function(){
				reveal.dissolve();
			}).delay(params.duration || 2000);
		});
	}

});

})();


/*
---

script: Form.Request.Append.js

name: Form.Request.Append

description: Handles the basic functionality of submitting a form and
updating a dom element with the result. The result is appended to the DOM
element instead of replacing its contents.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - /Form.Request
  - /Fx.Reveal
  - /Elements.from

provides: [Form.Request.Append]

...
*/

Form.Request.Append = new Class({

	Extends: Form.Request,

	options: {
		//onBeforeEffect: function(){},
		useReveal: true,
		revealOptions: {},
		inject: 'bottom'
	},

	makeRequest: function(){
		this.request = new Request.HTML(Object.merge({
				url: this.element.get('action'),
				method: this.element.get('method') || 'post',
				spinnerTarget: this.element
			}, this.options.requestOptions, {
				evalScripts: false
			})
		).addEvents({
			success: function(tree, elements, html, javascript){
				var container;
				var kids = Elements.from(html);
				if (kids.length == 1){
					container = kids[0];
				} else {
					 container = new Element('div', {
						styles: {
							display: 'none'
						}
					}).adopt(kids);
				}
				container.inject(this.target, this.options.inject);
				if (this.options.requestOptions.evalScripts) Browser.exec(javascript);
				this.fireEvent('beforeEffect', container);
				var finish = function(){
					this.fireEvent('success', [container, this.target, tree,
elements, html, javascript]);
				}.bind(this);
				if (this.options.useReveal){
					container.set('reveal',
this.options.revealOptions).get('reveal').chain(finish);
					container.reveal();
				} else {
					finish();
				}
			}.bind(this),
			failure: function(xhr){
				this.fireEvent('failure', xhr);
			}.bind(this)
		});
		this.attachReset();
	}

});


/*
---

name: Locale.en-US.Form.Validator

description: Form Validator messages for English.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - /Locale

provides: [Locale.en-US.Form.Validator]

...
*/

Locale.define('en-US', 'FormValidator', {

	required: 'This field is required.',
	length: 'Please enter {length} characters (you entered {elLength}
characters)',
	minLength: 'Please enter at least {minLength} characters (you entered
{length} characters).',
	maxLength: 'Please enter no more than {maxLength} characters (you
entered {length} characters).',
	integer: 'Please enter an integer in this field. Numbers with
decimals (e.g. 1.25) are not permitted.',
	numeric: 'Please enter only numeric values in this field (i.e.
"1" or "1.1" or "-1" or
"-1.1").',
	digits: 'Please use numbers and punctuation only in this field (for
example, a phone number with dashes or dots is permitted).',
	alpha: 'Please use only letters (a-z) within this field. No spaces or
other characters are allowed.',
	alphanum: 'Please use only letters (a-z) or numbers (0-9) in this
field. No spaces or other characters are allowed.',
	dateSuchAs: 'Please enter a valid date such as {date}',
	dateInFormatMDY: 'Please enter a valid date such as MM/DD/YYYY (i.e.
"12/31/1999")',
	email: 'Please enter a valid email address. For example
"fred@domain.com".',
	url: 'Please enter a valid URL such as http://www.example.com.',
	currencyDollar: 'Please enter a valid $ amount. For example $100.00
.',
	oneRequired: 'Please enter something for at least one of these
inputs.',
	errorPrefix: 'Error: ',
	warningPrefix: 'Warning: ',

	// Form.Validator.Extras
	noSpace: 'There can be no spaces in this input.',
	reqChkByNode: 'No items are selected.',
	requiredChk: 'This field is required.',
	reqChkByName: 'Please select a {label}.',
	match: 'This field needs to match the {matchName} field',
	startDate: 'the start date',
	endDate: 'the end date',
	currendDate: 'the current date',
	afterDate: 'The date should be the same or after {label}.',
	beforeDate: 'The date should be the same or before {label}.',
	startMonth: 'Please select a start month',
	sameMonth: 'These two dates must be in the same month - you must
change one or the other.',
	creditcard: 'The credit card number entered is invalid. Please check
the number and try again. {length} digits entered.'

});


/*
---

script: Form.Validator.js

name: Form.Validator

description: A css-class based form validation system.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Options
  - Core/Events
  - Core/Slick.Finder
  - Core/Element.Event
  - Core/Element.Style
  - Core/JSON
  - /Locale
  - /Class.Binds
  - /Date
  - /Element.Forms
  - /Locale.en-US.Form.Validator
  - /Element.Shortcuts

provides: [Form.Validator, InputValidator, FormValidator.BaseValidators]

...
*/
if (!window.Form) window.Form = {};

var InputValidator = this.InputValidator = new Class({

	Implements: [Options],

	options: {
		errorMsg: 'Validation failed.',
		test: Function.from(true)
	},

	initialize: function(className, options){
		this.setOptions(options);
		this.className = className;
	},

	test: function(field, props){
		field = document.id(field);
		return (field) ? this.options.test(field, props || this.getProps(field))
: false;
	},

	getError: function(field, props){
		field = document.id(field);
		var err = this.options.errorMsg;
		if (typeOf(err) == 'function') err = err(field, props ||
this.getProps(field));
		return err;
	},

	getProps: function(field){
		field = document.id(field);
		return (field) ? field.get('validatorProps') : {};
	}

});

Element.Properties.validators = {

	get: function(){
		return (this.get('data-validators') ||
this.className).clean().split(' ');
	}

};

Element.Properties.validatorProps = {

	set: function(props){
		return
this.eliminate('$moo:validatorProps').store('$moo:validatorProps',
props);
	},

	get: function(props){
		if (props) this.set(props);
		if (this.retrieve('$moo:validatorProps')) return
this.retrieve('$moo:validatorProps');
		if (this.getProperty('data-validator-properties') ||
this.getProperty('validatorProps')){
			try {
				this.store('$moo:validatorProps',
JSON.decode(this.getProperty('validatorProps') ||
this.getProperty('data-validator-properties')));
			}catch(e){
				return {};
			}
		} else {
			var vals = this.get('validators').filter(function(cls){
				return cls.test(':');
			});
			if (!vals.length){
				this.store('$moo:validatorProps', {});
			} else {
				props = {};
				vals.each(function(cls){
					var split = cls.split(':');
					if (split[1]){
						try {
							props[split[0]] = JSON.decode(split[1]);
						} catch(e){}
					}
				});
				this.store('$moo:validatorProps', props);
			}
		}
		return this.retrieve('$moo:validatorProps');
	}

};

Form.Validator = new Class({

	Implements: [Options, Events],

	Binds: ['onSubmit'],

	options: {/*
		onFormValidate: function(isValid, form, event){},
		onElementValidate: function(isValid, field, className, warn){},
		onElementPass: function(field){},
		onElementFail: function(field, validatorsFailed){}, */
		fieldSelectors: 'input, select, textarea',
		ignoreHidden: true,
		ignoreDisabled: true,
		useTitles: false,
		evaluateOnSubmit: true,
		evaluateFieldsOnBlur: true,
		evaluateFieldsOnChange: true,
		serial: true,
		stopOnFailure: true,
		warningPrefix: function(){
			return Form.Validator.getMsg('warningPrefix') ||
'Warning: ';
		},
		errorPrefix: function(){
			return Form.Validator.getMsg('errorPrefix') || 'Error:
';
		}
	},

	initialize: function(form, options){
		this.setOptions(options);
		this.element = document.id(form);
		this.element.store('validator', this);
		this.warningPrefix = Function.from(this.options.warningPrefix)();
		this.errorPrefix = Function.from(this.options.errorPrefix)();
		if (this.options.evaluateOnSubmit)
this.element.addEvent('submit', this.onSubmit);
		if (this.options.evaluateFieldsOnBlur ||
this.options.evaluateFieldsOnChange) this.watchFields(this.getFields());
	},

	toElement: function(){
		return this.element;
	},

	getFields: function(){
		return (this.fields =
this.element.getElements(this.options.fieldSelectors));
	},

	watchFields: function(fields){
		fields.each(function(el){
			if (this.options.evaluateFieldsOnBlur)
				el.addEvent('blur', this.validationMonitor.pass([el, false],
this));
			if (this.options.evaluateFieldsOnChange)
				el.addEvent('change', this.validationMonitor.pass([el, true],
this));
		}, this);
	},

	validationMonitor: function(){
		clearTimeout(this.timer);
		this.timer = this.validateField.delay(50, this, arguments);
	},

	onSubmit: function(event){
		if (this.validate(event)) this.reset();
	},

	reset: function(){
		this.getFields().each(this.resetField, this);
		return this;
	},

	validate: function(event){
		var result = this.getFields().map(function(field){
			return this.validateField(field, true);
		}, this).every(function(v){
			return v;
		});
		this.fireEvent('formValidate', [result, this.element, event]);
		if (this.options.stopOnFailure && !result && event)
event.preventDefault();
		return result;
	},

	validateField: function(field, force){
		if (this.paused) return true;
		field = document.id(field);
		var passed = !field.hasClass('validation-failed');
		var failed, warned;
		if (this.options.serial && !force){
			failed = this.element.getElement('.validation-failed');
			warned = this.element.getElement('.warning');
		}
		if (field && (!failed || force ||
field.hasClass('validation-failed') || (failed &&
!this.options.serial))){
			var validationTypes = field.get('validators');
			var validators = validationTypes.some(function(cn){
				return this.getValidator(cn);
			}, this);
			var validatorsFailed = [];
			validationTypes.each(function(className){
				if (className && !this.test(className, field))
validatorsFailed.include(className);
			}, this);
			passed = validatorsFailed.length === 0;
			if (validators && !this.hasValidator(field,
'warnOnly')){
				if (passed){
					field.addClass('validation-passed').removeClass('validation-failed');
					this.fireEvent('elementPass', [field]);
				} else {
					field.addClass('validation-failed').removeClass('validation-passed');
					this.fireEvent('elementFail', [field, validatorsFailed]);
				}
			}
			if (!warned){
				var warnings = validationTypes.some(function(cn){
					if (cn.test('^warn'))
						return this.getValidator(cn.replace(/^warn-/,''));
					else return null;
				}, this);
				field.removeClass('warning');
				var warnResult = validationTypes.map(function(cn){
					if (cn.test('^warn'))
						return this.test(cn.replace(/^warn-/,''), field, true);
					else return null;
				}, this);
			}
		}
		return passed;
	},

	test: function(className, field, warn){
		field = document.id(field);
		if ((this.options.ignoreHidden && !field.isVisible()) ||
(this.options.ignoreDisabled && field.get('disabled')))
return true;
		var validator = this.getValidator(className);
		if (warn != null) warn = false;
		if (this.hasValidator(field, 'warnOnly')) warn = true;
		var isValid = this.hasValidator(field, 'ignoreValidation') ||
(validator ? validator.test(field) : true);
		if (validator && field.isVisible())
this.fireEvent('elementValidate', [isValid, field, className,
warn]);
		if (warn) return true;
		return isValid;
	},

	hasValidator: function(field, value){
		return field.get('validators').contains(value);
	},

	resetField: function(field){
		field = document.id(field);
		if (field){
			field.get('validators').each(function(className){
				if (className.test('^warn-')) className =
className.replace(/^warn-/, '');
				field.removeClass('validation-failed');
				field.removeClass('warning');
				field.removeClass('validation-passed');
			}, this);
		}
		return this;
	},

	stop: function(){
		this.paused = true;
		return this;
	},

	start: function(){
		this.paused = false;
		return this;
	},

	ignoreField: function(field, warn){
		field = document.id(field);
		if (field){
			this.enforceField(field);
			if (warn) field.addClass('warnOnly');
			else field.addClass('ignoreValidation');
		}
		return this;
	},

	enforceField: function(field){
		field = document.id(field);
		if (field)
field.removeClass('warnOnly').removeClass('ignoreValidation');
		return this;
	}

});

Form.Validator.getMsg = function(key){
	return Locale.get('FormValidator.' + key);
};

Form.Validator.adders = {

	validators:{},

	add : function(className, options){
		this.validators[className] = new InputValidator(className, options);
		//if this is a class (this method is used by instances of Form.Validator
and the Form.Validator namespace)
		//extend these validators into it
		//this allows validators to be global and/or per instance
		if (!this.initialize){
			this.implement({
				validators: this.validators
			});
		}
	},

	addAllThese : function(validators){
		Array.from(validators).each(function(validator){
			this.add(validator[0], validator[1]);
		}, this);
	},

	getValidator: function(className){
		return this.validators[className.split(':')[0]];
	}

};

Object.append(Form.Validator, Form.Validator.adders);

Form.Validator.implement(Form.Validator.adders);

Form.Validator.add('IsEmpty', {

	errorMsg: false,
	test: function(element){
		if (element.type == 'select-one' || element.type ==
'select')
			return !(element.selectedIndex >= 0 &&
element.options[element.selectedIndex].value != '');
		else
			return ((element.get('value') == null) ||
(element.get('value').length == 0));
	}

});

Form.Validator.addAllThese([

	['required', {
		errorMsg: function(){
			return Form.Validator.getMsg('required');
		},
		test: function(element){
			return !Form.Validator.getValidator('IsEmpty').test(element);
		}
	}],

	['length', {
		errorMsg: function(element, props){
			if (typeOf(props.length) != 'null')
				return Form.Validator.getMsg('length').substitute({length:
props.length, elLength: element.get('value').length});
			else return '';
		},
		test: function(element, props){
			if (typeOf(props.length) != 'null') return
(element.get('value').length == props.length ||
element.get('value').length == 0);
			else return true;
		}
	}],	

	['minLength', {
		errorMsg: function(element, props){
			if (typeOf(props.minLength) != 'null')
				return
Form.Validator.getMsg('minLength').substitute({minLength:
props.minLength, length: element.get('value').length});
			else return '';
		},
		test: function(element, props){
			if (typeOf(props.minLength) != 'null') return
(element.get('value').length >= (props.minLength || 0));
			else return true;
		}
	}],

	['maxLength', {
		errorMsg: function(element, props){
			//props is {maxLength:10}
			if (typeOf(props.maxLength) != 'null')
				return
Form.Validator.getMsg('maxLength').substitute({maxLength:
props.maxLength, length: element.get('value').length});
			else return '';
		},
		test: function(element, props){
			return element.get('value').length <= (props.maxLength ||
10000);
		}
	}],

	['validate-integer', {
		errorMsg: Form.Validator.getMsg.pass('integer'),
		test: function(element){
			return Form.Validator.getValidator('IsEmpty').test(element) ||
(/^(-?[1-9]\d*|0)$/).test(element.get('value'));
		}
	}],

	['validate-numeric', {
		errorMsg: Form.Validator.getMsg.pass('numeric'),
		test: function(element){
			return Form.Validator.getValidator('IsEmpty').test(element) ||
				(/^-?(?:0$0(?=\d*\.)|[1-9]|0)\d*(\.\d+)?$/).test(element.get('value'));
		}
	}],

	['validate-digits', {
		errorMsg: Form.Validator.getMsg.pass('digits'),
		test: function(element){
			return Form.Validator.getValidator('IsEmpty').test(element) ||
(/^[\d() .:\-\+#]+$/.test(element.get('value')));
		}
	}],

	['validate-alpha', {
		errorMsg: Form.Validator.getMsg.pass('alpha'),
		test: function(element){
			return Form.Validator.getValidator('IsEmpty').test(element) ||
(/^[a-zA-Z]+$/).test(element.get('value'));
		}
	}],

	['validate-alphanum', {
		errorMsg: Form.Validator.getMsg.pass('alphanum'),
		test: function(element){
			return Form.Validator.getValidator('IsEmpty').test(element) ||
!(/\W/).test(element.get('value'));
		}
	}],

	['validate-date', {
		errorMsg: function(element, props){
			if (Date.parse){
				var format = props.dateFormat || '%x';
				return Form.Validator.getMsg('dateSuchAs').substitute({date:
new Date().format(format)});
			} else {
				return Form.Validator.getMsg('dateInFormatMDY');
			}
		},
		test: function(element, props){
			if (Form.Validator.getValidator('IsEmpty').test(element))
return true;
			var dateLocale = Locale.getCurrent().sets.Date,
				dateNouns = new RegExp([dateLocale.days, dateLocale.days_abbr,
dateLocale.months, dateLocale.months_abbr].flatten().join('|'),
'i'),
				value = element.get('value'),
				wordsInValue = value.match(/[a-z]+/gi);

				if (wordsInValue && !wordsInValue.every(dateNouns.exec,
dateNouns)) return false;

				var date = Date.parse(value),
					format = props.dateFormat || '%x',
					formatted = date.format(format);

				if (formatted != 'invalid date')
element.set('value', formatted);
				return date.isValid();
		}
	}],

	['validate-email', {
		errorMsg: Form.Validator.getMsg.pass('email'),
		test: function(element){
			/*
			var chars = "[a-z0-9!#$%&'*+/=?^_`{|}~-]",
				local = '(?:' + chars + '\\.?){0,63}' + chars,

				label = '[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?',
				hostname = '(?:' + label + '\\.)*' + label;

				octet = '(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)',
				ipv4 = '\\[(?:' + octet + '\\.){3}' + octet +
'\\]',

				domain = '(?:' + hostname + '|' + ipv4 +
')';

			var regex = new RegExp('^' + local + '@' + domain +
'$', 'i');
			*/
			return Form.Validator.getValidator('IsEmpty').test(element) ||
(/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+\/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(element.get('value'));
		}
	}],

	['validate-url', {
		errorMsg: Form.Validator.getMsg.pass('url'),
		test: function(element){
			return Form.Validator.getValidator('IsEmpty').test(element) ||
(/^(https?|ftp|rmtp|mms):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i).test(element.get('value'));
		}
	}],

	['validate-currency-dollar', {
		errorMsg: Form.Validator.getMsg.pass('currencyDollar'),
		test: function(element){
			return Form.Validator.getValidator('IsEmpty').test(element) ||
(/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(element.get('value'));
		}
	}],

	['validate-one-required', {
		errorMsg: Form.Validator.getMsg.pass('oneRequired'),
		test: function(element, props){
			var p = document.id(props['validate-one-required']) ||
element.getParent(props['validate-one-required']);
			return p.getElements('input').some(function(el){
				if (['checkbox',
'radio'].contains(el.get('type'))) return
el.get('checked');
				return el.get('value');
			});
		}
	}]

]);

Element.Properties.validator = {

	set: function(options){
		this.get('validator').setOptions(options);
	},

	get: function(){
		var validator = this.retrieve('validator');
		if (!validator){
			validator = new Form.Validator(this);
			this.store('validator', validator);
		}
		return validator;
	}

};

Element.implement({

	validate: function(options){
		if (options) this.set('validator', options);
		return this.get('validator').validate();
	}

});







/*
---

script: Form.Validator.Inline.js

name: Form.Validator.Inline

description: Extends Form.Validator to add inline messages.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - /Form.Validator

provides: [Form.Validator.Inline]

...
*/

Form.Validator.Inline = new Class({

	Extends: Form.Validator,

	options: {
		showError: function(errorElement){
			if (errorElement.reveal) errorElement.reveal();
			else errorElement.setStyle('display', 'block');
		},
		hideError: function(errorElement){
			if (errorElement.dissolve) errorElement.dissolve();
			else errorElement.setStyle('display', 'none');
		},
		scrollToErrorsOnSubmit: true,
		scrollToErrorsOnBlur: false,
		scrollToErrorsOnChange: false,
		scrollFxOptions: {
			transition: 'quad:out',
			offset: {
				y: -20
			}
		}
	},

	initialize: function(form, options){
		this.parent(form, options);
		this.addEvent('onElementValidate', function(isValid, field,
className, warn){
			var validator = this.getValidator(className);
			if (!isValid && validator.getError(field)){
				if (warn) field.addClass('warning');
				var advice = this.makeAdvice(className, field,
validator.getError(field), warn);
				this.insertAdvice(advice, field);
				this.showAdvice(className, field);
			} else {
				this.hideAdvice(className, field);
			}
		});
	},

	makeAdvice: function(className, field, error, warn){
		var errorMsg = (warn) ? this.warningPrefix : this.errorPrefix;
			errorMsg += (this.options.useTitles) ? field.title || error:error;
		var cssClass = (warn) ? 'warning-advice' :
'validation-advice';
		var advice = this.getAdvice(className, field);
		if (advice){
			advice = advice.set('html', errorMsg);
		} else {
			advice = new Element('div', {
				html: errorMsg,
				styles: { display: 'none' },
				id: 'advice-' + className.split(':')[0] +
'-' + this.getFieldId(field)
			}).addClass(cssClass);
		}
		field.store('$moo:advice-' + className, advice);
		return advice;
	},

	getFieldId : function(field){
		return field.id ? field.id : field.id = 'input_' + field.name;
	},

	showAdvice: function(className, field){
		var advice = this.getAdvice(className, field);
		if (
			advice &&
			!field.retrieve('$moo:' + this.getPropName(className))
&&
			(
				advice.getStyle('display') == 'none' ||
				advice.getStyle('visiblity') == 'hidden' ||
				advice.getStyle('opacity') == 0
			)
		){
			field.store('$moo:' + this.getPropName(className), true);
			this.options.showError(advice);
			this.fireEvent('showAdvice', [field, advice, className]);
		}
	},

	hideAdvice: function(className, field){
		var advice = this.getAdvice(className, field);
		if (advice && field.retrieve('$moo:' +
this.getPropName(className))){
			field.store('$moo:' + this.getPropName(className), false);
			this.options.hideError(advice);
			this.fireEvent('hideAdvice', [field, advice, className]);
		}
	},

	getPropName: function(className){
		return 'advice' + className;
	},

	resetField: function(field){
		field = document.id(field);
		if (!field) return this;
		this.parent(field);
		field.get('validators').each(function(className){
			this.hideAdvice(className, field);
		}, this);
		return this;
	},

	getAllAdviceMessages: function(field, force){
		var advice = [];
		if (field.hasClass('ignoreValidation') && !force)
return advice;
		var validators = field.get('validators').some(function(cn){
			var warner = cn.test('^warn-') ||
field.hasClass('warnOnly');
			if (warner) cn = cn.replace(/^warn-/, '');
			var validator = this.getValidator(cn);
			if (!validator) return;
			advice.push({
				message: validator.getError(field),
				warnOnly: warner,
				passed: validator.test(),
				validator: validator
			});
		}, this);
		return advice;
	},

	getAdvice: function(className, field){
		return field.retrieve('$moo:advice-' + className);
	},

	insertAdvice: function(advice, field){
		//Check for error position prop
		var props = field.get('validatorProps');
		//Build advice
		if (!props.msgPos || !document.id(props.msgPos)){
			if (field.type && field.type.toLowerCase() == 'radio')
field.getParent().adopt(advice);
			else advice.inject(document.id(field), 'after');
		} else {
			document.id(props.msgPos).grab(advice);
		}
	},

	validateField: function(field, force, scroll){
		var result = this.parent(field, force);
		if (((this.options.scrollToErrorsOnSubmit && scroll == null) ||
scroll) && !result){
			var failed =
document.id(this).getElement('.validation-failed');
			var par = document.id(this).getParent();
			while (par != document.body && par.getScrollSize().y ==
par.getSize().y){
				par = par.getParent();
			}
			var fx = par.retrieve('$moo:fvScroller');
			if (!fx && window.Fx && Fx.Scroll){
				fx = new Fx.Scroll(par, this.options.scrollFxOptions);
				par.store('$moo:fvScroller', fx);
			}
			if (failed){
				if (fx) fx.toElement(failed);
				else par.scrollTo(par.getScroll().x, failed.getPosition(par).y - 20);
			}
		}
		return result;
	},

	watchFields: function(fields){
		fields.each(function(el){
		if (this.options.evaluateFieldsOnBlur){
			el.addEvent('blur', this.validationMonitor.pass([el, false,
this.options.scrollToErrorsOnBlur], this));
		}
		if (this.options.evaluateFieldsOnChange){
				el.addEvent('change', this.validationMonitor.pass([el, true,
this.options.scrollToErrorsOnChange], this));
			}
		}, this);
	}

});


/*
---

script: Form.Validator.Extras.js

name: Form.Validator.Extras

description: Additional validators for the Form.Validator class.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - /Form.Validator

provides: [Form.Validator.Extras]

...
*/
Form.Validator.addAllThese([

	['validate-enforce-oncheck', {
		test: function(element, props){
			var fv =
element.getParent('form').retrieve('validator');
			if (!fv) return true;
			(props.toEnforce ||
document.id(props.enforceChildrenOf).getElements('input, select,
textarea')).map(function(item){
				if (element.checked){
					fv.enforceField(item);
				} else {
					fv.ignoreField(item);
					fv.resetField(item);
				}
			});
			return true;
		}
	}],

	['validate-ignore-oncheck', {
		test: function(element, props){
			var fv =
element.getParent('form').retrieve('validator');
			if (!fv) return true;
			(props.toIgnore ||
document.id(props.ignoreChildrenOf).getElements('input, select,
textarea')).each(function(item){
				if (element.checked){
					fv.ignoreField(item);
					fv.resetField(item);
				} else {
					fv.enforceField(item);
				}
			});
			return true;
		}
	}],

	['validate-nospace', {
		errorMsg: function(){
			return Form.Validator.getMsg('noSpace');
		},
		test: function(element, props){
			return !element.get('value').test(/\s/);
		}
	}],

	['validate-toggle-oncheck', {
		test: function(element, props){
			var fv =
element.getParent('form').retrieve('validator');
			if (!fv) return true;
			var eleArr = props.toToggle ||
document.id(props.toToggleChildrenOf).getElements('input, select,
textarea');
			if (!element.checked){
				eleArr.each(function(item){
					fv.ignoreField(item);
					fv.resetField(item);
				});
			} else {
				eleArr.each(function(item){
					fv.enforceField(item);
				});
			}
			return true;
		}
	}],

	['validate-reqchk-bynode', {
		errorMsg: function(){
			return Form.Validator.getMsg('reqChkByNode');
		},
		test: function(element, props){
			return (document.id(props.nodeId).getElements(props.selector ||
'input[type=checkbox], input[type=radio]')).some(function(item){
				return item.checked;
			});
		}
	}],

	['validate-required-check', {
		errorMsg: function(element, props){
			return props.useTitle ? element.get('title') :
Form.Validator.getMsg('requiredChk');
		},
		test: function(element, props){
			return !!element.checked;
		}
	}],

	['validate-reqchk-byname', {
		errorMsg: function(element, props){
			return
Form.Validator.getMsg('reqChkByName').substitute({label:
props.label || element.get('type')});
		},
		test: function(element, props){
			var grpName = props.groupName || element.get('name');
			var oneCheckedItem =
$$(document.getElementsByName(grpName)).some(function(item, index){
				return item.checked;
			});
			var fv =
element.getParent('form').retrieve('validator');
			if (oneCheckedItem && fv) fv.resetField(element);
			return oneCheckedItem;
		}
	}],

	['validate-match', {
		errorMsg: function(element, props){
			return Form.Validator.getMsg('match').substitute({matchName:
props.matchName || document.id(props.matchInput).get('name')});
		},
		test: function(element, props){
			var eleVal = element.get('value');
			var matchVal = document.id(props.matchInput) &&
document.id(props.matchInput).get('value');
			return eleVal && matchVal ? eleVal == matchVal : true;
		}
	}],

	['validate-after-date', {
		errorMsg: function(element, props){
			return Form.Validator.getMsg('afterDate').substitute({
				label: props.afterLabel || (props.afterElement ?
Form.Validator.getMsg('startDate') :
Form.Validator.getMsg('currentDate'))
			});
		},
		test: function(element, props){
			var start = document.id(props.afterElement) ?
Date.parse(document.id(props.afterElement).get('value')) : new
Date();
			var end = Date.parse(element.get('value'));
			return end && start ? end >= start : true;
		}
	}],

	['validate-before-date', {
		errorMsg: function(element, props){
			return Form.Validator.getMsg('beforeDate').substitute({
				label: props.beforeLabel || (props.beforeElement ?
Form.Validator.getMsg('endDate') :
Form.Validator.getMsg('currentDate'))
			});
		},
		test: function(element, props){
			var start = Date.parse(element.get('value'));
			var end = document.id(props.beforeElement) ?
Date.parse(document.id(props.beforeElement).get('value')) : new
Date();
			return end && start ? end >= start : true;
		}
	}],

	['validate-custom-required', {
		errorMsg: function(){
			return Form.Validator.getMsg('required');
		},
		test: function(element, props){
			return element.get('value') != props.emptyValue;
		}
	}],

	['validate-same-month', {
		errorMsg: function(element, props){
			var startMo = document.id(props.sameMonthAs) &&
document.id(props.sameMonthAs).get('value');
			var eleVal = element.get('value');
			if (eleVal != '') return Form.Validator.getMsg(startMo ?
'sameMonth' : 'startMonth');
		},
		test: function(element, props){
			var d1 = Date.parse(element.get('value'));
			var d2 = Date.parse(document.id(props.sameMonthAs) &&
document.id(props.sameMonthAs).get('value'));
			return d1 && d2 ? d1.format('%B') ==
d2.format('%B') : true;
		}
	}],


	['validate-cc-num', {
		errorMsg: function(element){
			var ccNum = element.get('value').replace(/[^0-9]/g,
'');
			return Form.Validator.getMsg('creditcard').substitute({length:
ccNum.length});
		},
		test: function(element){
			// required is a different test
			if (Form.Validator.getValidator('IsEmpty').test(element))
return true;

			// Clean number value
			var ccNum = element.get('value');
			ccNum = ccNum.replace(/[^0-9]/g, '');

			var valid_type = false;

			if (ccNum.test(/^4[0-9]{12}([0-9]{3})?$/)) valid_type =
'Visa';
			else if (ccNum.test(/^5[1-5]([0-9]{14})$/)) valid_type = 'Master
Card';
			else if (ccNum.test(/^3[47][0-9]{13}$/)) valid_type = 'American
Express';
			else if (ccNum.test(/^6011[0-9]{12}$/)) valid_type =
'Discover';

			if (valid_type){
				var sum = 0;
				var cur = 0;

				for (var i=ccNum.length-1; i>=0; --i){
					cur = ccNum.charAt(i).toInt();
					if (cur == 0) continue;

					if ((ccNum.length-i) % 2 == 0) cur += cur;
					if (cur > 9){
						cur = cur.toString().charAt(0).toInt() +
cur.toString().charAt(1).toInt();
					}

					sum += cur;
				}
				if ((sum % 10) == 0) return true;
			}

			var chunks = '';
			while (ccNum != ''){
				chunks += ' ' + ccNum.substr(0,4);
				ccNum = ccNum.substr(4);
			}

			element.getParent('form').retrieve('validator').ignoreField(element);
			element.set('value', chunks.clean());
			element.getParent('form').retrieve('validator').enforceField(element);
			return false;
		}
	}]


]);


/*
---

script: OverText.js

name: OverText

description: Shows text over an input that disappears when the user clicks
into it. The text remains hidden if the user adds a value.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Options
  - Core/Events
  - Core/Element.Event
  - Class.Binds
  - Class.Occlude
  - Element.Position
  - Element.Shortcuts

provides: [OverText]

...
*/

var OverText = new Class({

	Implements: [Options, Events, Class.Occlude],

	Binds: ['reposition', 'assert', 'focus',
'hide'],

	options: {/*
		textOverride: null,
		onFocus: function(){},
		onTextHide: function(textEl, inputEl){},
		onTextShow: function(textEl, inputEl){}, */
		element: 'label',
		labelClass: 'overTxtLabel',
		positionOptions: {
			position: 'upperLeft',
			edge: 'upperLeft',
			offset: {
				x: 4,
				y: 2
			}
		},
		poll: false,
		pollInterval: 250,
		wrap: false
	},

	property: 'OverText',

	initialize: function(element, options){
		element = this.element = document.id(element);

		if (this.occlude()) return this.occluded;
		this.setOptions(options);

		this.attach(element);
		OverText.instances.push(this);

		if (this.options.poll) this.poll();
	},

	toElement: function(){
		return this.element;
	},

	attach: function(){
		var element = this.element,
			options = this.options,
			value = options.textOverride || element.get('alt') ||
element.get('title');

		if (!value) return this;

		var text = this.text = new Element(options.element, {
			'class': options.labelClass,
			styles: {
				lineHeight: 'normal',
				position: 'absolute',
				cursor: 'text'
			},
			html: value,
			events: {
				click: this.hide.pass(options.element == 'label', this)
			}
		}).inject(element, 'after');

		if (options.element == 'label'){
			if (!element.get('id')) element.set('id',
'input_' + String.uniqueID());
			text.set('for', element.get('id'));
		}

		if (options.wrap){
			this.textHolder = new Element('div.overTxtWrapper', {
				styles: {
					lineHeight: 'normal',
					position: 'relative'
				}
			}).grab(text).inject(element, 'before');
		}

		return this.enable();
	},

	destroy: function(){
		this.element.eliminate(this.property); // Class.Occlude storage
		this.disable();
		if (this.text) this.text.destroy();
		if (this.textHolder) this.textHolder.destroy();
		return this;
	},

	disable: function(){
		this.element.removeEvents({
			focus: this.focus,
			blur: this.assert,
			change: this.assert
		});
		window.removeEvent('resize', this.reposition);
		this.hide(true, true);
		return this;
	},

	enable: function(){
		this.element.addEvents({
			focus: this.focus,
			blur: this.assert,
			change: this.assert
		});
		window.addEvent('resize', this.reposition);
		this.reposition();
		return this;
	},

	wrap: function(){
		if (this.options.element == 'label'){
			if (!this.element.get('id')) this.element.set('id',
'input_' + String.uniqueID());
			this.text.set('for', this.element.get('id'));
		}
	},

	startPolling: function(){
		this.pollingPaused = false;
		return this.poll();
	},

	poll: function(stop){
		//start immediately
		//pause on focus
		//resumeon blur
		if (this.poller && !stop) return this;
		if (stop){
			clearInterval(this.poller);
		} else {
			this.poller = (function(){
				if (!this.pollingPaused) this.assert(true);
			}).periodical(this.options.pollInterval, this);
		}

		return this;
	},

	stopPolling: function(){
		this.pollingPaused = true;
		return this.poll(true);
	},

	focus: function(){
		if (this.text && (!this.text.isDisplayed() ||
this.element.get('disabled'))) return this;
		return this.hide();
	},

	hide: function(suppressFocus, force){
		if (this.text && (this.text.isDisplayed() &&
(!this.element.get('disabled') || force))){
			this.text.hide();
			this.fireEvent('textHide', [this.text, this.element]);
			this.pollingPaused = true;
			if (!suppressFocus){
				try {
					this.element.fireEvent('focus');
					this.element.focus();
				} catch(e){} //IE barfs if you call focus on hidden elements
			}
		}
		return this;
	},

	show: function(){
		if (this.text && !this.text.isDisplayed()){
			this.text.show();
			this.reposition();
			this.fireEvent('textShow', [this.text, this.element]);
			this.pollingPaused = false;
		}
		return this;
	},

	test: function(){
		return !this.element.get('value');
	},

	assert: function(suppressFocus){
		return this[this.test() ? 'show' :
'hide'](suppressFocus);
	},

	reposition: function(){
		this.assert(true);
		if (!this.element.isVisible()) return this.stopPolling().hide();
		if (this.text && this.test()){
			this.text.position(Object.merge(this.options.positionOptions, {
				relativeTo: this.element
			}));
		}
		return this;
	}

});

OverText.instances = [];

Object.append(OverText, {

	each: function(fn){
		return OverText.instances.each(function(ot, i){
			if (ot.element && ot.text) fn.call(OverText, ot, i);
		});
	},

	update: function(){

		return OverText.each(function(ot){
			return ot.reposition();
		});

	},

	hideAll: function(){

		return OverText.each(function(ot){
			return ot.hide(true, true);
		});

	},

	showAll: function(){
		return OverText.each(function(ot){
			return ot.show();
		});
	}

});



/*
---

script: Fx.Elements.js

name: Fx.Elements

description: Effect to change any number of CSS properties of any number of
Elements.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Fx.CSS
  - /MooTools.More

provides: [Fx.Elements]

...
*/

Fx.Elements = new Class({

	Extends: Fx.CSS,

	initialize: function(elements, options){
		this.elements = this.subject = $$(elements);
		this.parent(options);
	},

	compute: function(from, to, delta){
		var now = {};

		for (var i in from){
			var iFrom = from[i], iTo = to[i], iNow = now[i] = {};
			for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta);
		}

		return now;
	},

	set: function(now){
		for (var i in now){
			if (!this.elements[i]) continue;

			var iNow = now[i];
			for (var p in iNow) this.render(this.elements[i], p, iNow[p],
this.options.unit);
		}

		return this;
	},

	start: function(obj){
		if (!this.check(obj)) return this;
		var from = {}, to = {};

		for (var i in obj){
			if (!this.elements[i]) continue;

			var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};

			for (var p in iProps){
				var parsed = this.prepare(this.elements[i], p, iProps[p]);
				iFrom[p] = parsed.from;
				iTo[p] = parsed.to;
			}
		}

		return this.parent(from, to);
	}

});


/*
---

script: Fx.Accordion.js

name: Fx.Accordion

description: An Fx.Elements extension which allows you to easily create
accordion type controls.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Element.Event
  - /Fx.Elements

provides: [Fx.Accordion]

...
*/

Fx.Accordion = new Class({

	Extends: Fx.Elements,

	options: {/*
		onActive: function(toggler, section){},
		onBackground: function(toggler, section){},*/
		fixedHeight: false,
		fixedWidth: false,
		display: 0,
		show: false,
		height: true,
		width: false,
		opacity: true,
		alwaysHide: false,
		trigger: 'click',
		initialDisplayFx: true,
		resetHeight: true
	},

	initialize: function(){
		var defined = function(obj){
			return obj != null;
		};

		var params = Array.link(arguments, {
			'container': Type.isElement, //deprecated
			'options': Type.isObject,
			'togglers': defined,
			'elements': defined
		});
		this.parent(params.elements, params.options);

		var options = this.options,
			togglers = this.togglers = $$(params.togglers);

		this.previous = -1;
		this.internalChain = new Chain();

		if (options.alwaysHide) this.options.link = 'chain';

		if (options.show || this.options.show === 0){
			options.display = false;
			this.previous = options.show;
		}

		if (options.start){
			options.display = false;
			options.show = false;
		}

		var effects = this.effects = {};

		if (options.opacity) effects.opacity = 'fullOpacity';
		if (options.width) effects.width = options.fixedWidth ?
'fullWidth' : 'offsetWidth';
		if (options.height) effects.height = options.fixedHeight ?
'fullHeight' : 'scrollHeight';

		for (var i = 0, l = togglers.length; i < l; i++)
this.addSection(togglers[i], this.elements[i]);

		this.elements.each(function(el, i){
			if (options.show === i){
				this.fireEvent('active', [togglers[i], el]);
			} else {
				for (var fx in effects) el.setStyle(fx, 0);
			}
		}, this);

		if (options.display || options.display === 0 || options.initialDisplayFx
=== false){
			this.display(options.display, options.initialDisplayFx);
		}

		if (options.fixedHeight !== false) options.resetHeight = false;
		this.addEvent('complete',
this.internalChain.callChain.bind(this.internalChain));
	},

	addSection: function(toggler, element){
		toggler = document.id(toggler);
		element = document.id(element);
		this.togglers.include(toggler);
		this.elements.include(element);

		var togglers = this.togglers,
			options = this.options,
			test = togglers.contains(toggler),
			idx = togglers.indexOf(toggler),
			displayer = this.display.pass(idx, this);

		toggler.store('accordion:display', displayer)
			.addEvent(options.trigger, displayer);

		if (options.height) element.setStyles({'padding-top': 0,
'border-top': 'none', 'padding-bottom': 0,
'border-bottom': 'none'});
		if (options.width) element.setStyles({'padding-left': 0,
'border-left': 'none', 'padding-right': 0,
'border-right': 'none'});

		element.fullOpacity = 1;
		if (options.fixedWidth) element.fullWidth = options.fixedWidth;
		if (options.fixedHeight) element.fullHeight = options.fixedHeight;
		element.setStyle('overflow', 'hidden');

		if (!test) for (var fx in this.effects){
			element.setStyle(fx, 0);
		}
		return this;
	},

	removeSection: function(toggler, displayIndex){
		var togglers = this.togglers,
			idx = togglers.indexOf(toggler),
			element = this.elements[idx];

		var remover = function(){
			togglers.erase(toggler);
			this.elements.erase(element);
			this.detach(toggler);
		}.bind(this);

		if (this.now == idx || displayIndex != null){
			this.display(displayIndex != null ? displayIndex : (idx - 1 >= 0 ?
idx - 1 : 0)).chain(remover);
		} else {
			remover();
		}
		return this;
	},

	detach: function(toggler){
		var remove = function(toggler){
			toggler.removeEvent(this.options.trigger,
toggler.retrieve('accordion:display'));
		}.bind(this);

		if (!toggler) this.togglers.each(remove);
		else remove(toggler);
		return this;
	},

	display: function(index, useFx){
		if (!this.check(index, useFx)) return this;

		var obj = {},
			elements = this.elements,
			options = this.options,
			effects = this.effects;

		if (useFx == null) useFx = true;
		if (typeOf(index) == 'element') index =
elements.indexOf(index);
		if (index == this.previous && !options.alwaysHide) return this;

		if (options.resetHeight){
			var prev = elements[this.previous];
			if (prev && !this.selfHidden){
				for (var fx in effects) prev.setStyle(fx, prev[effects[fx]]);
			}
		}

		if ((this.timer && options.link == 'chain') || (index
=== this.previous && !options.alwaysHide)) return this;

		this.previous = index;
		this.selfHidden = false;

		elements.each(function(el, i){
			obj[i] = {};
			var hide;
			if (i != index){
				hide = true;
			} else if (options.alwaysHide && ((el.offsetHeight > 0
&& options.height) || el.offsetWidth > 0 &&
options.width)){
				hide = true;
				this.selfHidden = true;
			}
			this.fireEvent(hide ? 'background' : 'active',
[this.togglers[i], el]);
			for (var fx in effects) obj[i][fx] = hide ? 0 : el[effects[fx]];
			if (!useFx && !hide && options.resetHeight)
obj[i].height = 'auto';
		}, this);

		this.internalChain.clearChain();
		this.internalChain.chain(function(){
			if (options.resetHeight && !this.selfHidden){
				var el = elements[index];
				if (el) el.setStyle('height', 'auto');
			}
		}.bind(this));

		return useFx ? this.start(obj) : this.set(obj).internalChain.callChain();
	}

});




/*
---

script: Fx.Move.js

name: Fx.Move

description: Defines Fx.Move, a class that works with Element.Position.js
to transition an element from one location to another.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Fx.Morph
  - /Element.Position

provides: [Fx.Move]

...
*/

Fx.Move = new Class({

	Extends: Fx.Morph,

	options: {
		relativeTo: document.body,
		position: 'center',
		edge: false,
		offset: {x: 0, y: 0}
	},

	start: function(destination){
		var element = this.element,
			topLeft = element.getStyles('top', 'left');
		if (topLeft.top == 'auto' || topLeft.left == 'auto'){
			element.setPosition(element.getPosition(element.getOffsetParent()));
		}
		return this.parent(element.position(Object.merge({}, this.options,
destination, {returnPos: true})));
	}

});

Element.Properties.move = {

	set: function(options){
		this.get('move').cancel().setOptions(options);
		return this;
	},

	get: function(){
		var move = this.retrieve('move');
		if (!move){
			move = new Fx.Move(this, {link: 'cancel'});
			this.store('move', move);
		}
		return move;
	}

};

Element.implement({

	move: function(options){
		this.get('move').start(options);
		return this;
	}

});


/*
---

script: Fx.Scroll.js

name: Fx.Scroll

description: Effect to smoothly scroll any element, including the window.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Fx
  - Core/Element.Event
  - Core/Element.Dimensions
  - /MooTools.More

provides: [Fx.Scroll]

...
*/

(function(){

Fx.Scroll = new Class({

	Extends: Fx,

	options: {
		offset: {x: 0, y: 0},
		wheelStops: true
	},

	initialize: function(element, options){
		this.element = this.subject = document.id(element);
		this.parent(options);

		if (typeOf(this.element) != 'element') this.element =
document.id(this.element.getDocument().body);

		if (this.options.wheelStops){
			var stopper = this.element,
				cancel = this.cancel.pass(false, this);
			this.addEvent('start', function(){
				stopper.addEvent('mousewheel', cancel);
			}, true);
			this.addEvent('complete', function(){
				stopper.removeEvent('mousewheel', cancel);
			}, true);
		}
	},

	set: function(){
		var now = Array.flatten(arguments);
		if (Browser.firefox) now = [Math.round(now[0]), Math.round(now[1])]; //
not needed anymore in newer firefox versions
		this.element.scrollTo(now[0], now[1]);
		return this;
	},

	compute: function(from, to, delta){
		return [0, 1].map(function(i){
			return Fx.compute(from[i], to[i], delta);
		});
	},

	start: function(x, y){
		if (!this.check(x, y)) return this;
		var scroll = this.element.getScroll();
		return this.parent([scroll.x, scroll.y], [x, y]);
	},

	calculateScroll: function(x, y){
		var element = this.element,
			scrollSize = element.getScrollSize(),
			scroll = element.getScroll(),
			size = element.getSize(),
			offset = this.options.offset,
			values = {x: x, y: y};

		for (var z in values){
			if (!values[z] && values[z] !== 0) values[z] = scroll[z];
			if (typeOf(values[z]) != 'number') values[z] = scrollSize[z] -
size[z];
			values[z] += offset[z];
		}

		return [values.x, values.y];
	},

	toTop: function(){
		return this.start.apply(this, this.calculateScroll(false, 0));
	},

	toLeft: function(){
		return this.start.apply(this, this.calculateScroll(0, false));
	},

	toRight: function(){
		return this.start.apply(this, this.calculateScroll('right',
false));
	},

	toBottom: function(){
		return this.start.apply(this, this.calculateScroll(false,
'bottom'));
	},

	toElement: function(el, axes){
		axes = axes ? Array.from(axes) : ['x', 'y'];
		var scroll = isBody(this.element) ? {x: 0, y: 0} :
this.element.getScroll();
		var position = Object.map(document.id(el).getPosition(this.element),
function(value, axis){
			return axes.contains(axis) ? value + scroll[axis] : false;
		});
		return this.start.apply(this, this.calculateScroll(position.x,
position.y));
	},

	toElementEdge: function(el, axes, offset){
		axes = axes ? Array.from(axes) : ['x', 'y'];
		el = document.id(el);
		var to = {},
			position = el.getPosition(this.element),
			size = el.getSize(),
			scroll = this.element.getScroll(),
			containerSize = this.element.getSize(),
			edge = {
				x: position.x + size.x,
				y: position.y + size.y
			};

		['x', 'y'].each(function(axis){
			if (axes.contains(axis)){
				if (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] =
edge[axis] - containerSize[axis];
				if (position[axis] < scroll[axis]) to[axis] = position[axis];
			}
			if (to[axis] == null) to[axis] = scroll[axis];
			if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
		}, this);

		if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
		return this;
	},

	toElementCenter: function(el, axes, offset){
		axes = axes ? Array.from(axes) : ['x', 'y'];
		el = document.id(el);
		var to = {},
			position = el.getPosition(this.element),
			size = el.getSize(),
			scroll = this.element.getScroll(),
			containerSize = this.element.getSize();

		['x', 'y'].each(function(axis){
			if (axes.contains(axis)){
				to[axis] = position[axis] - (containerSize[axis] - size[axis]) / 2;
			}
			if (to[axis] == null) to[axis] = scroll[axis];
			if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
		}, this);

		if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
		return this;
	}

});



function isBody(element){
	return (/^(?:body|html)$/i).test(element.tagName);
}

})();


/*
---

script: Fx.Slide.js

name: Fx.Slide

description: Effect to slide an element in and out of view.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Fx
  - Core/Element.Style
  - /MooTools.More

provides: [Fx.Slide]

...
*/

Fx.Slide = new Class({

	Extends: Fx,

	options: {
		mode: 'vertical',
		wrapper: false,
		hideOverflow: true,
		resetHeight: false
	},

	initialize: function(element, options){
		element = this.element = this.subject = document.id(element);
		this.parent(options);
		options = this.options;

		var wrapper = element.retrieve('wrapper'),
			styles = element.getStyles('margin', 'position',
'overflow');

		if (options.hideOverflow) styles = Object.append(styles, {overflow:
'hidden'});
		if (options.wrapper) wrapper =
document.id(options.wrapper).setStyles(styles);

		if (!wrapper) wrapper = new Element('div', {
			styles: styles
		}).wraps(element);

		element.store('wrapper', wrapper).setStyle('margin',
0);
		if (element.getStyle('overflow') == 'visible')
element.setStyle('overflow', 'hidden');

		this.now = [];
		this.open = true;
		this.wrapper = wrapper;

		this.addEvent('complete', function(){
			this.open = (wrapper['offset' + this.layout.capitalize()] !=
0);
			if (this.open && this.options.resetHeight)
wrapper.setStyle('height', '');
		}, true);
	},

	vertical: function(){
		this.margin = 'margin-top';
		this.layout = 'height';
		this.offset = this.element.offsetHeight;
	},

	horizontal: function(){
		this.margin = 'margin-left';
		this.layout = 'width';
		this.offset = this.element.offsetWidth;
	},

	set: function(now){
		this.element.setStyle(this.margin, now[0]);
		this.wrapper.setStyle(this.layout, now[1]);
		return this;
	},

	compute: function(from, to, delta){
		return [0, 1].map(function(i){
			return Fx.compute(from[i], to[i], delta);
		});
	},

	start: function(how, mode){
		if (!this.check(how, mode)) return this;
		this[mode || this.options.mode]();

		var margin = this.element.getStyle(this.margin).toInt(),
			layout = this.wrapper.getStyle(this.layout).toInt(),
			caseIn = [[margin, layout], [0, this.offset]],
			caseOut = [[margin, layout], [-this.offset, 0]],
			start;

		switch (how){
			case 'in': start = caseIn; break;
			case 'out': start = caseOut; break;
			case 'toggle': start = (layout == 0) ? caseIn : caseOut;
		}
		return this.parent(start[0], start[1]);
	},

	slideIn: function(mode){
		return this.start('in', mode);
	},

	slideOut: function(mode){
		return this.start('out', mode);
	},

	hide: function(mode){
		this[mode || this.options.mode]();
		this.open = false;
		return this.set([-this.offset, 0]);
	},

	show: function(mode){
		this[mode || this.options.mode]();
		this.open = true;
		return this.set([0, this.offset]);
	},

	toggle: function(mode){
		return this.start('toggle', mode);
	}

});

Element.Properties.slide = {

	set: function(options){
		this.get('slide').cancel().setOptions(options);
		return this;
	},

	get: function(){
		var slide = this.retrieve('slide');
		if (!slide){
			slide = new Fx.Slide(this, {link: 'cancel'});
			this.store('slide', slide);
		}
		return slide;
	}

};

Element.implement({

	slide: function(how, mode){
		how = how || 'toggle';
		var slide = this.get('slide'), toggle;
		switch (how){
			case 'hide': slide.hide(mode); break;
			case 'show': slide.show(mode); break;
			case 'toggle':
				var flag = this.retrieve('slide:flag', slide.open);
				slide[flag ? 'slideOut' : 'slideIn'](mode);
				this.store('slide:flag', !flag);
				toggle = true;
			break;
			default: slide.start(how, mode);
		}
		if (!toggle) this.eliminate('slide:flag');
		return this;
	}

});


/*
---

script: Fx.SmoothScroll.js

name: Fx.SmoothScroll

description: Class for creating a smooth scrolling effect to all internal
links on the page.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Slick.Finder
  - /Fx.Scroll

provides: [Fx.SmoothScroll]

...
*/

Fx.SmoothScroll = new Class({

	Extends: Fx.Scroll,

	options: {
		axes: ['x', 'y']
	},

	initialize: function(options, context){
		context = context || document;
		this.doc = context.getDocument();
		this.parent(this.doc, options);

		var win = context.getWindow(),
			location = win.location.href.match(/^[^#]*/)[0] + '#',
			links = $$(this.options.links || this.doc.links);

		links.each(function(link){
			if (link.href.indexOf(location) != 0) return;
			var anchor = link.href.substr(location.length);
			if (anchor) this.useLink(link, anchor);
		}, this);

		this.addEvent('complete', function(){
			win.location.hash = this.anchor;
			this.element.scrollTo(this.to[0], this.to[1]);
		}, true);
	},

	useLink: function(link, anchor){

		link.addEvent('click', function(event){
			var el = document.id(anchor) || this.doc.getElement('a[name='
+ anchor + ']');
			if (!el) return;

			event.preventDefault();
			this.toElement(el, this.options.axes).chain(function(){
				this.fireEvent('scrolledTo', [link, el]);
			}.bind(this));

			this.anchor = anchor;

		}.bind(this));

		return this;
	}
});


/*
---

script: Fx.Sort.js

name: Fx.Sort

description: Defines Fx.Sort, a class that reorders lists with a
transition.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Element.Dimensions
  - /Fx.Elements
  - /Element.Measure

provides: [Fx.Sort]

...
*/

Fx.Sort = new Class({

	Extends: Fx.Elements,

	options: {
		mode: 'vertical'
	},

	initialize: function(elements, options){
		this.parent(elements, options);
		this.elements.each(function(el){
			if (el.getStyle('position') == 'static')
el.setStyle('position', 'relative');
		});
		this.setDefaultOrder();
	},

	setDefaultOrder: function(){
		this.currentOrder = this.elements.map(function(el, index){
			return index;
		});
	},

	sort: function(){
		if (!this.check(arguments)) return this;
		var newOrder = Array.flatten(arguments);

		var top = 0,
			left = 0,
			next = {},
			zero = {},
			vert = this.options.mode == 'vertical';

		var current = this.elements.map(function(el, index){
			var size = el.getComputedSize({styles: ['border',
'padding', 'margin']});
			var val;
			if (vert){
				val = {
					top: top,
					margin: size['margin-top'],
					height: size.totalHeight
				};
				top += val.height - size['margin-top'];
			} else {
				val = {
					left: left,
					margin: size['margin-left'],
					width: size.totalWidth
				};
				left += val.width;
			}
			var plane = vert ? 'top' : 'left';
			zero[index] = {};
			var start = el.getStyle(plane).toInt();
			zero[index][plane] = start || 0;
			return val;
		}, this);

		this.set(zero);
		newOrder = newOrder.map(function(i){ return i.toInt(); });
		if (newOrder.length != this.elements.length){
			this.currentOrder.each(function(index){
				if (!newOrder.contains(index)) newOrder.push(index);
			});
			if (newOrder.length > this.elements.length)
				newOrder.splice(this.elements.length-1, newOrder.length -
this.elements.length);
		}
		var margin = 0;
		top = left = 0;
		newOrder.each(function(item){
			var newPos = {};
			if (vert){
				newPos.top = top - current[item].top - margin;
				top += current[item].height;
			} else {
				newPos.left = left - current[item].left;
				left += current[item].width;
			}
			margin = margin + current[item].margin;
			next[item]=newPos;
		}, this);
		var mapped = {};
		Array.clone(newOrder).sort().each(function(index){
			mapped[index] = next[index];
		});
		this.start(mapped);
		this.currentOrder = newOrder;

		return this;
	},

	rearrangeDOM: function(newOrder){
		newOrder = newOrder || this.currentOrder;
		var parent = this.elements[0].getParent();
		var rearranged = [];
		this.elements.setStyle('opacity', 0);
		//move each element and store the new default order
		newOrder.each(function(index){
			rearranged.push(this.elements[index].inject(parent).setStyles({
				top: 0,
				left: 0
			}));
		}, this);
		this.elements.setStyle('opacity', 1);
		this.elements = $$(rearranged);
		this.setDefaultOrder();
		return this;
	},

	getDefaultOrder: function(){
		return this.elements.map(function(el, index){
			return index;
		});
	},

	getCurrentOrder: function(){
		return this.currentOrder;
	},

	forward: function(){
		return this.sort(this.getDefaultOrder());
	},

	backward: function(){
		return this.sort(this.getDefaultOrder().reverse());
	},

	reverse: function(){
		return this.sort(this.currentOrder.reverse());
	},

	sortByElements: function(elements){
		return this.sort(elements.map(function(el){
			return this.elements.indexOf(el);
		}, this));
	},

	swap: function(one, two){
		if (typeOf(one) == 'element') one = this.elements.indexOf(one);
		if (typeOf(two) == 'element') two = this.elements.indexOf(two);

		var newOrder = Array.clone(this.currentOrder);
		newOrder[this.currentOrder.indexOf(one)] = two;
		newOrder[this.currentOrder.indexOf(two)] = one;

		return this.sort(newOrder);
	}

});


/*
---

script: Drag.js

name: Drag

description: The base Drag Class. Can be used to drag and resize Elements
using mouse events.

license: MIT-style license

authors:
  - Valerio Proietti
  - Tom Occhinno
  - Jan Kassens

requires:
  - Core/Events
  - Core/Options
  - Core/Element.Event
  - Core/Element.Style
  - Core/Element.Dimensions
  - /MooTools.More

provides: [Drag]
...

*/

var Drag = new Class({

	Implements: [Events, Options],

	options: {/*
		onBeforeStart: function(thisElement){},
		onStart: function(thisElement, event){},
		onSnap: function(thisElement){},
		onDrag: function(thisElement, event){},
		onCancel: function(thisElement){},
		onComplete: function(thisElement, event){},*/
		snap: 6,
		unit: 'px',
		grid: false,
		style: true,
		limit: false,
		handle: false,
		invert: false,
		preventDefault: false,
		stopPropagation: false,
		modifiers: {x: 'left', y: 'top'}
	},

	initialize: function(){
		var params = Array.link(arguments, {
			'options': Type.isObject,
			'element': function(obj){
				return obj != null;
			}
		});

		this.element = document.id(params.element);
		this.document = this.element.getDocument();
		this.setOptions(params.options || {});
		var htype = typeOf(this.options.handle);
		this.handles = ((htype == 'array' || htype ==
'collection') ? $$(this.options.handle) :
document.id(this.options.handle)) || this.element;
		this.mouse = {'now': {}, 'pos': {}};
		this.value = {'start': {}, 'now': {}};

		this.selection = (Browser.ie) ? 'selectstart' :
'mousedown';


		if (Browser.ie && !Drag.ondragstartFixed){
			document.ondragstart = Function.from(false);
			Drag.ondragstartFixed = true;
		}

		this.bound = {
			start: this.start.bind(this),
			check: this.check.bind(this),
			drag: this.drag.bind(this),
			stop: this.stop.bind(this),
			cancel: this.cancel.bind(this),
			eventStop: Function.from(false)
		};
		this.attach();
	},

	attach: function(){
		this.handles.addEvent('mousedown', this.bound.start);
		return this;
	},

	detach: function(){
		this.handles.removeEvent('mousedown', this.bound.start);
		return this;
	},

	start: function(event){
		var options = this.options;

		if (event.rightClick) return;

		if (options.preventDefault) event.preventDefault();
		if (options.stopPropagation) event.stopPropagation();
		this.mouse.start = event.page;

		this.fireEvent('beforeStart', this.element);

		var limit = options.limit;
		this.limit = {x: [], y: []};

		var z, coordinates;
		for (z in options.modifiers){
			if (!options.modifiers[z]) continue;

			var style = this.element.getStyle(options.modifiers[z]);

			// Some browsers (IE and Opera) don't always return pixels.
			if (style && !style.match(/px$/)){
				if (!coordinates) coordinates =
this.element.getCoordinates(this.element.getOffsetParent());
				style = coordinates[options.modifiers[z]];
			}

			if (options.style) this.value.now[z] = (style || 0).toInt();
			else this.value.now[z] = this.element[options.modifiers[z]];

			if (options.invert) this.value.now[z] *= -1;

			this.mouse.pos[z] = event.page[z] - this.value.now[z];

			if (limit && limit[z]){
				var i = 2;
				while (i--){
					var limitZI = limit[z][i];
					if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI ==
'function') ? limitZI() : limitZI;
				}
			}
		}

		if (typeOf(this.options.grid) == 'number') this.options.grid =
{
			x: this.options.grid,
			y: this.options.grid
		};

		var events = {
			mousemove: this.bound.check,
			mouseup: this.bound.cancel
		};
		events[this.selection] = this.bound.eventStop;
		this.document.addEvents(events);
	},

	check: function(event){
		if (this.options.preventDefault) event.preventDefault();
		var distance = Math.round(Math.sqrt(Math.pow(event.page.x -
this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
		if (distance > this.options.snap){
			this.cancel();
			this.document.addEvents({
				mousemove: this.bound.drag,
				mouseup: this.bound.stop
			});
			this.fireEvent('start', [this.element,
event]).fireEvent('snap', this.element);
		}
	},

	drag: function(event){
		var options = this.options;

		if (options.preventDefault) event.preventDefault();
		this.mouse.now = event.page;

		for (var z in options.modifiers){
			if (!options.modifiers[z]) continue;
			this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];

			if (options.invert) this.value.now[z] *= -1;

			if (options.limit && this.limit[z]){
				if ((this.limit[z][1] || this.limit[z][1] === 0) &&
(this.value.now[z] > this.limit[z][1])){
					this.value.now[z] = this.limit[z][1];
				} else if ((this.limit[z][0] || this.limit[z][0] === 0) &&
(this.value.now[z] < this.limit[z][0])){
					this.value.now[z] = this.limit[z][0];
				}
			}

			if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] -
(this.limit[z][0]||0)) % options.grid[z]);

			if (options.style) this.element.setStyle(options.modifiers[z],
this.value.now[z] + options.unit);
			else this.element[options.modifiers[z]] = this.value.now[z];
		}

		this.fireEvent('drag', [this.element, event]);
	},

	cancel: function(event){
		this.document.removeEvents({
			mousemove: this.bound.check,
			mouseup: this.bound.cancel
		});
		if (event){
			this.document.removeEvent(this.selection, this.bound.eventStop);
			this.fireEvent('cancel', this.element);
		}
	},

	stop: function(event){
		var events = {
			mousemove: this.bound.drag,
			mouseup: this.bound.stop
		};
		events[this.selection] = this.bound.eventStop;
		this.document.removeEvents(events);
		if (event) this.fireEvent('complete', [this.element, event]);
	}

});

Element.implement({

	makeResizable: function(options){
		var drag = new Drag(this, Object.merge({
			modifiers: {
				x: 'width',
				y: 'height'
			}
		}, options));

		this.store('resizer', drag);
		return drag.addEvent('drag', function(){
			this.fireEvent('resize', drag);
		}.bind(this));
	}

});


/*
---

script: Drag.Move.js

name: Drag.Move

description: A Drag extension that provides support for the constraining of
draggables to containers and droppables.

license: MIT-style license

authors:
  - Valerio Proietti
  - Tom Occhinno
  - Jan Kassens
  - Aaron Newton
  - Scott Kyle

requires:
  - Core/Element.Dimensions
  - /Drag

provides: [Drag.Move]

...
*/

Drag.Move = new Class({

	Extends: Drag,

	options: {/*
		onEnter: function(thisElement, overed){},
		onLeave: function(thisElement, overed){},
		onDrop: function(thisElement, overed, event){},*/
		droppables: [],
		container: false,
		precalculate: false,
		includeMargins: true,
		checkDroppables: true
	},

	initialize: function(element, options){
		this.parent(element, options);
		element = this.element;

		this.droppables = $$(this.options.droppables);
		this.container = document.id(this.options.container);

		if (this.container && typeOf(this.container) !=
'element')
			this.container = document.id(this.container.getDocument().body);

		if (this.options.style){
			if (this.options.modifiers.x == 'left' &&
this.options.modifiers.y == 'top'){
				var parent = element.getOffsetParent(),
					styles = element.getStyles('left', 'top');
				if (parent && (styles.left == 'auto' || styles.top ==
'auto')){
					element.setPosition(element.getPosition(parent));
				}
			}

			if (element.getStyle('position') == 'static')
element.setStyle('position', 'absolute');
		}

		this.addEvent('start', this.checkDroppables, true);
		this.overed = null;
	},

	start: function(event){
		if (this.container) this.options.limit = this.calculateLimit();

		if (this.options.precalculate){
			this.positions = this.droppables.map(function(el){
				return el.getCoordinates();
			});
		}

		this.parent(event);
	},

	calculateLimit: function(){
		var element = this.element,
			container = this.container,

			offsetParent = document.id(element.getOffsetParent()) || document.body,
			containerCoordinates = container.getCoordinates(offsetParent),
			elementMargin = {},
			elementBorder = {},
			containerMargin = {},
			containerBorder = {},
			offsetParentPadding = {};

		['top', 'right', 'bottom',
'left'].each(function(pad){
			elementMargin[pad] = element.getStyle('margin-' +
pad).toInt();
			elementBorder[pad] = element.getStyle('border-' +
pad).toInt();
			containerMargin[pad] = container.getStyle('margin-' +
pad).toInt();
			containerBorder[pad] = container.getStyle('border-' +
pad).toInt();
			offsetParentPadding[pad] = offsetParent.getStyle('padding-' +
pad).toInt();
		}, this);

		var width = element.offsetWidth + elementMargin.left +
elementMargin.right,
			height = element.offsetHeight + elementMargin.top +
elementMargin.bottom,
			left = 0,
			top = 0,
			right = containerCoordinates.right - containerBorder.right - width,
			bottom = containerCoordinates.bottom - containerBorder.bottom - height;

		if (this.options.includeMargins){
			left += elementMargin.left;
			top += elementMargin.top;
		} else {
			right += elementMargin.right;
			bottom += elementMargin.bottom;
		}

		if (element.getStyle('position') == 'relative'){
			var coords = element.getCoordinates(offsetParent);
			coords.left -= element.getStyle('left').toInt();
			coords.top -= element.getStyle('top').toInt();

			left -= coords.left;
			top -= coords.top;
			if (container.getStyle('position') != 'relative'){
				left += containerBorder.left;
				top += containerBorder.top;
			}
			right += elementMargin.left - coords.left;
			bottom += elementMargin.top - coords.top;

			if (container != offsetParent){
				left += containerMargin.left + offsetParentPadding.left;
				top += ((Browser.ie6 || Browser.ie7) ? 0 : containerMargin.top) +
offsetParentPadding.top;
			}
		} else {
			left -= elementMargin.left;
			top -= elementMargin.top;
			if (container != offsetParent){
				left += containerCoordinates.left + containerBorder.left;
				top += containerCoordinates.top + containerBorder.top;
			}
		}

		return {
			x: [left, right],
			y: [top, bottom]
		};
	},

	getDroppableCoordinates: function(element){
		var position = element.getCoordinates();
		if (element.getStyle('position') == 'fixed'){
			var scroll = window.getScroll();
			position.left += scroll.x;
			position.right += scroll.x;
			position.top += scroll.y;
			position.bottom += scroll.y;
		}
		return position;
	},

	checkDroppables: function(){
		var overed = this.droppables.filter(function(el, i){
			el = this.positions ? this.positions[i] :
this.getDroppableCoordinates(el);
			var now = this.mouse.now;
			return (now.x > el.left && now.x < el.right &&
now.y < el.bottom && now.y > el.top);
		}, this).getLast();

		if (this.overed != overed){
			if (this.overed) this.fireEvent('leave', [this.element,
this.overed]);
			if (overed) this.fireEvent('enter', [this.element, overed]);
			this.overed = overed;
		}
	},

	drag: function(event){
		this.parent(event);
		if (this.options.checkDroppables && this.droppables.length)
this.checkDroppables();
	},

	stop: function(event){
		this.checkDroppables();
		this.fireEvent('drop', [this.element, this.overed, event]);
		this.overed = null;
		return this.parent(event);
	}

});

Element.implement({

	makeDraggable: function(options){
		var drag = new Drag.Move(this, options);
		this.store('dragger', drag);
		return drag;
	}

});


/*
---

script: Slider.js

name: Slider

description: Class for creating horizontal and vertical slider controls.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Element.Dimensions
  - /Class.Binds
  - /Drag
  - /Element.Measure

provides: [Slider]

...
*/

var Slider = new Class({

	Implements: [Events, Options],

	Binds: ['clickedElement', 'draggedKnob',
'scrolledElement'],

	options: {/*
		onTick: function(intPosition){},
		onChange: function(intStep){},
		onComplete: function(strStep){},*/
		onTick: function(position){
			this.setKnobPosition(position);
		},
		initialStep: 0,
		snap: false,
		offset: 0,
		range: false,
		wheel: false,
		steps: 100,
		mode: 'horizontal'
	},

	initialize: function(element, knob, options){
		this.setOptions(options);
		options = this.options;
		this.element = document.id(element);
		knob = this.knob = document.id(knob);
		this.previousChange = this.previousEnd = this.step = -1;

		var limit = {},
			modifiers = {x: false, y: false};

		switch (options.mode){
			case 'vertical':
				this.axis = 'y';
				this.property = 'top';
				this.offset = 'offsetHeight';
				break;
			case 'horizontal':
				this.axis = 'x';
				this.property = 'left';
				this.offset = 'offsetWidth';
		}

		this.setSliderDimensions();
		this.setRange(options.range);

		if (knob.getStyle('position') == 'static')
knob.setStyle('position', 'relative');
		knob.setStyle(this.property, -options.offset);
		modifiers[this.axis] = this.property;
		limit[this.axis] = [-options.offset, this.full - options.offset];

		var dragOptions = {
			snap: 0,
			limit: limit,
			modifiers: modifiers,
			onDrag: this.draggedKnob,
			onStart: this.draggedKnob,
			onBeforeStart: (function(){
				this.isDragging = true;
			}).bind(this),
			onCancel: function(){
				this.isDragging = false;
			}.bind(this),
			onComplete: function(){
				this.isDragging = false;
				this.draggedKnob();
				this.end();
			}.bind(this)
		};
		if (options.snap) this.setSnap(dragOptions);

		this.drag = new Drag(knob, dragOptions);
		this.attach();
		if (options.initialStep != null) this.set(options.initialStep);
	},

	attach: function(){
		this.element.addEvent('mousedown', this.clickedElement);
		if (this.options.wheel) this.element.addEvent('mousewheel',
this.scrolledElement);
		this.drag.attach();
		return this;
	},

	detach: function(){
		this.element.removeEvent('mousedown', this.clickedElement)
			.removeEvent('mousewheel', this.scrolledElement);
		this.drag.detach();
		return this;
	},

	autosize: function(){
		this.setSliderDimensions()
			.setKnobPosition(this.toPosition(this.step));
		this.drag.options.limit[this.axis] = [-this.options.offset, this.full -
this.options.offset];
		if (this.options.snap) this.setSnap();
		return this;
	},

	setSnap: function(options){
		if (!options) options = this.drag.options;
		options.grid = Math.ceil(this.stepWidth);
		options.limit[this.axis][1] = this.full;
		return this;
	},

	setKnobPosition: function(position){
		if (this.options.snap) position = this.toPosition(this.step);
		this.knob.setStyle(this.property, position);
		return this;
	},

	setSliderDimensions: function(){
		this.full = this.element.measure(function(){
			this.half = this.knob[this.offset] / 2;
			return this.element[this.offset] - this.knob[this.offset] +
(this.options.offset * 2);
		}.bind(this));
		return this;
	},

	set: function(step){
		if (!((this.range > 0) ^ (step < this.min))) step = this.min;
		if (!((this.range > 0) ^ (step > this.max))) step = this.max;

		this.step = Math.round(step);
		return this.checkStep()
			.fireEvent('tick', this.toPosition(this.step))
			.end();
	},

	setRange: function(range, pos){
		this.min = Array.pick([range[0], 0]);
		this.max = Array.pick([range[1], this.options.steps]);
		this.range = this.max - this.min;
		this.steps = this.options.steps || this.full;
		this.stepSize = Math.abs(this.range) / this.steps;
		this.stepWidth = this.stepSize * this.full / Math.abs(this.range);
		if (range) this.set(Array.pick([pos,
this.step]).floor(this.min).max(this.max));
		return this;
	},

	clickedElement: function(event){
		if (this.isDragging || event.target == this.knob) return;

		var dir = this.range < 0 ? -1 : 1,
			position = event.page[this.axis] - this.element.getPosition()[this.axis]
- this.half;

		position = position.limit(-this.options.offset, this.full -
this.options.offset);

		this.step = Math.round(this.min + dir * this.toStep(position));

		this.checkStep()
			.fireEvent('tick', position)
			.end();
	},

	scrolledElement: function(event){
		var mode = (this.options.mode == 'horizontal') ? (event.wheel
< 0) : (event.wheel > 0);
		this.set(this.step + (mode ? -1 : 1) * this.stepSize);
		event.stop();
	},

	draggedKnob: function(){
		var dir = this.range < 0 ? -1 : 1,
			position = this.drag.value.now[this.axis];

		position = position.limit(-this.options.offset, this.full
-this.options.offset);

		this.step = Math.round(this.min + dir * this.toStep(position));
		this.checkStep();
	},

	checkStep: function(){
		var step = this.step;
		if (this.previousChange != step){
			this.previousChange = step;
			this.fireEvent('change', step);
		}
		return this;
	},

	end: function(){
		var step = this.step;
		if (this.previousEnd !== step){
			this.previousEnd = step;
			this.fireEvent('complete', step + '');
		}
		return this;
	},

	toStep: function(position){
		var step = (position + this.options.offset) * this.stepSize / this.full *
this.steps;
		return this.options.steps ? Math.round(step -= step % this.stepSize) :
step;
	},

	toPosition: function(step){
		return (this.full * Math.abs(this.min - step)) / (this.steps *
this.stepSize) - this.options.offset;
	}

});


/*
---

script: Sortables.js

name: Sortables

description: Class for creating a drag and drop sorting interface for lists
of items.

license: MIT-style license

authors:
  - Tom Occhino

requires:
  - Core/Fx.Morph
  - /Drag.Move

provides: [Sortables]

...
*/

var Sortables = new Class({

	Implements: [Events, Options],

	options: {/*
		onSort: function(element, clone){},
		onStart: function(element, clone){},
		onComplete: function(element){},*/
		opacity: 1,
		clone: false,
		revert: false,
		handle: false,
		dragOptions: {}
	},

	initialize: function(lists, options){
		this.setOptions(options);

		this.elements = [];
		this.lists = [];
		this.idle = true;

		this.addLists($$(document.id(lists) || lists));

		if (!this.options.clone) this.options.revert = false;
		if (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({
			duration: 250,
			link: 'cancel'
		}, this.options.revert));
	},

	attach: function(){
		this.addLists(this.lists);
		return this;
	},

	detach: function(){
		this.lists = this.removeLists(this.lists);
		return this;
	},

	addItems: function(){
		Array.flatten(arguments).each(function(element){
			this.elements.push(element);
			var start = element.retrieve('sortables:start',
function(event){
				this.start.call(this, event, element);
			}.bind(this));
			(this.options.handle ? element.getElement(this.options.handle) ||
element : element).addEvent('mousedown', start);
		}, this);
		return this;
	},

	addLists: function(){
		Array.flatten(arguments).each(function(list){
			this.lists.include(list);
			this.addItems(list.getChildren());
		}, this);
		return this;
	},

	removeItems: function(){
		return $$(Array.flatten(arguments).map(function(element){
			this.elements.erase(element);
			var start = element.retrieve('sortables:start');
			(this.options.handle ? element.getElement(this.options.handle) ||
element : element).removeEvent('mousedown', start);

			return element;
		}, this));
	},

	removeLists: function(){
		return $$(Array.flatten(arguments).map(function(list){
			this.lists.erase(list);
			this.removeItems(list.getChildren());

			return list;
		}, this));
	},

	getClone: function(event, element){
		if (!this.options.clone) return new
Element(element.tagName).inject(document.body);
		if (typeOf(this.options.clone) == 'function') return
this.options.clone.call(this, event, element, this.list);
		var clone = element.clone(true).setStyles({
			margin: 0,
			position: 'absolute',
			visibility: 'hidden',
			width: element.getStyle('width')
		}).addEvent('mousedown', function(event){
			element.fireEvent('mousedown', event);
		});
		//prevent the duplicated radio inputs from unchecking the real one
		if (clone.get('html').test('radio')){
			clone.getElements('input[type=radio]').each(function(input,
i){
				input.set('name', 'clone_' + i);
				if (input.get('checked'))
element.getElements('input[type=radio]')[i].set('checked',
true);
			});
		}

		return
clone.inject(this.list).setPosition(element.getPosition(element.getOffsetParent()));
	},

	getDroppables: function(){
		var droppables =
this.list.getChildren().erase(this.clone).erase(this.element);
		if (!this.options.constrain)
droppables.append(this.lists).erase(this.list);
		return droppables;
	},

	insert: function(dragging, element){
		var where = 'inside';
		if (this.lists.contains(element)){
			this.list = element;
			this.drag.droppables = this.getDroppables();
		} else {
			where = this.element.getAllPrevious().contains(element) ?
'before' : 'after';
		}
		this.element.inject(element, where);
		this.fireEvent('sort', [this.element, this.clone]);
	},

	start: function(event, element){
		if (
			!this.idle ||
			event.rightClick ||
			['button', 'input', 'a',
'textarea'].contains(event.target.get('tag'))
		) return;

		this.idle = false;
		this.element = element;
		this.opacity = element.getStyle('opacity');
		this.list = element.getParent();
		this.clone = this.getClone(event, element);

		this.drag = new Drag.Move(this.clone, Object.merge({
			
			droppables: this.getDroppables()
		}, this.options.dragOptions)).addEvents({
			onSnap: function(){
				event.stop();
				this.clone.setStyle('visibility', 'visible');
				this.element.setStyle('opacity', this.options.opacity || 0);
				this.fireEvent('start', [this.element, this.clone]);
			}.bind(this),
			onEnter: this.insert.bind(this),
			onCancel: this.end.bind(this),
			onComplete: this.end.bind(this)
		});

		this.clone.inject(this.element, 'before');
		this.drag.start(event);
	},

	end: function(){
		this.drag.detach();
		this.element.setStyle('opacity', this.opacity);
		if (this.effect){
			var dim = this.element.getStyles('width', 'height'),
				clone = this.clone,
				pos =
clone.computePosition(this.element.getPosition(this.clone.getOffsetParent()));

			var destroy = function(){
				this.removeEvent('cancel', destroy);
				clone.destroy();
			};

			this.effect.element = clone;
			this.effect.start({
				top: pos.top,
				left: pos.left,
				width: dim.width,
				height: dim.height,
				opacity: 0.25
			}).addEvent('cancel', destroy).chain(destroy);
		} else {
			this.clone.destroy();
		}
		this.reset();
	},

	reset: function(){
		this.idle = true;
		this.fireEvent('complete', this.element);
	},

	serialize: function(){
		var params = Array.link(arguments, {
			modifier: Type.isFunction,
			index: function(obj){
				return obj != null;
			}
		});
		var serial = this.lists.map(function(list){
			return list.getChildren().map(params.modifier || function(element){
				return element.get('id');
			}, this);
		}, this);

		var index = params.index;
		if (this.lists.length == 1) index = 0;
		return (index || index === 0) && index >= 0 && index
< this.lists.length ? serial[index] : serial;
	}

});


/*
---

script: Request.JSONP.js

name: Request.JSONP

description: Defines Request.JSONP, a class for cross domain javascript via
script injection.

license: MIT-style license

authors:
  - Aaron Newton
  - Guillermo Rauch
  - Arian Stolwijk

requires:
  - Core/Element
  - Core/Request
  - MooTools.More

provides: [Request.JSONP]

...
*/

Request.JSONP = new Class({

	Implements: [Chain, Events, Options],

	options: {/*
		onRequest: function(src, scriptElement){},
		onComplete: function(data){},
		onSuccess: function(data){},
		onCancel: function(){},
		onTimeout: function(){},
		onError: function(){}, */
		onRequest: function(src){
			if (this.options.log && window.console && console.log){
				console.log('JSONP retrieving script with url:' + src);
			}
		},
		onError: function(src){
			if (this.options.log && window.console && console.warn){
				console.warn('JSONP '+ src +' will fail in Internet
Explorer, which enforces a 2083 bytes length limit on URIs');
			}
		},
		url: '',
		callbackKey: 'callback',
		injectScript: document.head,
		data: '',
		link: 'ignore',
		timeout: 0,
		log: false
	},

	initialize: function(options){
		this.setOptions(options);
	},

	send: function(options){
		if (!Request.prototype.check.call(this, options)) return this;
		this.running = true;

		var type = typeOf(options);
		if (type == 'string' || type == 'element') options =
{data: options};
		options = Object.merge(this.options, options || {});

		var data = options.data;
		switch (typeOf(data)){
			case 'element': data = document.id(data).toQueryString();
break;
			case 'object': case 'hash': data =
Object.toQueryString(data);
		}

		var index = this.index = Request.JSONP.counter++;

		var src = options.url +
			(options.url.test('\\?') ? '&' :'?') +
			(options.callbackKey) +
			'=Request.JSONP.request_map.request_'+ index +
			(data ? '&' + data : '');

		if (src.length > 2083) this.fireEvent('error', src);

		Request.JSONP.request_map['request_' + index] = function(){
			this.success(arguments, index);
		}.bind(this);

		var script = this.getScript(src).inject(options.injectScript);
		this.fireEvent('request', [src, script]);

		if (options.timeout) this.timeout.delay(options.timeout, this);

		return this;
	},

	getScript: function(src){
		if (!this.script) this.script = new Element('script', {
			type: 'text/javascript',
			async: true,
			src: src
		});
		return this.script;
	},

	success: function(args, index){
		if (!this.running) return;
		this.clear()
			.fireEvent('complete', args).fireEvent('success',
args)
			.callChain();
	},

	cancel: function(){
		if (this.running) this.clear().fireEvent('cancel');
		return this;
	},

	isRunning: function(){
		return !!this.running;
	},

	clear: function(){
		this.running = false;
		if (this.script){
			this.script.destroy();
			this.script = null;
		}
		return this;
	},

	timeout: function(){
		if (this.running){
			this.running = false;
			this.fireEvent('timeout', [this.script.get('src'),
this.script]).fireEvent('failure').cancel();
		}
		return this;
	}

});

Request.JSONP.counter = 0;
Request.JSONP.request_map = {};


/*
---

script: Request.Queue.js

name: Request.Queue

description: Controls several instances of Request and its variants to run
only one request at a time.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Element
  - Core/Request
  - /Class.Binds

provides: [Request.Queue]

...
*/

Request.Queue = new Class({

	Implements: [Options, Events],

	Binds: ['attach', 'request', 'complete',
'cancel', 'success', 'failure',
'exception'],

	options: {/*
		onRequest: function(argsPassedToOnRequest){},
		onSuccess: function(argsPassedToOnSuccess){},
		onComplete: function(argsPassedToOnComplete){},
		onCancel: function(argsPassedToOnCancel){},
		onException: function(argsPassedToOnException){},
		onFailure: function(argsPassedToOnFailure){},
		onEnd: function(){},
		*/
		stopOnFailure: true,
		autoAdvance: true,
		concurrent: 1,
		requests: {}
	},

	initialize: function(options){
		var requests;
		if (options){
			requests = options.requests;
			delete options.requests;
		}
		this.setOptions(options);
		this.requests = {};
		this.queue = [];
		this.reqBinders = {};

		if (requests) this.addRequests(requests);
	},

	addRequest: function(name, request){
		this.requests[name] = request;
		this.attach(name, request);
		return this;
	},

	addRequests: function(obj){
		Object.each(obj, function(req, name){
			this.addRequest(name, req);
		}, this);
		return this;
	},

	getName: function(req){
		return Object.keyOf(this.requests, req);
	},

	attach: function(name, req){
		if (req._groupSend) return this;
		['request', 'complete', 'cancel',
'success', 'failure',
'exception'].each(function(evt){
			if (!this.reqBinders[name]) this.reqBinders[name] = {};
			this.reqBinders[name][evt] = function(){
				this['on' + evt.capitalize()].apply(this, [name,
req].append(arguments));
			}.bind(this);
			req.addEvent(evt, this.reqBinders[name][evt]);
		}, this);
		req._groupSend = req.send;
		req.send = function(options){
			this.send(name, options);
			return req;
		}.bind(this);
		return this;
	},

	removeRequest: function(req){
		var name = typeOf(req) == 'object' ? this.getName(req) : req;
		if (!name && typeOf(name) != 'string') return this;
		req = this.requests[name];
		if (!req) return this;
		['request', 'complete', 'cancel',
'success', 'failure',
'exception'].each(function(evt){
			req.removeEvent(evt, this.reqBinders[name][evt]);
		}, this);
		req.send = req._groupSend;
		delete req._groupSend;
		return this;
	},

	getRunning: function(){
		return Object.filter(this.requests, function(r){
			return r.running;
		});
	},

	isRunning: function(){
		return !!(Object.keys(this.getRunning()).length);
	},

	send: function(name, options){
		var q = function(){
			this.requests[name]._groupSend(options);
			this.queue.erase(q);
		}.bind(this);

		q.name = name;
		if (Object.keys(this.getRunning()).length >= this.options.concurrent
|| (this.error && this.options.stopOnFailure)) this.queue.push(q);
		else q();
		return this;
	},

	hasNext: function(name){
		return (!name) ? !!this.queue.length : !!this.queue.filter(function(q){
return q.name == name; }).length;
	},

	resume: function(){
		this.error = false;
		(this.options.concurrent -
Object.keys(this.getRunning()).length).times(this.runNext, this);
		return this;
	},

	runNext: function(name){
		if (!this.queue.length) return this;
		if (!name){
			this.queue[0]();
		} else {
			var found;
			this.queue.each(function(q){
				if (!found && q.name == name){
					found = true;
					q();
				}
			});
		}
		return this;
	},

	runAll: function(){
		this.queue.each(function(q){
			q();
		});
		return this;
	},

	clear: function(name){
		if (!name){
			this.queue.empty();
		} else {
			this.queue = this.queue.map(function(q){
				if (q.name != name) return q;
				else return false;
			}).filter(function(q){
				return q;
			});
		}
		return this;
	},

	cancel: function(name){
		this.requests[name].cancel();
		return this;
	},

	onRequest: function(){
		this.fireEvent('request', arguments);
	},

	onComplete: function(){
		this.fireEvent('complete', arguments);
		if (!this.queue.length) this.fireEvent('end');
	},

	onCancel: function(){
		if (this.options.autoAdvance && !this.error) this.runNext();
		this.fireEvent('cancel', arguments);
	},

	onSuccess: function(){
		if (this.options.autoAdvance && !this.error) this.runNext();
		this.fireEvent('success', arguments);
	},

	onFailure: function(){
		this.error = true;
		if (!this.options.stopOnFailure && this.options.autoAdvance)
this.runNext();
		this.fireEvent('failure', arguments);
	},

	onException: function(){
		this.error = true;
		if (!this.options.stopOnFailure && this.options.autoAdvance)
this.runNext();
		this.fireEvent('exception', arguments);
	}

});


/*
---

script: Request.Periodical.js

name: Request.Periodical

description: Requests the same URL to pull data from a server but increases
the intervals if no data is returned to reduce the load

license: MIT-style license

authors:
  - Christoph Pojer

requires:
  - Core/Request
  - /MooTools.More

provides: [Request.Periodical]

...
*/

Request.implement({

	options: {
		initialDelay: 5000,
		delay: 5000,
		limit: 60000
	},

	startTimer: function(data){
		var fn = function(){
			if (!this.running) this.send({data: data});
		};
		this.lastDelay = this.options.initialDelay;
		this.timer = fn.delay(this.lastDelay, this);
		this.completeCheck = function(response){
			clearTimeout(this.timer);
			this.lastDelay = (response) ? this.options.delay : (this.lastDelay +
this.options.delay).min(this.options.limit);
			this.timer = fn.delay(this.lastDelay, this);
		};
		return this.addEvent('complete', this.completeCheck);
	},

	stopTimer: function(){
		clearTimeout(this.timer);
		return this.removeEvent('complete', this.completeCheck);
	}

});


/*
---

script: Assets.js

name: Assets

description: Provides methods to dynamically load JavaScript, CSS, and
Image files into the document.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Element.Event
  - /MooTools.More

provides: [Assets]

...
*/

var Asset = {

	javascript: function(source, properties){
		if (!properties) properties = {};

		var script = new Element('script', {src: source, type:
'text/javascript'}),
			doc = properties.document || document,
			load = properties.onload || properties.onLoad;

		delete properties.onload;
		delete properties.onLoad;
		delete properties.document;

		if (load){
			if (typeof script.onreadystatechange != 'undefined'){
				script.addEvent('readystatechange', function(){
					if (['loaded',
'complete'].contains(this.readyState)) load.call(this);
				});
			} else {
				script.addEvent('load', load);
			}
		}

		return script.set(properties).inject(doc.head);
	},

	css: function(source, properties){
		if (!properties) properties = {};

		var link = new Element('link', {
			rel: 'stylesheet',
			media: 'screen',
			type: 'text/css',
			href: source
		});

		var load = properties.onload || properties.onLoad,
			doc = properties.document || document;

		delete properties.onload;
		delete properties.onLoad;
		delete properties.document;

		if (load) link.addEvent('load', load);
		return link.set(properties).inject(doc.head);
	},

	image: function(source, properties){
		if (!properties) properties = {};

		var image = new Image(),
			element = document.id(image) || new Element('img');

		['load', 'abort',
'error'].each(function(name){
			var type = 'on' + name,
				cap = 'on' + name.capitalize(),
				event = properties[type] || properties[cap] || function(){};

			delete properties[cap];
			delete properties[type];

			image[type] = function(){
				if (!image) return;
				if (!element.parentNode){
					element.width = image.width;
					element.height = image.height;
				}
				image = image.onload = image.onabort = image.onerror = null;
				event.delay(1, element, element);
				element.fireEvent(name, element, 1);
			};
		});

		image.src = element.src = source;
		if (image && image.complete) image.onload.delay(1);
		return element.set(properties);
	},

	images: function(sources, options){
		sources = Array.from(sources);

		var fn = function(){},
			counter = 0;

		options = Object.merge({
			onComplete: fn,
			onProgress: fn,
			onError: fn,
			properties: {}
		}, options);

		return new Elements(sources.map(function(source, index){
			return Asset.image(source, Object.append(options.properties, {
				onload: function(){
					counter++;
					options.onProgress.call(this, counter, index, source);
					if (counter == sources.length) options.onComplete();
				},
				onerror: function(){
					counter++;
					options.onError.call(this, counter, index, source);
					if (counter == sources.length) options.onComplete();
				}
			}));
		}));
	}

};


/*
---

script: Color.js

name: Color

description: Class for creating and manipulating colors in JavaScript.
Supports HSB -> RGB Conversions and vice versa.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Array
  - Core/String
  - Core/Number
  - Core/Hash
  - Core/Function
  - MooTools.More

provides: [Color]

...
*/

(function(){

var Color = this.Color = new Type('Color', function(color, type){
	if (arguments.length >= 3){
		type = 'rgb'; color = Array.slice(arguments, 0, 3);
	} else if (typeof color == 'string'){
		if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true);
		else if (color.match(/hsb/)) color = color.hsbToRgb();
		else color = color.hexToRgb(true);
	}
	type = type || 'rgb';
	switch (type){
		case 'hsb':
			var old = color;
			color = color.hsbToRgb();
			color.hsb = old;
		break;
		case 'hex': color = color.hexToRgb(true); break;
	}
	color.rgb = color.slice(0, 3);
	color.hsb = color.hsb || color.rgbToHsb();
	color.hex = color.rgbToHex();
	return Object.append(color, this);
});

Color.implement({

	mix: function(){
		var colors = Array.slice(arguments);
		var alpha = (typeOf(colors.getLast()) == 'number') ?
colors.pop() : 50;
		var rgb = this.slice();
		colors.each(function(color){
			color = new Color(color);
			for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100
- alpha)) + (color[i] / 100 * alpha));
		});
		return new Color(rgb, 'rgb');
	},

	invert: function(){
		return new Color(this.map(function(value){
			return 255 - value;
		}));
	},

	setHue: function(value){
		return new Color([value, this.hsb[1], this.hsb[2]], 'hsb');
	},

	setSaturation: function(percent){
		return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb');
	},

	setBrightness: function(percent){
		return new Color([this.hsb[0], this.hsb[1], percent], 'hsb');
	}

});

this.$RGB = function(r, g, b){
	return new Color([r, g, b], 'rgb');
};

this.$HSB = function(h, s, b){
	return new Color([h, s, b], 'hsb');
};

this.$HEX = function(hex){
	return new Color(hex, 'hex');
};

Array.implement({

	rgbToHsb: function(){
		var red = this[0],
				green = this[1],
				blue = this[2],
				hue = 0;
		var max = Math.max(red, green, blue),
				min = Math.min(red, green, blue);
		var delta = max - min;
		var brightness = max / 255,
				saturation = (max != 0) ? delta / max : 0;
		if (saturation != 0){
			var rr = (max - red) / delta;
			var gr = (max - green) / delta;
			var br = (max - blue) / delta;
			if (red == max) hue = br - gr;
			else if (green == max) hue = 2 + rr - br;
			else hue = 4 + gr - rr;
			hue /= 6;
			if (hue < 0) hue++;
		}
		return [Math.round(hue * 360), Math.round(saturation * 100),
Math.round(brightness * 100)];
	},

	hsbToRgb: function(){
		var br = Math.round(this[2] / 100 * 255);
		if (this[1] == 0){
			return [br, br, br];
		} else {
			var hue = this[0] % 360;
			var f = hue % 60;
			var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255);
			var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255);
			var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 *
255);
			switch (Math.floor(hue / 60)){
				case 0: return [br, t, p];
				case 1: return [q, br, p];
				case 2: return [p, br, t];
				case 3: return [p, q, br];
				case 4: return [t, p, br];
				case 5: return [br, p, q];
			}
		}
		return false;
	}

});

String.implement({

	rgbToHsb: function(){
		var rgb = this.match(/\d{1,3}/g);
		return (rgb) ? rgb.rgbToHsb() : null;
	},

	hsbToRgb: function(){
		var hsb = this.match(/\d{1,3}/g);
		return (hsb) ? hsb.hsbToRgb() : null;
	}

});

})();



/*
---

script: Group.js

name: Group

description: Class for monitoring collections of events

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Events
  - /MooTools.More

provides: [Group]

...
*/

(function(){

this.Group = new Class({

	initialize: function(){
		this.instances = Array.flatten(arguments);
	},

	addEvent: function(type, fn){
		var instances = this.instances,
			len = instances.length,
			togo = len,
			args = new Array(len),
			self = this;

		instances.each(function(instance, i){
			instance.addEvent(type, function(){
				if (!args[i]) togo--;
				args[i] = arguments;
				if (!togo){
					fn.call(self, instances, instance, args);
					togo = len;
					args = new Array(len);
				}
			});
		});
	}

});

})();


/*
---

script: Hash.Cookie.js

name: Hash.Cookie

description: Class for creating, reading, and deleting Cookies in JSON
format.

license: MIT-style license

authors:
  - Valerio Proietti
  - Aaron Newton

requires:
  - Core/Cookie
  - Core/JSON
  - /MooTools.More
  - /Hash

provides: [Hash.Cookie]

...
*/

Hash.Cookie = new Class({

	Extends: Cookie,

	options: {
		autoSave: true
	},

	initialize: function(name, options){
		this.parent(name, options);
		this.load();
	},

	save: function(){
		var value = JSON.encode(this.hash);
		if (!value || value.length > 4096) return false; //cookie would be
truncated!
		if (value == '{}') this.dispose();
		else this.write(value);
		return true;
	},

	load: function(){
		this.hash = new Hash(JSON.decode(this.read(), true));
		return this;
	}

});

Hash.each(Hash.prototype, function(method, name){
	if (typeof method == 'function') Hash.Cookie.implement(name,
function(){
		var value = method.apply(this.hash, arguments);
		if (this.options.autoSave) this.save();
		return value;
	});
});


/*
---
name: Table
description: LUA-Style table implementation.
license: MIT-style license
authors:
  - Valerio Proietti
requires: [Core/Array]
provides: [Table]
...
*/

(function(){

var Table = this.Table = function(){

	this.length = 0;
	var keys = [],
	    values = [];
	
	this.set = function(key, value){
		var index = keys.indexOf(key);
		if (index == -1){
			var length = keys.length;
			keys[length] = key;
			values[length] = value;
			this.length++;
		} else {
			values[index] = value;
		}
		return this;
	};

	this.get = function(key){
		var index = keys.indexOf(key);
		return (index == -1) ? null : values[index];
	};

	this.erase = function(key){
		var index = keys.indexOf(key);
		if (index != -1){
			this.length--;
			keys.splice(index, 1);
			return values.splice(index, 1)[0];
		}
		return null;
	};

	this.each = this.forEach = function(fn, bind){
		for (var i = 0, l = this.length; i < l; i++) fn.call(bind, keys[i],
values[i], this);
	};
	
};

if (this.Type) new Type('Table', Table);

})();


/*
---

script: HtmlTable.js

name: HtmlTable

description: Builds table elements with methods to add rows.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - Core/Options
  - Core/Events
  - /Class.Occlude

provides: [HtmlTable]

...
*/

var HtmlTable = new Class({

	Implements: [Options, Events, Class.Occlude],

	options: {
		properties: {
			cellpadding: 0,
			cellspacing: 0,
			border: 0
		},
		rows: [],
		headers: [],
		footers: []
	},

	property: 'HtmlTable',

	initialize: function(){
		var params = Array.link(arguments, {options: Type.isObject, table:
Type.isElement, id: Type.isString});
		this.setOptions(params.options);
		if (!params.table && params.id) params.table =
document.id(params.id);
		this.element = params.table || new Element('table',
this.options.properties);
		if (this.occlude()) return this.occluded;
		this.build();
	},

	build: function(){
		this.element.store('HtmlTable', this);

		this.body = document.id(this.element.tBodies[0]) || new
Element('tbody').inject(this.element);
		$$(this.body.rows);

		if (this.options.headers.length) this.setHeaders(this.options.headers);
		else this.thead = document.id(this.element.tHead);

		if (this.thead) this.head = this.getHead();
		if (this.options.footers.length) this.setFooters(this.options.footers);

		this.tfoot = document.id(this.element.tFoot);
		if (this.tfoot) this.foot = document.id(this.tfoot.rows[0]);

		this.options.rows.each(function(row){
			this.push(row);
		}, this);
	},

	toElement: function(){
		return this.element;
	},

	empty: function(){
		this.body.empty();
		return this;
	},

	set: function(what, items){
		var target = (what == 'headers') ? 'tHead' :
'tFoot',
			lower = target.toLowerCase();

		this[lower] = (document.id(this.element[target]) || new
Element(lower).inject(this.element, 'top')).empty();
		var data = this.push(items, {}, this[lower], what == 'headers'
? 'th' : 'td');

		if (what == 'headers') this.head = this.getHead();
		else this.foot = this.getHead();

		return data;
	},

	getHead: function(){
		var rows = this.thead.rows;
		return rows.length > 1 ? $$(rows) : rows.length ? document.id(rows[0])
: false;
	},

	setHeaders: function(headers){
		this.set('headers', headers);
		return this;
	},

	setFooters: function(footers){
		this.set('footers', footers);
		return this;
	},

	update: function(tr, row, tag){
		var tds = tr.getChildren(tag || 'td'), last = tds.length - 1;

		row.each(function(data, index){
			var td = tds[index] || new Element(tag || 'td').inject(tr),
				content = (data ? data.content : '') || data,
				type = typeOf(content);

			if (data && data.properties) td.set(data.properties);
			if (/(element(s?)|array|collection)/.test(type))
td.empty().adopt(content);
			else td.set('html', content);

			if (index > last) tds.push(td);
			else tds[index] = td;
		});

		return {
			tr: tr,
			tds: tds
		};
	},

	push: function(row, rowProperties, target, tag, where){
		if (typeOf(row) == 'element' &&
row.get('tag') == 'tr'){
			row.inject(target || this.body, where);
			return {
				tr: row,
				tds: row.getChildren('td')
			};
		}
		return this.update(new Element('tr',
rowProperties).inject(target || this.body, where), row, tag);
	},

	pushMany: function(rows, rowProperties, target, tag, where){
		return rows.map(function(row){
			return this.push(row, rowProperties, target, tag, where);
		}, this);
	}

});


['adopt', 'inject', 'wraps',
'grab', 'replaces',
'dispose'].each(function(method){
	HtmlTable.implement(method, function(){
		this.element[method].apply(this.element, arguments);
		return this;
	});
});




/*
---

script: HtmlTable.Zebra.js

name: HtmlTable.Zebra

description: Builds a stripy table with methods to add rows.

license: MIT-style license

authors:
  - Harald Kirschner
  - Aaron Newton

requires:
  - /HtmlTable
  - /Element.Shortcuts
  - /Class.refactor

provides: [HtmlTable.Zebra]

...
*/

HtmlTable = Class.refactor(HtmlTable, {

	options: {
		classZebra: 'table-tr-odd',
		zebra: true,
		zebraOnlyVisibleRows: true
	},

	initialize: function(){
		this.previous.apply(this, arguments);
		if (this.occluded) return this.occluded;
		if (this.options.zebra) this.updateZebras();
	},

	updateZebras: function(){
		var index = 0;
		Array.each(this.body.rows, function(row){
			if (!this.options.zebraOnlyVisibleRows || row.isDisplayed()){
				this.zebra(row, index++);
			}
		}, this);
	},

	setRowStyle: function(row, i){
		if (this.previous) this.previous(row, i);
		this.zebra(row, i);
	},

	zebra: function(row, i){
		return row[((i % 2) ? 'remove' :
'add')+'Class'](this.options.classZebra);
	},

	push: function(){
		var pushed = this.previous.apply(this, arguments);
		if (this.options.zebra) this.updateZebras();
		return pushed;
	}

});


/*
---

script: HtmlTable.Sort.js

name: HtmlTable.Sort

description: Builds a stripy, sortable table with methods to add rows.

license: MIT-style license

authors:
  - Harald Kirschner
  - Aaron Newton
  - Jacob Thornton

requires:
  - Core/Hash
  - /HtmlTable
  - /Class.refactor
  - /Element.Delegation
  - /String.Extras
  - /Date

provides: [HtmlTable.Sort]

...
*/

HtmlTable = Class.refactor(HtmlTable, {

	options: {/*
		onSort: function(){}, */
		sortIndex: 0,
		sortReverse: false,
		parsers: [],
		defaultParser: 'string',
		classSortable: 'table-sortable',
		classHeadSort: 'table-th-sort',
		classHeadSortRev: 'table-th-sort-rev',
		classNoSort: 'table-th-nosort',
		classGroupHead: 'table-tr-group-head',
		classGroup: 'table-tr-group',
		classCellSort: 'table-td-sort',
		classSortSpan: 'table-th-sort-span',
		sortable: false,
		thSelector: 'th'
	},

	initialize: function (){
		this.previous.apply(this, arguments);
		if (this.occluded) return this.occluded;
		this.sorted = {index: null, dir: 1};
		if (!this.bound) this.bound = {};
		this.bound.headClick = this.headClick.bind(this);
		this.sortSpans = new Elements();
		if (this.options.sortable){
			this.enableSort();
			if (this.options.sortIndex != null) this.sort(this.options.sortIndex,
this.options.sortReverse);
		}
	},

	attachSorts: function(attach){
		this.detachSorts();
		if (attach !== false) this.element.addEvent('click:relay(' +
this.options.thSelector + ')', this.bound.headClick);
	},

	detachSorts: function(){
		this.element.removeEvents('click:relay(' +
this.options.thSelector + ')');
	},

	setHeaders: function(){
		this.previous.apply(this, arguments);
		if (this.sortEnabled) this.setParsers();
	},

	setParsers: function(){
		this.parsers = this.detectParsers();
	},

	detectParsers: function(){
		return this.head &&
this.head.getElements(this.options.thSelector).flatten().map(this.detectParser,
this);
	},

	detectParser: function(cell, index){
		if (cell.hasClass(this.options.classNoSort) ||
cell.retrieve('htmltable-parser')) return
cell.retrieve('htmltable-parser');
		var thDiv = new Element('div');
		thDiv.adopt(cell.childNodes).inject(cell);
		var sortSpan = new Element('span', {'class':
this.options.classSortSpan}).inject(thDiv, 'top');
		this.sortSpans.push(sortSpan);
		var parser = this.options.parsers[index],
			rows = this.body.rows,
			cancel;
		switch (typeOf(parser)){
			case 'function': parser = {convert: parser}; cancel = true;
break;
			case 'string': parser = parser; cancel = true; break;
		}
		if (!cancel){
			HtmlTable.ParserPriority.some(function(parserName){
				var current = HtmlTable.Parsers[parserName],
					match = current.match;
				if (!match) return false;
				for (var i = 0, j = rows.length; i < j; i++){
					var cell = document.id(rows[i].cells[index]),
						text = cell ? cell.get('html').clean() : '';
					if (text && match.test(text)){
						parser = current;
						return true;
					}
				}
			});
		}
		if (!parser) parser = this.options.defaultParser;
		cell.store('htmltable-parser', parser);
		return parser;
	},

	headClick: function(event, el){
		if (!this.head || el.hasClass(this.options.classNoSort)) return;
		return
this.sort(Array.indexOf(this.head.getElements(this.options.thSelector).flatten(),
el) % this.body.rows[0].cells.length);
	},

	serialize: function(){
		var previousSerialization = this.previous.apply(this, arguments) || {};
		if (this.options.sortable){
			previousSerialization.sortIndex = this.sorted.index;
			previousSerialization.sortReverse = this.sorted.reverse;
		}
		return previousSerialization;
	},

	restore: function(tableState){
		if (this.options.sortable && tableState.sortIndex){
			this.sort(tableState.sortIndex, tableState.sortReverse);
		}
		this.previous.apply(this, arguments);
	},

	setSortedState: function(index, reverse){
		if (reverse != null) this.sorted.reverse = reverse;
		else if (this.sorted.index == index) this.sorted.reverse =
!this.sorted.reverse;
		else this.sorted.reverse = this.sorted.index == null;

		if (index != null) this.sorted.index = index;
	},

	setHeadSort: function(sorted){
		var head = $$(!this.head.length ? this.head.cells[this.sorted.index] :
this.head.map(function(row){
			return row.getElements(this.options.thSelector)[this.sorted.index];
		}, this).clean());
		if (!head.length) return;
		if (sorted){
			head.addClass(this.options.classHeadSort);
			if (this.sorted.reverse) head.addClass(this.options.classHeadSortRev);
			else head.removeClass(this.options.classHeadSortRev);
		} else {
			head.removeClass(this.options.classHeadSort).removeClass(this.options.classHeadSortRev);
		}
	},

	setRowSort: function(data, pre){
		var count = data.length,
			body = this.body,
			group,
			rowIndex;

		while (count){
			var item = data[--count],
				position = item.position,
				row = body.rows[position];

			if (row.disabled) continue;
			if (!pre){
				group = this.setGroupSort(group, row, item);
				this.setRowStyle(row, count);
			}
			body.appendChild(row);

			for (rowIndex = 0; rowIndex < count; rowIndex++){
				if (data[rowIndex].position > position) data[rowIndex].position--;
			}
		}
	},

	setRowStyle: function(row, i){
		this.previous(row, i);
		row.cells[this.sorted.index].addClass(this.options.classCellSort);
	},

	setGroupSort: function(group, row, item){
		if (group == item.value)
row.removeClass(this.options.classGroupHead).addClass(this.options.classGroup);
		else
row.removeClass(this.options.classGroup).addClass(this.options.classGroupHead);
		return item.value;
	},

	getParser: function(){
		var parser = this.parsers[this.sorted.index];
		return typeOf(parser) == 'string' ? HtmlTable.Parsers[parser] :
parser;
	},

	sort: function(index, reverse, pre){
		if (!this.head) return;

		if (!pre){
			this.clearSort();
			this.setSortedState(index, reverse);
			this.setHeadSort(true);
		}

		var parser = this.getParser();
		if (!parser) return;

		var rel;
		if (!Browser.ie){
			rel = this.body.getParent();
			this.body.dispose();
		}

		var data = this.parseData(parser).sort(function(a, b){
			if (a.value === b.value) return 0;
			return a.value > b.value ? 1 : -1;
		});

		if (this.sorted.reverse == (parser ==
HtmlTable.Parsers['input-checked'])) data.reverse(true);
		this.setRowSort(data, pre);

		if (rel) rel.grab(this.body);
		this.fireEvent('stateChanged');
		return this.fireEvent('sort', [this.body, this.sorted.index]);
	},

	parseData: function(parser){
		return Array.map(this.body.rows, function(row, i){
			var value =
parser.convert.call(document.id(row.cells[this.sorted.index]));
			return {
				position: i,
				value: value
			};
		}, this);
	},

	clearSort: function(){
		this.setHeadSort(false);
		this.body.getElements('td').removeClass(this.options.classCellSort);
	},

	reSort: function(){
		if (this.sortEnabled) this.sort.call(this, this.sorted.index,
this.sorted.reverse);
		return this;
	},

	enableSort: function(){
		this.element.addClass(this.options.classSortable);
		this.attachSorts(true);
		this.setParsers();
		this.sortEnabled = true;
		return this;
	},

	disableSort: function(){
		this.element.removeClass(this.options.classSortable);
		this.attachSorts(false);
		this.sortSpans.each(function(span){
			span.destroy();
		});
		this.sortSpans.empty();
		this.sortEnabled = false;
		return this;
	}

});

HtmlTable.ParserPriority = ['date', 'input-checked',
'input-value', 'float', 'number'];

HtmlTable.Parsers = {

	'date': {
		match: /^\d{2}[-\/ ]\d{2}[-\/ ]\d{2,4}$/,
		convert: function(){
			var d = Date.parse(this.get('text').stripTags());
			return (typeOf(d) == 'date') ? d.format('db') :
'';
		},
		type: 'date'
	},
	'input-checked': {
		match: / type="(radio|checkbox)" /,
		convert: function(){
			return this.getElement('input').checked;
		}
	},
	'input-value': {
		match: /<input/,
		convert: function(){
			return this.getElement('input').value;
		}
	},
	'number': {
		match: /^\d+[^\d.,]*$/,
		convert: function(){
			return this.get('text').stripTags().toInt();
		},
		number: true
	},
	'numberLax': {
		match: /^[^\d]+\d+$/,
		convert: function(){
			return this.get('text').replace(/[^-?^0-9]/,
'').stripTags().toInt();
		},
		number: true
	},
	'float': {
		match: /^[\d]+\.[\d]+/,
		convert: function(){
			return this.get('text').replace(/[^-?^\d.]/,
'').stripTags().toFloat();
		},
		number: true
	},
	'floatLax': {
		match: /^[^\d]+[\d]+\.[\d]+$/,
		convert: function(){
			return this.get('text').replace(/[^-?^\d.]/,
'').stripTags();
		},
		number: true
	},
	'string': {
		match: null,
		convert: function(){
			return this.get('text').stripTags().toLowerCase();
		}
	},
	'title': {
		match: null,
		convert: function(){
			return this.title;
		}
	}

};



HtmlTable.defineParsers = function(parsers){
	HtmlTable.Parsers = Object.append(HtmlTable.Parsers, parsers);
	for (var parser in parsers){
		HtmlTable.ParserPriority.unshift(parser);
	}
};


/*
---

script: Keyboard.js

name: Keyboard

description: KeyboardEvents used to intercept events on a class for
keyboard and format modifiers in a specific order so as to make alt+shift+c
the same as shift+alt+c.

license: MIT-style license

authors:
  - Perrin Westrich
  - Aaron Newton
  - Scott Kyle

requires:
  - Core/Events
  - Core/Options
  - Core/Element.Event
  - Element.Event.Pseudos.Keys

provides: [Keyboard]

...
*/

(function(){

	var Keyboard = this.Keyboard = new Class({

		Extends: Events,

		Implements: [Options],

		options: {/*
			onActivate: function(){},
			onDeactivate: function(){},*/
			defaultEventType: 'keydown',
			active: false,
			manager: null,
			events: {},
			nonParsedEvents: ['activate', 'deactivate',
'onactivate', 'ondeactivate', 'changed',
'onchanged']
		},

		initialize: function(options){
			if (options && options.manager){
				this._manager = options.manager;
				delete options.manager;
			}
			this.setOptions(options);
			this._setup();
		},

		addEvent: function(type, fn, internal){
			return this.parent(Keyboard.parse(type, this.options.defaultEventType,
this.options.nonParsedEvents), fn, internal);
		},

		removeEvent: function(type, fn){
			return this.parent(Keyboard.parse(type, this.options.defaultEventType,
this.options.nonParsedEvents), fn);
		},

		toggleActive: function(){
			return this[this.isActive() ? 'deactivate' :
'activate']();
		},

		activate: function(instance){
			if (instance){
				if (instance.isActive()) return this;
				//if we're stealing focus, store the last keyboard to have it so
the relinquish command works
				if (this._activeKB && instance != this._activeKB){
					this.previous = this._activeKB;
					this.previous.fireEvent('deactivate');
				}
				//if we're enabling a child, assign it so that events are now
passed to it
				this._activeKB = instance.fireEvent('activate');
				Keyboard.manager.fireEvent('changed');
			} else if (this._manager){
				//else we're enabling ourselves, we must ask our parent to do it
for us
				this._manager.activate(this);
			}
			return this;
		},

		isActive: function(){
			return this._manager ? (this._manager._activeKB == this) :
(Keyboard.manager == this);
		},

		deactivate: function(instance){
			if (instance){
				if (instance === this._activeKB){
					this._activeKB = null;
					instance.fireEvent('deactivate');
					Keyboard.manager.fireEvent('changed');
				}
			} else if (this._manager){
				this._manager.deactivate(this);
			}
			return this;
		},

		relinquish: function(){
			if (this.isActive() && this._manager &&
this._manager.previous) this._manager.activate(this._manager.previous);
			else this.deactivate();
			return this;
		},

		//management logic
		manage: function(instance){
			if (instance._manager) instance._manager.drop(instance);
			this._instances.push(instance);
			instance._manager = this;
			if (!this._activeKB) this.activate(instance);
			return this;
		},

		drop: function(instance){
			instance.relinquish();
			this._instances.erase(instance);
			if (this._activeKB == instance){
				if (this.previous && this._instances.contains(this.previous))
this.activate(this.previous);
				else this._activeKB = this._instances[0];
			}
			return this;
		},

		trace: function(){
			Keyboard.trace(this);
		},

		each: function(fn){
			Keyboard.each(this, fn);
		},

		/*
			PRIVATE METHODS
		*/

		_instances: [],

		_disable: function(instance){
			if (this._activeKB == instance) this._activeKB = null;
		},

		_setup: function(){
			this.addEvents(this.options.events);
			//if this is the root manager, nothing manages it
			if (Keyboard.manager && !this._manager)
Keyboard.manager.manage(this);
			if (this.options.active) this.activate();
			else this.relinquish();
		},

		_handle: function(event, type){
			//Keyboard.stop(event) prevents key propagation
			if (event.preventKeyboardPropagation) return;

			var bubbles = !!this._manager;
			if (bubbles && this._activeKB){
				this._activeKB._handle(event, type);
				if (event.preventKeyboardPropagation) return;
			}
			this.fireEvent(type, event);

			if (!bubbles && this._activeKB) this._activeKB._handle(event,
type);
		}

	});

	var parsed = {};
	var modifiers = ['shift', 'control', 'alt',
'meta'];
	var regex = /^(?:shift|control|ctrl|alt|meta)$/;

	Keyboard.parse = function(type, eventType, ignore){
		if (ignore && ignore.contains(type.toLowerCase())) return type;

		type = type.toLowerCase().replace(/^(keyup|keydown):/, function($0, $1){
			eventType = $1;
			return '';
		});

		if (!parsed[type]){
			var key, mods = {};
			type.split('+').each(function(part){
				if (regex.test(part)) mods[part] = true;
				else key = part;
			});

			mods.control = mods.control || mods.ctrl; // allow both control and ctrl

			var keys = [];
			modifiers.each(function(mod){
				if (mods[mod]) keys.push(mod);
			});

			if (key) keys.push(key);
			parsed[type] = keys.join('+');
		}

		return eventType + ':keys(' + parsed[type] + ')';
	};

	Keyboard.each = function(keyboard, fn){
		var current = keyboard || Keyboard.manager;
		while (current){
			fn.run(current);
			current = current._activeKB;
		}
	};

	Keyboard.stop = function(event){
		event.preventKeyboardPropagation = true;
	};

	Keyboard.manager = new Keyboard({
		active: true
	});

	Keyboard.trace = function(keyboard){
		keyboard = keyboard || Keyboard.manager;
		var hasConsole = window.console && console.log;
		if (hasConsole) console.log('the following items have focus:
');
		Keyboard.each(keyboard, function(current){
			if (hasConsole) console.log(document.id(current.widget) || current.wiget
|| current);
		});
	};

	var handler = function(event){
		var keys = [];
		modifiers.each(function(mod){
			if (event[mod]) keys.push(mod);
		});

		if (!regex.test(event.key)) keys.push(event.key);
		Keyboard.manager._handle(event, event.type + ':keys(' +
keys.join('+') + ')');
	};

	document.addEvents({
		'keyup': handler,
		'keydown': handler
	});

})();


/*
---

script: Keyboard.Extras.js

name: Keyboard.Extras

description: Enhances Keyboard by adding the ability to name and describe
keyboard shortcuts, and the ability to grab shortcuts by name and bind the
shortcut to different keys.

license: MIT-style license

authors:
  - Perrin Westrich

requires:
  - /Keyboard
  - /MooTools.More

provides: [Keyboard.Extras]

...
*/
Keyboard.prototype.options.nonParsedEvents.combine(['rebound',
'onrebound']);

Keyboard.implement({

	/*
		shortcut should be in the format of:
		{
			'keys': 'shift+s', // the default to add as an
event.
			'description': 'blah blah blah', // a brief
description of the functionality.
			'handler': function(){} // the event handler to run when keys
are pressed.
		}
	*/
	addShortcut: function(name, shortcut){
		this._shortcuts = this._shortcuts || [];
		this._shortcutIndex = this._shortcutIndex || {};

		shortcut.getKeyboard = Function.from(this);
		shortcut.name = name;
		this._shortcutIndex[name] = shortcut;
		this._shortcuts.push(shortcut);
		if (shortcut.keys) this.addEvent(shortcut.keys, shortcut.handler);
		return this;
	},

	addShortcuts: function(obj){
		for (var name in obj) this.addShortcut(name, obj[name]);
		return this;
	},

	removeShortcut: function(name){
		var shortcut = this.getShortcut(name);
		if (shortcut && shortcut.keys){
			this.removeEvent(shortcut.keys, shortcut.handler);
			delete this._shortcutIndex[name];
			this._shortcuts.erase(shortcut);
		}
		return this;
	},

	removeShortcuts: function(names){
		names.each(this.removeShortcut, this);
		return this;
	},

	getShortcuts: function(){
		return this._shortcuts || [];
	},

	getShortcut: function(name){
		return (this._shortcutIndex || {})[name];
	}

});

Keyboard.rebind = function(newKeys, shortcuts){
	Array.from(shortcuts).each(function(shortcut){
		shortcut.getKeyboard().removeEvent(shortcut.keys, shortcut.handler);
		shortcut.getKeyboard().addEvent(newKeys, shortcut.handler);
		shortcut.keys = newKeys;
		shortcut.getKeyboard().fireEvent('rebound');
	});
};


Keyboard.getActiveShortcuts = function(keyboard){
	var activeKBS = [], activeSCS = [];
	Keyboard.each(keyboard, [].push.bind(activeKBS));
	activeKBS.each(function(kb){ activeSCS.extend(kb.getShortcuts()); });
	return activeSCS;
};

Keyboard.getShortcut = function(name, keyboard, opts){
	opts = opts || {};
	var shortcuts = opts.many ? [] : null,
		set = opts.many ? function(kb){
				var shortcut = kb.getShortcut(name);
				if (shortcut) shortcuts.push(shortcut);
			} : function(kb){
				if (!shortcuts) shortcuts = kb.getShortcut(name);
			};
	Keyboard.each(keyboard, set);
	return shortcuts;
};

Keyboard.getShortcuts = function(name, keyboard){
	return Keyboard.getShortcut(name, keyboard, { many: true });
};


/*
---

script: HtmlTable.Select.js

name: HtmlTable.Select

description: Builds a stripy, sortable table with methods to add rows. Rows
can be selected with the mouse or keyboard navigation.

license: MIT-style license

authors:
  - Harald Kirschner
  - Aaron Newton

requires:
  - /Keyboard
  - /Keyboard.Extras
  - /HtmlTable
  - /Class.refactor
  - /Element.Delegation
  - /Element.Shortcuts

provides: [HtmlTable.Select]

...
*/

HtmlTable = Class.refactor(HtmlTable, {

	options: {
		/*onRowFocus: function(){},
		onRowUnfocus: function(){},*/
		useKeyboard: true,
		classRowSelected: 'table-tr-selected',
		classRowHovered: 'table-tr-hovered',
		classSelectable: 'table-selectable',
		shiftForMultiSelect: true,
		allowMultiSelect: true,
		selectable: false,
		selectHiddenRows: false
	},

	initialize: function(){
		this.previous.apply(this, arguments);
		if (this.occluded) return this.occluded;

		this.selectedRows = new Elements();

		if (!this.bound) this.bound = {};
		this.bound.mouseleave = this.mouseleave.bind(this);
		this.bound.clickRow = this.clickRow.bind(this);
		this.bound.activateKeyboard = function(){
			if (this.keyboard && this.selectEnabled)
this.keyboard.activate();
		}.bind(this);

		if (this.options.selectable) this.enableSelect();
	},

	empty: function(){
		this.selectNone();
		return this.previous();
	},

	enableSelect: function(){
		this.selectEnabled = true;
		this.attachSelects();
		this.element.addClass(this.options.classSelectable);
		return this;
	},

	disableSelect: function(){
		this.selectEnabled = false;
		this.attachSelects(false);
		this.element.removeClass(this.options.classSelectable);
		return this;
	},

	push: function(){
		var ret = this.previous.apply(this, arguments);
		this.updateSelects();
		return ret;
	},

	toggleRow: function(row){
		return this[(this.isSelected(row) ? 'de' : '') +
'selectRow'](row);
	},

	selectRow: function(row, _nocheck){
		//private variable _nocheck: boolean whether or not to confirm the row is
in the table body
		//added here for optimization when selecting ranges
		if (this.isSelected(row) || (!_nocheck &&
!this.body.getChildren().contains(row))) return;
		if (!this.options.allowMultiSelect) this.selectNone();

		if (!this.isSelected(row)){
			this.selectedRows.push(row);
			row.addClass(this.options.classRowSelected);
			this.fireEvent('rowFocus', [row, this.selectedRows]);
			this.fireEvent('stateChanged');
		}

		this.focused = row;
		document.clearSelection();

		return this;
	},

	isSelected: function(row){
		return this.selectedRows.contains(row);
	},

	getSelected: function(){
		return this.selectedRows;
	},

	getSelected: function(){
		return this.selectedRows;
	},

	serialize: function(){
		var previousSerialization = this.previous.apply(this, arguments) || {};
		if (this.options.selectable){
			previousSerialization.selectedRows =
this.selectedRows.map(function(row){
				return Array.indexOf(this.body.rows, row);
			}.bind(this));
		}
		return previousSerialization;
	},

	restore: function(tableState){
		if (this.options.selectable && tableState.selectedRows){
			tableState.selectedRows.each(function(index){
				this.selectRow(this.body.rows[index]);
			}.bind(this));
		}
		this.previous.apply(this, arguments);
	},

	deselectRow: function(row, _nocheck){
		if (!this.isSelected(row) || (!_nocheck &&
!this.body.getChildren().contains(row))) return;

		this.selectedRows = new
Elements(Array.from(this.selectedRows).erase(row));
		row.removeClass(this.options.classRowSelected);
		this.fireEvent('rowUnfocus', [row, this.selectedRows]);
		this.fireEvent('stateChanged');
		return this;
	},

	selectAll: function(selectNone){
		if (!selectNone && !this.options.allowMultiSelect) return;
		this.selectRange(0, this.body.rows.length, selectNone);
		return this;
	},

	selectNone: function(){
		return this.selectAll(true);
	},

	selectRange: function(startRow, endRow, _deselect){
		if (!this.options.allowMultiSelect && !_deselect) return;
		var method = _deselect ? 'deselectRow' : 'selectRow',
			rows = Array.clone(this.body.rows);

		if (typeOf(startRow) == 'element') startRow =
rows.indexOf(startRow);
		if (typeOf(endRow) == 'element') endRow = rows.indexOf(endRow);
		endRow = endRow < rows.length - 1 ? endRow : rows.length - 1;

		if (endRow < startRow){
			var tmp = startRow;
			startRow = endRow;
			endRow = tmp;
		}

		for (var i = startRow; i <= endRow; i++){
			if (this.options.selectHiddenRows || rows[i].isDisplayed())
this[method](rows[i], true);
		}

		return this;
	},

	deselectRange: function(startRow, endRow){
		this.selectRange(startRow, endRow, true);
	},

	getSelected: function(){
		return this.selectedRows;
	},

/*
	Private methods:
*/

	enterRow: function(row){
		if (this.hovered) this.hovered = this.leaveRow(this.hovered);
		this.hovered = row.addClass(this.options.classRowHovered);
	},

	leaveRow: function(row){
		row.removeClass(this.options.classRowHovered);
	},

	updateSelects: function(){
		Array.each(this.body.rows, function(row){
			var binders = row.retrieve('binders');
			if (!binders && !this.selectEnabled) return;
			if (!binders){
				binders = {
					mouseenter: this.enterRow.pass([row], this),
					mouseleave: this.leaveRow.pass([row], this)
				};
				row.store('binders', binders);
			}
			if (this.selectEnabled) row.addEvents(binders);
			else row.removeEvents(binders);
		}, this);
	},

	shiftFocus: function(offset, event){
		if (!this.focused) return this.selectRow(this.body.rows[0], event);
		var to = this.getRowByOffset(offset, this.options.selectHiddenRows);
		if (to === null || this.focused == this.body.rows[to]) return this;
		this.toggleRow(this.body.rows[to], event);
	},

	clickRow: function(event, row){
		var selecting = (event.shift || event.meta || event.control) &&
this.options.shiftForMultiSelect;
		if (!selecting && !(event.rightClick &&
this.isSelected(row) && this.options.allowMultiSelect))
this.selectNone();

		if (event.rightClick) this.selectRow(row);
		else this.toggleRow(row);

		if (event.shift){
			this.selectRange(this.rangeStart || this.body.rows[0], row,
this.rangeStart ? !this.isSelected(row) : true);
			this.focused = row;
		}
		this.rangeStart = row;
	},

	getRowByOffset: function(offset, includeHiddenRows){
		if (!this.focused) return 0;
		var index = Array.indexOf(this.body.rows, this.focused);
		if ((index == 0 && offset < 0) || (index ==
this.body.rows.length -1 && offset > 0)) return null;
		if (includeHiddenRows){
			index += offset;
		} else {
			var limit = 0,
			    count = 0;
			if (offset > 0){
				while (count < offset && index < this.body.rows.length
-1){
					if (this.body.rows[++index].isDisplayed()) count++;
				}
			} else {
				while (count > offset && index > 0){
					if (this.body.rows[--index].isDisplayed()) count--;
				}
			}
		}
		return index;
	},

	attachSelects: function(attach){
		attach = attach != null ? attach : true;

		var method = attach ? 'addEvents' : 'removeEvents';
		this.element[method]({
			mouseleave: this.bound.mouseleave,
			click: this.bound.activateKeyboard
		});

		this.body[method]({
			'click:relay(tr)': this.bound.clickRow,
			'contextmenu:relay(tr)': this.bound.clickRow
		});

		if (this.options.useKeyboard || this.keyboard){
			if (!this.keyboard) this.keyboard = new Keyboard();
			if (!this.selectKeysDefined){
				this.selectKeysDefined = true;
				var timer, held;

				var move = function(offset){
					var mover = function(e){
						clearTimeout(timer);
						e.preventDefault();
						var to = this.body.rows[this.getRowByOffset(offset,
this.options.selectHiddenRows)];
						if (e.shift && to && this.isSelected(to)){
							this.deselectRow(this.focused);
							this.focused = to;
						} else {
							if (to && (!this.options.allowMultiSelect || !e.shift)){
								this.selectNone();
							}
							this.shiftFocus(offset, e);
						}

						if (held){
							timer = mover.delay(100, this, e);
						} else {
							timer = (function(){
								held = true;
								mover(e);
							}).delay(400);
						}
					}.bind(this);
					return mover;
				}.bind(this);

				var clear = function(){
					clearTimeout(timer);
					held = false;
				};

				this.keyboard.addEvents({
					'keydown:shift+up': move(-1),
					'keydown:shift+down': move(1),
					'keyup:shift+up': clear,
					'keyup:shift+down': clear,
					'keyup:up': clear,
					'keyup:down': clear
				});

				var shiftHint = '';
				if (this.options.allowMultiSelect &&
this.options.shiftForMultiSelect && this.options.useKeyboard){
					shiftHint = " (Shift multi-selects).";
				}

				this.keyboard.addShortcuts({
					'Select Previous Row': {
						keys: 'up',
						shortcut: 'up arrow',
						handler: move(-1),
						description: 'Select the previous row in the table.' +
shiftHint
					},
					'Select Next Row': {
						keys: 'down',
						shortcut: 'down arrow',
						handler: move(1),
						description: 'Select the next row in the table.' +
shiftHint
					}
				});

			}
			this.keyboard[attach ? 'activate' : 'deactivate']();
		}
		this.updateSelects();
	},

	mouseleave: function(){
		if (this.hovered) this.leaveRow(this.hovered);
	}

});


/*
---

script: Scroller.js

name: Scroller

description: Class which scrolls the contents of any Element (including the
window) when the mouse reaches the Element's boundaries.

license: MIT-style license

authors:
  - Valerio Proietti

requires:
  - Core/Events
  - Core/Options
  - Core/Element.Event
  - Core/Element.Dimensions
  - MooTools.More

provides: [Scroller]

...
*/

var Scroller = new Class({

	Implements: [Events, Options],

	options: {
		area: 20,
		velocity: 1,
		onChange: function(x, y){
			this.element.scrollTo(x, y);
		},
		fps: 50
	},

	initialize: function(element, options){
		this.setOptions(options);
		this.element = document.id(element);
		this.docBody = document.id(this.element.getDocument().body);
		this.listener = (typeOf(this.element) != 'element') ?
this.docBody : this.element;
		this.timer = null;
		this.bound = {
			attach: this.attach.bind(this),
			detach: this.detach.bind(this),
			getCoords: this.getCoords.bind(this)
		};
	},

	start: function(){
		this.listener.addEvents({
			mouseover: this.bound.attach,
			mouseleave: this.bound.detach
		});
		return this;
	},

	stop: function(){
		this.listener.removeEvents({
			mouseover: this.bound.attach,
			mouseleave: this.bound.detach
		});
		this.detach();
		this.timer = clearInterval(this.timer);
		return this;
	},

	attach: function(){
		this.listener.addEvent('mousemove', this.bound.getCoords);
	},

	detach: function(){
		this.listener.removeEvent('mousemove', this.bound.getCoords);
		this.timer = clearInterval(this.timer);
	},

	getCoords: function(event){
		this.page = (this.listener.get('tag') == 'body') ?
event.client : event.page;
		if (!this.timer) this.timer = this.scroll.periodical(Math.round(1000 /
this.options.fps), this);
	},

	scroll: function(){
		var size = this.element.getSize(),
			scroll = this.element.getScroll(),
			pos = this.element != this.docBody ? this.element.getOffsets() : {x: 0,
y:0},
			scrollSize = this.element.getScrollSize(),
			change = {x: 0, y: 0},
			top = this.options.area.top || this.options.area,
			bottom = this.options.area.bottom || this.options.area;
		for (var z in this.page){
			if (this.page[z] < (top + pos[z]) && scroll[z] != 0){
				change[z] = (this.page[z] - top - pos[z]) * this.options.velocity;
			} else if (this.page[z] + bottom > (size[z] + pos[z]) &&
scroll[z] + size[z] != scrollSize[z]){
				change[z] = (this.page[z] - size[z] + bottom - pos[z]) *
this.options.velocity;
			}
			change[z] = change[z].round();
		}
		if (change.y || change.x) this.fireEvent('change', [scroll.x +
change.x, scroll.y + change.y]);
	}

});


/*
---

script: Tips.js

name: Tips

description: Class for creating nice tips that follow the mouse cursor when
hovering an element.

license: MIT-style license

authors:
  - Valerio Proietti
  - Christoph Pojer
  - Luis Merino

requires:
  - Core/Options
  - Core/Events
  - Core/Element.Event
  - Core/Element.Style
  - Core/Element.Dimensions
  - /MooTools.More

provides: [Tips]

...
*/

(function(){

var read = function(option, element){
	return (option) ? (typeOf(option) == 'function' ?
option(element) : element.get(option)) : '';
};

this.Tips = new Class({

	Implements: [Events, Options],

	options: {/*
		id: null,
		onAttach: function(element){},
		onDetach: function(element){},
		onBound: function(coords){},*/
		onShow: function(){
			this.tip.setStyle('display', 'block');
		},
		onHide: function(){
			this.tip.setStyle('display', 'none');
		},
		title: 'title',
		text: function(element){
			return element.get('rel') || element.get('href');
		},
		showDelay: 100,
		hideDelay: 100,
		className: 'tip-wrap',
		offset: {x: 16, y: 16},
		windowPadding: {x:0, y:0},
		fixed: false,
		waiAria: true
	},

	initialize: function(){
		var params = Array.link(arguments, {
			options: Type.isObject,
			elements: function(obj){
				return obj != null;
			}
		});
		this.setOptions(params.options);
		if (params.elements) this.attach(params.elements);
		this.container = new Element('div', {'class':
'tip'});

		if (this.options.id){
			this.container.set('id', this.options.id);
			if (this.options.waiAria) this.attachWaiAria();
		}
	},

	toElement: function(){
		if (this.tip) return this.tip;

		this.tip = new Element('div', {
			'class': this.options.className,
			styles: {
				position: 'absolute',
				top: 0,
				left: 0
			}
		}).adopt(
			new Element('div', {'class': 'tip-top'}),
			this.container,
			new Element('div', {'class':
'tip-bottom'})
		);

		return this.tip;
	},

	attachWaiAria: function(){
		var id = this.options.id;
		this.container.set('role', 'tooltip');

		if (!this.waiAria){
			this.waiAria = {
				show: function(element){
					if (id) element.set('aria-describedby', id);
					this.container.set('aria-hidden', 'false');
				},
				hide: function(element){
					if (id) element.erase('aria-describedby');
					this.container.set('aria-hidden', 'true');
				}
			};
		}
		this.addEvents(this.waiAria);
	},

	detachWaiAria: function(){
		if (this.waiAria){
			this.container.erase('role');
			this.container.erase('aria-hidden');
			this.removeEvents(this.waiAria);
		}
	},

	attach: function(elements){
		$$(elements).each(function(element){
			var title = read(this.options.title, element),
				text = read(this.options.text, element);

			element.set('title',
'').store('tip:native',
title).retrieve('tip:title', title);
			element.retrieve('tip:text', text);
			this.fireEvent('attach', [element]);

			var events = ['enter', 'leave'];
			if (!this.options.fixed) events.push('move');

			events.each(function(value){
				var event = element.retrieve('tip:' + value);
				if (!event) event = function(event){
					this['element' + value.capitalize()].apply(this, [event,
element]);
				}.bind(this);

				element.store('tip:' + value,
event).addEvent('mouse' + value, event);
			}, this);
		}, this);

		return this;
	},

	detach: function(elements){
		$$(elements).each(function(element){
			['enter', 'leave',
'move'].each(function(value){
				element.removeEvent('mouse' + value,
element.retrieve('tip:' + value)).eliminate('tip:' +
value);
			});

			this.fireEvent('detach', [element]);

			if (this.options.title == 'title'){ // This is necessary to
check if we can revert the title
				var original = element.retrieve('tip:native');
				if (original) element.set('title', original);
			}
		}, this);

		return this;
	},

	elementEnter: function(event, element){
		clearTimeout(this.timer);
		this.timer = (function(){
			this.container.empty();

			['title', 'text'].each(function(value){
				var content = element.retrieve('tip:' + value);
				var div = this['_' + value + 'Element'] = new
Element('div', {
						'class': 'tip-' + value
					}).inject(this.container);
				if (content) this.fill(div, content);
			}, this);
			this.show(element);
			this.position((this.options.fixed) ? {page: element.getPosition()} :
event);
		}).delay(this.options.showDelay, this);
	},

	elementLeave: function(event, element){
		clearTimeout(this.timer);
		this.timer = this.hide.delay(this.options.hideDelay, this, element);
		this.fireForParent(event, element);
	},

	setTitle: function(title){
		if (this._titleElement){
			this._titleElement.empty();
			this.fill(this._titleElement, title);
		}
		return this;
	},

	setText: function(text){
		if (this._textElement){
			this._textElement.empty();
			this.fill(this._textElement, text);
		}
		return this;
	},

	fireForParent: function(event, element){
		element = element.getParent();
		if (!element || element == document.body) return;
		if (element.retrieve('tip:enter'))
element.fireEvent('mouseenter', event);
		else this.fireForParent(event, element);
	},

	elementMove: function(event, element){
		this.position(event);
	},

	position: function(event){
		if (!this.tip) document.id(this);

		var size = window.getSize(), scroll = window.getScroll(),
			tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight},
			props = {x: 'left', y: 'top'},
			bounds = {y: false, x2: false, y2: false, x: false},
			obj = {};

		for (var z in props){
			obj[props[z]] = event.page[z] + this.options.offset[z];
			if (obj[props[z]] < 0) bounds[z] = true;
			if ((obj[props[z]] + tip[z] - scroll[z]) > size[z] -
this.options.windowPadding[z]){
				obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z];
				bounds[z+'2'] = true;
			}
		}

		this.fireEvent('bound', bounds);
		this.tip.setStyles(obj);
	},

	fill: function(element, contents){
		if (typeof contents == 'string') element.set('html',
contents);
		else element.adopt(contents);
	},

	show: function(element){
		if (!this.tip) document.id(this);
		if (!this.tip.getParent()) this.tip.inject(document.body);
		this.fireEvent('show', [this.tip, element]);
	},

	hide: function(element){
		if (!this.tip) document.id(this);
		this.fireEvent('hide', [this.tip, element]);
	}

});

})();


/*
---

script: Locale.Set.From.js

name: Locale.Set.From

description: Provides an alternative way to create Locale.Set objects.

license: MIT-style license

authors:
  - Tim Wienk

requires:
  - Core/JSON
  - /Locale

provides: Locale.Set.From

...
*/

(function(){

var parsers = {
	'json': JSON.decode
};

Locale.Set.defineParser = function(name, fn){
	parsers[name] = fn;
};

Locale.Set.from = function(set, type){
	if (instanceOf(set, Locale.Set)) return set;

	if (!type && typeOf(set) == 'string') type =
'json';
	if (parsers[type]) set = parsers[type](set);

	var locale = new Locale.Set;

	locale.sets = set.sets || {};

	if (set.inherits){
		locale.inherits.locales = Array.from(set.inherits.locales);
		locale.inherits.sets = set.inherits.sets || {};
	}

	return locale;
};

})();


/*
---

name: Locale.ar.Date

description: Date messages for Arabic.

license: MIT-style license

authors:
  - Chafik Barbar

requires:
  - /Locale

provides: [Locale.ar.Date]

...
*/

Locale.define('ar', 'Date', {

	// Culture's date order: DD/MM/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d/%m/%Y',
	shortTime: '%H:%M'

});


/*
---

name: Locale.ar.Form.Validator

description: Form Validator messages for Arabic.

license: MIT-style license

authors:
  - Chafik Barbar

requires:
  - /Locale

provides: [Locale.ar.Form.Validator]

...
*/

Locale.define('ar', 'FormValidator', {

	required: 'هذا الحقل مطلوب.',
	minLength: 'رجاءً إدخال {minLength} أحرف على
الأقل (تم إدخال {length} أحرف).',
	maxLength: 'الرجاء عدم إدخال أكثر من {maxLength}
أحرف (تم إدخال {length} أحرف).',
	integer: 'الرجاء إدخال عدد صحيح في هذا
الحقل. أي رقم ذو كسر عشري أو مئوي (مثال 1.25 )
غير مسموح.',
	numeric: 'الرجاء إدخال قيم رقمية في هذا
الحقل (مثال "1" أو "1.1" أو "-1"
أو "-1.1").',
	digits: 'الرجاء أستخدام قيم رقمية وعلامات
ترقيمية فقط في هذا الحقل (مثال, رقم هاتف
مع نقطة أو شحطة)',
	alpha: 'الرجاء أستخدام أحرف فقط (ا-ي) في
هذا الحقل. أي فراغات أو علامات غير
مسموحة.',
	alphanum: 'الرجاء أستخدام أحرف فقط (ا-ي) أو
أرقام (0-9) فقط في هذا الحقل. أي فراغات أو
علامات غير مسموحة.',
	dateSuchAs: 'الرجاء إدخال تاريخ صحيح
كالتالي {date}',
	dateInFormatMDY: 'الرجاء إدخال تاريخ صحيح
(مثال, 31-12-1999)',
	email: 'الرجاء إدخال بريد إلكتروني
صحيح.',
	url: 'الرجاء إدخال عنوان إلكتروني صحيح
مثل http://www.example.com',
	currencyDollar: 'الرجاء إدخال قيمة $ صحيحة.
مثال, 100.00$',
	oneRequired: 'الرجاء إدخال قيمة في أحد هذه
الحقول على الأقل.',
	errorPrefix: 'خطأ: ',
	warningPrefix: 'تحذير: '

});


/*
---

name: Locale.ca-CA.Date

description: Date messages for Catalan.

license: MIT-style license

authors:
  - Ãlfons Sanchez

requires:
  - /Locale

provides: [Locale.ca-CA.Date]

...
*/

Locale.define('ca-CA', 'Date', {

	months: ['Gener', 'Febrer', 'Març',
'Abril', 'Maig', 'Juny', 'Juli',
'Agost', 'Setembre', 'Octubre',
'Novembre', 'Desembre'],
	months_abbr: ['gen.', 'febr.', 'març',
'abr.', 'maig', 'juny', 'jul.',
'ag.', 'set.', 'oct.', 'nov.',
'des.'],
	days: ['Diumenge', 'Dilluns', 'Dimarts',
'Dimecres', 'Dijous', 'Divendres',
'Dissabte'],
	days_abbr: ['dg', 'dl', 'dt',
'dc', 'dj', 'dv', 'ds'],

	// Culture's date order: DD/MM/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d/%m/%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 0,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: 'fa menys d`un minut',
	minuteAgo: 'fa un minut',
	minutesAgo: 'fa {delta} minuts',
	hourAgo: 'fa un hora',
	hoursAgo: 'fa unes {delta} hores',
	dayAgo: 'fa un dia',
	daysAgo: 'fa {delta} dies',

	lessThanMinuteUntil: 'menys d`un minut des d`ara',
	minuteUntil: 'un minut des d`ara',
	minutesUntil: '{delta} minuts des d`ara',
	hourUntil: 'un hora des d`ara',
	hoursUntil: 'unes {delta} hores des d`ara',
	dayUntil: '1 dia des d`ara',
	daysUntil: '{delta} dies des d`ara'

});


/*
---

name: Locale.ca-CA.Form.Validator

description: Form Validator messages for Catalan.

license: MIT-style license

authors:
  - Miquel Hudin
  - Ãlfons Sanchez

requires:
  - /Locale

provides: [Locale.ca-CA.Form.Validator]

...
*/

Locale.define('ca-CA', 'FormValidator', {

	required: 'Aquest camp es obligatori.',
	minLength: 'Per favor introdueix al menys {minLength} caracters (has
introduit {length} caracters).',
	maxLength: 'Per favor introdueix no mes de {maxLength} caracters (has
introduit {length} caracters).',
	integer: 'Per favor introdueix un nombre enter en aquest camp.
Nombres amb decimals (p.e. 1,25) no estan permesos.',
	numeric: 'Per favor introdueix sols valors numerics en aquest camp
(p.e. "1" o "1,1" o "-1" o
"-1,1").',
	digits: 'Per favor usa sols numeros i puntuacio en aquest camp (per
exemple, un nombre de telefon amb guions i punts no esta permes).',
	alpha: 'Per favor utilitza lletres nomes (a-z) en aquest camp. No
s´admiteixen espais ni altres caracters.',
	alphanum: 'Per favor, utilitza nomes lletres (a-z) o numeros (0-9) en
aquest camp. No s´admiteixen espais ni altres caracters.',
	dateSuchAs: 'Per favor introdueix una data valida com {date}',
	dateInFormatMDY: 'Per favor introdueix una data valida com DD/MM/YYYY
(p.e. "31/12/1999")',
	email: 'Per favor, introdueix una adreça de correu electronic
valida. Per exemple, "fred@domain.com".',
	url: 'Per favor introdueix una URL valida com
http://www.example.com.',
	currencyDollar: 'Per favor introdueix una quantitat valida de €.
Per exemple €100,00 .',
	oneRequired: 'Per favor introdueix alguna cosa per al menys una
d´aquestes entrades.',
	errorPrefix: 'Error: ',
	warningPrefix: 'Avis: ',

	// Form.Validator.Extras
	noSpace: 'No poden haver espais en aquesta entrada.',
	reqChkByNode: 'No hi han elements seleccionats.',
	requiredChk: 'Aquest camp es obligatori.',
	reqChkByName: 'Per favor selecciona una {label}.',
	match: 'Aquest camp necessita coincidir amb el camp
{matchName}',
	startDate: 'la data de inici',
	endDate: 'la data de fi',
	currendDate: 'la data actual',
	afterDate: 'La data deu ser igual o posterior a {label}.',
	beforeDate: 'La data deu ser igual o anterior a {label}.',
	startMonth: 'Per favor selecciona un mes d´orige',
	sameMonth: 'Aquestes dos dates deuen estar dins del mateix mes - deus
canviar una o altra.'

});


/*
---

name: Locale.cs-CZ.Date

description: Date messages for Czech.

license: MIT-style license

authors:
  - Jan Černý chemiX
  - Christopher Zukowski

requires:
  - /Locale

provides: [Locale.cs-CZ.Date]

...
*/
(function(){

// Czech language pluralization rules, see
http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
// one -> n is 1;            1
// few -> n in 2..4;         2-4
// other -> everything else  0, 5-999, 1.31, 2.31, 5.31...
var pluralize = function (n, one, few, other){
	if (n == 1) return one;
	else if (n == 2 || n == 3 || n == 4) return few;
	else return other;
};

Locale.define('cs-CZ', 'Date', {

	months: ['Leden', 'Únor', 'Březen',
'Duben', 'Květen', 'Červen',
'Červenec', 'Srpen', 'Září',
'Říjen', 'Listopad', 'Prosinec'],
	months_abbr: ['ledna', 'února', 'března',
'dubna', 'května', 'června',
'července', 'srpna', 'září',
'října', 'listopadu', 'prosince'],
	days: ['Neděle', 'Pondělí', 'Úterý',
'Středa', 'Čtvrtek', 'Pátek',
'Sobota'],
	days_abbr: ['ne', 'po', 'út',
'st', 'čt', 'pá', 'so'],

	// Culture's date order: DD.MM.YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d.%m.%Y',
	shortTime: '%H:%M',
	AM: 'dop.',
	PM: 'odp.',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '.',

	lessThanMinuteAgo: 'před chvílí',
	minuteAgo: 'přibližně před minutou',
	minutesAgo: function(delta){ return 'před {delta} ' +
pluralize(delta, 'minutou', 'minutami',
'minutami'); },
	hourAgo: 'přibližně před hodinou',
	hoursAgo: function(delta){ return 'před {delta} ' +
pluralize(delta, 'hodinou', 'hodinami',
'hodinami'); },
	dayAgo: 'před dnem',
	daysAgo: function(delta){ return 'před {delta} ' +
pluralize(delta, 'dnem', 'dny', 'dny'); },
	weekAgo: 'před týdnem',
	weeksAgo: function(delta){ return 'před {delta} ' +
pluralize(delta, 'týdnem', 'týdny',
'týdny'); },
	monthAgo: 'před měsícem',
	monthsAgo: function(delta){ return 'před {delta} ' +
pluralize(delta, 'měsícem', 'měsíci',
'měsíci'); },
	yearAgo: 'před rokem',
	yearsAgo: function(delta){ return 'před {delta} ' +
pluralize(delta, 'rokem', 'lety', 'lety'); },

	lessThanMinuteUntil: 'za chvíli',
	minuteUntil: 'přibližně za minutu',
	minutesUntil: function(delta){ return 'za {delta} ' +
pluralize(delta, 'minutu', 'minuty',
'minut'); },
	hourUntil: 'přibližně za hodinu',
	hoursUntil: function(delta){ return 'za {delta} ' +
pluralize(delta, 'hodinu', 'hodiny',
'hodin'); },
	dayUntil: 'za den',
	daysUntil: function(delta){ return 'za {delta} ' +
pluralize(delta, 'den', 'dny', 'dnů'); },
	weekUntil: 'za týden',
	weeksUntil: function(delta){ return 'za {delta} ' +
pluralize(delta, 'týden', 'týdny',
'týdnů'); },
	monthUntil: 'za měsíc',
	monthsUntil: function(delta){ return 'za {delta} ' +
pluralize(delta, 'měsíc', 'měsíce',
'měsíců'); },
	yearUntil: 'za rok',
	yearsUntil: function(delta){ return 'za {delta} ' +
pluralize(delta, 'rok', 'roky', 'let'); }
});

})();


/*
---

name: Locale.cs-CZ.Form.Validator

description: Form Validator messages for Czech.

license: MIT-style license

authors:
  - Jan Černý chemiX

requires:
  - /Locale

provides: [Locale.cs-CZ.Form.Validator]

...
*/

Locale.define('cs-CZ', 'FormValidator', {

	required: 'Tato položka je povinná.',
	minLength: 'Zadejte prosím alespoň {minLength} znaků (napsáno
{length} znaků).',
	maxLength: 'Zadejte prosím méně než {maxLength} znaků (nápsáno
{length} znaků).',
	integer: 'Zadejte prosím celé číslo. Desetinná čísla (např.
1.25) nejsou povolena.',
	numeric: 'Zadejte jen číselné hodnoty (tj. "1" nebo
"1.1" nebo "-1" nebo "-1.1").',
	digits: 'Zadejte prosím pouze čísla a interpunkční
znaménka(například telefonní číslo s pomlčkami nebo tečkami je
povoleno).',
	alpha: 'Zadejte prosím pouze písmena (a-z). Mezery nebo jiné znaky
nejsou povoleny.',
	alphanum: 'Zadejte prosím pouze písmena (a-z) nebo číslice (0-9).
Mezery nebo jiné znaky nejsou povoleny.',
	dateSuchAs: 'Zadejte prosím platné datum jako {date}',
	dateInFormatMDY: 'Zadejte prosím platné datum jako MM / DD / RRRR
(tj. "12/31/1999")',
	email: 'Zadejte prosím platnou e-mailovou adresu. Například
"fred@domain.com".',
	url: 'Zadejte prosím platnou URL adresu jako
http://www.example.com.',
	currencyDollar: 'Zadejte prosím platnou částku. Například
$100.00.',
	oneRequired: 'Zadejte prosím alespoň jednu hodnotu pro tyto
položky.',
	errorPrefix: 'Chyba: ',
	warningPrefix: 'Upozornění: ',

	// Form.Validator.Extras
	noSpace: 'V této položce nejsou povoleny mezery',
	reqChkByNode: 'Nejsou vybrány žádné položky.',
	requiredChk: 'Tato položka je vyžadována.',
	reqChkByName: 'Prosím vyberte {label}.',
	match: 'Tato položka se musí shodovat s položkou
{matchName}',
	startDate: 'datum zahájení',
	endDate: 'datum ukončení',
	currendDate: 'aktuální datum',
	afterDate: 'Datum by mělo být stejné nebo větší než
{label}.',
	beforeDate: 'Datum by mělo být stejné nebo menší než
{label}.',
	startMonth: 'Vyberte počáteční měsíc.',
	sameMonth: 'Tyto dva datumy musí být ve stejném měsíci -
změňte jeden z nich.',
	creditcard: 'Zadané číslo kreditní karty je neplatné. Prosím
opravte ho. Bylo zadáno {length} čísel.'

});


/*
---

name: Locale.da-DK.Date

description: Date messages for Danish.

license: MIT-style license

authors:
  - Martin Overgaard
  - Henrik Hansen

requires:
  - /Locale

provides: [Locale.da-DK.Date]

...
*/

Locale.define('da-DK', 'Date', {

	months: ['Januar', 'Februar', 'Marts',
'April', 'Maj', 'Juni', 'Juli',
'August', 'September', 'Oktober',
'November', 'December'],
	months_abbr: ['jan.', 'feb.', 'mar.',
'apr.', 'maj.', 'jun.', 'jul.',
'aug.', 'sep.', 'okt.', 'nov.',
'dec.'],
	days: ['Søndag', 'Mandag', 'Tirsdag',
'Onsdag', 'Torsdag', 'Fredag',
'Lørdag'],
	days_abbr: ['søn', 'man', 'tir',
'ons', 'tor', 'fre', 'lør'],

	// Culture's date order: DD-MM-YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d-%m-%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '.',

	lessThanMinuteAgo: 'mindre end et minut siden',
	minuteAgo: 'omkring et minut siden',
	minutesAgo: '{delta} minutter siden',
	hourAgo: 'omkring en time siden',
	hoursAgo: 'omkring {delta} timer siden',
	dayAgo: '1 dag siden',
	daysAgo: '{delta} dage siden',
	weekAgo: '1 uge siden',
	weeksAgo: '{delta} uger siden',
	monthAgo: '1 måned siden',
	monthsAgo: '{delta} måneder siden',
	yearAgo: '1 år siden',
	yearsAgo: '{delta} år siden',

	lessThanMinuteUntil: 'mindre end et minut fra nu',
	minuteUntil: 'omkring et minut fra nu',
	minutesUntil: '{delta} minutter fra nu',
	hourUntil: 'omkring en time fra nu',
	hoursUntil: 'omkring {delta} timer fra nu',
	dayUntil: '1 dag fra nu',
	daysUntil: '{delta} dage fra nu',
	weekUntil: '1 uge fra nu',
	weeksUntil: '{delta} uger fra nu',
	monthUntil: '1 måned fra nu',
	monthsUntil: '{delta} måneder fra nu',
	yearUntil: '1 år fra nu',
	yearsUntil: '{delta} år fra nu'

});


/*
---

name: Locale.da-DK.Form.Validator

description: Form Validator messages for Danish.

license: MIT-style license

authors:
  - Martin Overgaard

requires:
  - /Locale

provides: [Locale.da-DK.Form.Validator]

...
*/

Locale.define('da-DK', 'FormValidator', {

	required: 'Feltet skal udfyldes.',
	minLength: 'Skriv mindst {minLength} tegn (du skrev {length}
tegn).',
	maxLength: 'Skriv maksimalt {maxLength} tegn (du skrev {length}
tegn).',
	integer: 'Skriv et tal i dette felt. Decimal tal (f.eks. 1.25) er
ikke tilladt.',
	numeric: 'Skriv kun tal i dette felt (i.e. "1" eller
"1.1" eller "-1" eller "-1.1").',
	digits: 'Skriv kun tal og tegnsætning i dette felt (eksempel, et
telefon nummer med bindestreg eller punktum er tilladt).',
	alpha: 'Skriv kun bogstaver (a-z) i dette felt. Mellemrum og andre
tegn er ikke tilladt.',
	alphanum: 'Skriv kun bogstaver (a-z) eller tal (0-9) i dette felt.
Mellemrum og andre tegn er ikke tilladt.',
	dateSuchAs: 'Skriv en gyldig dato som {date}',
	dateInFormatMDY: 'Skriv dato i formatet DD-MM-YYYY (f.eks.
"31-12-1999")',
	email: 'Skriv en gyldig e-mail adresse. F.eks
"fred@domain.com".',
	url: 'Skriv en gyldig URL adresse. F.eks
"http://www.example.com".',
	currencyDollar: 'Skriv et gldigt beløb. F.eks Kr.100.00 .',
	oneRequired: 'Et eller flere af felterne i denne formular skal
udfyldes.',
	errorPrefix: 'Fejl: ',
	warningPrefix: 'Advarsel: ',

	// Form.Validator.Extras
	noSpace: 'Der må ikke benyttes mellemrum i dette felt.',
	reqChkByNode: 'Foretag et valg.',
	requiredChk: 'Dette felt skal udfyldes.',
	reqChkByName: 'Vælg en {label}.',
	match: 'Dette felt skal matche {matchName} feltet',
	startDate: 'start dato',
	endDate: 'slut dato',
	currendDate: 'dags dato',
	afterDate: 'Datoen skal være større end eller lig med
{label}.',
	beforeDate: 'Datoen skal være mindre end eller lig med
{label}.',
	startMonth: 'Vælg en start måned',
	sameMonth: 'De valgte datoer skal være i samme måned - skift en af
dem.'

});


/*
---

name: Locale.de-DE.Date

description: Date messages for German.

license: MIT-style license

authors:
  - Christoph Pojer
  - Frank Rossi
  - Ulrich Petri
  - Fabian Beiner

requires:
  - /Locale

provides: [Locale.de-DE.Date]

...
*/

Locale.define('de-DE', 'Date', {

	months: ['Januar', 'Februar', 'März',
'April', 'Mai', 'Juni', 'Juli',
'August', 'September', 'Oktober',
'November', 'Dezember'],
	months_abbr: ['Jan', 'Feb', 'Mär',
'Apr', 'Mai', 'Jun', 'Jul',
'Aug', 'Sep', 'Okt', 'Nov',
'Dez'],
	days: ['Sonntag', 'Montag', 'Dienstag',
'Mittwoch', 'Donnerstag', 'Freitag',
'Samstag'],
	days_abbr: ['So.', 'Mo.', 'Di.',
'Mi.', 'Do.', 'Fr.', 'Sa.'],

	// Culture's date order: DD.MM.YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d.%m.%Y',
	shortTime: '%H:%M',
	AM: 'vormittags',
	PM: 'nachmittags',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '.',

	lessThanMinuteAgo: 'vor weniger als einer Minute',
	minuteAgo: 'vor einer Minute',
	minutesAgo: 'vor {delta} Minuten',
	hourAgo: 'vor einer Stunde',
	hoursAgo: 'vor {delta} Stunden',
	dayAgo: 'vor einem Tag',
	daysAgo: 'vor {delta} Tagen',
	weekAgo: 'vor einer Woche',
	weeksAgo: 'vor {delta} Wochen',
	monthAgo: 'vor einem Monat',
	monthsAgo: 'vor {delta} Monaten',
	yearAgo: 'vor einem Jahr',
	yearsAgo: 'vor {delta} Jahren',

	lessThanMinuteUntil: 'in weniger als einer Minute',
	minuteUntil: 'in einer Minute',
	minutesUntil: 'in {delta} Minuten',
	hourUntil: 'in ca. einer Stunde',
	hoursUntil: 'in ca. {delta} Stunden',
	dayUntil: 'in einem Tag',
	daysUntil: 'in {delta} Tagen',
	weekUntil: 'in einer Woche',
	weeksUntil: 'in {delta} Wochen',
	monthUntil: 'in einem Monat',
	monthsUntil: 'in {delta} Monaten',
	yearUntil: 'in einem Jahr',
	yearsUntil: 'in {delta} Jahren'

});


/*
---

name: Locale.de-CH.Date

description: Date messages for German (Switzerland).

license: MIT-style license

authors:
  - Michael van der Weg

requires:
  - /Locale
  - /Locale.de-DE.Date

provides: [Locale.de-CH.Date]

...
*/

Locale.define('de-CH').inherit('de-DE',
'Date');


/*
---

name: Locale.de-CH.Form.Validator

description: Form Validator messages for German (Switzerland).

license: MIT-style license

authors:
  - Michael van der Weg

requires:
  - /Locale

provides: [Locale.de-CH.Form.Validator]

...
*/

Locale.define('de-CH', 'FormValidator', {

	required: 'Dieses Feld ist obligatorisch.',
	minLength: 'Geben Sie bitte mindestens {minLength} Zeichen ein (Sie
haben {length} Zeichen eingegeben).',
	maxLength: 'Bitte geben Sie nicht mehr als {maxLength} Zeichen ein
(Sie haben {length} Zeichen eingegeben).',
	integer: 'Geben Sie bitte eine ganze Zahl ein. Dezimalzahlen (z.B.
1.25) sind nicht erlaubt.',
	numeric: 'Geben Sie bitte nur Zahlenwerte in dieses Eingabefeld ein
(z.B. &quot;1&quot;, &quot;1.1&quot;,
&quot;-1&quot; oder &quot;-1.1&quot;).',
	digits: 'Benutzen Sie bitte nur Zahlen und Satzzeichen in diesem
Eingabefeld (erlaubt ist z.B. eine Telefonnummer mit Bindestrichen und
Punkten).',
	alpha: 'Benutzen Sie bitte nur Buchstaben (a-z) in diesem Feld.
Leerzeichen und andere Zeichen sind nicht erlaubt.',
	alphanum: 'Benutzen Sie bitte nur Buchstaben (a-z) und Zahlen (0-9)
in diesem Eingabefeld. Leerzeichen und andere Zeichen sind nicht
erlaubt.',
	dateSuchAs: 'Geben Sie bitte ein g&uuml;ltiges Datum ein. Wie zum
Beispiel {date}',
	dateInFormatMDY: 'Geben Sie bitte ein g&uuml;ltiges Datum ein.
Wie zum Beispiel TT.MM.JJJJ (z.B. &quot;31.12.1999&quot;)',
	email: 'Geben Sie bitte eine g&uuml;ltige E-Mail Adresse ein. Wie
zum Beispiel &quot;maria@bernasconi.ch&quot;.',
	url: 'Geben Sie bitte eine g&uuml;ltige URL ein. Wie zum Beispiel
http://www.example.com.',
	currencyDollar: 'Geben Sie bitte einen g&uuml;ltigen Betrag in
Schweizer Franken ein. Wie zum Beispiel 100.00 CHF .',
	oneRequired: 'Machen Sie f&uuml;r mindestens eines der
Eingabefelder einen Eintrag.',
	errorPrefix: 'Fehler: ',
	warningPrefix: 'Warnung: ',

	// Form.Validator.Extras
	noSpace: 'In diesem Eingabefeld darf kein Leerzeichen sein.',
	reqChkByNode: 'Es wurden keine Elemente gew&auml;hlt.',
	requiredChk: 'Dieses Feld ist obligatorisch.',
	reqChkByName: 'Bitte w&auml;hlen Sie ein {label}.',
	match: 'Dieses Eingabefeld muss mit dem Feld {matchName}
&uuml;bereinstimmen.',
	startDate: 'Das Anfangsdatum',
	endDate: 'Das Enddatum',
	currendDate: 'Das aktuelle Datum',
	afterDate: 'Das Datum sollte zur gleichen Zeit oder sp&auml;ter
sein {label}.',
	beforeDate: 'Das Datum sollte zur gleichen Zeit oder fr&uuml;her
sein {label}.',
	startMonth: 'W&auml;hlen Sie bitte einen Anfangsmonat',
	sameMonth: 'Diese zwei Datumsangaben m&uuml;ssen im selben Monat
sein - Sie m&uuml;ssen eine von beiden ver&auml;ndern.',
	creditcard: 'Die eingegebene Kreditkartennummer ist
ung&uuml;ltig. Bitte &uuml;berpr&uuml;fen Sie diese und
versuchen Sie es erneut. {length} Zahlen eingegeben.'

});


/*
---

name: Locale.de-DE.Form.Validator

description: Form Validator messages for German.

license: MIT-style license

authors:
  - Frank Rossi
  - Ulrich Petri
  - Fabian Beiner

requires:
  - /Locale

provides: [Locale.de-DE.Form.Validator]

...
*/

Locale.define('de-DE', 'FormValidator', {

	required: 'Dieses Eingabefeld muss ausgefüllt werden.',
	minLength: 'Geben Sie bitte mindestens {minLength} Zeichen ein (Sie
haben nur {length} Zeichen eingegeben).',
	maxLength: 'Geben Sie bitte nicht mehr als {maxLength} Zeichen ein
(Sie haben {length} Zeichen eingegeben).',
	integer: 'Geben Sie in diesem Eingabefeld bitte eine ganze Zahl ein.
Dezimalzahlen (z.B. "1.25") sind nicht erlaubt.',
	numeric: 'Geben Sie in diesem Eingabefeld bitte nur Zahlenwerte (z.B.
"1", "1.1", "-1" oder "-1.1")
ein.',
	digits: 'Geben Sie in diesem Eingabefeld bitte nur Zahlen und
Satzzeichen ein (z.B. eine Telefonnummer mit Bindestrichen und Punkten ist
erlaubt).',
	alpha: 'Geben Sie in diesem Eingabefeld bitte nur Buchstaben (a-z)
ein. Leerzeichen und andere Zeichen sind nicht erlaubt.',
	alphanum: 'Geben Sie in diesem Eingabefeld bitte nur Buchstaben (a-z)
und Zahlen (0-9) ein. Leerzeichen oder andere Zeichen sind nicht
erlaubt.',
	dateSuchAs: 'Geben Sie bitte ein gültiges Datum ein (z.B.
"{date}").',
	dateInFormatMDY: 'Geben Sie bitte ein gültiges Datum im Format
TT.MM.JJJJ ein (z.B. "31.12.1999").',
	email: 'Geben Sie bitte eine gültige E-Mail-Adresse ein (z.B.
"max@mustermann.de").',
	url: 'Geben Sie bitte eine gültige URL ein (z.B.
"http://www.example.com").',
	currencyDollar: 'Geben Sie bitte einen gültigen Betrag in EURO ein
(z.B. 100.00€).',
	oneRequired: 'Bitte füllen Sie mindestens ein Eingabefeld
aus.',
	errorPrefix: 'Fehler: ',
	warningPrefix: 'Warnung: ',

	// Form.Validator.Extras
	noSpace: 'Es darf kein Leerzeichen in diesem Eingabefeld sein.',
	reqChkByNode: 'Es wurden keine Elemente gewählt.',
	requiredChk: 'Dieses Feld muss ausgefüllt werden.',
	reqChkByName: 'Bitte wählen Sie ein {label}.',
	match: 'Dieses Eingabefeld muss mit dem {matchName} Eingabefeld
übereinstimmen.',
	startDate: 'Das Anfangsdatum',
	endDate: 'Das Enddatum',
	currendDate: 'Das aktuelle Datum',
	afterDate: 'Das Datum sollte zur gleichen Zeit oder später sein als
{label}.',
	beforeDate: 'Das Datum sollte zur gleichen Zeit oder früher sein als
{label}.',
	startMonth: 'Wählen Sie bitte einen Anfangsmonat',
	sameMonth: 'Diese zwei Datumsangaben müssen im selben Monat sein -
Sie müssen eines von beiden verändern.',
	creditcard: 'Die eingegebene Kreditkartennummer ist ungültig. Bitte
überprüfen Sie diese und versuchen Sie es erneut. {length} Zahlen
eingegeben.'

});


/*
---

name: Locale.EU.Number

description: Number messages for Europe.

license: MIT-style license

authors:
  - Arian Stolwijk

requires:
  - /Locale

provides: [Locale.EU.Number]

...
*/

Locale.define('EU', 'Number', {

	decimal: ',',
	group: '.',

	currency: {
		prefix: '€ '
	}

});


/*
---

name: Locale.de-DE.Number

description: Number messages for German.

license: MIT-style license

authors:
  - Christoph Pojer

requires:
  - /Locale
  - /Locale.EU.Number

provides: [Locale.de-DE.Number]

...
*/

Locale.define('de-DE').inherit('EU',
'Number');


/*
---

name: Locale.en-GB.Date

description: Date messages for British English.

license: MIT-style license

authors:
  - Aaron Newton

requires:
  - /Locale
  - /Locale.en-US.Date

provides: [Locale.en-GB.Date]

...
*/

Locale.define('en-GB', 'Date', {

	// Culture's date order: DD/MM/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d/%m/%Y',
	shortTime: '%H:%M'

}).inherit('en-US', 'Date');


/*
---

name: Locale.es-ES.Date

description: Date messages for Spanish.

license: MIT-style license

authors:
  - Ãlfons Sanchez

requires:
  - /Locale

provides: [Locale.es-ES.Date]

...
*/

Locale.define('es-ES', 'Date', {

	months: ['Enero', 'Febrero', 'Marzo',
'Abril', 'Mayo', 'Junio', 'Julio',
'Agosto', 'Septiembre', 'Octubre',
'Noviembre', 'Diciembre'],
	months_abbr: ['ene', 'feb', 'mar',
'abr', 'may', 'jun', 'jul',
'ago', 'sep', 'oct', 'nov',
'dic'],
	days: ['Domingo', 'Lunes', 'Martes',
'Miércoles', 'Jueves', 'Viernes',
'Sábado'],
	days_abbr: ['dom', 'lun', 'mar',
'mié', 'juv', 'vie', 'sáb'],

	// Culture's date order: DD/MM/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d/%m/%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: 'hace menos de un minuto',
	minuteAgo: 'hace un minuto',
	minutesAgo: 'hace {delta} minutos',
	hourAgo: 'hace una hora',
	hoursAgo: 'hace unas {delta} horas',
	dayAgo: 'hace un día',
	daysAgo: 'hace {delta} días',
	weekAgo: 'hace una semana',
	weeksAgo: 'hace unas {delta} semanas',
	monthAgo: 'hace un mes',
	monthsAgo: 'hace {delta} meses',
	yearAgo: 'hace un año',
	yearsAgo: 'hace {delta} años',

	lessThanMinuteUntil: 'menos de un minuto desde ahora',
	minuteUntil: 'un minuto desde ahora',
	minutesUntil: '{delta} minutos desde ahora',
	hourUntil: 'una hora desde ahora',
	hoursUntil: 'unas {delta} horas desde ahora',
	dayUntil: 'un día desde ahora',
	daysUntil: '{delta} días desde ahora',
	weekUntil: 'una semana desde ahora',
	weeksUntil: 'unas {delta} semanas desde ahora',
	monthUntil: 'un mes desde ahora',
	monthsUntil: '{delta} meses desde ahora',
	yearUntil: 'un año desde ahora',
	yearsUntil: '{delta} años desde ahora'

});


/*
---

name: Locale.es-AR.Date

description: Date messages for Spanish (Argentina).

license: MIT-style license

authors:
  - Ãlfons Sanchez
  - Diego Massanti

requires:
  - /Locale
  - /Locale.es-ES.Date

provides: [Locale.es-AR.Date]

...
*/

Locale.define('es-AR').inherit('es-ES',
'Date');


/*
---

name: Locale.es-AR.Form.Validator

description: Form Validator messages for Spanish (Argentina).

license: MIT-style license

authors:
  - Diego Massanti

requires:
  - /Locale

provides: [Locale.es-AR.Form.Validator]

...
*/

Locale.define('es-AR', 'FormValidator', {

	required: 'Este campo es obligatorio.',
	minLength: 'Por favor ingrese al menos {minLength} caracteres (ha
ingresado {length} caracteres).',
	maxLength: 'Por favor no ingrese más de {maxLength} caracteres (ha
ingresado {length} caracteres).',
	integer: 'Por favor ingrese un número entero en este campo. Números
con decimales (p.e. 1,25) no se permiten.',
	numeric: 'Por favor ingrese solo valores numéricos en este campo
(p.e. "1" o "1,1" o "-1" o
"-1,1").',
	digits: 'Por favor use sólo números y puntuación en este campo
(por ejemplo, un número de teléfono con guiones y/o puntos no está
permitido).',
	alpha: 'Por favor use sólo letras (a-z) en este campo. No se
permiten espacios ni otros caracteres.',
	alphanum: 'Por favor, usa sólo letras (a-z) o números (0-9) en este
campo. No se permiten espacios u otros caracteres.',
	dateSuchAs: 'Por favor ingrese una fecha válida como {date}',
	dateInFormatMDY: 'Por favor ingrese una fecha válida, utulizando el
formato DD/MM/YYYY (p.e. "31/12/1999")',
	email: 'Por favor, ingrese una dirección de e-mail válida. Por
ejemplo, "fred@dominio.com".',
	url: 'Por favor ingrese una URL válida como
http://www.example.com.',
	currencyDollar: 'Por favor ingrese una cantidad válida de pesos. Por
ejemplo $100,00 .',
	oneRequired: 'Por favor ingrese algo para por lo menos una de estas
entradas.',
	errorPrefix: 'Error: ',
	warningPrefix: 'Advertencia: ',

	// Form.Validator.Extras
	noSpace: 'No se permiten espacios en este campo.',
	reqChkByNode: 'No hay elementos seleccionados.',
	requiredChk: 'Este campo es obligatorio.',
	reqChkByName: 'Por favor selecciona una {label}.',
	match: 'Este campo necesita coincidir con el campo {matchName}',
	startDate: 'la fecha de inicio',
	endDate: 'la fecha de fin',
	currendDate: 'la fecha actual',
	afterDate: 'La fecha debe ser igual o posterior a {label}.',
	beforeDate: 'La fecha debe ser igual o anterior a {label}.',
	startMonth: 'Por favor selecciona un mes de origen',
	sameMonth: 'Estas dos fechas deben estar en el mismo mes - debes
cambiar una u otra.'

});


/*
---

name: Locale.es-ES.Form.Validator

description: Form Validator messages for Spanish.

license: MIT-style license

authors:
  - Ãlfons Sanchez

requires:
  - /Locale

provides: [Locale.es-ES.Form.Validator]

...
*/

Locale.define('es-ES', 'FormValidator', {

	required: 'Este campo es obligatorio.',
	minLength: 'Por favor introduce al menos {minLength} caracteres (has
introducido {length} caracteres).',
	maxLength: 'Por favor introduce no m&aacute;s de {maxLength}
caracteres (has introducido {length} caracteres).',
	integer: 'Por favor introduce un n&uacute;mero entero en este
campo. N&uacute;meros con decimales (p.e. 1,25) no se permiten.',
	numeric: 'Por favor introduce solo valores num&eacute;ricos en
este campo (p.e. "1" o "1,1" o "-1" o
"-1,1").',
	digits: 'Por favor usa solo n&uacute;meros y
puntuaci&oacute;n en este campo (por ejemplo, un n&uacute;mero de
tel&eacute;fono con guiones y puntos no esta permitido).',
	alpha: 'Por favor usa letras solo (a-z) en este campo. No se admiten
espacios ni otros caracteres.',
	alphanum: 'Por favor, usa solo letras (a-z) o n&uacute;meros
(0-9) en este campo. No se admiten espacios ni otros caracteres.',
	dateSuchAs: 'Por favor introduce una fecha v&aacute;lida como
{date}',
	dateInFormatMDY: 'Por favor introduce una fecha v&aacute;lida
como DD/MM/YYYY (p.e. "31/12/1999")',
	email: 'Por favor, introduce una direcci&oacute;n de email
v&aacute;lida. Por ejemplo, "fred@domain.com".',
	url: 'Por favor introduce una URL v&aacute;lida como
http://www.example.com.',
	currencyDollar: 'Por favor introduce una cantidad v&aacute;lida
de €. Por ejemplo €100,00 .',
	oneRequired: 'Por favor introduce algo para por lo menos una de estas
entradas.',
	errorPrefix: 'Error: ',
	warningPrefix: 'Aviso: ',

	// Form.Validator.Extras
	noSpace: 'No pueden haber espacios en esta entrada.',
	reqChkByNode: 'No hay elementos seleccionados.',
	requiredChk: 'Este campo es obligatorio.',
	reqChkByName: 'Por favor selecciona una {label}.',
	match: 'Este campo necesita coincidir con el campo {matchName}',
	startDate: 'la fecha de inicio',
	endDate: 'la fecha de fin',
	currendDate: 'la fecha actual',
	afterDate: 'La fecha debe ser igual o posterior a {label}.',
	beforeDate: 'La fecha debe ser igual o anterior a {label}.',
	startMonth: 'Por favor selecciona un mes de origen',
	sameMonth: 'Estas dos fechas deben estar en el mismo mes - debes
cambiar una u otra.'

});


/*
---

name: Locale.et-EE.Date

description: Date messages for Estonian.

license: MIT-style license

authors:
  - Kevin Valdek

requires:
  - /Locale

provides: [Locale.et-EE.Date]

...
*/

Locale.define('et-EE', 'Date', {

	months: ['jaanuar', 'veebruar', 'märts',
'aprill', 'mai', 'juuni', 'juuli',
'august', 'september', 'oktoober',
'november', 'detsember'],
	months_abbr: ['jaan', 'veebr', 'märts',
'apr', 'mai', 'juuni', 'juuli',
'aug', 'sept', 'okt', 'nov',
'dets'],
	days: ['pühapäev', 'esmaspäev',
'teisipäev', 'kolmapäev', 'neljapäev',
'reede', 'laupäev'],
	days_abbr: ['pühap', 'esmasp', 'teisip',
'kolmap', 'neljap', 'reede',
'laup'],

	// Culture's date order: MM.DD.YYYY
	dateOrder: ['month', 'date', 'year'],
	shortDate: '%m.%d.%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: 'vähem kui minut aega tagasi',
	minuteAgo: 'umbes minut aega tagasi',
	minutesAgo: '{delta} minutit tagasi',
	hourAgo: 'umbes tund aega tagasi',
	hoursAgo: 'umbes {delta} tundi tagasi',
	dayAgo: '1 päev tagasi',
	daysAgo: '{delta} päeva tagasi',
	weekAgo: '1 nädal tagasi',
	weeksAgo: '{delta} nädalat tagasi',
	monthAgo: '1 kuu tagasi',
	monthsAgo: '{delta} kuud tagasi',
	yearAgo: '1 aasta tagasi',
	yearsAgo: '{delta} aastat tagasi',

	lessThanMinuteUntil: 'vähem kui minuti aja pärast',
	minuteUntil: 'umbes minuti aja pärast',
	minutesUntil: '{delta} minuti pärast',
	hourUntil: 'umbes tunni aja pärast',
	hoursUntil: 'umbes {delta} tunni pärast',
	dayUntil: '1 päeva pärast',
	daysUntil: '{delta} päeva pärast',
	weekUntil: '1 nädala pärast',
	weeksUntil: '{delta} nädala pärast',
	monthUntil: '1 kuu pärast',
	monthsUntil: '{delta} kuu pärast',
	yearUntil: '1 aasta pärast',
	yearsUntil: '{delta} aasta pärast'

});


/*
---

name: Locale.et-EE.Form.Validator

description: Form Validator messages for Estonian.

license: MIT-style license

authors:
  - Kevin Valdek

requires:
  - /Locale

provides: [Locale.et-EE.Form.Validator]

...
*/

Locale.define('et-EE', 'FormValidator', {

	required: 'Väli peab olema täidetud.',
	minLength: 'Palun sisestage vähemalt {minLength} tähte (te
sisestasite {length} tähte).',
	maxLength: 'Palun ärge sisestage rohkem kui {maxLength} tähte (te
sisestasite {length} tähte).',
	integer: 'Palun sisestage väljale täisarv. Kümnendarvud (näiteks
1.25) ei ole lubatud.',
	numeric: 'Palun sisestage ainult numbreid väljale (näiteks
"1", "1.1", "-1" või
"-1.1").',
	digits: 'Palun kasutage ainult numbreid ja kirjavahemärke
(telefoninumbri sisestamisel on lubatud kasutada kriipse ja punkte).',
	alpha: 'Palun kasutage ainult tähti (a-z). Tühikud ja teised
sümbolid on keelatud.',
	alphanum: 'Palun kasutage ainult tähti (a-z) või numbreid (0-9).
Tühikud ja teised sümbolid on keelatud.',
	dateSuchAs: 'Palun sisestage kehtiv kuupäev kujul {date}',
	dateInFormatMDY: 'Palun sisestage kehtiv kuupäev kujul MM.DD.YYYY
(näiteks: "12.31.1999").',
	email: 'Palun sisestage kehtiv e-maili aadress (näiteks:
"fred@domain.com").',
	url: 'Palun sisestage kehtiv URL (näiteks:
http://www.example.com).',
	currencyDollar: 'Palun sisestage kehtiv $ summa (näiteks:
$100.00).',
	oneRequired: 'Palun sisestage midagi vähemalt ühele antud
väljadest.',
	errorPrefix: 'Viga: ',
	warningPrefix: 'Hoiatus: ',

	// Form.Validator.Extras
	noSpace: 'Väli ei tohi sisaldada tühikuid.',
	reqChkByNode: 'Ükski väljadest pole valitud.',
	requiredChk: 'Välja täitmine on vajalik.',
	reqChkByName: 'Palun valige üks {label}.',
	match: 'Väli peab sobima {matchName} väljaga',
	startDate: 'algkuupäev',
	endDate: 'lõppkuupäev',
	currendDate: 'praegune kuupäev',
	afterDate: 'Kuupäev peab olema võrdne või pärast {label}.',
	beforeDate: 'Kuupäev peab olema võrdne või enne {label}.',
	startMonth: 'Palun valige algkuupäev.',
	sameMonth: 'Antud kaks kuupäeva peavad olema samas kuus - peate
muutma ühte kuupäeva.'

});


/*
---

name: Locale.fa.Date

description: Date messages for Persian.

license: MIT-style license

authors:
  - Amir Hossein Hodjaty Pour

requires:
  - /Locale

provides: [Locale.fa.Date]

...
*/

Locale.define('fa', 'Date', {

	months: ['ژانویه', 'فوریه',
'مارس', 'آپریل', 'مه',
'ژوئن', 'ژوئیه', 'آگوست',
'سپتامبر', 'اکتبر',
'نوامبر', 'دسامبر'],
	months_abbr: ['1', '2', '3', '4',
'5', '6', '7', '8', '9',
'10', '11', '12'],
	days: ['یکشنبه', 'دوشنبه', 'سه
شنبه', 'چهارشنبه', 'پنجشنبه',
'جمعه', 'شنبه'],
	days_abbr: ['ي', 'د', 'س',
'چ', 'پ', 'ج', 'ش'],

	// Culture's date order: MM/DD/YYYY
	dateOrder: ['month', 'date', 'year'],
	shortDate: '%m/%d/%Y',
	shortTime: '%I:%M%p',
	AM: 'ق.ظ',
	PM: 'ب.ظ',

	// Date.Extras
	ordinal: 'ام',

	lessThanMinuteAgo: 'کمتر از یک دقیقه پیش',
	minuteAgo: 'حدود یک دقیقه پیش',
	minutesAgo: '{delta} دقیقه پیش',
	hourAgo: 'حدود یک ساعت پیش',
	hoursAgo: 'حدود {delta} ساعت پیش',
	dayAgo: '1 روز پیش',
	daysAgo: '{delta} روز پیش',
	weekAgo: '1 هفته پیش',
	weeksAgo: '{delta} هفته پیش',
	monthAgo: '1 ماه پیش',
	monthsAgo: '{delta} ماه پیش',
	yearAgo: '1 سال پیش',
	yearsAgo: '{delta} سال پیش',

	lessThanMinuteUntil: 'کمتر از یک دقیقه از
حالا',
	minuteUntil: 'حدود یک دقیقه از حالا',
	minutesUntil: '{delta} دقیقه از حالا',
	hourUntil: 'حدود یک ساعت از حالا',
	hoursUntil: 'حدود {delta} ساعت از حالا',
	dayUntil: '1 روز از حالا',
	daysUntil: '{delta} روز از حالا',
	weekUntil: '1 هفته از حالا',
	weeksUntil: '{delta} هفته از حالا',
	monthUntil: '1 ماه از حالا',
	monthsUntil: '{delta} ماه از حالا',
	yearUntil: '1 سال از حالا',
	yearsUntil: '{delta} سال از حالا'

});


/*
---

name: Locale.fa.Form.Validator

description: Form Validator messages for Persian.

license: MIT-style license

authors:
  - Amir Hossein Hodjaty Pour

requires:
  - /Locale

provides: [Locale.fa.Form.Validator]

...
*/

Locale.define('fa', 'FormValidator', {

	required: 'این فیلد الزامی است.',
	minLength: 'شما باید حداقل {minLength} حرف وارد
کنید ({length} حرف وارد کرده اید).',
	maxLength: 'لطفا حداکثر {maxLength} حرف وارد
کنید (شما {length} حرف وارد کرده اید).',
	integer: 'لطفا از عدد صحیح استفاده کنید.
اعداد اعشاری (مانند 1.25) مجاز نیستند.',
	numeric: 'لطفا فقط داده عددی وارد کنید
(مانند "1" یا "1.1" یا "1-" یا
"1.1-").',
	digits: 'لطفا فقط از اعداد و علامتها در
این فیلد استفاده کنید (برای مثال شماره
تلفن با خط تیره و نقطه قابل قبول است).',
	alpha: 'لطفا فقط از حروف الفباء برای این
بخش استفاده کنید. کاراکترهای دیگر و فاصله
مجاز نیستند.',
	alphanum: 'لطفا فقط از حروف الفباء و اعداد
در این بخش استفاده کنید. کاراکترهای دیگر
و فاصله مجاز نیستند.',
	dateSuchAs: 'لطفا یک تاریخ معتبر مانند {date}
وارد کنید.',
	dateInFormatMDY: 'لطفا یک تاریخ معتبر به شکل
MM/DD/YYYY وارد کنید (مانند "12/31/1999").',
	email: 'لطفا یک آدرس ایمیل معتبر وارد
کنید. برای مثال "fred@domain.com".',
	url: 'لطفا یک URL معتبر مانند http://www.example.com
وارد کنید.',
	currencyDollar: 'لطفا یک محدوده معتبر برای
این بخش وارد کنید مانند 100.00$ .',
	oneRequired: 'لطفا حداقل یکی از فیلدها را پر
کنید.',
	errorPrefix: 'خطا: ',
	warningPrefix: 'هشدار: ',

	// Form.Validator.Extras
	noSpace: 'استفاده از فاصله در این بخش مجاز
نیست.',
	reqChkByNode: 'موردی انتخاب نشده است.',
	requiredChk: 'این فیلد الزامی است.',
	reqChkByName: 'لطفا یک {label} را انتخاب
کنید.',
	match: 'این فیلد باید با فیلد {matchName}
مطابقت داشته باشد.',
	startDate: 'تاریخ شروع',
	endDate: 'تاریخ پایان',
	currendDate: 'تاریخ کنونی',
	afterDate: 'تاریخ میبایست برابر یا بعد از
{label} باشد',
	beforeDate: 'تاریخ میبایست برابر یا قبل از
{label} باشد',
	startMonth: 'لطفا ماه شروع را انتخاب
کنید',
	sameMonth: 'این دو تاریخ باید در یک ماه
باشند - شما باید یکی یا هر دو را تغییر
دهید.',
	creditcard: 'شماره کارت اعتباری که وارد
کرده اید معتبر نیست. لطفا شماره را بررسی
کنید و مجددا تلاش کنید. {length} رقم وارد شده
است.'

});


/*
---

name: Locale.fi-FI.Date

description: Date messages for Finnish.

license: MIT-style license

authors:
  - ksel

requires:
  - /Locale

provides: [Locale.fi-FI.Date]

...
*/

Locale.define('fi-FI', 'Date', {

	// NOTE: months and days are not capitalized in finnish
	months: ['tammikuu', 'helmikuu',
'maaliskuu', 'huhtikuu', 'toukokuu',
'kesäkuu', 'heinäkuu', 'elokuu',
'syyskuu', 'lokakuu', 'marraskuu',
'joulukuu'],

	// these abbreviations are really not much used in finnish because they
obviously won't abbreviate very much. ;)
	// NOTE: sometimes one can see forms such as "tammi",
"helmi", etc. but that is not proper finnish.
	months_abbr: ['tammik.', 'helmik.',
'maalisk.', 'huhtik.', 'toukok.',
'kesäk.', 'heinäk.', 'elok.',
'syysk.', 'lokak.', 'marrask.',
'jouluk.'],

	days: ['sunnuntai', 'maanantai', 'tiistai',
'keskiviikko', 'torstai', 'perjantai',
'lauantai'],
	days_abbr: ['su', 'ma', 'ti',
'ke', 'to', 'pe', 'la'],

	// Culture's date order: DD/MM/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d.%m.%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '.',

	lessThanMinuteAgo: 'vajaa minuutti sitten',
	minuteAgo: 'noin minuutti sitten',
	minutesAgo: '{delta} minuuttia sitten',
	hourAgo: 'noin tunti sitten',
	hoursAgo: 'noin {delta} tuntia sitten',
	dayAgo: 'päivä sitten',
	daysAgo: '{delta} päivää sitten',
	weekAgo: 'viikko sitten',
	weeksAgo: '{delta} viikkoa sitten',
	monthAgo: 'kuukausi sitten',
	monthsAgo: '{delta} kuukautta sitten',
	yearAgo: 'vuosi sitten',
	yearsAgo: '{delta} vuotta sitten',

	lessThanMinuteUntil: 'vajaan minuutin kuluttua',
	minuteUntil: 'noin minuutin kuluttua',
	minutesUntil: '{delta} minuutin kuluttua',
	hourUntil: 'noin tunnin kuluttua',
	hoursUntil: 'noin {delta} tunnin kuluttua',
	dayUntil: 'päivän kuluttua',
	daysUntil: '{delta} päivän kuluttua',
	weekUntil: 'viikon kuluttua',
	weeksUntil: '{delta} viikon kuluttua',
	monthUntil: 'kuukauden kuluttua',
	monthsUntil: '{delta} kuukauden kuluttua',
	yearUntil: 'vuoden kuluttua',
	yearsUntil: '{delta} vuoden kuluttua'

});


/*
---

name: Locale.fi-FI.Form.Validator

description: Form Validator messages for Finnish.

license: MIT-style license

authors:
  - ksel

requires:
  - /Locale

provides: [Locale.fi-FI.Form.Validator]

...
*/

Locale.define('fi-FI', 'FormValidator', {

	required: 'Tämä kenttä on pakollinen.',
	minLength: 'Ole hyvä ja anna vähintään {minLength} merkkiä
(annoit {length} merkkiä).',
	maxLength: 'Älä anna enempää kuin {maxLength} merkkiä (annoit
{length} merkkiä).',
	integer: 'Ole hyvä ja anna kokonaisluku. Luvut, joissa on
desimaaleja (esim. 1.25) eivät ole sallittuja.',
	numeric: 'Anna tähän kenttään lukuarvo (kuten "1" tai
"1.1" tai "-1" tai "-1.1").',
	digits: 'Käytä pelkästään numeroita ja välimerkkejä tässä
kentässä (syötteet, kuten esim. puhelinnumero, jossa on väliviivoja,
pilkkuja tai pisteitä, kelpaa).',
	alpha: 'Anna tähän kenttään vain kirjaimia (a-z). Välilyönnit
tai muut merkit eivät ole sallittuja.',
	alphanum: 'Anna tähän kenttään vain kirjaimia (a-z) tai numeroita
(0-9). Välilyönnit tai muut merkit eivät ole sallittuja.',
	dateSuchAs: 'Ole hyvä ja anna kelvollinen päivmäärä, kuten
esimerkiksi {date}',
	dateInFormatMDY: 'Ole hyvä ja anna kelvollinen päivämäärä
muodossa pp/kk/vvvv (kuten "12/31/1999")',
	email: 'Ole hyvä ja anna kelvollinen sähköpostiosoite (kuten
esimerkiksi "matti@meikalainen.com").',
	url: 'Ole hyvä ja anna kelvollinen URL, kuten esimerkiksi
http://www.example.com.',
	currencyDollar: 'Ole hyvä ja anna kelvollinen eurosumma (kuten
esimerkiksi 100,00 EUR) .',
	oneRequired: 'Ole hyvä ja syötä jotakin ainakin johonkin näistä
kentistä.',
	errorPrefix: 'Virhe: ',
	warningPrefix: 'Varoitus: ',

	// Form.Validator.Extras
	noSpace: 'Tässä syötteessä ei voi olla välilyöntejä',
	reqChkByNode: 'Ei valintoja.',
	requiredChk: 'Tämä kenttä on pakollinen.',
	reqChkByName: 'Ole hyvä ja valitse {label}.',
	match: 'Tämän kentän tulee vastata kenttää {matchName}',
	startDate: 'alkupäivämäärä',
	endDate: 'loppupäivämäärä',
	currendDate: 'nykyinen päivämäärä',
	afterDate: 'Päivämäärän tulisi olla sama tai myöhäisempi
ajankohta kuin {label}.',
	beforeDate: 'Päivämäärän tulisi olla sama tai aikaisempi
ajankohta kuin {label}.',
	startMonth: 'Ole hyvä ja valitse aloituskuukausi',
	sameMonth: 'Näiden kahden päivämäärän tulee olla saman kuun
sisällä -- sinun pitää muuttaa jompaa kumpaa.',
	creditcard: 'Annettu luottokortin numero ei kelpaa. Ole hyvä ja
tarkista numero sekä yritä uudelleen. {length} numeroa syötetty.'

});


/*
---

name: Locale.fi-FI.Number

description: Finnish number messages

license: MIT-style license

authors:
  - ksel

requires:
  - /Locale
  - /Locale.EU.Number

provides: [Locale.fi-FI.Number]

...
*/

Locale.define('fi-FI', 'Number', {

	group: ' ' // grouped by space

}).inherit('EU', 'Number');


/*
---

name: Locale.fr-FR.Date

description: Date messages for French.

license: MIT-style license

authors:
  - Nicolas Sorosac
  - Antoine Abt

requires:
  - /Locale

provides: [Locale.fr-FR.Date]

...
*/

Locale.define('fr-FR', 'Date', {

	months: ['Janvier', 'Février', 'Mars',
'Avril', 'Mai', 'Juin', 'Juillet',
'Août', 'Septembre', 'Octobre',
'Novembre', 'Décembre'],
	months_abbr: ['janv.', 'févr.', 'mars',
'avr.', 'mai', 'juin', 'juil.',
'août', 'sept.', 'oct.', 'nov.',
'déc.'],
	days: ['Dimanche', 'Lundi', 'Mardi',
'Mercredi', 'Jeudi', 'Vendredi',
'Samedi'],
	days_abbr: ['dim.', 'lun.', 'mar.',
'mer.', 'jeu.', 'ven.', 'sam.'],

	// Culture's date order: DD/MM/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d/%m/%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: function(dayOfMonth){
		return (dayOfMonth > 1) ? '' : 'er';
	},

	lessThanMinuteAgo: "il y a moins d'une minute",
	minuteAgo: 'il y a une minute',
	minutesAgo: 'il y a {delta} minutes',
	hourAgo: 'il y a une heure',
	hoursAgo: 'il y a {delta} heures',
	dayAgo: 'il y a un jour',
	daysAgo: 'il y a {delta} jours',
	weekAgo: 'il y a une semaine',
	weeksAgo: 'il y a {delta} semaines',
	monthAgo: 'il y a 1 mois',
	monthsAgo: 'il y a {delta} mois',
	yearthAgo: 'il y a 1 an',
	yearsAgo: 'il y a {delta} ans',

	lessThanMinuteUntil: "dans moins d'une minute",
	minuteUntil: 'dans une minute',
	minutesUntil: 'dans {delta} minutes',
	hourUntil: 'dans une heure',
	hoursUntil: 'dans {delta} heures',
	dayUntil: 'dans un jour',
	daysUntil: 'dans {delta} jours',
	weekUntil: 'dans 1 semaine',
	weeksUntil: 'dans {delta} semaines',
	monthUntil: 'dans 1 mois',
	monthsUntil: 'dans {delta} mois',
	yearUntil: 'dans 1 an',
	yearsUntil: 'dans {delta} ans'

});


/*
---

name: Locale.fr-FR.Form.Validator

description: Form Validator messages for French.

license: MIT-style license

authors:
  - Miquel Hudin
  - Nicolas Sorosac

requires:
  - /Locale

provides: [Locale.fr-FR.Form.Validator]

...
*/

Locale.define('fr-FR', 'FormValidator', {

	required: 'Ce champ est obligatoire.',
	length: 'Veuillez saisir {length} caract&egrave;re(s) (vous avez
saisi {elLength} caract&egrave;re(s)',
	minLength: 'Veuillez saisir un minimum de {minLength}
caract&egrave;re(s) (vous avez saisi {length}
caract&egrave;re(s)).',
	maxLength: 'Veuillez saisir un maximum de {maxLength}
caract&egrave;re(s) (vous avez saisi {length}
caract&egrave;re(s)).',
	integer: 'Veuillez saisir un nombre entier dans ce champ. Les nombres
d&eacute;cimaux (ex : "1,25") ne sont pas
autoris&eacute;s.',
	numeric: 'Veuillez saisir uniquement des chiffres dans ce champ (ex :
"1" ou "1,1" ou "-1" ou
"-1,1").',
	digits: "Veuillez saisir uniquement des chiffres et des signes de
ponctuation dans ce champ (ex : un num&eacute;ro de
t&eacute;l&eacute;phone avec des traits d'union est
autoris&eacute;).",
	alpha: 'Veuillez saisir uniquement des lettres (a-z) dans ce champ.
Les espaces ou autres caract&egrave;res ne sont pas
autoris&eacute;s.',
	alphanum: 'Veuillez saisir uniquement des lettres (a-z) ou des
chiffres (0-9) dans ce champ. Les espaces ou autres caract&egrave;res
ne sont pas autoris&eacute;s.',
	dateSuchAs: 'Veuillez saisir une date correcte comme {date}',
	dateInFormatMDY: 'Veuillez saisir une date correcte, au format
JJ/MM/AAAA (ex : "31/11/1999").',
	email: 'Veuillez saisir une adresse de courrier
&eacute;lectronique. Par example "fred@domaine.com".',
	url: 'Veuillez saisir une URL, comme http://www.example.com.',
	currencyDollar: 'Veuillez saisir une quantit&eacute; correcte.
Par example 100,00&euro;.',
	oneRequired: 'Veuillez s&eacute;lectionner au moins une de ces
options.',
	errorPrefix: 'Erreur : ',
	warningPrefix: 'Attention : ',

	// Form.Validator.Extras
	noSpace: "Ce champ n'accepte pas les espaces.",
	reqChkByNode: "Aucun &eacute;l&eacute;ment n'est
s&eacute;lectionn&eacute;.",
	requiredChk: 'Ce champ est obligatoire.',
	reqChkByName: 'Veuillez s&eacute;lectionner un(e) {label}.',
	match: 'Ce champ doit correspondre avec le champ {matchName}.',
	startDate: 'date de d&eacute;but',
	endDate: 'date de fin',
	currendDate: 'date actuelle',
	afterDate: 'La date doit &ecirc;tre identique ou
post&eacute;rieure &agrave; {label}.',
	beforeDate: 'La date doit &ecirc;tre identique ou
ant&eacute;rieure &agrave; {label}.',
	startMonth: 'Veuillez s&eacute;lectionner un mois de
d&eacute;but.',
	sameMonth: 'Ces deux dates doivent &ecirc;tre dans le
m&ecirc;me mois - vous devez en modifier une.',
	creditcard: 'Le num&eacute;ro de carte de cr&eacute;dit est
invalide. Merci de v&eacute;rifier le num&eacute;ro et de
r&eacute;essayer. Vous avez entr&eacute; {length} chiffre(s).'

});


/*
---

name: Locale.fr-FR.Number

description: Number messages for French.

license: MIT-style license

authors:
  - Arian Stolwijk
  - sv1l

requires:
  - /Locale
  - /Locale.EU.Number

provides: [Locale.fr-FR.Number]

...
*/

Locale.define('fr-FR', 'Number', {

	group: ' ' // In fr-FR localization, group character is a blank
space

}).inherit('EU', 'Number');


/*
---

name: Locale.he-IL.Date

description: Date messages for Hebrew.

license: MIT-style license

authors:
  - Elad Ossadon

requires:
  - /Locale

provides: [Locale.he-IL.Date]

...
*/

Locale.define('he-IL', 'Date', {

	months: ['ינואר', 'פברואר',
'מרץ', 'אפריל', 'מאי',
'יוני', 'יולי', 'אוגוסט',
'ספטמבר', 'אוקטובר',
'נובמבר', 'דצמבר'],
	months_abbr: ['ינואר', 'פברואר',
'מרץ', 'אפריל', 'מאי',
'יוני', 'יולי', 'אוגוסט',
'ספטמבר', 'אוקטובר',
'נובמבר', 'דצמבר'],
	days: ['ראשון', 'שני', 'שלישי',
'רביעי', 'חמישי', 'שישי',
'שבת'],
	days_abbr: ['ראשון', 'שני',
'שלישי', 'רביעי', 'חמישי',
'שישי', 'שבת'],

	// Culture's date order: MM/DD/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d/%m/%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 0,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: 'לפני פחות מדקה',
	minuteAgo: 'לפני כדקה',
	minutesAgo: 'לפני {delta} דקות',
	hourAgo: 'לפני כשעה',
	hoursAgo: 'לפני {delta} שעות',
	dayAgo: 'לפני יום',
	daysAgo: 'לפני {delta} ימים',
	weekAgo: 'לפני שבוע',
	weeksAgo: 'לפני {delta} שבועות',
	monthAgo: 'לפני חודש',
	monthsAgo: 'לפני {delta} חודשים',
	yearAgo: 'לפני שנה',
	yearsAgo: 'לפני {delta} שנים',

	lessThanMinuteUntil: 'בעוד פחות מדקה',
	minuteUntil: 'בעוד כדקה',
	minutesUntil: 'בעוד {delta} דקות',
	hourUntil: 'בעוד כשעה',
	hoursUntil: 'בעוד {delta} שעות',
	dayUntil: 'בעוד יום',
	daysUntil: 'בעוד {delta} ימים',
	weekUntil: 'בעוד שבוע',
	weeksUntil: 'בעוד {delta} שבועות',
	monthUntil: 'בעוד חודש',
	monthsUntil: 'בעוד {delta} חודשים',
	yearUntil: 'בעוד שנה',
	yearsUntil: 'בעוד {delta} שנים'

});


/*
---

name: Locale.he-IL.Form.Validator

description: Form Validator messages for Hebrew.

license: MIT-style license

authors:
  - Elad Ossadon

requires:
  - /Locale

provides: [Locale.he-IL.Form.Validator]

...
*/

Locale.define('he-IL', 'FormValidator', {

	required: 'נא למלא שדה זה.',
	minLength: 'נא להזין לפחות {minLength} תווים
(הזנת {length} תווים).',
	maxLength: 'נא להזין עד {maxLength} תווים (הזנת
{length} תווים).',
	integer: 'נא להזין מספר שלם לשדה זה. מספרים
עשרוניים (כמו 1.25) אינם חוקיים.',
	numeric: 'נא להזין ערך מספרי בלבד בשדה זה
(כמו "1", "1.1", "-1" או
"-1.1").',
	digits: 'נא להזין רק ספרות וסימני הפרדה
בשדה זה (למשל, מספר טלפון עם מקפים או
נקודות הוא חוקי).',
	alpha: 'נא להזין רק אותיות באנגלית (a-z)
בשדה זה. רווחים או תווים אחרים אינם
חוקיים.',
	alphanum: 'נא להזין רק אותריות באנגלית (a-z)
או ספרות (0-9) בשדה זה. אווחרים או תווים
אחרים אינם חוקיים.',
	dateSuchAs: 'נא להזין תאריך חוקי, כמו
{date}',
	dateInFormatMDY: 'נא להזין תאריך חוקי בפורמט
MM/DD/YYYY (כמו "12/31/1999")',
	email: 'נא להזין כתובת אימייל חוקית.
לדוגמה: "fred@domain.com".',
	url: 'נא להזין כתובת אתר חוקית, כמו
http://www.example.com.',
	currencyDollar: 'נא להזין סכום דולרי חוקי.
לדוגמה $100.00.',
	oneRequired: 'נא לבחור לפחות בשדה אחד.',
	errorPrefix: 'שגיאה: ',
	warningPrefix: 'אזהרה: ',

	// Form.Validator.Extras
	noSpace: 'אין להזין רווחים בשדה זה.',
	reqChkByNode: 'נא לבחור אחת מהאפשרויות.',
	requiredChk: 'שדה זה נדרש.',
	reqChkByName: 'נא לבחור {label}.',
	match: 'שדה זה צריך להתאים לשדה {matchName}',
	startDate: 'תאריך ההתחלה',
	endDate: 'תאריך הסיום',
	currendDate: 'התאריך הנוכחי',
	afterDate: 'התאריך צריך להיות זהה או אחרי
{label}.',
	beforeDate: 'התאריך צריך להיות זהה או לפני
{label}.',
	startMonth: 'נא לבחור חודש התחלה',
	sameMonth: 'שני תאריכים אלה צריכים להיות
באותו חודש - נא לשנות אחד התאריכים.',
	creditcard: 'מספר כרטיס האשראי שהוזן אינו
חוקי. נא לבדוק שנית. הוזנו {length} ספרות.'

});


/*
---

name: Locale.he-IL.Number

description: Number messages for Hebrew.

license: MIT-style license

authors:
  - Elad Ossadon

requires:
  - /Locale

provides: [Locale.he-IL.Number]

...
*/

Locale.define('he-IL', 'Number', {

	decimal: '.',
	group: ',',

	currency: {
		suffix: ' ₪'
	}

});


/*
---

name: Locale.hu-HU.Date

description: Date messages for Hungarian.

license: MIT-style license

authors:
  - Zsolt Szegheő

requires:
  - /Locale

provides: [Locale.hu-HU.Date]

...
*/

Locale.define('hu-HU', 'Date', {

	months: ['Január', 'Február', 'Március',
'Április', 'Május', 'Június',
'Július', 'Augusztus', 'Szeptember',
'Október', 'November', 'December'],
	months_abbr: ['jan.', 'febr.', 'márc.',
'ápr.', 'máj.', 'jún.', 'júl.',
'aug.', 'szept.', 'okt.', 'nov.',
'dec.'],
	days: ['Vasárnap', 'Hétfő', 'Kedd',
'Szerda', 'Csütörtök', 'Péntek',
'Szombat'],
	days_abbr: ['V', 'H', 'K', 'Sze',
'Cs', 'P', 'Szo'],

	// Culture's date order: YYYY.MM.DD.
	dateOrder: ['year', 'month', 'date'],
	shortDate: '%Y.%m.%d.',
	shortTime: '%I:%M',
	AM: 'de.',
	PM: 'du.',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '.',

	lessThanMinuteAgo: 'alig egy perce',
	minuteAgo: 'egy perce',
	minutesAgo: '{delta} perce',
	hourAgo: 'egy órája',
	hoursAgo: '{delta} órája',
	dayAgo: '1 napja',
	daysAgo: '{delta} napja',
	weekAgo: '1 hete',
	weeksAgo: '{delta} hete',
	monthAgo: '1 hónapja',
	monthsAgo: '{delta} hónapja',
	yearAgo: '1 éve',
	yearsAgo: '{delta} éve',

	lessThanMinuteUntil: 'alig egy perc múlva',
	minuteUntil: 'egy perc múlva',
	minutesUntil: '{delta} perc múlva',
	hourUntil: 'egy óra múlva',
	hoursUntil: '{delta} óra múlva',
	dayUntil: '1 nap múlva',
	daysUntil: '{delta} nap múlva',
	weekUntil: '1 hét múlva',
	weeksUntil: '{delta} hét múlva',
	monthUntil: '1 hónap múlva',
	monthsUntil: '{delta} hónap múlva',
	yearUntil: '1 év múlva',
	yearsUntil: '{delta} év múlva'

});


/*
---

name: Locale.hu-HU.Form.Validator

description: Form Validator messages for Hungarian.

license: MIT-style license

authors:
  - Zsolt Szegheő

requires:
  - /Locale

provides: [Locale.hu-HU.Form.Validator]

...
*/

Locale.define('hu-HU', 'FormValidator', {

	required: 'A mező kitöltése kötelező.',
	minLength: 'Legalább {minLength} karakter megadása szükséges
(megadva {length} karakter).',
	maxLength: 'Legfeljebb {maxLength} karakter megadása lehetséges
(megadva {length} karakter).',
	integer: 'Egész szám megadása szükséges. A tizedesjegyek (pl.
1.25) nem engedélyezettek.',
	numeric: 'Szám megadása szükséges (pl. "1" vagy
"1.1" vagy "-1" vagy "-1.1").',
	digits: 'Csak számok és írásjelek megadása lehetséges (pl.
telefonszám kötőjelek és/vagy perjelekkel).',
	alpha: 'Csak betűk (a-z) megadása lehetséges. Szóköz és egyéb
karakterek nem engedélyezettek.',
	alphanum: 'Csak betűk (a-z) vagy számok (0-9) megadása
lehetséges. Szóköz és egyéb karakterek nem engedélyezettek.',
	dateSuchAs: 'Valós dátum megadása szükséges (pl. {date}).',
	dateInFormatMDY: 'Valós dátum megadása szükséges ÉÉÉÉ.HH.NN.
formában. (pl. "1999.12.31.")',
	email: 'Valós e-mail cím megadása szükséges (pl.
"fred@domain.hu").',
	url: 'Valós URL megadása szükséges (pl.
http://www.example.com).',
	currencyDollar: 'Valós pénzösszeg megadása szükséges (pl.
100.00 Ft.).',
	oneRequired: 'Az alábbi mezők legalább egyikének kitöltése
kötelező.',
	errorPrefix: 'Hiba: ',
	warningPrefix: 'Figyelem: ',

	// Form.Validator.Extras
	noSpace: 'A mező nem tartalmazhat szóközöket.',
	reqChkByNode: 'Nincs egyetlen kijelölt elem sem.',
	requiredChk: 'A mező kitöltése kötelező.',
	reqChkByName: 'Egy {label} kiválasztása szükséges.',
	match: 'A mezőnek egyeznie kell a(z) {matchName} mezővel.',
	startDate: 'a kezdet dátuma',
	endDate: 'a vég dátuma',
	currendDate: 'jelenlegi dátum',
	afterDate: 'A dátum nem lehet kisebb, mint {label}.',
	beforeDate: 'A dátum nem lehet nagyobb, mint {label}.',
	startMonth: 'Kezdeti hónap megadása szükséges.',
	sameMonth: 'A két dátumnak ugyanazon hónapban kell lennie.',
	creditcard: 'A megadott bankkártyaszám nem valódi (megadva
{length} számjegy).'

});


/*
---

name: Locale.it-IT.Date

description: Date messages for Italian.

license: MIT-style license.

authors:
  - Andrea Novero
  - Valerio Proietti

requires:
  - /Locale

provides: [Locale.it-IT.Date]

...
*/

Locale.define('it-IT', 'Date', {

	months: ['Gennaio', 'Febbraio', 'Marzo',
'Aprile', 'Maggio', 'Giugno',
'Luglio', 'Agosto', 'Settembre',
'Ottobre', 'Novembre', 'Dicembre'],
	months_abbr: ['gen', 'feb', 'mar',
'apr', 'mag', 'giu', 'lug',
'ago', 'set', 'ott', 'nov',
'dic'],
	days: ['Domenica', 'Lunedì', 'Martedì',
'Mercoledì', 'Giovedì', 'Venerdì',
'Sabato'],
	days_abbr: ['dom', 'lun', 'mar',
'mer', 'gio', 'ven', 'sab'],

	// Culture's date order: DD/MM/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d/%m/%Y',
	shortTime: '%H.%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: 'º',

	lessThanMinuteAgo: 'meno di un minuto fa',
	minuteAgo: 'circa un minuto fa',
	minutesAgo: 'circa {delta} minuti fa',
	hourAgo: "circa un'ora fa",
	hoursAgo: 'circa {delta} ore fa',
	dayAgo: 'circa 1 giorno fa',
	daysAgo: 'circa {delta} giorni fa',
	weekAgo: 'una settimana fa',
	weeksAgo: '{delta} settimane fa',
	monthAgo: 'un mese fa',
	monthsAgo: '{delta} mesi fa',
	yearAgo: 'un anno fa',
	yearsAgo: '{delta} anni fa',

	lessThanMinuteUntil: 'tra meno di un minuto',
	minuteUntil: 'tra circa un minuto',
	minutesUntil: 'tra circa {delta} minuti',
	hourUntil: "tra circa un'ora",
	hoursUntil: 'tra circa {delta} ore',
	dayUntil: 'tra circa un giorno',
	daysUntil: 'tra circa {delta} giorni',
	weekUntil: 'tra una settimana',
	weeksUntil: 'tra {delta} settimane',
	monthUntil: 'tra un mese',
	monthsUntil: 'tra {delta} mesi',
	yearUntil: 'tra un anno',
	yearsUntil: 'tra {delta} anni'

});


/*
---

name: Locale.it-IT.Form.Validator

description: Form Validator messages for Italian.

license: MIT-style license

authors:
  - Leonardo Laureti
  - Andrea Novero

requires:
  - /Locale

provides: [Locale.it-IT.Form.Validator]

...
*/

Locale.define('it-IT', 'FormValidator', {

	required: 'Il campo &egrave; obbligatorio.',
	minLength: 'Inserire almeno {minLength} caratteri (ne sono stati
inseriti {length}).',
	maxLength: 'Inserire al massimo {maxLength} caratteri (ne sono stati
inseriti {length}).',
	integer: 'Inserire un numero intero. Non sono consentiti decimali
(es.: 1.25).',
	numeric: 'Inserire solo valori numerici (es.: "1" oppure
"1.1" oppure "-1" oppure "-1.1").',
	digits: 'Inserire solo numeri e caratteri di punteggiatura. Per
esempio &egrave; consentito un numero telefonico con trattini o
punti.',
	alpha: 'Inserire solo lettere (a-z). Non sono consentiti spazi o
altri caratteri.',
	alphanum: 'Inserire solo lettere (a-z) o numeri (0-9). Non sono
consentiti spazi o altri caratteri.',
	dateSuchAs: 'Inserire una data valida del tipo {date}',
	dateInFormatMDY: 'Inserire una data valida nel formato MM/GG/AAAA
(es.: "12/31/1999")',
	email: 'Inserire un indirizzo email valido. Per esempio
"nome@dominio.com".',
	url: 'Inserire un indirizzo valido. Per esempio
"http://www.example.com".',
	currencyDollar: 'Inserire un importo valido. Per esempio
"$100.00".',
	oneRequired: 'Completare almeno uno dei campi richiesti.',
	errorPrefix: 'Errore: ',
	warningPrefix: 'Attenzione: ',

	// Form.Validator.Extras
	noSpace: 'Non sono consentiti spazi.',
	reqChkByNode: 'Nessuna voce selezionata.',
	requiredChk: 'Il campo &egrave; obbligatorio.',
	reqChkByName: 'Selezionare un(a) {label}.',
	match: 'Il valore deve corrispondere al campo {matchName}',
	startDate: "data d'inizio",
	endDate: 'data di fine',
	currendDate: 'data attuale',
	afterDate: 'La data deve corrispondere o essere successiva al
{label}.',
	beforeDate: 'La data deve corrispondere o essere precedente al
{label}.',
	startMonth: "Selezionare un mese d'inizio",
	sameMonth: 'Le due date devono essere dello stesso mese - occorre
modificarne una.'

});


/*
---

name: Locale.ja-JP.Date

description: Date messages for Japanese.

license: MIT-style license

authors:
  - Noritaka Horio

requires:
  - /Locale

provides: [Locale.ja-JP.Date]

...
*/

Locale.define('ja-JP', 'Date', {

	months: ['1月', '2月', '3月',
'4月', '5月', '6月', '7月',
'8月', '9月', '10月', '11月',
'12月'],
	months_abbr: ['1月', '2月', '3月',
'4月', '5月', '6月', '7月',
'8月', '9月', '10月', '11月',
'12月'],
	days: ['日曜日', '月曜日',
'火曜日', '水曜日', '木曜日',
'金曜日', '土曜日'],
	days_abbr: ['日', '月', '火',
'水', '木', '金', '土'],

	// Culture's date order: YYYY/MM/DD
	dateOrder: ['year', 'month', 'date'],
	shortDate: '%Y/%m/%d',
	shortTime: '%H:%M',
	AM: '午前',
	PM: '午後',
	firstDayOfWeek: 0,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: '1分以内前',
	minuteAgo: '約1分前',
	minutesAgo: '約{delta}分前',
	hourAgo: '約1時間前',
	hoursAgo: '約{delta}時間前',
	dayAgo: '1日前',
	daysAgo: '{delta}日前',
	weekAgo: '1週間前',
	weeksAgo: '{delta}週間前',
	monthAgo: '1ヶ月前',
	monthsAgo: '{delta}ヶ月前',
	yearAgo: '1年前',
	yearsAgo: '{delta}年前',

	lessThanMinuteUntil: '今から約1分以内',
	minuteUntil: '今から約1分',
	minutesUntil: '今から約{delta}分',
	hourUntil: '今から約1時間',
	hoursUntil: '今から約{delta}時間',
	dayUntil: '今から1日間',
	daysUntil: '今から{delta}日間',
	weekUntil: '今から1週間',
	weeksUntil: '今から{delta}週間',
	monthUntil: '今から1ヶ月',
	monthsUntil: '今から{delta}ヶ月',
	yearUntil: '今から1年',
	yearsUntil: '今から{delta}年'

});


/*
---

name: Locale.ja-JP.Form.Validator

description: Form Validator messages for Japanese.

license: MIT-style license

authors:
  - Noritaka Horio

requires:
  - /Locale

provides: [Locale.ja-JP.Form.Validator]

...
*/

Locale.define("ja-JP", "FormValidator", {

	required: '入力は必須です。',
	minLength:
'入力文字数は{minLength}以上にしてください。({length}文字)',
	maxLength:
'入力文字数は{maxLength}以下にしてください。({length}文字)',
	integer: '整数を入力してください。',
	numeric: '入力できるのは数値だけです。(例:
"1", "1.1", "-1",
"-1.1"....)',
	digits: '入力できるのは数値と句読記号です。 (例:
-や+を含む電話番号など).',
	alpha:
'入力できるのは半角英字だけです。それ以外の文字は入力できません。',
	alphanum:
'入力できるのは半角英数字だけです。それ以外の文字は入力できません。',
	dateSuchAs:
'有効な日付を入力してください。{date}',
	dateInFormatMDY:
'日付の書式に誤りがあります。YYYY/MM/DD (i.e.
"1999/12/31")',
	email: 'メールアドレスに誤りがあります。',
	url: 'URLアドレスに誤りがあります。',
	currencyDollar: '金額に誤りがあります。',
	oneRequired: 'ひとつ以上入力してください。',
	errorPrefix: 'エラー: ',
	warningPrefix: '警告: ',

	// FormValidator.Extras
	noSpace: 'スペースは入力できません。',
	reqChkByNode: '選択されていません。',
	requiredChk: 'この項目は必須です。',
	reqChkByName: '{label}を選択してください。',
	match:
'{matchName}が入力されている場合必須です。',
	startDate: '開始日',
	endDate: '終了日',
	currendDate: '今日',
	afterDate: '{label}以降の日付にしてください。',
	beforeDate: '{label}以前の日付にしてください。',
	startMonth: '開始月を選択してください。',
	sameMonth:
'日付が同一です。どちらかを変更してください。'

});


/*
---

name: Locale.ja-JP.Number

description: Number messages for Japanese.

license: MIT-style license

authors:
  - Noritaka Horio

requires:
  - /Locale

provides: [Locale.ja-JP.Number]

...
*/

Locale.define('ja-JP', 'Number', {

	decimal: '.',
	group: ',',

	currency: {
		decimals: 0,
		prefix: '\\'
	}

});


/*
---

name: Locale.nl-NL.Date

description: Date messages for Dutch.

license: MIT-style license

authors:
  - Lennart Pilon
  - Tim Wienk

requires:
  - /Locale

provides: [Locale.nl-NL.Date]

...
*/

Locale.define('nl-NL', 'Date', {

	months: ['januari', 'februari', 'maart',
'april', 'mei', 'juni', 'juli',
'augustus', 'september', 'oktober',
'november', 'december'],
	months_abbr: ['jan', 'feb', 'mrt',
'apr', 'mei', 'jun', 'jul',
'aug', 'sep', 'okt', 'nov',
'dec'],
	days: ['zondag', 'maandag', 'dinsdag',
'woensdag', 'donderdag', 'vrijdag',
'zaterdag'],
	days_abbr: ['zo', 'ma', 'di',
'wo', 'do', 'vr', 'za'],

	// Culture's date order: DD-MM-YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d-%m-%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: 'e',

	lessThanMinuteAgo: 'minder dan een minuut geleden',
	minuteAgo: 'ongeveer een minuut geleden',
	minutesAgo: '{delta} minuten geleden',
	hourAgo: 'ongeveer een uur geleden',
	hoursAgo: 'ongeveer {delta} uur geleden',
	dayAgo: 'een dag geleden',
	daysAgo: '{delta} dagen geleden',
	weekAgo: 'een week geleden',
	weeksAgo: '{delta} weken geleden',
	monthAgo: 'een maand geleden',
	monthsAgo: '{delta} maanden geleden',
	yearAgo: 'een jaar geleden',
	yearsAgo: '{delta} jaar geleden',

	lessThanMinuteUntil: 'over minder dan een minuut',
	minuteUntil: 'over ongeveer een minuut',
	minutesUntil: 'over {delta} minuten',
	hourUntil: 'over ongeveer een uur',
	hoursUntil: 'over {delta} uur',
	dayUntil: 'over ongeveer een dag',
	daysUntil: 'over {delta} dagen',
	weekUntil: 'over een week',
	weeksUntil: 'over {delta} weken',
	monthUntil: 'over een maand',
	monthsUntil: 'over {delta} maanden',
	yearUntil: 'over een jaar',
	yearsUntil: 'over {delta} jaar'

});


/*
---

name: Locale.nl-NL.Form.Validator

description: Form Validator messages for Dutch.

license: MIT-style license

authors:
  - Lennart Pilon
  - Arian Stolwijk
  - Tim Wienk

requires:
  - /Locale

provides: [Locale.nl-NL.Form.Validator]

...
*/

Locale.define('nl-NL', 'FormValidator', {

	required: 'Dit veld is verplicht.',
	length: 'Vul precies {length} karakters in (je hebt {elLength}
karakters ingevoerd).',
	minLength: 'Vul minimaal {minLength} karakters in (je hebt {length}
karakters ingevoerd).',
	maxLength: 'Vul niet meer dan {maxLength} karakters in (je hebt
{length} karakters ingevoerd).',
	integer: 'Vul een getal in. Getallen met decimalen (bijvoorbeeld
1.25) zijn niet toegestaan.',
	numeric: 'Vul alleen numerieke waarden in (bijvoorbeeld "1"
of "1.1" of "-1" of "-1.1").',
	digits: 'Vul alleen nummers en leestekens in (bijvoorbeeld een
telefoonnummer met streepjes is toegestaan).',
	alpha: 'Vul alleen letters in (a-z). Spaties en andere karakters zijn
niet toegestaan.',
	alphanum: 'Vul alleen letters (a-z) of nummers (0-9) in. Spaties en
andere karakters zijn niet toegestaan.',
	dateSuchAs: 'Vul een geldige datum in, zoals {date}',
	dateInFormatMDY: 'Vul een geldige datum, in het formaat MM/DD/YYYY
(bijvoorbeeld "12/31/1999")',
	email: 'Vul een geldig e-mailadres in. Bijvoorbeeld
"fred@domein.nl".',
	url: 'Vul een geldige URL in, zoals http://www.example.com.',
	currencyDollar: 'Vul een geldig $ bedrag in. Bijvoorbeeld $100.00
.',
	oneRequired: 'Vul iets in bij in ieder geval een van deze
velden.',
	warningPrefix: 'Waarschuwing: ',
	errorPrefix: 'Fout: ',

	// Form.Validator.Extras
	noSpace: 'Spaties zijn niet toegestaan in dit veld.',
	reqChkByNode: 'Er zijn geen items geselecteerd.',
	requiredChk: 'Dit veld is verplicht.',
	reqChkByName: 'Selecteer een {label}.',
	match: 'Dit veld moet overeen komen met het {matchName} veld',
	startDate: 'de begin datum',
	endDate: 'de eind datum',
	currendDate: 'de huidige datum',
	afterDate: 'De datum moet hetzelfde of na {label} zijn.',
	beforeDate: 'De datum moet hetzelfde of voor {label} zijn.',
	startMonth: 'Selecteer een begin maand',
	sameMonth: 'Deze twee data moeten in dezelfde maand zijn - u moet een
van beide aanpassen.',
	creditcard: 'Het ingevulde creditcardnummer is niet geldig.
Controleer het nummer en probeer opnieuw. {length} getallen ingevuld.'

});


/*
---

name: Locale.nl-NL.Number

description: Number messages for Dutch.

license: MIT-style license

authors:
  - Arian Stolwijk

requires:
  - /Locale
  - /Locale.EU.Number

provides: [Locale.nl-NL.Number]

...
*/

Locale.define('nl-NL').inherit('EU',
'Number');





/*
---

name: Locale.no-NO.Date

description: Date messages for Norwegian.

license: MIT-style license

authors:
  - Espen 'Rexxars' Hovlandsdal

requires:
  - /Locale

provides: [Locale.no-NO.Date]

...
*/

Locale.define('no-NO', 'Date', {

	// Culture's date order: DD.MM.YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d.%m.%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	lessThanMinuteAgo: 'kortere enn et minutt siden',
	minuteAgo: 'omtrent et minutt siden',
	minutesAgo: '{delta} minutter siden',
	hourAgo: 'omtrent en time siden',
	hoursAgo: 'omtrent {delta} timer siden',
	dayAgo: '{delta} dag siden',
	daysAgo: '{delta} dager siden'

});


/*
---

name: Locale.no-NO.Form.Validator

description: Form Validator messages for Norwegian.

license: MIT-style license

authors:
  - Espen 'Rexxars' Hovlandsdal

requires:
  - /Locale

provides: [Locale.no-NO.Form.Validator]

...
*/

Locale.define('no-NO', 'FormValidator', {

	required: 'Dette feltet er påkrevd.',
	minLength: 'Vennligst skriv inn minst {minLength} tegn (du skrev
{length} tegn).',
	maxLength: 'Vennligst skriv inn maksimalt {maxLength} tegn (du skrev
{length} tegn).',
	integer: 'Vennligst skriv inn et tall i dette feltet. Tall med
desimaler (for eksempel 1,25) er ikke tillat.',
	numeric: 'Vennligst skriv inn kun numeriske verdier i dette feltet
(for eksempel "1", "1.1", "-1" eller
"-1.1").',
	digits: 'Vennligst bruk kun nummer og skilletegn i dette
feltet.',
	alpha: 'Vennligst bruk kun bokstaver (a-z) i dette feltet. Ingen
mellomrom eller andre tegn er tillat.',
	alphanum: 'Vennligst bruk kun bokstaver (a-z) eller nummer (0-9) i
dette feltet. Ingen mellomrom eller andre tegn er tillat.',
	dateSuchAs: 'Vennligst skriv inn en gyldig dato, som {date}',
	dateInFormatMDY: 'Vennligst skriv inn en gyldig dato, i formatet
MM/DD/YYYY (for eksempel "12/31/1999")',
	email: 'Vennligst skriv inn en gyldig epost-adresse. For eksempel
"espen@domene.no".',
	url: 'Vennligst skriv inn en gyldig URL, for eksempel
http://www.example.com.',
	currencyDollar: 'Vennligst fyll ut et gyldig $ beløp. For eksempel
$100.00 .',
	oneRequired: 'Vennligst fyll ut noe i minst ett av disse
feltene.',
	errorPrefix: 'Feil: ',
	warningPrefix: 'Advarsel: '

});


/*
---

name: Locale.pl-PL.Date

description: Date messages for Polish.

license: MIT-style license

authors:
  - Oskar Krawczyk

requires:
  - /Locale

provides: [Locale.pl-PL.Date]

...
*/

Locale.define('pl-PL', 'Date', {

	months: ['Styczeń', 'Luty', 'Marzec',
'Kwiecień', 'Maj', 'Czerwiec',
'Lipiec', 'Sierpień', 'Wrzesień',
'Październik', 'Listopad', 'Grudzień'],
	months_abbr: ['sty', 'lut', 'mar',
'kwi', 'maj', 'cze', 'lip',
'sie', 'wrz', 'paź', 'lis',
'gru'],
	days: ['Niedziela', 'Poniedziałek',
'Wtorek', 'Środa', 'Czwartek',
'Piątek', 'Sobota'],
	days_abbr: ['niedz.', 'pon.', 'wt.',
'śr.', 'czw.', 'pt.', 'sob.'],

	// Culture's date order: YYYY-MM-DD
	dateOrder: ['year', 'month', 'date'],
	shortDate: '%Y-%m-%d',
	shortTime: '%H:%M',
	AM: 'nad ranem',
	PM: 'po południu',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: function(dayOfMonth){
		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'ty'
: ['ty', 'szy', 'gi', 'ci',
'ty'][Math.min(dayOfMonth % 10, 4)];
	},

	lessThanMinuteAgo: 'mniej niż minute temu',
	minuteAgo: 'około minutę temu',
	minutesAgo: '{delta} minut temu',
	hourAgo: 'około godzinę temu',
	hoursAgo: 'około {delta} godzin temu',
	dayAgo: 'Wczoraj',
	daysAgo: '{delta} dni temu',

	lessThanMinuteUntil: 'za niecałą minutę',
	minuteUntil: 'za około minutę',
	minutesUntil: 'za {delta} minut',
	hourUntil: 'za około godzinę',
	hoursUntil: 'za około {delta} godzin',
	dayUntil: 'za 1 dzień',
	daysUntil: 'za {delta} dni'

});


/*
---

name: Locale.pl-PL.Form.Validator

description: Form Validator messages for Polish.

license: MIT-style license

authors:
  - Oskar Krawczyk

requires:
  - /Locale

provides: [Locale.pl-PL.Form.Validator]

...
*/

Locale.define('pl-PL', 'FormValidator', {

	required: 'To pole jest wymagane.',
	minLength: 'Wymagane jest przynajmniej {minLength} znaków (wpisanych
zostało tylko {length}).',
	maxLength: 'Dozwolone jest nie więcej niż {maxLength} znaków
(wpisanych zostało {length})',
	integer: 'To pole wymaga liczb całych. Liczby dziesiętne (np. 1.25)
są niedozwolone.',
	numeric: 'Prosimy używać tylko numerycznych wartości w tym polu
(np. "1", "1.1", "-1" lub
"-1.1").',
	digits: 'Prosimy używać liczb oraz zankow punktuacyjnych w typ polu
(dla przykładu, przy numerze telefonu myślniki i kropki są
dozwolone).',
	alpha: 'Prosimy używać tylko liter (a-z) w tym polu. Spacje oraz
inne znaki są niedozwolone.',
	alphanum: 'Prosimy używać tylko liter (a-z) lub liczb (0-9) w tym
polu. Spacje oraz inne znaki są niedozwolone.',
	dateSuchAs: 'Prosimy podać prawidłową datę w formacie:
{date}',
	dateInFormatMDY: 'Prosimy podać poprawną date w formacie DD.MM.RRRR
(i.e. "12.01.2009")',
	email: 'Prosimy podać prawidłowy adres e-mail, np.
"jan@domena.pl".',
	url: 'Prosimy podać prawidłowy adres URL, np.
http://www.example.com.',
	currencyDollar: 'Prosimy podać prawidłową sumę w PLN. Dla
przykładu: 100.00 PLN.',
	oneRequired: 'Prosimy wypełnić chociaż jedno z pól.',
	errorPrefix: 'Błąd: ',
	warningPrefix: 'Uwaga: ',

	// Form.Validator.Extras
	noSpace: 'W tym polu nie mogą znajdować się spacje.',
	reqChkByNode: 'Brak zaznaczonych elementów.',
	requiredChk: 'To pole jest wymagane.',
	reqChkByName: 'Prosimy wybrać z {label}.',
	match: 'To pole musi być takie samo jak {matchName}',
	startDate: 'data początkowa',
	endDate: 'data końcowa',
	currendDate: 'aktualna data',
	afterDate: 'Podana data poinna być taka sama lub po {label}.',
	beforeDate: 'Podana data poinna być taka sama lub przed
{label}.',
	startMonth: 'Prosimy wybrać początkowy miesiąc.',
	sameMonth: 'Te dwie daty muszą być w zakresie tego samego miesiąca
- wymagana jest zmiana któregoś z pól.'

});


/*
---

name: Locale.pt-PT.Date

description: Date messages for Portuguese.

license: MIT-style license

authors:
  - Fabio Miranda Costa

requires:
  - /Locale

provides: [Locale.pt-PT.Date]

...
*/

Locale.define('pt-PT', 'Date', {

	months: ['Janeiro', 'Fevereiro', 'Março',
'Abril', 'Maio', 'Junho', 'Julho',
'Agosto', 'Setembro', 'Outubro',
'Novembro', 'Dezembro'],
	months_abbr: ['Jan', 'Fev', 'Mar',
'Abr', 'Mai', 'Jun', 'Jul',
'Ago', 'Set', 'Out', 'Nov',
'Dez'],
	days: ['Domingo', 'Segunda-feira',
'Terça-feira', 'Quarta-feira',
'Quinta-feira', 'Sexta-feira', 'Sábado'],
	days_abbr: ['Dom', 'Seg', 'Ter',
'Qua', 'Qui', 'Sex', 'Sáb'],

	// Culture's date order: DD-MM-YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d-%m-%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: 'º',

	lessThanMinuteAgo: 'há menos de um minuto',
	minuteAgo: 'há cerca de um minuto',
	minutesAgo: 'há {delta} minutos',
	hourAgo: 'há cerca de uma hora',
	hoursAgo: 'há cerca de {delta} horas',
	dayAgo: 'há um dia',
	daysAgo: 'há {delta} dias',
	weekAgo: 'há uma semana',
	weeksAgo: 'há {delta} semanas',
	monthAgo: 'há um mês',
	monthsAgo: 'há {delta} meses',
	yearAgo: 'há um ano',
	yearsAgo: 'há {delta} anos',

	lessThanMinuteUntil: 'em menos de um minuto',
	minuteUntil: 'em um minuto',
	minutesUntil: 'em {delta} minutos',
	hourUntil: 'em uma hora',
	hoursUntil: 'em {delta} horas',
	dayUntil: 'em um dia',
	daysUntil: 'em {delta} dias',
	weekUntil: 'em uma semana',
	weeksUntil: 'em {delta} semanas',
	monthUntil: 'em um mês',
	monthsUntil: 'em {delta} meses',
	yearUntil: 'em um ano',
	yearsUntil: 'em {delta} anos'

});


/*
---

name: Locale.pt-BR.Date

description: Date messages for Portuguese (Brazil).

license: MIT-style license

authors:
  - Fabio Miranda Costa

requires:
  - /Locale
  - /Locale.pt-PT.Date

provides: [Locale.pt-BR.Date]

...
*/

Locale.define('pt-BR', 'Date', {

	// Culture's date order: DD/MM/YYYY
	shortDate: '%d/%m/%Y'

}).inherit('pt-PT', 'Date');


/*
---

name: Locale.pt-BR.Form.Validator

description: Form Validator messages for Portuguese (Brazil).

license: MIT-style license

authors:
  - Fábio Miranda Costa

requires:
  - /Locale

provides: [Locale.pt-BR.Form.Validator]

...
*/

Locale.define('pt-BR', 'FormValidator', {

	required: 'Este campo é obrigatório.',
	minLength: 'Digite pelo menos {minLength} caracteres (tamanho atual:
{length}).',
	maxLength: 'Não digite mais de {maxLength} caracteres (tamanho
atual: {length}).',
	integer: 'Por favor digite apenas um número inteiro neste campo.
Não são permitidos números decimais (por exemplo, 1,25).',
	numeric: 'Por favor digite apenas valores numéricos neste campo (por
exemplo, "1" ou "1.1" ou "-1" ou
"-1,1").',
	digits: 'Por favor use apenas números e pontuação neste campo (por
exemplo, um número de telefone com traços ou pontos é permitido).',
	alpha: 'Por favor use somente letras (a-z). Espaço e outros
caracteres não são permitidos.',
	alphanum: 'Use somente letras (a-z) ou números (0-9) neste campo.
Espaço e outros caracteres não são permitidos.',
	dateSuchAs: 'Digite uma data válida, como {date}',
	dateInFormatMDY: 'Digite uma data válida, como DD/MM/YYYY (por
exemplo, "31/12/1999")',
	email: 'Digite um endereço de email válido. Por exemplo
"nome@dominio.com".',
	url: 'Digite uma URL válida. Exemplo: http://www.example.com.',
	currencyDollar: 'Digite um valor em dinheiro válido. Exemplo:
R$100,00 .',
	oneRequired: 'Digite algo para pelo menos um desses campos.',
	errorPrefix: 'Erro: ',
	warningPrefix: 'Aviso: ',

	// Form.Validator.Extras
	noSpace: 'Não é possível digitar espaços neste campo.',
	reqChkByNode: 'Não foi selecionado nenhum item.',
	requiredChk: 'Este campo é obrigatório.',
	reqChkByName: 'Por favor digite um {label}.',
	match: 'Este campo deve ser igual ao campo {matchName}.',
	startDate: 'a data inicial',
	endDate: 'a data final',
	currendDate: 'a data atual',
	afterDate: 'A data deve ser igual ou posterior a {label}.',
	beforeDate: 'A data deve ser igual ou anterior a {label}.',
	startMonth: 'Por favor selecione uma data inicial.',
	sameMonth: 'Estas duas datas devem ter o mesmo mês - você deve
modificar uma das duas.',
	creditcard: 'O número do cartão de crédito informado é inválido.
Por favor verifique o valor e tente novamente. {length} números
informados.'

});


/*
---

name: Locale.pt-PT.Form.Validator

description: Form Validator messages for Portuguese.

license: MIT-style license

authors:
  - Miquel Hudin

requires:
  - /Locale

provides: [Locale.pt-PT.Form.Validator]

...
*/

Locale.define('pt-PT', 'FormValidator', {

	required: 'Este campo é necessário.',
	minLength: 'Digite pelo menos{minLength} caracteres (comprimento
{length} caracteres).',
	maxLength: 'Não insira mais de {maxLength} caracteres (comprimento
{length} caracteres).',
	integer: 'Digite um número inteiro neste domínio. Com números
decimais (por exemplo, 1,25), não são permitidas.',
	numeric: 'Digite apenas valores numéricos neste domínio (p.ex.,
"1" ou "1.1" ou "-1" ou
"-1,1").',
	digits: 'Por favor, use números e pontuação apenas neste campo
(p.ex., um número de telefone com traços ou pontos é permitida).',
	alpha: 'Por favor use somente letras (a-z), com nesta área. Não
utilize espaços nem outros caracteres são permitidos.',
	alphanum: 'Use somente letras (a-z) ou números (0-9) neste campo.
Não utilize espaços nem outros caracteres são permitidos.',
	dateSuchAs: 'Digite uma data válida, como {date}',
	dateInFormatMDY: 'Digite uma data válida, como DD/MM/YYYY (p.ex.
"31/12/1999")',
	email: 'Digite um endereço de email válido. Por exemplo
"fred@domain.com".',
	url: 'Digite uma URL válida, como http://www.example.com.',
	currencyDollar: 'Digite um valor válido $. Por exemplo $ 100,00.
',
	oneRequired: 'Digite algo para pelo menos um desses insumos.',
	errorPrefix: 'Erro: ',
	warningPrefix: 'Aviso: '

});


/*
---

name: Locale.ru-RU-unicode.Date

description: Date messages for Russian (utf-8).

license: MIT-style license

authors:
  - Evstigneev Pavel
  - Kuryanovich Egor

requires:
  - /Locale

provides: [Locale.ru-RU.Date]

...
*/

(function(){

// Russian language pluralization rules, taken from CLDR project,
http://unicode.org/cldr/
// one -> n mod 10 is 1 and n mod 100 is not 11;
// few -> n mod 10 in 2..4 and n mod 100 not in 12..14;
// many -> n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14;
// other -> everything else (example 3.14)
var pluralize = function (n, one, few, many, other){
	var modulo10 = n % 10,
		modulo100 = n % 100;

	if (modulo10 == 1 && modulo100 != 11){
		return one;
	} else if ((modulo10 == 2 || modulo10 == 3 || modulo10 == 4) &&
!(modulo100 == 12 || modulo100 == 13 || modulo100 == 14)){
		return few;
	} else if (modulo10 == 0 || (modulo10 == 5 || modulo10 == 6 || modulo10 ==
7 || modulo10 == 8 || modulo10 == 9) || (modulo100 == 11 || modulo100 == 12
|| modulo100 == 13 || modulo100 == 14)){
		return many;
	} else {
		return other;
	}
};

Locale.define('ru-RU', 'Date', {

	months: ['Январь', 'Февраль',
'Март', 'Апрель', 'Май',
'Июнь', 'Июль', 'Август',
'Сентябрь', 'Октябрь',
'Ноябрь', 'Декабрь'],
	months_abbr: ['янв', 'февр',
'март', 'апр',
'май','июнь','июль','авг','сент','окт','нояб','дек'],
	days: ['Воскресенье',
'Понедельник', 'Вторник',
'Среда', 'Четверг',
'Пятница', 'Суббота'],
	days_abbr: ['Вс', 'Пн', 'Вт',
'Ср', 'Чт', 'Пт', 'Сб'],

	// Culture's date order: DD.MM.YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d.%m.%Y',
	shortTime: '%H:%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: 'меньше минуты назад',
	minuteAgo: 'минуту назад',
	minutesAgo: function(delta){ return '{delta} ' +
pluralize(delta, 'минуту', 'минуты',
'минут') + ' назад'; },
	hourAgo: 'час назад',
	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta,
'час', 'часа', 'часов') + '
назад'; },
	dayAgo: 'вчера',
	daysAgo: function(delta){ return '{delta} ' + pluralize(delta,
'день', 'дня', 'дней') + '
назад'; },
	weekAgo: 'неделю назад',
	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta,
'неделя', 'недели',
'недель') + ' назад'; },
	monthAgo: 'месяц назад',
	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta,
'месяц', 'месяца',
'месецев') + ' назад'; },
	yearAgo: 'год назад',
	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta,
'год', 'года', 'лет') + '
назад'; },

	lessThanMinuteUntil: 'меньше чем через
минуту',
	minuteUntil: 'через минуту',
	minutesUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'час', 'часа',
'часов') + ''; },
	hourUntil: 'через час',
	hoursUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'час', 'часа',
'часов') + ''; },
	dayUntil: 'завтра',
	daysUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'день', 'дня',
'дней') + ''; },
	weekUntil: 'через неделю',
	weeksUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'неделю', 'недели',
'недель') + ''; },
	monthUntil: 'через месяц',
	monthsUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'месяц', 'месяца',
'месецев') + ''; },
	yearUntil: 'через',
	yearsUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'год', 'года',
'лет') + ''; }

});



})();


/*
---

name: Locale.ru-RU-unicode.Form.Validator

description: Form Validator messages for Russian (utf-8).

license: MIT-style license

authors:
  - Chernodarov Egor

requires:
  - /Locale

provides: [Locale.ru-RU.Form.Validator]

...
*/

Locale.define('ru-RU', 'FormValidator', {

	required: 'Это поле обязательно к
заполнению.',
	minLength: 'Пожалуйста, введите хотя бы
{minLength} символов (Вы ввели {length}).',
	maxLength: 'Пожалуйста, введите не больше
{maxLength} символов (Вы ввели {length}).',
	integer: 'Пожалуйста, введите в это поле
число. Дробные числа (например 1.25) тут не
разрешены.',
	numeric: 'Пожалуйста, введите в это поле
число (например "1" или "1.1", или
"-1", или "-1.1").',
	digits: 'В этом поле Вы можете
использовать только цифры и знаки
пунктуации (например, телефонный номер
со знаками дефиса или с точками).',
	alpha: 'В этом поле можно использовать
только латинские буквы (a-z). Пробелы и
другие символы запрещены.',
	alphanum: 'В этом поле можно использовать
только латинские буквы (a-z) и цифры (0-9).
Пробелы и другие символы запрещены.',
	dateSuchAs: 'Пожалуйста, введите
корректную дату {date}',
	dateInFormatMDY: 'Пожалуйста, введите дату в
формате ММ/ДД/ГГГГ (например
"12/31/1999")',
	email: 'Пожалуйста, введите корректный
емейл-адрес. Для примера
"fred@domain.com".',
	url: 'Пожалуйста, введите правильную
ссылку вида http://www.example.com.',
	currencyDollar: 'Пожалуйста, введите сумму в
долларах. Например: $100.00 .',
	oneRequired: 'Пожалуйста, выберите хоть
что-нибудь в одном из этих полей.',
	errorPrefix: 'Ошибка: ',
	warningPrefix: 'Внимание: '

});




/*
---

name: Locale.si-SI.Date

description: Date messages for Slovenian.

license: MIT-style license

authors:
  - Radovan Lozej

requires:
  - /Locale

provides: [Locale.si-SI.Date]

...
*/

(function(){

var pluralize = function(n, one, two, three, other){
	return (n >= 1 && n <= 3) ? arguments[n] : other;
};

Locale.define('si-SI', 'Date', {

	months: ['januar', 'februar', 'marec',
'april', 'maj', 'junij', 'julij',
'avgust', 'september', 'oktober',
'november', 'december'],
	months_abbr: ['jan', 'feb', 'mar',
'apr', 'maj', 'jun', 'jul',
'avg', 'sep', 'okt', 'nov',
'dec'],
	days: ['nedelja', 'ponedeljek', 'torek',
'sreda', 'četrtek', 'petek',
'sobota'],
	days_abbr: ['ned', 'pon', 'tor',
'sre', 'čet', 'pet', 'sob'],

	// Culture's date order: DD.MM.YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d.%m.%Y',
	shortTime: '%H.%M',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '.',

	lessThanMinuteAgo: 'manj kot minuto nazaj',
	minuteAgo: 'minuto nazaj',
	minutesAgo: function(delta){ return '{delta} ' +
pluralize(delta, 'minuto', 'minuti',
'minute', 'minut') + ' nazaj'; },
	hourAgo: 'uro nazaj',
	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta,
'uro', 'uri', 'ure', 'ur') + '
nazaj'; },
	dayAgo: 'dan nazaj',
	daysAgo: function(delta){ return '{delta} ' + pluralize(delta,
'dan', 'dneva', 'dni', 'dni') +
' nazaj'; },
	weekAgo: 'teden nazaj',
	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta,
'teden', 'tedna', 'tedne',
'tednov') + ' nazaj'; },
	monthAgo: 'mesec nazaj',
	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta,
'mesec', 'meseca', 'mesece',
'mesecov') + ' nazaj'; },
	yearthAgo: 'leto nazaj',
	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta,
'leto', 'leti', 'leta', 'let') +
' nazaj'; },

	lessThanMinuteUntil: 'še manj kot minuto',
	minuteUntil: 'še minuta',
	minutesUntil: function(delta){ return 'še {delta} ' +
pluralize(delta, 'minuta', 'minuti',
'minute', 'minut'); },
	hourUntil: 'še ura',
	hoursUntil: function(delta){ return 'še {delta} ' +
pluralize(delta, 'ura', 'uri', 'ure',
'ur'); },
	dayUntil: 'še dan',
	daysUntil: function(delta){ return 'še {delta} ' +
pluralize(delta, 'dan', 'dneva', 'dnevi',
'dni'); },
	weekUntil: 'še tedn',
	weeksUntil: function(delta){ return 'še {delta} ' +
pluralize(delta, 'teden', 'tedna', 'tedni',
'tednov'); },
	monthUntil: 'še mesec',
	monthsUntil: function(delta){ return 'še {delta} ' +
pluralize(delta, 'mesec', 'meseca', 'meseci',
'mesecov'); },
	yearUntil: 'še leto',
	yearsUntil: function(delta){ return 'še {delta} ' +
pluralize(delta, 'leto', 'leti', 'leta',
'let'); }

});

})();


/*
---

name: Locale.si-SI.Form.Validator

description: Form Validator messages for Slovenian.

license: MIT-style license

authors:
  - Radovan Lozej

requires:
  - /Locale

provides: [Locale.si-SI.Form.Validator]

...
*/

Locale.define('si-SI', 'FormValidator', {

	required: 'To polje je obvezno',
	minLength: 'Prosim, vnesite vsaj {minLength} znakov (vnesli ste
{length} znakov).',
	maxLength: 'Prosim, ne vnesite več kot {maxLength} znakov (vnesli
ste {length} znakov).',
	integer: 'Prosim, vnesite celo število. Decimalna števila (kot
1,25) niso dovoljena.',
	numeric: 'Prosim, vnesite samo numerične vrednosti (kot
"1" ali "1.1" ali "-1" ali
"-1.1").',
	digits: 'Prosim, uporabite številke in ločila le na tem polju (na
primer, dovoljena je telefonska številka z pomišlaji ali pikami).',
	alpha: 'Prosim, uporabite le črke v tem plju. Presledki in drugi
znaki niso dovoljeni.',
	alphanum: 'Prosim, uporabite samo črke ali številke v tem polju.
Presledki in drugi znaki niso dovoljeni.',
	dateSuchAs: 'Prosim, vnesite pravilen datum kot {date}',
	dateInFormatMDY: 'Prosim, vnesite pravilen datum kot MM.DD.YYYY
(primer "12.31.1999")',
	email: 'Prosim, vnesite pravilen email naslov. Na primer
"fred@domain.com".',
	url: 'Prosim, vnesite pravilen URL kot http://www.example.com.',
	currencyDollar: 'Prosim, vnesit epravilno vrednost €. Primer
100,00€ .',
	oneRequired: 'Prosimo, vnesite nekaj za vsaj eno izmed teh
polj.',
	errorPrefix: 'Napaka: ',
	warningPrefix: 'Opozorilo: ',

	// Form.Validator.Extras
	noSpace: 'To vnosno polje ne dopušča presledkov.',
	reqChkByNode: 'Nič niste izbrali.',
	requiredChk: 'To polje je obvezno',
	reqChkByName: 'Prosim, izberite {label}.',
	match: 'To polje se mora ujemati z poljem {matchName}',
	startDate: 'datum začetka',
	endDate: 'datum konca',
	currendDate: 'trenuten datum',
	afterDate: 'Datum bi moral biti isti ali po {label}.',
	beforeDate: 'Datum bi moral biti isti ali pred {label}.',
	startMonth: 'Prosim, vnesite začetni datum',
	sameMonth: 'Ta dva datuma morata biti v istem mesecu - premeniti
morate eno ali drugo.',
	creditcard: 'Številka kreditne kartice ni pravilna. Preverite
številko ali poskusite še enkrat. Vnešenih {length} znakov.'

});


/*
---

name: Locale.sv-SE.Date

description: Date messages for Swedish.

license: MIT-style license

authors:
  - Martin Lundgren

requires:
  - /Locale

provides: [Locale.sv-SE.Date]

...
*/

Locale.define('sv-SE', 'Date', {

	months: ['januari', 'februari', 'mars',
'april', 'maj', 'juni', 'juli',
'augusti', 'september', 'oktober',
'november', 'december'],
	months_abbr: ['jan', 'feb', 'mar',
'apr', 'maj', 'jun', 'jul',
'aug', 'sep', 'okt', 'nov',
'dec'],
	days: ['söndag', 'måndag', 'tisdag',
'onsdag', 'torsdag', 'fredag',
'lördag'],
	days_abbr: ['sön', 'mån', 'tis',
'ons', 'tor', 'fre', 'lör'],

	// Culture's date order: YYYY-MM-DD
	dateOrder: ['year', 'month', 'date'],
	shortDate: '%Y-%m-%d',
	shortTime: '%H:%M',
	AM: '',
	PM: '',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: 'mindre än en minut sedan',
	minuteAgo: 'ungefär en minut sedan',
	minutesAgo: '{delta} minuter sedan',
	hourAgo: 'ungefär en timme sedan',
	hoursAgo: 'ungefär {delta} timmar sedan',
	dayAgo: '1 dag sedan',
	daysAgo: '{delta} dagar sedan',

	lessThanMinuteUntil: 'mindre än en minut sedan',
	minuteUntil: 'ungefär en minut sedan',
	minutesUntil: '{delta} minuter sedan',
	hourUntil: 'ungefär en timme sedan',
	hoursUntil: 'ungefär {delta} timmar sedan',
	dayUntil: '1 dag sedan',
	daysUntil: '{delta} dagar sedan'

});


/*
---

name: Locale.sv-SE.Form.Validator

description: Form Validator messages for Swedish.

license: MIT-style license

authors:
  - Martin Lundgren

requires:
  - /Locale

provides: [Locale.sv-SE.Form.Validator]

...
*/

Locale.define('sv-SE', 'FormValidator', {

	required: 'Fältet är obligatoriskt.',
	minLength: 'Ange minst {minLength} tecken (du angav {length}
tecken).',
	maxLength: 'Ange högst {maxLength} tecken (du angav {length}
tecken). ',
	integer: 'Ange ett heltal i fältet. Tal med decimaler (t.ex. 1,25)
är inte tillåtna.',
	numeric: 'Ange endast numeriska värden i detta fält (t.ex.
"1" eller "1.1" eller "-1" eller
"-1,1").',
	digits: 'Använd endast siffror och skiljetecken i detta fält (till
exempel ett telefonnummer med bindestreck tillåtet).',
	alpha: 'Använd endast bokstäver (a-ö) i detta fält. Inga
mellanslag eller andra tecken är tillåtna.',
	alphanum: 'Använd endast bokstäver (a-ö) och siffror (0-9) i detta
fält. Inga mellanslag eller andra tecken är tillåtna.',
	dateSuchAs: 'Ange ett giltigt datum som t.ex. {date}',
	dateInFormatMDY: 'Ange ett giltigt datum som t.ex. YYYY-MM-DD (i.e.
"1999-12-31")',
	email: 'Ange en giltig e-postadress. Till exempel
"erik@domain.com".',
	url: 'Ange en giltig webbadress som http://www.example.com.',
	currencyDollar: 'Ange en giltig belopp. Exempelvis 100,00.',
	oneRequired: 'Vänligen ange minst ett av dessa alternativ.',
	errorPrefix: 'Fel: ',
	warningPrefix: 'Varning: ',

	// Form.Validator.Extras
	noSpace: 'Det får inte finnas några mellanslag i detta
fält.',
	reqChkByNode: 'Inga objekt är valda.',
	requiredChk: 'Detta är ett obligatoriskt fält.',
	reqChkByName: 'Välj en {label}.',
	match: 'Detta fält måste matcha {matchName}',
	startDate: 'startdatumet',
	endDate: 'slutdatum',
	currendDate: 'dagens datum',
	afterDate: 'Datumet bör vara samma eller senare än {label}.',
	beforeDate: 'Datumet bör vara samma eller tidigare än
{label}.',
	startMonth: 'Välj en start månad',
	sameMonth: 'Dessa två datum måste vara i samma månad - du måste
ändra det ena eller det andra.'

});


/*
---

name: Locale.uk-UA.Date

description: Date messages for Ukrainian (utf-8).

license: MIT-style license

authors:
  - Slik

requires:
  - /Locale

provides: [Locale.uk-UA.Date]

...
*/

(function(){

var pluralize = function(n, one, few, many, other){
	var d = (n / 10).toInt(),
		z = n % 10,
		s = (n / 100).toInt();

	if (d == 1 && n > 10) return many;
	if (z == 1) return one;
	if (z > 0 && z < 5) return few;
	return many;
};

Locale.define('uk-UA', 'Date', {

	months: ['Січень', 'Лютий',
'Березень', 'Квітень',
'Травень', 'Червень',
'Липень', 'Серпень',
'Вересень', 'Жовтень',
'Листопад', 'Грудень'],
	months_abbr: ['Січ', 'Лют', 'Бер',
'Квіт', 'Трав', 'Черв',
'Лип', 'Серп', 'Вер',
'Жовт', 'Лист', 'Груд' ],
	days: ['Неділя', 'Понеділок',
'Вівторок', 'Середа',
'Четвер', "П'ятниця",
'Субота'],
	days_abbr: ['Нд', 'Пн', 'Вт',
'Ср', 'Чт', 'Пт', 'Сб'],

	// Culture's date order: DD/MM/YYYY
	dateOrder: ['date', 'month', 'year'],
	shortDate: '%d/%m/%Y',
	shortTime: '%H:%M',
	AM: 'до полудня',
	PM: 'по полудню',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: 'меньше хвилини тому',
	minuteAgo: 'хвилину тому',
	minutesAgo: function(delta){ return '{delta} ' +
pluralize(delta, 'хвилину', 'хвилини',
'хвилин') + ' тому'; },
	hourAgo: 'годину тому',
	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta,
'годину', 'години', 'годин')
+ ' тому'; },
	dayAgo: 'вчора',
	daysAgo: function(delta){ return '{delta} ' + pluralize(delta,
'день', 'дня', 'днів') + '
тому'; },
	weekAgo: 'тиждень тому',
	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta,
'тиждень', 'тижні',
'тижнів') + ' тому'; },
	monthAgo: 'місяць тому',
	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta,
'місяць', 'місяці',
'місяців') + ' тому'; },
	yearAgo: 'рік тому',
	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta,
'рік', 'роки', 'років') + '
тому'; },

	lessThanMinuteUntil: 'за мить',
	minuteUntil: 'через хвилину',
	minutesUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'хвилину', 'хвилини',
'хвилин'); },
	hourUntil: 'через годину',
	hoursUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'годину', 'години',
'годин'); },
	dayUntil: 'завтра',
	daysUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'день', 'дня',
'днів'); },
	weekUntil: 'через тиждень',
	weeksUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'тиждень', 'тижні',
'тижнів'); },
	monthUntil: 'через місяць',
	monthesUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'місяць', 'місяці',
'місяців'); },
	yearUntil: 'через рік',
	yearsUntil: function(delta){ return 'через {delta} ' +
pluralize(delta, 'рік', 'роки',
'років'); }

});

})();


/*
---

name: Locale.uk-UA.Form.Validator

description: Form Validator messages for Ukrainian (utf-8).

license: MIT-style license

authors:
  - Slik

requires:
  - /Locale

provides: [Locale.uk-UA.Form.Validator]

...
*/

Locale.define('uk-UA', 'FormValidator', {

	required: 'Це поле повинне бути
заповненим.',
	minLength: 'Введіть хоча б {minLength} символів
(Ви ввели {length}).',
	maxLength: 'Кількість символів не може
бути більше {maxLength} (Ви ввели {length}).',
	integer: 'Введіть в це поле число. Дробові
числа (наприклад 1.25) не дозволені.',
	numeric: 'Введіть в це поле число
(наприклад "1" або "1.1", або
"-1", або "-1.1").',
	digits: 'В цьому полі ви можете
використовувати лише цифри і знаки
пунктіації (наприклад, телефонний номер
з знаками дефізу або з крапками).',
	alpha: 'В цьому полі можна
використовувати лише латинські літери
(a-z). Пробіли і інші символи
заборонені.',
	alphanum: 'В цьому полі можна
використовувати лише латинські літери
(a-z) і цифри (0-9). Пробіли і інші символи
заборонені.',
	dateSuchAs: 'Введіть коректну дату {date}.',
	dateInFormatMDY: 'Введіть дату в форматі
ММ/ДД/РРРР (наприклад "12/31/2009").',
	email: 'Введіть коректну адресу
електронної пошти (наприклад
"name@domain.com").',
	url: 'Введіть коректне
інтернет-посилання (наприклад
http://www.example.com).',
	currencyDollar: 'Введіть суму в доларах
(наприклад "$100.00").',
	oneRequired: 'Заповніть одне з полів.',
	errorPrefix: 'Помилка: ',
	warningPrefix: 'Увага: ',

	noSpace: 'Пробіли заборонені.',
	reqChkByNode: 'Не відмічено жодного
варіанту.',
	requiredChk: 'Це поле повинне бути
віміченим.',
	reqChkByName: 'Будь ласка, відмітьте
{label}.',
	match: 'Це поле повинно відповідати
{matchName}',
	startDate: 'початкова дата',
	endDate: 'кінцева дата',
	currendDate: 'сьогоднішня дата',
	afterDate: 'Ця дата повинна бути такою ж,
або пізнішою за {label}.',
	beforeDate: 'Ця дата повинна бути такою ж,
або ранішою за {label}.',
	startMonth: 'Будь ласка, виберіть
початковий місяць',
	sameMonth: 'Ці дати повинні відноситись
одного і того ж місяця. Будь ласка,
змініть одну з них.',
	creditcard: 'Номер кредитної карти
введений неправильно. Будь ласка,
перевірте його. Введено {length}
символів.'

});


/*
---

name: Locale.zh-CH.Date

description: Date messages for Chinese (simplified and traditional).

license: MIT-style license

authors:
  - YMind Chan

requires:
  - /Locale

provides: [Locale.zh-CH.Date]

...
*/

// Simplified Chinese
Locale.define('zh-CHS', 'Date', {

	months: ['一月', '二月', '三月',
'四月', '五月', '六月',
'七月', '八月', '九月',
'十月', '十一月', '十二月'],
	months_abbr: ['一', '二', '三',
'四', '五', '六', '七',
'八', '九', '十', '十一',
'十二'],
	days: ['星期日', '星期一',
'星期二', '星期三', '星期四',
'星期五', '星期六'],
	days_abbr: ['日', '一', '二',
'三', '四', '五', '六'],

	// Culture's date order: YYYY-MM-DD
	dateOrder: ['year', 'month', 'date'],
	shortDate: '%Y-%m-%d',
	shortTime: '%I:%M%p',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: '不到1分钟前',
	minuteAgo: '大约1分钟前',
	minutesAgo: '{delta}分钟之前',
	hourAgo: '大约1小时前',
	hoursAgo: '大约{delta}小时前',
	dayAgo: '1天前',
	daysAgo: '{delta}天前',
	weekAgo: '1星期前',
	weeksAgo: '{delta}星期前',
	monthAgo: '1个月前',
	monthsAgo: '{delta}个月前',
	yearAgo: '1年前',
	yearsAgo: '{delta}年前',

	lessThanMinuteUntil: '从现在开始不到1分钟',
	minuteUntil: '从现在开始約1分钟',
	minutesUntil: '从现在开始约{delta}分钟',
	hourUntil: '从现在开始1小时',
	hoursUntil: '从现在开始约{delta}小时',
	dayUntil: '从现在开始1天',
	daysUntil: '从现在开始{delta}天',
	weekUntil: '从现在开始1星期',
	weeksUntil: '从现在开始{delta}星期',
	monthUntil: '从现在开始一个月',
	monthsUntil: '从现在开始{delta}个月',
	yearUntil: '从现在开始1年',
	yearsUntil: '从现在开始{delta}年'

});

// Traditional Chinese
Locale.define('zh-CHT', 'Date', {

	months: ['一月', '二月', '三月',
'四月', '五月', '六月',
'七月', '八月', '九月',
'十月', '十一月', '十二月'],
	months_abbr: ['一', '二', '三',
'四', '五', '六', '七',
'八', '九', '十', '十一',
'十二'],
	days: ['星期日', '星期一',
'星期二', '星期三', '星期四',
'星期五', '星期六'],
	days_abbr: ['日', '一', '二',
'三', '四', '五', '六'],

	// Culture's date order: YYYY-MM-DD
	dateOrder: ['year', 'month', 'date'],
	shortDate: '%Y-%m-%d',
	shortTime: '%I:%M%p',
	AM: 'AM',
	PM: 'PM',
	firstDayOfWeek: 1,

	// Date.Extras
	ordinal: '',

	lessThanMinuteAgo: '不到1分鐘前',
	minuteAgo: '大約1分鐘前',
	minutesAgo: '{delta}分鐘之前',
	hourAgo: '大約1小時前',
	hoursAgo: '大約{delta}小時前',
	dayAgo: '1天前',
	daysAgo: '{delta}天前',
	weekAgo: '1星期前',
	weeksAgo: '{delta}星期前',
	monthAgo: '1个月前',
	monthsAgo: '{delta}个月前',
	yearAgo: '1年前',
	yearsAgo: '{delta}年前',

	lessThanMinuteUntil: '從現在開始不到1分鐘',
	minuteUntil: '從現在開始約1分鐘',
	minutesUntil: '從現在開始約{delta}分鐘',
	hourUntil: '從現在開始1小時',
	hoursUntil: '從現在開始約{delta}小時',
	dayUntil: '從現在開始1天',
	daysUntil: '從現在開始{delta}天',
	weekUntil: '從現在開始1星期',
	weeksUntil: '從現在開始{delta}星期',
	monthUntil: '從現在開始一個月',
	monthsUntil: '從現在開始{delta}個月',
	yearUntil: '從現在開始1年',
	yearsUntil: '從現在開始{delta}年'

});


/*
---

name: Locale.zh-CH.Form.Validator

description: Form Validator messages for Chinese (simplified and
traditional).

license: MIT-style license

authors:
  - YMind Chan

requires:
  - /Locale
  - /Form.Validator

provides: [Form.zh-CH.Form.Validator, Form.Validator.CurrencyYuanValidator]

...
*/

// Simplified Chinese
Locale.define('zh-CHS', 'FormValidator', {

	required: '此项必填。',
	minLength: '请至少输入 {minLength} 个字符 (已输入 {length}
个)。',
	maxLength: '最多只能输入 {maxLength} 个字符 (已输入
{length} 个)。',
	integer:
'请输入一个整数,不能包含小数点。例如:"1",
"200"。',
	numeric: '请输入一个数字,例如:"1",
"1.1", "-1", "-1.1"。',
	digits:
'请输入由数字和标点符号组成的内容。例如电话号码。',
	alpha: '请输入 A-Z 的 26
个字母,不能包含空格或任何其他字符。',
	alphanum: '请输入 A-Z 的 26 个字母或 0-9 的 10
个数字,不能包含空格或任何其他字符。',
	dateSuchAs: '请输入合法的日期格式,如:{date}。',
	dateInFormatMDY:
'请输入合法的日期格式,例如:YYYY-MM-DD
("2010-12-31")。',
	email:
'请输入合法的电子信箱地址,例如:"fred@domain.com"。',
	url: '请输入合法的 Url
地址,例如:http://www.example.com。',
	currencyDollar:
'请输入合法的货币符号,例如:¥100.0',
	oneRequired: '请至少选择一项。',
	errorPrefix: '错误:',
	warningPrefix: '警告:',

	// Form.Validator.Extras
	noSpace: '不能包含空格。',
	reqChkByNode: '未选择任何内容。',
	requiredChk: '此项必填。',
	reqChkByName: '请选择 {label}.',
	match: '必须与{matchName}相匹配',
	startDate: '起始日期',
	endDate: '结束日期',
	currendDate: '当前日期',
	afterDate: '日期必须等于或晚于 {label}.',
	beforeDate: '日期必须早于或等于 {label}.',
	startMonth: '请选择起始月份',
	sameMonth:
'您必须修改两个日期中的一个,以确保它们在同一月份。',
	creditcard:
'您输入的信用卡号码不正确。当前已输入{length}个字符。'

});

// Traditional Chinese
Locale.define('zh-CHT', 'FormValidator', {

	required: '此項必填。 ',
	minLength: '請至少輸入{minLength} 個字符(已輸入{length}
個)。 ',
	maxLength: '最多只能輸入{maxLength} 個字符(已輸入{length}
個)。 ',
	integer:
'請輸入一個整數,不能包含小數點。例如:"1",
"200"。 ',
	numeric: '請輸入一個數字,例如:"1",
"1.1", "-1", "-1.1"。 ',
	digits:
'請輸入由數字和標點符號組成的內容。例如電話號碼。
',
	alpha: '請輸入AZ 的26
個字母,不能包含空格或任何其他字符。 ',
	alphanum: '請輸入AZ 的26 個字母或0-9 的10
個數字,不能包含空格或任何其他字符。 ',
	dateSuchAs: '請輸入合法的日期格式,如:{date}。 ',
	dateInFormatMDY:
'請輸入合法的日期格式,例如:YYYY-MM-DD
("2010-12-31")。 ',
	email:
'請輸入合法的電子信箱地址,例如:"fred@domain.com"。
',
	url: '請輸入合法的Url
地址,例如:http://www.example.com。 ',
	currencyDollar:
'請輸入合法的貨幣符號,例如:¥100.0',
	oneRequired: '請至少選擇一項。 ',
	errorPrefix: '錯誤:',
	warningPrefix: '警告:',

	// Form.Validator.Extras
	noSpace: '不能包含空格。 ',
	reqChkByNode: '未選擇任何內容。 ',
	requiredChk: '此項必填。 ',
	reqChkByName: '請選擇 {label}.',
	match: '必須與{matchName}相匹配',
	startDate: '起始日期',
	endDate: '結束日期',
	currendDate: '當前日期',
	afterDate: '日期必須等於或晚於{label}.',
	beforeDate: '日期必須早於或等於{label}.',
	startMonth: '請選擇起始月份',
	sameMonth:
'您必須修改兩個日期中的一個,以確保它們在同一月份。
',
	creditcard:
'您輸入的信用卡號碼不正確。當前已輸入{length}個字符。
'

});

Form.Validator.add('validate-currency-yuan', {

	errorMsg: function(){
		return Form.Validator.getMsg('currencyYuan');
	},

	test: function(element){
		// [¥]1[##][,###]+[.##]
		// [¥]1###+[.##]
		// [¥]0.##
		// [¥].##
		return Form.Validator.getValidator('IsEmpty').test(element) ||
(/^¥?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(element.get('value'));
	}

});

PK]n�[�[���js/mootools-more.jsnu�[���//
MooTools: the javascript framework.
// Load this file's selection again by visiting:
http://mootools.net/more/065f2f092ece4e3b32bb5214464cf926 
// Or build this file again with packager using: packager build More/More
More/Events.Pseudos More/Class.Refactor More/Class.Binds More/Class.Occlude
More/Chain.Wait More/Array.Extras More/Date More/Date.Extras
More/Number.Format More/Object.Extras More/String.Extras
More/String.QueryString More/URI More/URI.Relative More/Hash
More/Hash.Extras More/Element.Forms More/Elements.From
More/Element.Event.Pseudos More/Element.Event.Pseudos.Keys
More/Element.Measure More/Element.Pin More/Element.Position
More/Element.Shortcuts More/Form.Request More/Form.Request.Append
More/Form.Validator More/Form.Validator.Inline More/Form.Validator.Extras
More/OverText More/Fx.Elements More/Fx.Accordion More/Fx.Move
More/Fx.Reveal More/Fx.Scroll More/Fx.Slide More/Fx.SmoothScroll
More/Fx.Sort More/Drag More/Drag.Move More/Slider More/Sortables
More/Request.JSONP More/Request.Queue More/Request.Periodical More/Assets
More/Color More/Group More/Hash.Cookie More/IframeShim More/Table
More/HtmlTable More/HtmlTable.Zebra More/HtmlTable.Sort
More/HtmlTable.Select More/Keyboard More/Keyboard.Extras More/Mask
More/Scroller More/Tips More/Spinner More/Locale More/Locale.Set.From
More/Locale.en-US.Date More/Locale.en-US.Form.Validator
More/Locale.en-US.Number More/Locale.ar.Date More/Locale.ar.Form.Validator
More/Locale.ca-CA.Date More/Locale.ca-CA.Form.Validator
More/Locale.cs-CZ.Date More/Locale.cs-CZ.Form.Validator
More/Locale.da-DK.Date More/Locale.da-DK.Form.Validator
More/Locale.de-CH.Date More/Locale.de-CH.Form.Validator
More/Locale.de-DE.Date More/Locale.de-DE.Form.Validator
More/Locale.de-DE.Number More/Locale.en-GB.Date More/Locale.es-AR.Date
More/Locale.es-AR.Form.Validator More/Locale.es-ES.Date
More/Locale.es-ES.Form.Validator More/Locale.et-EE.Date
More/Locale.et-EE.Form.Validator More/Locale.EU.Number More/Locale.fa.Date
More/Locale.fa.Form.Validator More/Locale.fi-FI.Date
More/Locale.fi-FI.Form.Validator More/Locale.fi-FI.Number
More/Locale.fr-FR.Date More/Locale.fr-FR.Form.Validator
More/Locale.fr-FR.Number More/Locale.he-IL.Date
More/Locale.he-IL.Form.Validator More/Locale.he-IL.Number
More/Locale.hu-HU.Date More/Locale.hu-HU.Form.Validator
More/Locale.it-IT.Date More/Locale.it-IT.Form.Validator
More/Locale.ja-JP.Date More/Locale.ja-JP.Form.Validator
More/Locale.ja-JP.Number More/Locale.nl-NL.Date
More/Locale.nl-NL.Form.Validator More/Locale.nl-NL.Number
More/Locale.no-NO.Date More/Locale.no-NO.Form.Validator
More/Locale.pl-PL.Date More/Locale.pl-PL.Form.Validator
More/Locale.pt-BR.Date More/Locale.pt-BR.Form.Validator
More/Locale.pt-PT.Date More/Locale.pt-PT.Form.Validator
More/Locale.ru-RU-unicode.Date More/Locale.ru-RU-unicode.Form.Validator
More/Locale.si-SI.Date More/Locale.si-SI.Form.Validator
More/Locale.sv-SE.Date More/Locale.sv-SE.Form.Validator
More/Locale.uk-UA.Date More/Locale.uk-UA.Form.Validator
More/Locale.zh-CH.Date More/Locale.zh-CH.Form.Validator
/*
---
copyrights:
  - [MooTools](http://mootools.net)

licenses:
  - [MIT License](http://mootools.net/license.txt)
...
*/
MooTools.More={version:"1.4.0.1",build:"a4244edf2aa97ac8a196fc96082dd35af1abab87"};(function(){Events.Pseudos=function(h,e,f){var
d="_monitorEvents:";var
c=function(i){return{store:i.store?function(j,k){i.store(d+j,k);
}:function(j,k){(i._monitorEvents||(i._monitorEvents={}))[j]=k;},retrieve:i.retrieve?function(j,k){return
i.retrieve(d+j,k);}:function(j,k){if(!i._monitorEvents){return k;
}return i._monitorEvents[j]||k;}};};var
g=function(k){if(k.indexOf(":")==-1||!h){return null;}var
j=Slick.parse(k).expressions[0][0],p=j.pseudos,i=p.length,o=[];
while(i--){var
n=p[i].key,m=h[n];if(m!=null){o.push({event:j.tag,value:p[i].value,pseudo:n,original:k,listener:m});}}return
o.length?o:null;};return{addEvent:function(m,p,j){var n=g(m);
if(!n){return e.call(this,m,p,j);}var
k=c(this),r=k.retrieve(m,[]),i=n[0].event,l=Array.slice(arguments,2),o=p,q=this;n.each(function(s){var
t=s.listener,u=o;
if(t==false){i+=":"+s.pseudo+"("+s.value+")";}else{o=function(){t.call(q,s,u,arguments,o);};}});r.include({type:i,event:p,monitor:o});k.store(m,r);if(m!=i){e.apply(this,[m,p].concat(l));
}return e.apply(this,[i,o].concat(l));},removeEvent:function(m,l){var
k=g(m);if(!k){return f.call(this,m,l);}var
n=c(this),j=n.retrieve(m);if(!j){return this;
}var
i=Array.slice(arguments,2);f.apply(this,[m,l].concat(i));j.each(function(o,p){if(!l||o.event==l){f.apply(this,[o.type,o.monitor].concat(i));}delete
j[p];
},this);n.store(m,j);return this;}};};var
b={once:function(e,f,d,c){f.apply(this,d);this.removeEvent(e.event,c).removeEvent(e.original,f);},throttle:function(d,e,c){if(!e._throttled){e.apply(this,c);
e._throttled=setTimeout(function(){e._throttled=false;},d.value||250);}},pause:function(d,e,c){clearTimeout(e._pause);e._pause=e.delay(d.value||250,this,c);
}};Events.definePseudo=function(c,d){b[c]=d;return
this;};Events.lookupPseudo=function(c){return b[c];};var
a=Events.prototype;Events.implement(Events.Pseudos(b,a.addEvent,a.removeEvent));
["Request","Fx"].each(function(c){if(this[c]){this[c].implement(Events.prototype);}});})();Class.refactor=function(b,a){Object.each(a,function(e,d){var
c=b.prototype[d];
c=(c&&c.$origin)||c||function(){};b.implement(d,(typeof
e=="function")?function(){var f=this.previous;this.previous=c;var
g=e.apply(this,arguments);this.previous=f;
return g;}:e);});return
b;};Class.Mutators.Binds=function(a){if(!this.prototype.initialize){this.implement("initialize",function(){});}return
Array.from(a).concat(this.prototype.Binds||[]);
};Class.Mutators.initialize=function(a){return
function(){Array.from(this.Binds).each(function(b){var
c=this[b];if(c){this[b]=c.bind(this);}},this);return
a.apply(this,arguments);
};};Class.Occlude=new
Class({occlude:function(c,b){b=document.id(b||this.element);var
a=b.retrieve(c||this.property);if(a&&!this.occluded){return(this.occluded=a);
}this.occluded=false;b.store(c||this.property,this);return
this.occluded;}});(function(){var a={wait:function(b){return
this.chain(function(){this.callChain.delay(b==null?500:b,this);
return
this;}.bind(this));}};Chain.implement(a);if(this.Fx){Fx.implement(a);}if(this.Element&&Element.implement&&this.Fx){Element.implement({chains:function(b){Array.from(b||["tween","morph","reveal"]).each(function(c){c=this.get(c);
if(!c){return;}c.setOptions({link:"chain"});},this);return
this;},pauseFx:function(c,b){this.chains(b).get(b||"tween").wait(c);return
this;}});}})();(function(a){Array.implement({min:function(){return
Math.min.apply(null,this);
},max:function(){return
Math.max.apply(null,this);},average:function(){return
this.length?this.sum()/this.length:0;},sum:function(){var
b=0,c=this.length;
if(c){while(c--){b+=this[c];}}return
b;},unique:function(){return[].combine(this);},shuffle:function(){for(var
c=this.length;c&&--c;){var
b=this[c],d=Math.floor(Math.random()*(c+1));
this[c]=this[d];this[d]=b;}return this;},reduce:function(d,e){for(var
c=0,b=this.length;c<b;c++){if(c in
this){e=e===a?this[c]:d.call(null,e,this[c],c,this);
}}return e;},reduceRight:function(c,d){var b=this.length;while(b--){if(b in
this){d=d===a?this[b]:c.call(null,d,this[b],b,this);}}return
d;}});})();(function(){var b=function(c){return c!=null;
};var
a=Object.prototype.hasOwnProperty;Object.extend({getFromPath:function(e,f){if(typeof
f=="string"){f=f.split(".");}for(var
d=0,c=f.length;d<c;d++){if(a.call(e,f[d])){e=e[f[d]];
}else{return null;}}return e;},cleanValues:function(c,e){e=e||b;for(var d
in c){if(!e(c[d])){delete c[d];}}return
c;},erase:function(c,d){if(a.call(c,d)){delete c[d];
}return c;},run:function(d){var c=Array.slice(arguments,1);for(var e in
d){if(d[e].apply){d[e].apply(d,c);}}return d;}});})();(function(){var
b=null,a={},d={};
var c=function(f){if(instanceOf(f,e.Set)){return f;}else{return a[f];}};var
e=this.Locale={define:function(f,j,h,i){var
g;if(instanceOf(f,e.Set)){g=f.name;
if(g){a[g]=f;}}else{g=f;if(!a[g]){a[g]=new
e.Set(g);}f=a[g];}if(j){f.define(j,h,i);}if(!b){b=f;}return
f;},use:function(f){f=c(f);if(f){b=f;this.fireEvent("change",f);
}return this;},getCurrent:function(){return
b;},get:function(g,f){return(b)?b.get(g,f):"";},inherit:function(f,g,h){f=c(f);if(f){f.inherit(g,h);}return
this;
},list:function(){return Object.keys(a);}};Object.append(e,new
Events);e.Set=new
Class({sets:{},inherits:{locales:[],sets:{}},initialize:function(f){this.name=f||"";
},define:function(i,g,h){var
f=this.sets[i];if(!f){f={};}if(g){if(typeOf(g)=="object"){f=Object.merge(f,g);}else{f[g]=h;}}this.sets[i]=f;return
this;},get:function(r,j,q){var p=Object.getFromPath(this.sets,r);
if(p!=null){var
m=typeOf(p);if(m=="function"){p=p.apply(null,Array.from(j));}else{if(m=="object"){p=Object.clone(p);}}return
p;}var
h=r.indexOf("."),o=h<0?r:r.substr(0,h),k=(this.inherits.sets[o]||[]).combine(this.inherits.locales).include("en-US");
if(!q){q=[];}for(var
g=0,f=k.length;g<f;g++){if(q.contains(k[g])){continue;}q.include(k[g]);var
n=a[k[g]];if(!n){continue;}p=n.get(r,j,q);if(p!=null){return p;
}}return"";},inherit:function(g,h){g=Array.from(g);if(h&&!this.inherits.sets[h]){this.inherits.sets[h]=[];}var
f=g.length;while(f--){(h?this.inherits.sets[h]:this.inherits.locales).unshift(g[f]);
}return
this;}});})();Locale.define("en-US","Date",{months:["January","February","March","April","May","June","July","August","September","October","November","December"],months_abbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],days_abbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dateOrder:["month","date","year"],shortDate:"%m/%d/%Y",shortTime:"%I:%M%p",AM:"AM",PM:"PM",firstDayOfWeek:0,ordinal:function(a){return(a>3&&a<21)?"th":["th","st","nd","rd","th"][Math.min(a%10,4)];
},lessThanMinuteAgo:"less than a minute
ago",minuteAgo:"about a minute ago",minutesAgo:"{delta}
minutes ago",hourAgo:"about an hour
ago",hoursAgo:"about {delta} hours ago",dayAgo:"1 day
ago",daysAgo:"{delta} days ago",weekAgo:"1 week
ago",weeksAgo:"{delta} weeks ago",monthAgo:"1 month
ago",monthsAgo:"{delta} months ago",yearAgo:"1 year
ago",yearsAgo:"{delta} years
ago",lessThanMinuteUntil:"less than a minute from
now",minuteUntil:"about a minute from
now",minutesUntil:"{delta} minutes from
now",hourUntil:"about an hour from
now",hoursUntil:"about {delta} hours from
now",dayUntil:"1 day from now",daysUntil:"{delta} days
from now",weekUntil:"1 week from
now",weeksUntil:"{delta} weeks from now",monthUntil:"1
month from now",monthsUntil:"{delta} months from
now",yearUntil:"1 year from now",yearsUntil:"{delta}
years from now"});
(function(){var a=this.Date;var
f=a.Methods={ms:"Milliseconds",year:"FullYear",min:"Minutes",mo:"Month",sec:"Seconds",hr:"Hours"};["Date","Day","FullYear","Hours","Milliseconds","Minutes","Month","Seconds","Time","TimezoneOffset","Week","Timezone","GMTOffset","DayOfYear","LastMonth","LastDayOfMonth","UTCDate","UTCDay","UTCFullYear","AMPM","Ordinal","UTCHours","UTCMilliseconds","UTCMinutes","UTCMonth","UTCSeconds","UTCMilliseconds"].each(function(s){a.Methods[s.toLowerCase()]=s;
});var p=function(u,t,s){if(t==1){return u;}return
u<Math.pow(10,t-1)?(s||"0")+p(u,t-1,s):u;};a.implement({set:function(u,s){u=u.toLowerCase();var
t=f[u]&&"set"+f[u];
if(t&&this[t]){this[t](s);}return
this;}.overloadSetter(),get:function(t){t=t.toLowerCase();var
s=f[t]&&"get"+f[t];if(s&&this[s]){return
this[s]();}return null;
}.overloadGetter(),clone:function(){return new
a(this.get("time"));},increment:function(s,u){s=s||"day";u=u!=null?u:1;switch(s){case"year":return
this.increment("month",u*12);
case"month":var
t=this.get("date");this.set("date",1).set("mo",this.get("mo")+u);return
this.set("date",t.min(this.get("lastdayofmonth")));case"week":return
this.increment("day",u*7);
case"day":return
this.set("date",this.get("date")+u);}if(!a.units[s]){throw
new Error(s+" is not a supported interval");}return
this.set("time",this.get("time")+u*a.units[s]());
},decrement:function(s,t){return
this.increment(s,-1*(t!=null?t:1));},isLeapYear:function(){return
a.isLeapYear(this.get("year"));},clearTime:function(){return
this.set({hr:0,min:0,sec:0,ms:0});
},diff:function(t,s){if(typeOf(t)=="string"){t=a.parse(t);}return((t-this)/a.units[s||"day"](3,3)).round();},getLastDayOfMonth:function(){return
a.daysInMonth(this.get("mo"),this.get("year"));
},getDayOfYear:function(){return(a.UTC(this.get("year"),this.get("mo"),this.get("date")+1)-a.UTC(this.get("year"),0,1))/a.units.day();},setDay:function(t,s){if(s==null){s=a.getMsg("firstDayOfWeek");
if(s===""){s=1;}}t=(7+a.parseDay(t,true)-s)%7;var
u=(7+this.get("day")-s)%7;return
this.increment("day",t-u);},getWeek:function(v){if(v==null){v=a.getMsg("firstDayOfWeek");
if(v===""){v=1;}}var
x=this,u=(7+x.get("day")-v)%7,t=0,w;if(v==1){var
y=x.get("month"),s=x.get("date")-u;if(y==11&&s>28){return
1;}if(y==0&&s<-2){x=new a(x).decrement("day",u);
u=0;}w=new
a(x.get("year"),0,1).get("day")||7;if(w>4){t=-7;}}else{w=new
a(x.get("year"),0,1).get("day");}t+=x.get("dayofyear");t+=6-u;t+=(7+w-v)%7;return(t/7);
},getOrdinal:function(s){return
a.getMsg("ordinal",s||this.get("date"));},getTimezone:function(){return
this.toString().replace(/^.*?
([A-Z]{3}).[0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+
([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");
},getGMTOffset:function(){var
s=this.get("timezoneOffset");return((s>0)?"-":"+")+p((s.abs()/60).floor(),2)+p(s%60,2);},setAMPM:function(s){s=s.toUpperCase();
var
t=this.get("hr");if(t>11&&s=="AM"){return
this.decrement("hour",12);}else{if(t<12&&s=="PM"){return
this.increment("hour",12);}}return
this;},getAMPM:function(){return(this.get("hr")<12)?"AM":"PM";
},parse:function(s){this.set("time",a.parse(s));return
this;},isValid:function(s){if(!s){s=this;}return
typeOf(s)=="date"&&!isNaN(s.valueOf());},format:function(s){if(!this.isValid()){return"invalid
date";
}if(!s){s="%x %X";}if(typeof
s=="string"){s=g[s.toLowerCase()]||s;}if(typeof
s=="function"){return s(this);}var t=this;return
s.replace(/%([a-z%])/gi,function(v,u){switch(u){case"a":return
a.getMsg("days_abbr")[t.get("day")];
case"A":return
a.getMsg("days")[t.get("day")];case"b":return
a.getMsg("months_abbr")[t.get("month")];case"B":return
a.getMsg("months")[t.get("month")];
case"c":return t.format("%a %b %d %H:%M:%S
%Y");case"d":return
p(t.get("date"),2);case"e":return
p(t.get("date"),2," ");case"H":return
p(t.get("hr"),2);
case"I":return
p((t.get("hr")%12)||12,2);case"j":return
p(t.get("dayofyear"),3);case"k":return
p(t.get("hr"),2," ");case"l":return
p((t.get("hr")%12)||12,2," ");
case"L":return
p(t.get("ms"),3);case"m":return
p((t.get("mo")+1),2);case"M":return
p(t.get("min"),2);case"o":return
t.get("ordinal");case"p":return
a.getMsg(t.get("ampm"));
case"s":return Math.round(t/1000);case"S":return
p(t.get("seconds"),2);case"T":return
t.format("%H:%M:%S");case"U":return
p(t.get("week"),2);case"w":return
t.get("day");
case"x":return
t.format(a.getMsg("shortDate"));case"X":return
t.format(a.getMsg("shortTime"));case"y":return
t.get("year").toString().substr(2);case"Y":return
t.get("year");
case"z":return
t.get("GMTOffset");case"Z":return
t.get("Timezone");}return u;});},toISOString:function(){return
this.format("iso8601");}}).alias({toJSON:"toISOString",compare:"diff",strftime:"format"});
var
k=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var
g={db:"%Y-%m-%d
%H:%M:%S",compact:"%Y%m%dT%H%M%S","short":"%d
%b %H:%M","long":"%B %d, %Y
%H:%M",rfc822:function(s){return
k[s.get("day")]+s.format(", %d
")+h[s.get("month")]+s.format(" %Y %H:%M:%S %Z");
},rfc2822:function(s){return k[s.get("day")]+s.format(", %d
")+h[s.get("month")]+s.format(" %Y %H:%M:%S
%z");},iso8601:function(s){return(s.getUTCFullYear()+"-"+p(s.getUTCMonth()+1,2)+"-"+p(s.getUTCDate(),2)+"T"+p(s.getUTCHours(),2)+":"+p(s.getUTCMinutes(),2)+":"+p(s.getUTCSeconds(),2)+"."+p(s.getUTCMilliseconds(),3)+"Z");
}};var c=[],n=a.parse;var r=function(v,x,u){var
t=-1,w=a.getMsg(v+"s");switch(typeOf(x)){case"object":t=w[x.get(v)];break;case"number":t=w[x];if(!t){throw
new Error("Invalid "+v+" index: "+x);
}break;case"string":var s=w.filter(function(y){return
this.test(y);},new
RegExp("^"+x,"i"));if(!s.length){throw new
Error("Invalid "+v+" string");}if(s.length>1){throw
new Error("Ambiguous "+v);
}t=s[0];}return(u)?w.indexOf(t):t;};var
i=1900,o=70;a.extend({getMsg:function(t,s){return
Locale.get("Date."+t,s);},units:{ms:Function.from(1),second:Function.from(1000),minute:Function.from(60000),hour:Function.from(3600000),day:Function.from(86400000),week:Function.from(608400000),month:function(t,s){var
u=new a;
return
a.daysInMonth(t!=null?t:u.get("mo"),s!=null?s:u.get("year"))*86400000;},year:function(s){s=s||new
a().get("year");return a.isLeapYear(s)?31622400000:31536000000;
}},daysInMonth:function(t,s){return[31,a.isLeapYear(s)?29:28,31,30,31,30,31,31,30,31,30,31][t];},isLeapYear:function(s){return((s%4===0)&&(s%100!==0))||(s%400===0);
},parse:function(v){var u=typeOf(v);if(u=="number"){return new
a(v);}if(u!="string"){return v;}v=v.clean();if(!v.length){return
null;}var s;c.some(function(w){var t=w.re.exec(v);
return(t)?(s=w.handler(t)):false;});if(!(s&&s.isValid())){s=new
a(n(v));if(!(s&&s.isValid())){s=new a(v.toInt());}}return
s;},parseDay:function(s,t){return r("day",s,t);
},parseMonth:function(t,s){return
r("month",t,s);},parseUTC:function(t){var s=new a(t);var
u=a.UTC(s.get("year"),s.get("mo"),s.get("date"),s.get("hr"),s.get("min"),s.get("sec"),s.get("ms"));
return new a(u);},orderIndex:function(s){return
a.getMsg("dateOrder").indexOf(s)+1;},defineFormat:function(s,t){g[s]=t;return
this;},defineParser:function(s){c.push((s.re&&s.handler)?s:l(s));
return
this;},defineParsers:function(){Array.flatten(arguments).each(a.defineParser);return
this;},define2DigitYearStart:function(s){o=s%100;i=s-o;return this;
}}).extend({defineFormats:a.defineFormat.overloadSetter()});var
d=function(s){return new
RegExp("(?:"+a.getMsg(s).map(function(t){return t.substr(0,3);
}).join("|")+")[a-z]*");};var
m=function(s){switch(s){case"T":return"%H:%M:%S";case"x":return((a.orderIndex("month")==1)?"%m[-./]%d":"%d[-./]%m")+"([-./]%y)?";
case"X":return"%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p?
?%z?";}return null;};var
j={d:/[0-2]?[0-9]|3[01]/,H:/[01]?[0-9]|2[0-3]/,I:/0?[1-9]|1[0-2]/,M:/[0-5]?\d/,s:/\d+/,o:/[a-z]*/,p:/[ap]\.?m\.?/,y:/\d{2}|\d{4}/,Y:/\d{4}/,z:/Z|[+-]\d{2}(?::?\d{2})?/};
j.m=j.I;j.S=j.M;var e;var
b=function(s){e=s;j.a=j.A=d("days");j.b=j.B=d("months");c.each(function(u,t){if(u.format){c[t]=l(u.format);}});};var
l=function(u){if(!e){return{format:u};
}var s=[];var t=(u.source||u).replace(/%([a-z])/gi,function(w,v){return
m(v)||w;}).replace(/\((?!\?)/g,"(?:").replace(/
(?!\?|\*)/g,",? ").replace(/%([a-z%])/gi,function(w,v){var
x=j[v];
if(!x){return
v;}s.push(v);return"("+x.source+")";}).replace(/\[a-z\]/gi,"[a-z\\u00c0-\\uffff;&]");return{format:u,re:new
RegExp("^"+t+"$","i"),handler:function(y){y=y.slice(1).associate(s);
var v=new
a().clearTime(),x=y.y||y.Y;if(x!=null){q.call(v,"y",x);}if("d"
in y){q.call(v,"d",1);}if("m" in
y||y.b||y.B){q.call(v,"m",1);}for(var w in y){q.call(v,w,y[w]);
}return v;}};};var q=function(s,t){if(!t){return
this;}switch(s){case"a":case"A":return
this.set("day",a.parseDay(t,true));case"b":case"B":return
this.set("mo",a.parseMonth(t,true));
case"d":return
this.set("date",t);case"H":case"I":return
this.set("hr",t);case"m":return
this.set("mo",t-1);case"M":return
this.set("min",t);case"p":return
this.set("ampm",t.replace(/\./g,""));
case"S":return
this.set("sec",t);case"s":return
this.set("ms",("0."+t)*1000);case"w":return
this.set("day",t);case"Y":return
this.set("year",t);case"y":t=+t;
if(t<100){t+=i+(t<o?100:0);}return
this.set("year",t);case"z":if(t=="Z"){t="+00";}var
u=t.match(/([+-])(\d{2}):?(\d{2})?/);u=(u[1]+"1")*(u[2]*60+(+u[3]||0))+this.getTimezoneOffset();
return this.set("time",this-u*60000);}return
this;};a.defineParsers("%Y([-./]%m([-./]%d((T|
)%X)?)?)?","%Y%m%d(T%H(%M%S?)?)?","%x(
%X)?","%d%o( %b( %Y)?)?( %X)?","%b( %d%o)?( %Y)?(
%X)?","%Y %b( %d%o( %X)?)?","%o %b %d %X %z
%Y","%T","%H:%M( ?%p)?");
Locale.addEvent("change",function(s){if(Locale.get("Date")){b(s);}}).fireEvent("change",Locale.getCurrent());})();Date.implement({timeDiffInWords:function(a){return
Date.distanceOfTimeInWords(this,a||new Date);
},timeDiff:function(f,c){if(f==null){f=new Date;}var
h=((f-this)/1000).floor().abs();var
e=[],a=[60,60,24,365,0],d=["s","m","h","d","y"],g,b;for(var
i=0;
i<a.length;i++){if(i&&!h){break;}g=h;if((b=a[i])){g=(h%b);h=(h/b).floor();}e.unshift(g+(d[i]||""));}return
e.join(c||":");}}).extend({distanceOfTimeInWords:function(b,a){return
Date.getTimePhrase(((a-b)/1000).toInt());
},getTimePhrase:function(f){var
d=(f<0)?"Until":"Ago";if(f<0){f*=-1;}var
b={minute:60,hour:60,day:24,week:7,month:52/12,year:12,eon:Infinity};var
e="lessThanMinute";
for(var c in b){var
a=b[c];if(f<1.5*a){if(f>0.75*a){e=c;}break;}f/=a;e=c+"s";}f=f.round();return
Date.getMsg(e+d,f).substitute({delta:f});}}).defineParsers({re:/^(?:tod|tom|yes)/i,handler:function(a){var
b=new Date().clearTime();
switch(a[0]){case"tom":return
b.increment();case"yes":return b.decrement();default:return
b;}}},{re:/^(next|last) ([a-z]+)$/i,handler:function(e){var f=new
Date().clearTime();
var b=f.getDay();var c=Date.parseDay(e[2],true);var
a=c-b;if(c<=b){a+=7;}if(e[1]=="last"){a-=7;}return
f.set("date",f.getDate()+a);}}).alias("timeAgoInWords","timeDiffInWords");
Locale.define("en-US","Number",{decimal:".",group:",",currency:{prefix:"$
"}});Number.implement({format:function(q){var
n=this;q=q?Object.clone(q):{};var a=function(i){if(q[i]!=null){return q[i];
}return Locale.get("Number."+i);};var
f=n<0,h=a("decimal"),k=a("precision"),o=a("group"),c=a("decimals");if(f){var
e=a("negative")||{};if(e.prefix==null&&e.suffix==null){e.prefix="-";
}["prefix","suffix"].each(function(i){if(e[i]){q[i]=a(i)+e[i];}});n=-n;}var
l=a("prefix"),p=a("suffix");if(c!==""&&c>=0&&c<=20){n=n.toFixed(c);}if(k>=1&&k<=21){n=(+n).toPrecision(k);
}n+="";var
m;if(a("scientific")===false&&n.indexOf("e")>-1){var
j=n.split("e"),b=+j[1];n=j[0].replace(".","");if(b<0){b=-b-1;m=j[0].indexOf(".");if(m>-1){b-=m-1;
}while(b--){n="0"+n;}n="0."+n;}else{m=j[0].lastIndexOf(".");if(m>-1){b-=j[0].length-m-1;}while(b--){n+="0";}}}if(h!="."){n=n.replace(".",h);}if(o){m=n.lastIndexOf(h);
m=(m>-1)?m:n.length;var
d=n.substring(m),g=m;while(g--){if((m-g-1)%3==0&&g!=(m-1)){d=o+d;}d=n.charAt(g)+d;}n=d;}if(l){n=l+n;}if(p){n+=p;}return
n;},formatCurrency:function(b){var
a=Locale.get("Number.currency")||{};
if(a.scientific==null){a.scientific=false;}a.decimals=b!=null?b:(a.decimals==null?2:a.decimals);return
this.format(a);},formatPercentage:function(b){var
a=Locale.get("Number.percentage")||{};
if(a.suffix==null){a.suffix="%";}a.decimals=b!=null?b:(a.decimals==null?2:a.decimals);return
this.format(a);}});(function(){var
c={a:/[àáâãäåăą]/g,A:/[ÀÁÂÃÄÅĂĄ]/g,c:/[ćčç]/g,C:/[ĆČÇ]/g,d:/[ďđ]/g,D:/[ĎÐ]/g,e:/[èéêëěę]/g,E:/[ÈÉÊËĚĘ]/g,g:/[ğ]/g,G:/[Ğ]/g,i:/[ìíîï]/g,I:/[ÌÍÎÏ]/g,l:/[ĺľł]/g,L:/[ĹĽŁ]/g,n:/[ñňń]/g,N:/[ÑŇŃ]/g,o:/[òóôõöøő]/g,O:/[ÒÓÔÕÖØ]/g,r:/[řŕ]/g,R:/[ŘŔ]/g,s:/[ššş]/g,S:/[ŠŞŚ]/g,t:/[ťţ]/g,T:/[ŤŢ]/g,ue:/[ü]/g,UE:/[Ü]/g,u:/[ùúûůµ]/g,U:/[ÙÚÛŮ]/g,y:/[ÿý]/g,Y:/[ŸÝ]/g,z:/[žźż]/g,Z:/[ŽŹŻ]/g,th:/[þ]/g,TH:/[Þ]/g,dh:/[ð]/g,DH:/[Ð]/g,ss:/[ß]/g,oe:/[œ]/g,OE:/[Œ]/g,ae:/[æ]/g,AE:/[Æ]/g},b={"
":/[\xa0\u2002\u2003\u2009]/g,"*":/[\xb7]/g,"'":/[\u2018\u2019]/g,'"':/[\u201c\u201d]/g,"...":/[\u2026]/g,"-":/[\u2013]/g,"&raquo;":/[\uFFFD]/g};
var a=function(f,h){var e=f,g;for(g in h){e=e.replace(h[g],g);}return
e;};var d=function(e,g){e=e||"";var
h=g?"<"+e+"(?!\\w)[^>]*>([\\s\\S]*?)</"+e+"(?!\\w)>":"</?"+e+"([^>]+)?>",f=new
RegExp(h,"gi");
return f;};String.implement({standardize:function(){return
a(this,c);},repeat:function(e){return new
Array(e+1).join(this);},pad:function(e,h,g){if(this.length>=e){return
this;
}var f=(h==null?"
":""+h).repeat(e-this.length).substr(0,e-this.length);if(!g||g=="right"){return
this+f;}if(g=="left"){return f+this;}return
f.substr(0,(f.length/2).floor())+this+f.substr(0,(f.length/2).ceil());
},getTags:function(e,f){return
this.match(d(e,f))||[];},stripTags:function(e,f){return
this.replace(d(e,f),"");},tidy:function(){return
a(this,b);},truncate:function(e,f,i){var h=this;
if(f==null&&arguments.length==1){f="…";}if(h.length>e){h=h.substring(0,e);if(i){var
g=h.lastIndexOf(i);if(g!=-1){h=h.substr(0,g);}}if(f){h+=f;}}return h;
}});})();String.implement({parseQueryString:function(d,a){if(d==null){d=true;}if(a==null){a=true;}var
c=this.split(/[&;]/),b={};if(!c.length){return b;
}c.each(function(i){var
e=i.indexOf("=")+1,g=e?i.substr(e):"",f=e?i.substr(0,e-1).match(/([^\]\[]+|(\B)(?=\]))/g):[i],h=b;if(!f){return;}if(a){g=decodeURIComponent(g);
}f.each(function(k,j){if(d){k=decodeURIComponent(k);}var
l=h[k];if(j<f.length-1){h=h[k]=l||{};}else{if(typeOf(l)=="array"){l.push(g);}else{h[k]=l!=null?[l,g]:g;
}}});});return b;},cleanQueryString:function(a){return
this.split("&").filter(function(e){var
b=e.indexOf("="),c=b<0?"":e.substr(0,b),d=e.substr(b+1);return
a?a.call(null,c,d):(d||d===0);
}).join("&");}});(function(){var b=function(){return
this.get("value");};var a=this.URI=new
Class({Implements:Options,options:{},regex:/^(?:(\w+):)?(?:\/\/(?:(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)?(\.\.?$|(?:[^?#\/]*\/)*)([^?#]*)(?:\?([^#]*))?(?:#(.*))?/,parts:["scheme","user","password","host","port","directory","file","query","fragment"],schemes:{http:80,https:443,ftp:21,rtsp:554,mms:1755,file:0},initialize:function(d,c){this.setOptions(c);
var
e=this.options.base||a.base;if(!d){d=e;}if(d&&d.parsed){this.parsed=Object.clone(d.parsed);}else{this.set("value",d.href||d.toString(),e?new
a(e):false);
}},parse:function(e,d){var c=e.match(this.regex);if(!c){return
false;}c.shift();return
this.merge(c.associate(this.parts),d);},merge:function(d,c){if((!d||!d.scheme)&&(!c||!c.scheme)){return
false;
}if(c){this.parts.every(function(e){if(d[e]){return
false;}d[e]=c[e]||"";return
true;});}d.port=d.port||this.schemes[d.scheme.toLowerCase()];d.directory=d.directory?this.parseDirectory(d.directory,c?c.directory:""):"/";
return
d;},parseDirectory:function(d,e){d=(d.substr(0,1)=="/"?"":(e||"/"))+d;if(!d.test(a.regs.directoryDot)){return
d;}var
c=[];d.replace(a.regs.endSlash,"").split("/").each(function(f){if(f==".."&&c.length>0){c.pop();
}else{if(f!="."){c.push(f);}}});return
c.join("/")+"/";},combine:function(c){return
c.value||c.scheme+"://"+(c.user?c.user+(c.password?":"+c.password:"")+"@":"")+(c.host||"")+(c.port&&c.port!=this.schemes[c.scheme]?":"+c.port:"")+(c.directory||"/")+(c.file||"")+(c.query?"?"+c.query:"")+(c.fragment?"#"+c.fragment:"");
},set:function(d,f,e){if(d=="value"){var
c=f.match(a.regs.scheme);if(c){c=c[1];}if(c&&this.schemes[c.toLowerCase()]==null){this.parsed={scheme:c,value:f};
}else{this.parsed=this.parse(f,(e||this).parsed)||(c?{scheme:c,value:f}:{value:f});}}else{if(d=="data"){this.setData(f);}else{this.parsed[d]=f;}}return
this;
},get:function(c,d){switch(c){case"value":return
this.combine(this.parsed,d?d.parsed:false);case"data":return
this.getData();}return this.parsed[c]||"";
},go:function(){document.location.href=this.toString();},toURI:function(){return
this;},getData:function(e,d){var
c=this.get(d||"query");if(!(c||c===0)){return e?null:{};
}var f=c.parseQueryString();return
e?f[e]:f;},setData:function(c,f,d){if(typeof c=="string"){var
e=this.getData();e[arguments[0]]=arguments[1];c=e;}else{if(f){c=Object.merge(this.getData(),c);
}}return
this.set(d||"query",Object.toQueryString(c));},clearData:function(c){return
this.set(c||"query","");},toString:b,valueOf:b});a.regs={endSlash:/\/$/,scheme:/^(\w+):/,directoryDot:/\.\/|\.$/};
a.base=new
a(Array.from(document.getElements("base[href]",true)).getLast(),{base:document.location});String.implement({toURI:function(c){return
new a(this,c);
}});})();URI=Class.refactor(URI,{combine:function(f,e){if(!e||f.scheme!=e.scheme||f.host!=e.host||f.port!=e.port){return
this.previous.apply(this,arguments);
}var
a=f.file+(f.query?"?"+f.query:"")+(f.fragment?"#"+f.fragment:"");if(!e.directory){return(f.directory||(f.file?"":"./"))+a;}var
d=e.directory.split("/"),c=f.directory.split("/"),g="",h;
var
b=0;for(h=0;h<d.length&&h<c.length&&d[h]==c[h];h++){}for(b=0;b<d.length-h-1;b++){g+="../";}for(b=h;b<c.length-1;b++){g+=c[b]+"/";}return(g||(f.file?"":"./"))+a;
},toAbsolute:function(a){a=new
URI(a);if(a){a.set("directory","").set("file","");}return
this.toRelative(a);},toRelative:function(a){return
this.get("value",new URI(a));
}});(function(){if(this.Hash){return;}var a=this.Hash=new
Type("Hash",function(b){if(typeOf(b)=="hash"){b=Object.clone(b.getClean());}for(var
c in b){this[c]=b[c];
}return this;});this.$H=function(b){return new
a(b);};a.implement({forEach:function(b,c){Object.forEach(this,b,c);},getClean:function(){var
c={};for(var b in this){if(this.hasOwnProperty(b)){c[b]=this[b];
}}return c;},getLength:function(){var c=0;for(var b in
this){if(this.hasOwnProperty(b)){c++;}}return
c;}});a.alias("each","forEach");a.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){return
Object.keyOf(this,b);
},hasValue:function(b){return
Object.contains(this,b);},extend:function(b){a.each(b||{},function(d,c){a.set(this,c,d);},this);return
this;},combine:function(b){a.each(b||{},function(d,c){a.include(this,c,d);
},this);return this;},erase:function(b){if(this.hasOwnProperty(b)){delete
this[b];}return
this;},get:function(b){return(this.hasOwnProperty(b))?this[b]:null;
},set:function(b,c){if(!this[b]||this.hasOwnProperty(b)){this[b]=c;}return
this;},empty:function(){a.each(this,function(c,b){delete
this[b];},this);return this;
},include:function(b,c){if(this[b]==undefined){this[b]=c;}return
this;},map:function(b,c){return new
a(Object.map(this,b,c));},filter:function(b,c){return new
a(Object.filter(this,b,c));
},every:function(b,c){return
Object.every(this,b,c);},some:function(b,c){return
Object.some(this,b,c);},getKeys:function(){return
Object.keys(this);},getValues:function(){return Object.values(this);
},toQueryString:function(b){return
Object.toQueryString(this,b);}});a.alias({indexOf:"keyOf",contains:"hasValue"});})();Hash.implement({getFromPath:function(a){return
Object.getFromPath(this,a);
},cleanValues:function(a){return new
Hash(Object.cleanValues(this,a));},run:function(){Object.run(arguments);}});Element.implement({tidy:function(){this.set("value",this.get("value").tidy());
},getTextInRange:function(b,a){return
this.get("value").substring(b,a);},getSelectedText:function(){if(this.setSelectionRange){return
this.getTextInRange(this.getSelectionStart(),this.getSelectionEnd());
}return
document.selection.createRange().text;},getSelectedRange:function(){if(this.selectionStart!=null){return{start:this.selectionStart,end:this.selectionEnd};
}var e={start:0,end:0};var
a=this.getDocument().selection.createRange();if(!a||a.parentElement()!=this){return
e;}var
c=a.duplicate();if(this.type=="text"){e.start=0-c.moveStart("character",-100000);
e.end=e.start+a.text.length;}else{var b=this.get("value");var
d=b.length;c.moveToElementText(this);c.setEndPoint("StartToEnd",a);if(c.text.length){d-=b.match(/[\n\r]*$/)[0].length;
}e.end=d-c.text.length;c.setEndPoint("StartToStart",a);e.start=d-c.text.length;}return
e;},getSelectionStart:function(){return this.getSelectedRange().start;
},getSelectionEnd:function(){return
this.getSelectedRange().end;},setCaretPosition:function(a){if(a=="end"){a=this.get("value").length;}this.selectRange(a,a);
return this;},getCaretPosition:function(){return
this.getSelectedRange().start;},selectRange:function(e,a){if(this.setSelectionRange){this.focus();this.setSelectionRange(e,a);
}else{var c=this.get("value");var
d=c.substr(e,a-e).replace(/\r/g,"").length;e=c.substr(0,e).replace(/\r/g,"").length;var
b=this.createTextRange();b.collapse(true);
b.moveEnd("character",e+d);b.moveStart("character",e);b.select();}return
this;},insertAtCursor:function(b,a){var d=this.getSelectedRange();var
c=this.get("value");
this.set("value",c.substring(0,d.start)+b+c.substring(d.end,c.length));if(a!==false){this.selectRange(d.start,d.start+b.length);}else{this.setCaretPosition(d.start+b.length);
}return
this;},insertAroundCursor:function(b,a){b=Object.append({before:"",defaultMiddle:"",after:""},b);var
c=this.getSelectedText()||b.defaultMiddle;
var g=this.getSelectedRange();var
f=this.get("value");if(g.start==g.end){this.set("value",f.substring(0,g.start)+b.before+c+b.after+f.substring(g.end,f.length));
this.selectRange(g.start+b.before.length,g.end+b.before.length+c.length);}else{var
d=f.substring(g.start,g.end);this.set("value",f.substring(0,g.start)+b.before+d+b.after+f.substring(g.end,f.length));
var
e=g.start+b.before.length;if(a!==false){this.selectRange(e,e+d.length);}else{this.setCaretPosition(e+f.length);}}return
this;}});Elements.from=function(e,d){if(d||d==null){e=e.stripScripts();
}var b,c=e.match(/^\s*<(t[dhr]|tbody|tfoot|thead)/i);if(c){b=new
Element("table");var
a=c[1].toLowerCase();if(["td","th","tr"].contains(a)){b=new
Element("tbody").inject(b);
if(a!="tr"){b=new
Element("tr").inject(b);}}}return(b||new
Element("div")).set("html",e).getChildren();};(function(){var
d={relay:false},c=["once","throttle","pause"],b=c.length;
while(b--){d[c[b]]=Events.lookupPseudo(c[b]);}DOMEvent.definePseudo=function(e,f){d[e]=f;return
this;};var
a=Element.prototype;[Element,Window,Document].invoke("implement",Events.Pseudos(d,a.addEvent,a.removeEvent));
})();(function(){var
a="$moo:keys-pressed",b="$moo:keys-keyup";DOMEvent.definePseudo("keys",function(d,e,c){var
g=c[0],f=[],h=this.retrieve(a,[]);f.append(d.value.replace("++",function(){f.push("+");
return"";}).split("+"));h.include(g.key);if(f.every(function(j){return
h.contains(j);})){e.apply(this,c);}this.store(a,h);if(!this.retrieve(b)){var
i=function(j){(function(){h=this.retrieve(a,[]).erase(j.key);
this.store(a,h);}).delay(0,this);};this.store(b,i).addEvent("keyup",i);}});DOMEvent.defineKeys({"16":"shift","17":"control","18":"alt","20":"capslock","33":"pageup","34":"pagedown","35":"end","36":"home","144":"numlock","145":"scrolllock","186":";","187":"=","188":",","190":".","191":"/","192":"`","219":"[","220":"\\","221":"]","222":"'","107":"+"}).defineKey(Browser.firefox?109:189,"-");
})();(function(){var b=function(e,d){var
f=[];Object.each(d,function(g){Object.each(g,function(h){e.each(function(i){f.push(i+"-"+h+(i=="border"?"-width":""));
});});});return f;};var c=function(f,e){var
d=0;Object.each(e,function(h,g){if(g.test(f)){d=d+h.toInt();}});return
d;};var a=function(d){return !!(!d||d.offsetHeight||d.offsetWidth);
};Element.implement({measure:function(h){if(a(this)){return
h.call(this);}var
g=this.getParent(),e=[];while(!a(g)&&g!=document.body){e.push(g.expose());
g=g.getParent();}var
f=this.expose(),d=h.call(this);f();e.each(function(i){i();});return
d;},expose:function(){if(this.getStyle("display")!="none"){return
function(){};
}var
d=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return
function(){this.style.cssText=d;}.bind(this);
},getDimensions:function(d){d=Object.merge({computeSize:false},d);var
i={x:0,y:0};var
h=function(j,e){return(e.computeSize)?j.getComputedSize(e):j.getSize();
};var
f=this.getParent("body");if(f&&this.getStyle("display")=="none"){i=this.measure(function(){return
h(this,d);});}else{if(f){try{i=h(this,d);}catch(g){}}}return
Object.append(i,(i.x||i.x===0)?{width:i.x,height:i.y}:{x:i.width,y:i.height});
},getComputedSize:function(d){d=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},d);var
g={},e={width:0,height:0},f;
if(d.mode=="vertical"){delete e.width;delete
d.planes.width;}else{if(d.mode=="horizontal"){delete
e.height;delete
d.planes.height;}}b(d.styles,d.planes).each(function(h){g[h]=this.getStyle(h).toInt();
},this);Object.each(d.planes,function(i,h){var
k=h.capitalize(),j=this.getStyle(h);if(j=="auto"&&!f){f=this.getDimensions();}j=g[h]=(j=="auto")?f[h]:j.toInt();
e["total"+k]=j;i.each(function(m){var
l=c(m,g);e["computed"+m.capitalize()]=l;e["total"+k]+=l;});},this);return
Object.append(e,g);}});})();(function(){var a=false,b=false;
var c=function(){var d=new
Element("div").setStyles({position:"fixed",top:0,right:0}).inject(document.body);a=(d.offsetTop===0);d.dispose();b=true;};Element.implement({pin:function(h,f){if(!b){c();
}if(this.getStyle("display")=="none"){return this;}var
j,k=window.getScroll(),l,e;if(h!==false){j=this.getPosition(a?document.body:this.getOffsetParent());
if(!this.retrieve("pin:_pinned")){var
g={top:j.y-k.y,left:j.x-k.x};if(a&&!f){this.setStyle("position","fixed").setStyles(g);}else{l=this.getOffsetParent();
var
i=this.getPosition(l),m=this.getStyles("left","top");if(l&&m.left=="auto"||m.top=="auto"){this.setPosition(i);}if(this.getStyle("position")=="static"){this.setStyle("position","absolute");
}i={x:m.left.toInt()-k.x,y:m.top.toInt()-k.y};e=function(){if(!this.retrieve("pin:_pinned")){return;}var
n=window.getScroll();this.setStyles({left:i.x+n.x,top:i.y+n.y});
}.bind(this);this.store("pin:_scrollFixer",e);window.addEvent("scroll",e);}this.store("pin:_pinned",true);}}else{if(!this.retrieve("pin:_pinned")){return
this;
}l=this.getParent();var
d=(l.getComputedStyle("position")!="static"?l:l.getOffsetParent());j=this.getPosition(d);this.store("pin:_pinned",false);e=this.retrieve("pin:_scrollFixer");
if(!e){this.setStyles({position:"absolute",top:j.y+k.y,left:j.x+k.x});}else{this.store("pin:_scrollFixer",null);window.removeEvent("scroll",e);}this.removeClass("isPinned");
}return this;},unpin:function(){return
this.pin(false);},togglePin:function(){return
this.pin(!this.retrieve("pin:_pinned"));}});})();(function(b){var
a=Element.Position={options:{relativeTo:document.body,position:{x:"center",y:"center"},offset:{x:0,y:0}},getOptions:function(d,c){c=Object.merge({},a.options,c);
a.setPositionOption(c);a.setEdgeOption(c);a.setOffsetOption(d,c);a.setDimensionsOption(d,c);return
c;},setPositionOption:function(c){c.position=a.getCoordinateFromValue(c.position);
},setEdgeOption:function(d){var
c=a.getCoordinateFromValue(d.edge);d.edge=c?c:(d.position.x=="center"&&d.position.y=="center")?{x:"center",y:"center"}:{x:"left",y:"top"};
},setOffsetOption:function(f,d){var
c={x:0,y:0},g=f.measure(function(){return
document.id(this.getOffsetParent());}),e=g.getScroll();if(!g||g==f.getDocument().body){return;
}c=g.measure(function(){var
i=this.getPosition();if(this.getStyle("position")=="fixed"){var
h=window.getScroll();i.x+=h.x;i.y+=h.y;}return
i;});d.offset={parentPositioned:g!=document.id(d.relativeTo),x:d.offset.x-c.x+e.x,y:d.offset.y-c.y+e.y};
},setDimensionsOption:function(d,c){c.dimensions=d.getDimensions({computeSize:true,styles:["padding","border","margin"]});},getPosition:function(e,d){var
c={};
d=a.getOptions(e,d);var
f=document.id(d.relativeTo)||document.body;a.setPositionCoordinates(d,c,f);if(d.edge){a.toEdge(c,d);}var
g=d.offset;c.left=((c.x>=0||g.parentPositioned||d.allowNegative)?c.x:0).toInt();
c.top=((c.y>=0||g.parentPositioned||d.allowNegative)?c.y:0).toInt();a.toMinMax(c,d);if(d.relFixedPosition||f.getStyle("position")=="fixed"){a.toRelFixedPosition(f,c);
}if(d.ignoreScroll){a.toIgnoreScroll(f,c);}if(d.ignoreMargins){a.toIgnoreMargins(c,d);}c.left=Math.ceil(c.left);c.top=Math.ceil(c.top);delete
c.x;delete c.y;
return c;},setPositionCoordinates:function(k,g,d){var
f=k.offset.y,h=k.offset.x,e=(d==document.body)?window.getScroll():d.getPosition(),j=e.y,c=e.x,i=window.getSize();
switch(k.position.x){case"left":g.x=c+h;break;case"right":g.x=c+h+d.offsetWidth;break;default:g.x=c+((d==document.body?i.x:d.offsetWidth)/2)+h;break;}switch(k.position.y){case"top":g.y=j+f;
break;case"bottom":g.y=j+f+d.offsetHeight;break;default:g.y=j+((d==document.body?i.y:d.offsetHeight)/2)+f;break;}},toMinMax:function(c,d){var
f={left:"x",top:"y"},e;
["minimum","maximum"].each(function(g){["left","top"].each(function(h){e=d[g]?d[g][f[h]]:null;if(e!=null&&((g=="minimum")?c[h]<e:c[h]>e)){c[h]=e;}});});
},toRelFixedPosition:function(e,c){var
d=window.getScroll();c.top+=d.y;c.left+=d.x;},toIgnoreScroll:function(e,d){var
c=e.getScroll();d.top-=c.y;d.left-=c.x;
},toIgnoreMargins:function(c,d){c.left+=d.edge.x=="right"?d.dimensions["margin-right"]:(d.edge.x!="center"?-d.dimensions["margin-left"]:-d.dimensions["margin-left"]+((d.dimensions["margin-right"]+d.dimensions["margin-left"])/2));
c.top+=d.edge.y=="bottom"?d.dimensions["margin-bottom"]:(d.edge.y!="center"?-d.dimensions["margin-top"]:-d.dimensions["margin-top"]+((d.dimensions["margin-bottom"]+d.dimensions["margin-top"])/2));
},toEdge:function(c,d){var
e={},g=d.dimensions,f=d.edge;switch(f.x){case"left":e.x=0;break;case"right":e.x=-g.x-g.computedRight-g.computedLeft;break;default:e.x=-(Math.round(g.totalWidth/2));
break;}switch(f.y){case"top":e.y=0;break;case"bottom":e.y=-g.y-g.computedTop-g.computedBottom;break;default:e.y=-(Math.round(g.totalHeight/2));break;}c.x+=e.x;
c.y+=e.y;},getCoordinateFromValue:function(c){if(typeOf(c)!="string"){return
c;}c=c.toLowerCase();return{x:c.test("left")?"left":(c.test("right")?"right":"center"),y:c.test(/upper|top/)?"top":(c.test("bottom")?"bottom":"center")};
}};Element.implement({position:function(d){if(d&&(d.x!=null||d.y!=null)){return(b?b.apply(this,arguments):this);}var
c=this.setStyle("position","absolute").calculatePosition(d);
return(d&&d.returnPos)?c:this.setStyles(c);},calculatePosition:function(c){return
a.getPosition(this,c);}});})(Element.prototype.position);Element.implement({isDisplayed:function(){return
this.getStyle("display")!="none";
},isVisible:function(){var
a=this.offsetWidth,b=this.offsetHeight;return(a==0&&b==0)?false:(a>0&&b>0)?true:this.style.display!="none";},toggle:function(){return
this[this.isDisplayed()?"hide":"show"]();
},hide:function(){var
b;try{b=this.getStyle("display");}catch(a){}if(b=="none"){return
this;}return
this.store("element:_originalDisplay",b||"").setStyle("display","none");
},show:function(a){if(!a&&this.isDisplayed()){return
this;}a=a||this.retrieve("element:_originalDisplay")||"block";return
this.setStyle("display",(a=="none")?"block":a);
},swapClass:function(a,b){return
this.removeClass(a).addClass(b);}});Document.implement({clearSelection:function(){if(window.getSelection){var
a=window.getSelection();
if(a&&a.removeAllRanges){a.removeAllRanges();}}else{if(document.selection&&document.selection.empty){try{document.selection.empty();}catch(b){}}}}});var
IframeShim=new
Class({Implements:[Options,Events,Class.Occlude],options:{className:"iframeShim",src:'javascript:false;document.write("");',display:false,zIndex:null,margin:0,offset:{x:0,y:0},browsers:(Browser.ie6||(Browser.firefox&&Browser.version<3&&Browser.Platform.mac))},property:"IframeShim",initialize:function(b,a){this.element=document.id(b);
if(this.occlude()){return
this.occluded;}this.setOptions(a);this.makeShim();return
this;},makeShim:function(){if(this.options.browsers){var
c=this.element.getStyle("zIndex").toInt();
if(!c){c=1;var
b=this.element.getStyle("position");if(b=="static"||!b){this.element.setStyle("position","relative");}this.element.setStyle("zIndex",c);
}c=((this.options.zIndex!=null||this.options.zIndex===0)&&c>this.options.zIndex)?this.options.zIndex:c-1;if(c<0){c=1;}this.shim=new
Element("iframe",{src:this.options.src,scrolling:"no",frameborder:0,styles:{zIndex:c,position:"absolute",border:"none",filter:"progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"},"class":this.options.className}).store("IframeShim",this);
var
a=(function(){this.shim.inject(this.element,"after");this[this.options.display?"show":"hide"]();this.fireEvent("inject");}).bind(this);if(!IframeShim.ready){window.addEvent("load",a);
}else{a();}}else{this.position=this.hide=this.show=this.dispose=Function.from(this);}},position:function(){if(!IframeShim.ready||!this.shim){return
this;
}var a=this.element.measure(function(){return
this.getSize();});if(this.options.margin!=undefined){a.x=a.x-(this.options.margin*2);a.y=a.y-(this.options.margin*2);
this.options.offset.x+=this.options.margin;this.options.offset.y+=this.options.margin;}this.shim.set({width:a.x,height:a.y}).position({relativeTo:this.element,offset:this.options.offset});
return
this;},hide:function(){if(this.shim){this.shim.setStyle("display","none");}return
this;},show:function(){if(this.shim){this.shim.setStyle("display","block");
}return
this.position();},dispose:function(){if(this.shim){this.shim.dispose();}return
this;},destroy:function(){if(this.shim){this.shim.destroy();}return this;
}});window.addEvent("load",function(){IframeShim.ready=true;});var
Mask=new
Class({Implements:[Options,Events],Binds:["position"],options:{style:{},"class":"mask",maskMargins:false,useIframeShim:true,iframeShimOptions:{}},initialize:function(b,a){this.target=document.id(b)||document.id(document.body);
this.target.store("mask",this);this.setOptions(a);this.render();this.inject();},render:function(){this.element=new
Element("div",{"class":this.options["class"],id:this.options.id||"mask-"+String.uniqueID(),styles:Object.merge({},this.options.style,{display:"none"}),events:{click:function(a){this.fireEvent("click",a);
if(this.options.hideOnClick){this.hide();}}.bind(this)}});this.hidden=true;},toElement:function(){return
this.element;},inject:function(b,a){a=a||(this.options.inject?this.options.inject.where:"")||this.target==document.body?"inside":"after";
b=b||(this.options.inject&&this.options.inject.target)||this.target;this.element.inject(b,a);if(this.options.useIframeShim){this.shim=new
IframeShim(this.element,this.options.iframeShimOptions);
this.addEvents({show:this.shim.show.bind(this.shim),hide:this.shim.hide.bind(this.shim),destroy:this.shim.destroy.bind(this.shim)});}},position:function(){this.resize(this.options.width,this.options.height);
this.element.position({relativeTo:this.target,position:"topLeft",ignoreMargins:!this.options.maskMargins,ignoreScroll:this.target==document.body});return
this;
},resize:function(a,e){var
b={styles:["padding","border"]};if(this.options.maskMargins){b.styles.push("margin");}var
d=this.target.getComputedSize(b);if(this.target==document.body){this.element.setStyles({width:0,height:0});
var
c=window.getScrollSize();if(d.totalHeight<c.y){d.totalHeight=c.y;}if(d.totalWidth<c.x){d.totalWidth=c.x;}}this.element.setStyles({width:Array.pick([a,d.totalWidth,d.x]),height:Array.pick([e,d.totalHeight,d.y])});
return this;},show:function(){if(!this.hidden){return
this;}window.addEvent("resize",this.position);this.position();this.showMask.apply(this,arguments);
return
this;},showMask:function(){this.element.setStyle("display","block");this.hidden=false;this.fireEvent("show");},hide:function(){if(this.hidden){return
this;
}window.removeEvent("resize",this.position);this.hideMask.apply(this,arguments);if(this.options.destroyOnHide){return
this.destroy();}return
this;},hideMask:function(){this.element.setStyle("display","none");
this.hidden=true;this.fireEvent("hide");},toggle:function(){this[this.hidden?"show":"hide"]();},destroy:function(){this.hide();this.element.destroy();this.fireEvent("destroy");
this.target.eliminate("mask");}});Element.Properties.mask={set:function(b){var
a=this.retrieve("mask");if(a){a.destroy();}return
this.eliminate("mask").store("mask:options",b);
},get:function(){var a=this.retrieve("mask");if(!a){a=new
Mask(this,this.retrieve("mask:options"));this.store("mask",a);}return
a;}};Element.implement({mask:function(a){if(a){this.set("mask",a);
}this.get("mask").show();return
this;},unmask:function(){this.get("mask").hide();return
this;}});var Spinner=new
Class({Extends:Mask,Implements:Chain,options:{"class":"spinner",containerPosition:{},content:{"class":"spinner-content"},messageContainer:{"class":"spinner-msg"},img:{"class":"spinner-img"},fxOptions:{link:"chain"}},initialize:function(c,a){this.target=document.id(c)||document.id(document.body);
this.target.store("spinner",this);this.setOptions(a);this.render();this.inject();var
b=function(){this.active=false;}.bind(this);this.addEvents({hide:b,show:b});
},render:function(){this.parent();this.element.set("id",this.options.id||"spinner-"+String.uniqueID());this.content=document.id(this.options.content)||new
Element("div",this.options.content);
this.content.inject(this.element);if(this.options.message){this.msg=document.id(this.options.message)||new
Element("p",this.options.messageContainer).appendText(this.options.message);
this.msg.inject(this.content);}if(this.options.img){this.img=document.id(this.options.img)||new
Element("div",this.options.img);this.img.inject(this.content);
}this.element.set("tween",this.options.fxOptions);},show:function(a){if(this.active){return
this.chain(this.show.bind(this));}if(!this.hidden){this.callChain.delay(20,this);
return this;}this.active=true;return
this.parent(a);},showMask:function(a){var
b=function(){this.content.position(Object.merge({relativeTo:this.element},this.options.containerPosition));
}.bind(this);if(a){this.parent();b();}else{if(!this.options.style.opacity){this.options.style.opacity=this.element.getStyle("opacity").toFloat();}this.element.setStyles({display:"block",opacity:0}).tween("opacity",this.options.style.opacity);
b();this.hidden=false;this.fireEvent("show");this.callChain();}},hide:function(a){if(this.active){return
this.chain(this.hide.bind(this));}if(this.hidden){this.callChain.delay(20,this);
return this;}this.active=true;return
this.parent(a);},hideMask:function(a){if(a){return
this.parent();}this.element.tween("opacity",0).get("tween").chain(function(){this.element.setStyle("display","none");
this.hidden=true;this.fireEvent("hide");this.callChain();}.bind(this));},destroy:function(){this.content.destroy();this.parent();this.target.eliminate("spinner");
}});Request=Class.refactor(Request,{options:{useSpinner:false,spinnerOptions:{},spinnerTarget:false},initialize:function(a){this._send=this.send;this.send=function(b){var
c=this.getSpinner();
if(c){c.chain(this._send.pass(b,this)).show();}else{this._send(b);}return
this;};this.previous(a);},getSpinner:function(){if(!this.spinner){var
b=document.id(this.options.spinnerTarget)||document.id(this.options.update);
if(this.options.useSpinner&&b){b.set("spinner",this.options.spinnerOptions);var
a=this.spinner=b.get("spinner");["complete","exception","cancel"].each(function(c){this.addEvent(c,a.hide.bind(a));
},this);}}return
this.spinner;}});Element.Properties.spinner={set:function(a){var
b=this.retrieve("spinner");if(b){b.destroy();}return
this.eliminate("spinner").store("spinner:options",a);
},get:function(){var a=this.retrieve("spinner");if(!a){a=new
Spinner(this,this.retrieve("spinner:options"));this.store("spinner",a);}return
a;}};Element.implement({spin:function(a){if(a){this.set("spinner",a);
}this.get("spinner").show();return
this;},unspin:function(){this.get("spinner").hide();return
this;}});if(!window.Form){window.Form={};}(function(){Form.Request=new
Class({Binds:["onSubmit","onFormValidate"],Implements:[Options,Events,Class.Occlude],options:{requestOptions:{evalScripts:true,useSpinner:true,emulation:false,link:"ignore"},sendButtonClicked:true,extraData:{},resetForm:true},property:"form.request",initialize:function(b,c,a){this.element=document.id(b);
if(this.occlude()){return
this.occluded;}this.setOptions(a).setTarget(c).attach();},setTarget:function(a){this.target=document.id(a);if(!this.request){this.makeRequest();
}else{this.request.setOptions({update:this.target});}return
this;},toElement:function(){return
this.element;},makeRequest:function(){var a=this;this.request=new
Request.HTML(Object.merge({update:this.target,emulation:false,spinnerTarget:this.element,method:this.element.get("method")||"post"},this.options.requestOptions)).addEvents({success:function(c,e,d,b){["complete","success"].each(function(f){a.fireEvent(f,[a.target,c,e,d,b]);
});},failure:function(){a.fireEvent("complete",arguments).fireEvent("failure",arguments);},exception:function(){a.fireEvent("failure",arguments);}});return
this.attachReset();
},attachReset:function(){if(!this.options.resetForm){return
this;}this.request.addEvent("success",function(){Function.attempt(function(){this.element.reset();
}.bind(this));if(window.OverText){OverText.update();}}.bind(this));return
this;},attach:function(a){var
c=(a!=false)?"addEvent":"removeEvent";this.element[c]("click:relay(button,
input[type=submit])",this.saveClickedButton.bind(this));
var
b=this.element.retrieve("validator");if(b){b[c]("onFormValidate",this.onFormValidate);}else{this.element[c]("submit",this.onSubmit);}return
this;},detach:function(){return this.attach(false);
},enable:function(){return this.attach();},disable:function(){return
this.detach();},onFormValidate:function(c,b,a){if(!a){return;}var
d=this.element.retrieve("validator");
if(c||(d&&!d.options.stopOnFailure)){a.stop();this.send();}},onSubmit:function(a){var
b=this.element.retrieve("validator");if(b){this.element.removeEvent("submit",this.onSubmit);
b.addEvent("onFormValidate",this.onFormValidate);this.element.validate();return;}if(a){a.stop();}this.send();},saveClickedButton:function(b,c){var
a=c.get("name");
if(!a||!this.options.sendButtonClicked){return;}this.options.extraData[a]=c.get("value")||true;this.clickedCleaner=function(){delete
this.options.extraData[a];
this.clickedCleaner=function(){};}.bind(this);},clickedCleaner:function(){},send:function(){var
b=this.element.toQueryString().trim(),a=Object.toQueryString(this.options.extraData);
if(b){b+="&"+a;}else{b=a;}this.fireEvent("send",[this.element,b.parseQueryString()]);this.request.send({data:b,url:this.options.requestOptions.url||this.element.get("action")});
this.clickedCleaner();return
this;}});Element.implement("formUpdate",function(c,b){var
a=this.retrieve("form.request");if(!a){a=new
Form.Request(this,c,b);
}else{if(c){a.setTarget(c);}if(b){a.setOptions(b).makeRequest();}}a.send();return
this;});})();(function(){var a=function(d){var b=d.options.hideInputs;
if(window.OverText){var
c=[null];OverText.each(function(e){c.include("."+e.options.labelClass);});if(c){b+=c.join(",
");}}return(b)?d.element.getElements(b):null;
};Fx.Reveal=new
Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:!Browser.ie6,mode:"vertical",display:function(){return
this.element.get("tag")!="tr"?"block":"table-row";
},opacity:1,hideInputs:Browser.ie?"select, input, textarea, object,
embed":null},dissolve:function(){if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true;
this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var
d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});
if(this.options.transitionOpacity){d.opacity=this.options.opacity;}var
c={};Object.each(d,function(f,e){c[e]=[f,0];});this.element.setStyles({display:Function.from(this.options.display).call(this),overflow:"hidden"});
var
b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){if(this.hidden){this.hiding=false;this.element.style.cssText=this.cssText;
this.element.setStyle("display","none");if(b){b.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);this.callChain();}.bind(this));this.start(c);
}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this));
}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();this.dissolve();}}}return
this;},reveal:function(){if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"){this.hiding=false;
this.showing=true;this.hidden=false;this.cssText=this.element.style.cssText;var
d;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});
}.bind(this));if(this.options.heightOverride!=null){d.height=this.options.heightOverride.toInt();}if(this.options.widthOverride!=null){d.width=this.options.widthOverride.toInt();
}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=this.options.opacity;}var
c={height:0,display:Function.from(this.options.display).call(this)};
Object.each(d,function(f,e){c[e]=0;});c.overflow="hidden";this.element.setStyles(c);var
b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){this.element.style.cssText=this.cssText;
this.element.setStyle("display",Function.from(this.options.display).call(this));if(!this.hidden){this.showing=false;}if(b){b.setStyle("visibility","visible");
}this.callChain();this.fireEvent("show",this.element);}.bind(this));this.start(d);}else{this.callChain();this.fireEvent("complete",this.element);this.fireEvent("show",this.element);
}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();this.reveal();
}}}return
this;},toggle:function(){if(this.element.getStyle("display")=="none"){this.reveal();}else{this.dissolve();}return
this;},cancel:function(){this.parent.apply(this,arguments);
if(this.cssText!=null){this.element.style.cssText=this.cssText;}this.hiding=false;this.showing=false;return
this;}});Element.Properties.reveal={set:function(b){this.get("reveal").cancel().setOptions(b);
return this;},get:function(){var
b=this.retrieve("reveal");if(!b){b=new
Fx.Reveal(this);this.store("reveal",b);}return
b;}};Element.Properties.dissolve=Element.Properties.reveal;
Element.implement({reveal:function(b){this.get("reveal").setOptions(b).reveal();return
this;},dissolve:function(b){this.get("reveal").setOptions(b).dissolve();
return this;},nix:function(b){var
c=Array.link(arguments,{destroy:Type.isBoolean,options:Type.isObject});this.get("reveal").setOptions(b).dissolve().chain(function(){this[c.destroy?"destroy":"dispose"]();
}.bind(this));return this;},wink:function(){var
c=Array.link(arguments,{duration:Type.isNumber,options:Type.isObject});var
b=this.get("reveal").setOptions(c.options);
b.reveal().chain(function(){(function(){b.dissolve();}).delay(c.duration||2000);});}});})();Form.Request.Append=new
Class({Extends:Form.Request,options:{useReveal:true,revealOptions:{},inject:"bottom"},makeRequest:function(){this.request=new
Request.HTML(Object.merge({url:this.element.get("action"),method:this.element.get("method")||"post",spinnerTarget:this.element},this.options.requestOptions,{evalScripts:false})).addEvents({success:function(b,g,f,a){var
c;
var d=Elements.from(f);if(d.length==1){c=d[0];}else{c=new
Element("div",{styles:{display:"none"}}).adopt(d);}c.inject(this.target,this.options.inject);
if(this.options.requestOptions.evalScripts){Browser.exec(a);}this.fireEvent("beforeEffect",c);var
e=function(){this.fireEvent("success",[c,this.target,b,g,f,a]);
}.bind(this);if(this.options.useReveal){c.set("reveal",this.options.revealOptions).get("reveal").chain(e);c.reveal();}else{e();}}.bind(this),failure:function(a){this.fireEvent("failure",a);
}.bind(this)});this.attachReset();}});Locale.define("en-US","FormValidator",{required:"This
field is required.",length:"Please enter {length} characters (you
entered {elLength} characters)",minLength:"Please enter at least
{minLength} characters (you entered {length}
characters).",maxLength:"Please enter no more than {maxLength}
characters (you entered {length} characters).",integer:"Please
enter an integer in this field. Numbers with decimals (e.g. 1.25) are not
permitted.",numeric:'Please enter only numeric values in this
field (i.e. "1" or "1.1" or "-1" or
"-1.1").',digits:"Please use numbers and punctuation
only in this field (for example, a phone number with dashes or dots is
permitted).",alpha:"Please use only letters (a-z) within this
field. No spaces or other characters are
allowed.",alphanum:"Please use only letters (a-z) or numbers
(0-9) in this field. No spaces or other characters are
allowed.",dateSuchAs:"Please enter a valid date such as
{date}",dateInFormatMDY:'Please enter a valid date such as
MM/DD/YYYY (i.e. "12/31/1999")',email:'Please enter a
valid email address. For example
"fred@domain.com".',url:"Please enter a valid URL such
as http://www.example.com.",currencyDollar:"Please enter a valid
$ amount. For example $100.00 .",oneRequired:"Please enter
something for at least one of these inputs.",errorPrefix:"Error:
",warningPrefix:"Warning: ",noSpace:"There can be no
spaces in this input.",reqChkByNode:"No items are
selected.",requiredChk:"This field is
required.",reqChkByName:"Please select a
{label}.",match:"This field needs to match the {matchName}
field",startDate:"the start date",endDate:"the end
date",currendDate:"the current date",afterDate:"The
date should be the same or after {label}.",beforeDate:"The date
should be the same or before {label}.",startMonth:"Please select
a start month",sameMonth:"These two dates must be in the same
month - you must change one or the other.",creditcard:"The credit
card number entered is invalid. Please check the number and try again.
{length} digits entered."});
if(!window.Form){window.Form={};}var InputValidator=this.InputValidator=new
Class({Implements:[Options],options:{errorMsg:"Validation
failed.",test:Function.from(true)},initialize:function(b,a){this.setOptions(a);
this.className=b;},test:function(b,a){b=document.id(b);return(b)?this.options.test(b,a||this.getProps(b)):false;},getError:function(c,a){c=document.id(c);
var
b=this.options.errorMsg;if(typeOf(b)=="function"){b=b(c,a||this.getProps(c));}return
b;},getProps:function(a){a=document.id(a);return(a)?a.get("validatorProps"):{};
}});Element.Properties.validators={get:function(){return(this.get("data-validators")||this.className).clean().split("
");}};Element.Properties.validatorProps={set:function(a){return
this.eliminate("$moo:validatorProps").store("$moo:validatorProps",a);
},get:function(a){if(a){this.set(a);}if(this.retrieve("$moo:validatorProps")){return
this.retrieve("$moo:validatorProps");}if(this.getProperty("data-validator-properties")||this.getProperty("validatorProps")){try{this.store("$moo:validatorProps",JSON.decode(this.getProperty("validatorProps")||this.getProperty("data-validator-properties")));
}catch(c){return{};}}else{var
b=this.get("validators").filter(function(d){return
d.test(":");});if(!b.length){this.store("$moo:validatorProps",{});}else{a={};
b.each(function(d){var
f=d.split(":");if(f[1]){try{a[f[0]]=JSON.decode(f[1]);}catch(g){}}});this.store("$moo:validatorProps",a);}}return
this.retrieve("$moo:validatorProps");
}};Form.Validator=new
Class({Implements:[Options,Events],Binds:["onSubmit"],options:{fieldSelectors:"input,
select,
textarea",ignoreHidden:true,ignoreDisabled:true,useTitles:false,evaluateOnSubmit:true,evaluateFieldsOnBlur:true,evaluateFieldsOnChange:true,serial:true,stopOnFailure:true,warningPrefix:function(){return
Form.Validator.getMsg("warningPrefix")||"Warning: ";
},errorPrefix:function(){return
Form.Validator.getMsg("errorPrefix")||"Error:
";}},initialize:function(b,a){this.setOptions(a);this.element=document.id(b);
this.element.store("validator",this);this.warningPrefix=Function.from(this.options.warningPrefix)();this.errorPrefix=Function.from(this.options.errorPrefix)();
if(this.options.evaluateOnSubmit){this.element.addEvent("submit",this.onSubmit);}if(this.options.evaluateFieldsOnBlur||this.options.evaluateFieldsOnChange){this.watchFields(this.getFields());
}},toElement:function(){return
this.element;},getFields:function(){return(this.fields=this.element.getElements(this.options.fieldSelectors));},watchFields:function(a){a.each(function(b){if(this.options.evaluateFieldsOnBlur){b.addEvent("blur",this.validationMonitor.pass([b,false],this));
}if(this.options.evaluateFieldsOnChange){b.addEvent("change",this.validationMonitor.pass([b,true],this));}},this);},validationMonitor:function(){clearTimeout(this.timer);
this.timer=this.validateField.delay(50,this,arguments);},onSubmit:function(a){if(this.validate(a)){this.reset();}},reset:function(){this.getFields().each(this.resetField,this);
return this;},validate:function(b){var
a=this.getFields().map(function(c){return
this.validateField(c,true);},this).every(function(c){return
c;});this.fireEvent("formValidate",[a,this.element,b]);
if(this.options.stopOnFailure&&!a&&b){b.preventDefault();}return
a;},validateField:function(j,b){if(this.paused){return
true;}j=document.id(j);var f=!j.hasClass("validation-failed");
var
g,i;if(this.options.serial&&!b){g=this.element.getElement(".validation-failed");i=this.element.getElement(".warning");}if(j&&(!g||b||j.hasClass("validation-failed")||(g&&!this.options.serial))){var
a=j.get("validators");
var d=a.some(function(k){return this.getValidator(k);},this);var
h=[];a.each(function(k){if(k&&!this.test(k,j)){h.include(k);}},this);f=h.length===0;if(d&&!this.hasValidator(j,"warnOnly")){if(f){j.addClass("validation-passed").removeClass("validation-failed");
this.fireEvent("elementPass",[j]);}else{j.addClass("validation-failed").removeClass("validation-passed");this.fireEvent("elementFail",[j,h]);}}if(!i){var
e=a.some(function(k){if(k.test("^warn")){return
this.getValidator(k.replace(/^warn-/,""));
}else{return null;}},this);j.removeClass("warning");var
c=a.map(function(k){if(k.test("^warn")){return
this.test(k.replace(/^warn-/,""),j,true);}else{return null;
}},this);}}return
f;},test:function(b,d,e){d=document.id(d);if((this.options.ignoreHidden&&!d.isVisible())||(this.options.ignoreDisabled&&d.get("disabled"))){return
true;
}var
a=this.getValidator(b);if(e!=null){e=false;}if(this.hasValidator(d,"warnOnly")){e=true;}var
c=this.hasValidator(d,"ignoreValidation")||(a?a.test(d):true);
if(a&&d.isVisible()){this.fireEvent("elementValidate",[c,d,b,e]);}if(e){return
true;}return c;},hasValidator:function(b,a){return
b.get("validators").contains(a);
},resetField:function(a){a=document.id(a);if(a){a.get("validators").each(function(b){if(b.test("^warn-")){b=b.replace(/^warn-/,"");}a.removeClass("validation-failed");
a.removeClass("warning");a.removeClass("validation-passed");},this);}return
this;},stop:function(){this.paused=true;return
this;},start:function(){this.paused=false;
return
this;},ignoreField:function(a,b){a=document.id(a);if(a){this.enforceField(a);if(b){a.addClass("warnOnly");}else{a.addClass("ignoreValidation");}}return
this;
},enforceField:function(a){a=document.id(a);if(a){a.removeClass("warnOnly").removeClass("ignoreValidation");}return
this;}});Form.Validator.getMsg=function(a){return
Locale.get("FormValidator."+a);
};Form.Validator.adders={validators:{},add:function(b,a){this.validators[b]=new
InputValidator(b,a);if(!this.initialize){this.implement({validators:this.validators});
}},addAllThese:function(a){Array.from(a).each(function(b){this.add(b[0],b[1]);},this);},getValidator:function(a){return
this.validators[a.split(":")[0]];
}};Object.append(Form.Validator,Form.Validator.adders);Form.Validator.implement(Form.Validator.adders);Form.Validator.add("IsEmpty",{errorMsg:false,test:function(a){if(a.type=="select-one"||a.type=="select"){return
!(a.selectedIndex>=0&&a.options[a.selectedIndex].value!="");
}else{return((a.get("value")==null)||(a.get("value").length==0));}}});Form.Validator.addAllThese([["required",{errorMsg:function(){return
Form.Validator.getMsg("required");
},test:function(a){return
!Form.Validator.getValidator("IsEmpty").test(a);}}],["length",{errorMsg:function(a,b){if(typeOf(b.length)!="null"){return
Form.Validator.getMsg("length").substitute({length:b.length,elLength:a.get("value").length});
}else{return"";}},test:function(a,b){if(typeOf(b.length)!="null"){return(a.get("value").length==b.length||a.get("value").length==0);}else{return
true;}}}],["minLength",{errorMsg:function(a,b){if(typeOf(b.minLength)!="null"){return
Form.Validator.getMsg("minLength").substitute({minLength:b.minLength,length:a.get("value").length});
}else{return"";}},test:function(a,b){if(typeOf(b.minLength)!="null"){return(a.get("value").length>=(b.minLength||0));}else{return
true;}}}],["maxLength",{errorMsg:function(a,b){if(typeOf(b.maxLength)!="null"){return
Form.Validator.getMsg("maxLength").substitute({maxLength:b.maxLength,length:a.get("value").length});
}else{return"";}},test:function(a,b){return
a.get("value").length<=(b.maxLength||10000);}}],["validate-integer",{errorMsg:Form.Validator.getMsg.pass("integer"),test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||(/^(-?[1-9]\d*|0)$/).test(a.get("value"));
}}],["validate-numeric",{errorMsg:Form.Validator.getMsg.pass("numeric"),test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||(/^-?(?:0$0(?=\d*\.)|[1-9]|0)\d*(\.\d+)?$/).test(a.get("value"));
}}],["validate-digits",{errorMsg:Form.Validator.getMsg.pass("digits"),test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||(/^[\d()
.:\-\+#]+$/.test(a.get("value")));
}}],["validate-alpha",{errorMsg:Form.Validator.getMsg.pass("alpha"),test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||(/^[a-zA-Z]+$/).test(a.get("value"));
}}],["validate-alphanum",{errorMsg:Form.Validator.getMsg.pass("alphanum"),test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||!(/\W/).test(a.get("value"));
}}],["validate-date",{errorMsg:function(a,b){if(Date.parse){var
c=b.dateFormat||"%x";return
Form.Validator.getMsg("dateSuchAs").substitute({date:new
Date().format(c)});
}else{return
Form.Validator.getMsg("dateInFormatMDY");}},test:function(e,g){if(Form.Validator.getValidator("IsEmpty").test(e)){return
true;}var a=Locale.getCurrent().sets.Date,b=new
RegExp([a.days,a.days_abbr,a.months,a.months_abbr].flatten().join("|"),"i"),i=e.get("value"),f=i.match(/[a-z]+/gi);
if(f&&!f.every(b.exec,b)){return false;}var
c=Date.parse(i),h=g.dateFormat||"%x",d=c.format(h);if(d!="invalid
date"){e.set("value",d);}return c.isValid();
}}],["validate-email",{errorMsg:Form.Validator.getMsg.pass("email"),test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||(/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+\/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(a.get("value"));
}}],["validate-url",{errorMsg:Form.Validator.getMsg.pass("url"),test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||(/^(https?|ftp|rmtp|mms):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i).test(a.get("value"));
}}],["validate-currency-dollar",{errorMsg:Form.Validator.getMsg.pass("currencyDollar"),test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||(/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(a.get("value"));
}}],["validate-one-required",{errorMsg:Form.Validator.getMsg.pass("oneRequired"),test:function(a,b){var
c=document.id(b["validate-one-required"])||a.getParent(b["validate-one-required"]);
return
c.getElements("input").some(function(d){if(["checkbox","radio"].contains(d.get("type"))){return
d.get("checked");}return d.get("value");});}}]]);
Element.Properties.validator={set:function(a){this.get("validator").setOptions(a);},get:function(){var
a=this.retrieve("validator");if(!a){a=new Form.Validator(this);
this.store("validator",a);}return
a;}};Element.implement({validate:function(a){if(a){this.set("validator",a);}return
this.get("validator").validate();}});
Form.Validator.Inline=new
Class({Extends:Form.Validator,options:{showError:function(a){if(a.reveal){a.reveal();}else{a.setStyle("display","block");}},hideError:function(a){if(a.dissolve){a.dissolve();
}else{a.setStyle("display","none");}},scrollToErrorsOnSubmit:true,scrollToErrorsOnBlur:false,scrollToErrorsOnChange:false,scrollFxOptions:{transition:"quad:out",offset:{y:-20}}},initialize:function(b,a){this.parent(b,a);
this.addEvent("onElementValidate",function(g,f,e,h){var
d=this.getValidator(e);if(!g&&d.getError(f)){if(h){f.addClass("warning");}var
c=this.makeAdvice(e,f,d.getError(f),h);
this.insertAdvice(c,f);this.showAdvice(e,f);}else{this.hideAdvice(e,f);}});},makeAdvice:function(d,f,c,g){var
e=(g)?this.warningPrefix:this.errorPrefix;
e+=(this.options.useTitles)?f.title||c:c;var
a=(g)?"warning-advice":"validation-advice";var
b=this.getAdvice(d,f);if(b){b=b.set("html",e);}else{b=new
Element("div",{html:e,styles:{display:"none"},id:"advice-"+d.split(":")[0]+"-"+this.getFieldId(f)}).addClass(a);
}f.store("$moo:advice-"+d,b);return
b;},getFieldId:function(a){return
a.id?a.id:a.id="input_"+a.name;},showAdvice:function(b,c){var
a=this.getAdvice(b,c);
if(a&&!c.retrieve("$moo:"+this.getPropName(b))&&(a.getStyle("display")=="none"||a.getStyle("visiblity")=="hidden"||a.getStyle("opacity")==0)){c.store("$moo:"+this.getPropName(b),true);
this.options.showError(a);this.fireEvent("showAdvice",[c,a,b]);}},hideAdvice:function(b,c){var
a=this.getAdvice(b,c);if(a&&c.retrieve("$moo:"+this.getPropName(b))){c.store("$moo:"+this.getPropName(b),false);
this.options.hideError(a);this.fireEvent("hideAdvice",[c,a,b]);}},getPropName:function(a){return"advice"+a;},resetField:function(a){a=document.id(a);if(!a){return
this;
}this.parent(a);a.get("validators").each(function(b){this.hideAdvice(b,a);},this);return
this;},getAllAdviceMessages:function(d,c){var
b=[];if(d.hasClass("ignoreValidation")&&!c){return b;
}var a=d.get("validators").some(function(g){var
e=g.test("^warn-")||d.hasClass("warnOnly");if(e){g=g.replace(/^warn-/,"");}var
f=this.getValidator(g);if(!f){return;
}b.push({message:f.getError(d),warnOnly:e,passed:f.test(),validator:f});},this);return
b;},getAdvice:function(a,b){return b.retrieve("$moo:advice-"+a);
},insertAdvice:function(a,c){var
b=c.get("validatorProps");if(!b.msgPos||!document.id(b.msgPos)){if(c.type&&c.type.toLowerCase()=="radio"){c.getParent().adopt(a);
}else{a.inject(document.id(c),"after");}}else{document.id(b.msgPos).grab(a);}},validateField:function(g,f,b){var
a=this.parent(g,f);if(((this.options.scrollToErrorsOnSubmit&&b==null)||b)&&!a){var
c=document.id(this).getElement(".validation-failed");
var
d=document.id(this).getParent();while(d!=document.body&&d.getScrollSize().y==d.getSize().y){d=d.getParent();}var
e=d.retrieve("$moo:fvScroller");if(!e&&window.Fx&&Fx.Scroll){e=new
Fx.Scroll(d,this.options.scrollFxOptions);
d.store("$moo:fvScroller",e);}if(c){if(e){e.toElement(c);}else{d.scrollTo(d.getScroll().x,c.getPosition(d).y-20);}}}return
a;},watchFields:function(a){a.each(function(b){if(this.options.evaluateFieldsOnBlur){b.addEvent("blur",this.validationMonitor.pass([b,false,this.options.scrollToErrorsOnBlur],this));
}if(this.options.evaluateFieldsOnChange){b.addEvent("change",this.validationMonitor.pass([b,true,this.options.scrollToErrorsOnChange],this));}},this);}});
Form.Validator.addAllThese([["validate-enforce-oncheck",{test:function(a,b){var
c=a.getParent("form").retrieve("validator");if(!c){return
true;}(b.toEnforce||document.id(b.enforceChildrenOf).getElements("input,
select, textarea")).map(function(d){if(a.checked){c.enforceField(d);
}else{c.ignoreField(d);c.resetField(d);}});return
true;}}],["validate-ignore-oncheck",{test:function(a,b){var
c=a.getParent("form").retrieve("validator");
if(!c){return
true;}(b.toIgnore||document.id(b.ignoreChildrenOf).getElements("input,
select, textarea")).each(function(d){if(a.checked){c.ignoreField(d);
c.resetField(d);}else{c.enforceField(d);}});return
true;}}],["validate-nospace",{errorMsg:function(){return
Form.Validator.getMsg("noSpace");},test:function(a,b){return
!a.get("value").test(/\s/);
}}],["validate-toggle-oncheck",{test:function(b,c){var
d=b.getParent("form").retrieve("validator");if(!d){return
true;}var
a=c.toToggle||document.id(c.toToggleChildrenOf).getElements("input,
select, textarea");
if(!b.checked){a.each(function(e){d.ignoreField(e);d.resetField(e);});}else{a.each(function(e){d.enforceField(e);});}return
true;}}],["validate-reqchk-bynode",{errorMsg:function(){return
Form.Validator.getMsg("reqChkByNode");
},test:function(a,b){return(document.id(b.nodeId).getElements(b.selector||"input[type=checkbox],
input[type=radio]")).some(function(c){return c.checked;
});}}],["validate-required-check",{errorMsg:function(a,b){return
b.useTitle?a.get("title"):Form.Validator.getMsg("requiredChk");},test:function(a,b){return
!!a.checked;
}}],["validate-reqchk-byname",{errorMsg:function(a,b){return
Form.Validator.getMsg("reqChkByName").substitute({label:b.label||a.get("type")});},test:function(b,d){var
c=d.groupName||b.get("name");
var a=$$(document.getElementsByName(c)).some(function(g,f){return
g.checked;});var
e=b.getParent("form").retrieve("validator");if(a&&e){e.resetField(b);
}return a;}}],["validate-match",{errorMsg:function(a,b){return
Form.Validator.getMsg("match").substitute({matchName:b.matchName||document.id(b.matchInput).get("name")});
},test:function(b,c){var d=b.get("value");var
a=document.id(c.matchInput)&&document.id(c.matchInput).get("value");return
d&&a?d==a:true;}}],["validate-after-date",{errorMsg:function(a,b){return
Form.Validator.getMsg("afterDate").substitute({label:b.afterLabel||(b.afterElement?Form.Validator.getMsg("startDate"):Form.Validator.getMsg("currentDate"))});
},test:function(b,c){var
d=document.id(c.afterElement)?Date.parse(document.id(c.afterElement).get("value")):new
Date();var a=Date.parse(b.get("value"));
return
a&&d?a>=d:true;}}],["validate-before-date",{errorMsg:function(a,b){return
Form.Validator.getMsg("beforeDate").substitute({label:b.beforeLabel||(b.beforeElement?Form.Validator.getMsg("endDate"):Form.Validator.getMsg("currentDate"))});
},test:function(b,c){var d=Date.parse(b.get("value"));var
a=document.id(c.beforeElement)?Date.parse(document.id(c.beforeElement).get("value")):new
Date();
return
a&&d?a>=d:true;}}],["validate-custom-required",{errorMsg:function(){return
Form.Validator.getMsg("required");},test:function(a,b){return
a.get("value")!=b.emptyValue;
}}],["validate-same-month",{errorMsg:function(a,b){var
c=document.id(b.sameMonthAs)&&document.id(b.sameMonthAs).get("value");var
d=a.get("value");if(d!=""){return
Form.Validator.getMsg(c?"sameMonth":"startMonth");
}},test:function(a,b){var d=Date.parse(a.get("value"));var
c=Date.parse(document.id(b.sameMonthAs)&&document.id(b.sameMonthAs).get("value"));return
d&&c?d.format("%B")==c.format("%B"):true;
}}],["validate-cc-num",{errorMsg:function(a){var
b=a.get("value").replace(/[^0-9]/g,"");return
Form.Validator.getMsg("creditcard").substitute({length:b.length});
},test:function(c){if(Form.Validator.getValidator("IsEmpty").test(c)){return
true;}var
g=c.get("value");g=g.replace(/[^0-9]/g,"");var
a=false;if(g.test(/^4[0-9]{12}([0-9]{3})?$/)){a="Visa";
}else{if(g.test(/^5[1-5]([0-9]{14})$/)){a="Master
Card";}else{if(g.test(/^3[47][0-9]{13}$/)){a="American
Express";}else{if(g.test(/^6011[0-9]{12}$/)){a="Discover";
}}}}if(a){var d=0;var e=0;for(var
b=g.length-1;b>=0;--b){e=g.charAt(b).toInt();if(e==0){continue;}if((g.length-b)%2==0){e+=e;}if(e>9){e=e.toString().charAt(0).toInt()+e.toString().charAt(1).toInt();
}d+=e;}if((d%10)==0){return true;}}var
f="";while(g!=""){f+="
"+g.substr(0,4);g=g.substr(4);}c.getParent("form").retrieve("validator").ignoreField(c);c.set("value",f.clean());
c.getParent("form").retrieve("validator").enforceField(c);return
false;}}]]);var OverText=new
Class({Implements:[Options,Events,Class.Occlude],Binds:["reposition","assert","focus","hide"],options:{element:"label",labelClass:"overTxtLabel",positionOptions:{position:"upperLeft",edge:"upperLeft",offset:{x:4,y:2}},poll:false,pollInterval:250,wrap:false},property:"OverText",initialize:function(b,a){b=this.element=document.id(b);
if(this.occlude()){return
this.occluded;}this.setOptions(a);this.attach(b);OverText.instances.push(this);if(this.options.poll){this.poll();}},toElement:function(){return
this.element;
},attach:function(){var
b=this.element,a=this.options,c=a.textOverride||b.get("alt")||b.get("title");if(!c){return
this;}var d=this.text=new
Element(a.element,{"class":a.labelClass,styles:{lineHeight:"normal",position:"absolute",cursor:"text"},html:c,events:{click:this.hide.pass(a.element=="label",this)}}).inject(b,"after");
if(a.element=="label"){if(!b.get("id")){b.set("id","input_"+String.uniqueID());}d.set("for",b.get("id"));}if(a.wrap){this.textHolder=new
Element("div.overTxtWrapper",{styles:{lineHeight:"normal",position:"relative"}}).grab(d).inject(b,"before");
}return
this.enable();},destroy:function(){this.element.eliminate(this.property);this.disable();if(this.text){this.text.destroy();}if(this.textHolder){this.textHolder.destroy();
}return
this;},disable:function(){this.element.removeEvents({focus:this.focus,blur:this.assert,change:this.assert});window.removeEvent("resize",this.reposition);
this.hide(true,true);return
this;},enable:function(){this.element.addEvents({focus:this.focus,blur:this.assert,change:this.assert});window.addEvent("resize",this.reposition);
this.reposition();return
this;},wrap:function(){if(this.options.element=="label"){if(!this.element.get("id")){this.element.set("id","input_"+String.uniqueID());
}this.text.set("for",this.element.get("id"));}},startPolling:function(){this.pollingPaused=false;return
this.poll();},poll:function(a){if(this.poller&&!a){return this;
}if(a){clearInterval(this.poller);}else{this.poller=(function(){if(!this.pollingPaused){this.assert(true);}}).periodical(this.options.pollInterval,this);
}return this;},stopPolling:function(){this.pollingPaused=true;return
this.poll(true);},focus:function(){if(this.text&&(!this.text.isDisplayed()||this.element.get("disabled"))){return
this;
}return
this.hide();},hide:function(c,a){if(this.text&&(this.text.isDisplayed()&&(!this.element.get("disabled")||a))){this.text.hide();this.fireEvent("textHide",[this.text,this.element]);
this.pollingPaused=true;if(!c){try{this.element.fireEvent("focus");this.element.focus();}catch(b){}}}return
this;},show:function(){if(this.text&&!this.text.isDisplayed()){this.text.show();
this.reposition();this.fireEvent("textShow",[this.text,this.element]);this.pollingPaused=false;}return
this;},test:function(){return !this.element.get("value");
},assert:function(a){return
this[this.test()?"show":"hide"](a);},reposition:function(){this.assert(true);if(!this.element.isVisible()){return
this.stopPolling().hide();
}if(this.text&&this.test()){this.text.position(Object.merge(this.options.positionOptions,{relativeTo:this.element}));}return
this;}});OverText.instances=[];
Object.append(OverText,{each:function(a){return
OverText.instances.each(function(c,b){if(c.element&&c.text){a.call(OverText,c,b);}});},update:function(){return
OverText.each(function(a){return a.reposition();
});},hideAll:function(){return OverText.each(function(a){return
a.hide(true,true);});},showAll:function(){return
OverText.each(function(a){return a.show();
});}});Fx.Elements=new
Class({Extends:Fx.CSS,initialize:function(b,a){this.elements=this.subject=$$(b);this.parent(a);},compute:function(g,h,j){var
c={};
for(var d in g){var a=g[d],e=h[d],f=c[d]={};for(var b in
a){f[b]=this.parent(a[b],e[b],j);}}return c;},set:function(b){for(var c in
b){if(!this.elements[c]){continue;
}var a=b[c];for(var d in
a){this.render(this.elements[c],d,a[d],this.options.unit);}}return
this;},start:function(c){if(!this.check(c)){return this;}var h={},j={};
for(var d in c){if(!this.elements[d]){continue;}var
f=c[d],a=h[d]={},g=j[d]={};for(var b in f){var
e=this.prepare(this.elements[d],b,f[b]);a[b]=e.from;
g[b]=e.to;}}return this.parent(h,j);}});Fx.Accordion=new
Class({Extends:Fx.Elements,options:{fixedHeight:false,fixedWidth:false,display:0,show:false,height:true,width:false,opacity:true,alwaysHide:false,trigger:"click",initialDisplayFx:true,resetHeight:true},initialize:function(){var
g=function(h){return h!=null;
};var
f=Array.link(arguments,{container:Type.isElement,options:Type.isObject,togglers:g,elements:g});this.parent(f.elements,f.options);var
b=this.options,e=this.togglers=$$(f.togglers);
this.previous=-1;this.internalChain=new
Chain();if(b.alwaysHide){this.options.link="chain";}if(b.show||this.options.show===0){b.display=false;this.previous=b.show;
}if(b.start){b.display=false;b.show=false;}var
d=this.effects={};if(b.opacity){d.opacity="fullOpacity";}if(b.width){d.width=b.fixedWidth?"fullWidth":"offsetWidth";
}if(b.height){d.height=b.fixedHeight?"fullHeight":"scrollHeight";}for(var
c=0,a=e.length;c<a;c++){this.addSection(e[c],this.elements[c]);}this.elements.each(function(j,h){if(b.show===h){this.fireEvent("active",[e[h],j]);
}else{for(var k in
d){j.setStyle(k,0);}}},this);if(b.display||b.display===0||b.initialDisplayFx===false){this.display(b.display,b.initialDisplayFx);}if(b.fixedHeight!==false){b.resetHeight=false;
}this.addEvent("complete",this.internalChain.callChain.bind(this.internalChain));},addSection:function(g,d){g=document.id(g);d=document.id(d);this.togglers.include(g);
this.elements.include(d);var
f=this.togglers,c=this.options,h=f.contains(g),a=f.indexOf(g),b=this.display.pass(a,this);g.store("accordion:display",b).addEvent(c.trigger,b);
if(c.height){d.setStyles({"padding-top":0,"border-top":"none","padding-bottom":0,"border-bottom":"none"});}if(c.width){d.setStyles({"padding-left":0,"border-left":"none","padding-right":0,"border-right":"none"});
}d.fullOpacity=1;if(c.fixedWidth){d.fullWidth=c.fixedWidth;}if(c.fixedHeight){d.fullHeight=c.fixedHeight;}d.setStyle("overflow","hidden");if(!h){for(var
e in this.effects){d.setStyle(e,0);
}}return this;},removeSection:function(f,b){var
e=this.togglers,a=e.indexOf(f),c=this.elements[a];var
d=function(){e.erase(f);this.elements.erase(c);this.detach(f);
}.bind(this);if(this.now==a||b!=null){this.display(b!=null?b:(a-1>=0?a-1:0)).chain(d);}else{d();}return
this;},detach:function(b){var
a=function(c){c.removeEvent(this.options.trigger,c.retrieve("accordion:display"));
}.bind(this);if(!b){this.togglers.each(a);}else{a(b);}return
this;},display:function(b,c){if(!this.check(b,c)){return this;}var
h={},g=this.elements,a=this.options,f=this.effects;
if(c==null){c=true;}if(typeOf(b)=="element"){b=g.indexOf(b);}if(b==this.previous&&!a.alwaysHide){return
this;}if(a.resetHeight){var e=g[this.previous];
if(e&&!this.selfHidden){for(var d in
f){e.setStyle(d,e[f[d]]);}}}if((this.timer&&a.link=="chain")||(b===this.previous&&!a.alwaysHide)){return
this;}this.previous=b;
this.selfHidden=false;g.each(function(l,k){h[k]={};var
j;if(k!=b){j=true;}else{if(a.alwaysHide&&((l.offsetHeight>0&&a.height)||l.offsetWidth>0&&a.width)){j=true;
this.selfHidden=true;}}this.fireEvent(j?"background":"active",[this.togglers[k],l]);for(var
m in
f){h[k][m]=j?0:l[f[m]];}if(!c&&!j&&a.resetHeight){h[k].height="auto";
}},this);this.internalChain.clearChain();this.internalChain.chain(function(){if(a.resetHeight&&!this.selfHidden){var
i=g[b];if(i){i.setStyle("height","auto");
}}}.bind(this));return
c?this.start(h):this.set(h).internalChain.callChain();}});Fx.Move=new
Class({Extends:Fx.Morph,options:{relativeTo:document.body,position:"center",edge:false,offset:{x:0,y:0}},start:function(a){var
b=this.element,c=b.getStyles("top","left");
if(c.top=="auto"||c.left=="auto"){b.setPosition(b.getPosition(b.getOffsetParent()));}return
this.parent(b.position(Object.merge({},this.options,a,{returnPos:true})));
}});Element.Properties.move={set:function(a){this.get("move").cancel().setOptions(a);return
this;},get:function(){var a=this.retrieve("move");if(!a){a=new
Fx.Move(this,{link:"cancel"});
this.store("move",a);}return
a;}};Element.implement({move:function(a){this.get("move").start(a);return
this;}});(function(){Fx.Scroll=new
Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(c,b){this.element=this.subject=document.id(c);
this.parent(b);if(typeOf(this.element)!="element"){this.element=document.id(this.element.getDocument().body);}if(this.options.wheelStops){var
d=this.element,e=this.cancel.pass(false,this);
this.addEvent("start",function(){d.addEvent("mousewheel",e);},true);this.addEvent("complete",function(){d.removeEvent("mousewheel",e);},true);}},set:function(){var
b=Array.flatten(arguments);
if(Browser.firefox){b=[Math.round(b[0]),Math.round(b[1])];}this.element.scrollTo(b[0],b[1]);return
this;},compute:function(d,c,b){return[0,1].map(function(e){return
Fx.compute(d[e],c[e],b);
});},start:function(c,d){if(!this.check(c,d)){return this;}var
b=this.element.getScroll();return
this.parent([b.x,b.y],[c,d]);},calculateScroll:function(g,f){var
d=this.element,b=d.getScrollSize(),h=d.getScroll(),j=d.getSize(),c=this.options.offset,i={x:g,y:f};
for(var e in
i){if(!i[e]&&i[e]!==0){i[e]=h[e];}if(typeOf(i[e])!="number"){i[e]=b[e]-j[e];}i[e]+=c[e];}return[i.x,i.y];},toTop:function(){return
this.start.apply(this,this.calculateScroll(false,0));
},toLeft:function(){return
this.start.apply(this,this.calculateScroll(0,false));},toRight:function(){return
this.start.apply(this,this.calculateScroll("right",false));
},toBottom:function(){return
this.start.apply(this,this.calculateScroll(false,"bottom"));},toElement:function(d,e){e=e?Array.from(e):["x","y"];var
c=a(this.element)?{x:0,y:0}:this.element.getScroll();
var
b=Object.map(document.id(d).getPosition(this.element),function(g,f){return
e.contains(f)?g+c[f]:false;});return
this.start.apply(this,this.calculateScroll(b.x,b.y));
},toElementEdge:function(d,g,e){g=g?Array.from(g):["x","y"];d=document.id(d);var
i={},f=d.getPosition(this.element),j=d.getSize(),h=this.element.getScroll(),b=this.element.getSize(),c={x:f.x+j.x,y:f.y+j.y};
["x","y"].each(function(k){if(g.contains(k)){if(c[k]>h[k]+b[k]){i[k]=c[k]-b[k];}if(f[k]<h[k]){i[k]=f[k];}}if(i[k]==null){i[k]=h[k];}if(e&&e[k]){i[k]=i[k]+e[k];
}},this);if(i.x!=h.x||i.y!=h.y){this.start(i.x,i.y);}return
this;},toElementCenter:function(e,f,h){f=f?Array.from(f):["x","y"];e=document.id(e);var
i={},c=e.getPosition(this.element),d=e.getSize(),b=this.element.getScroll(),g=this.element.getSize();
["x","y"].each(function(j){if(f.contains(j)){i[j]=c[j]-(g[j]-d[j])/2;}if(i[j]==null){i[j]=b[j];}if(h&&h[j]){i[j]=i[j]+h[j];}},this);if(i.x!=b.x||i.y!=b.y){this.start(i.x,i.y);
}return this;}});function
a(b){return(/^(?:body|html)$/i).test(b.tagName);}})();Fx.Slide=new
Class({Extends:Fx,options:{mode:"vertical",wrapper:false,hideOverflow:true,resetHeight:false},initialize:function(b,a){b=this.element=this.subject=document.id(b);
this.parent(a);a=this.options;var
d=b.retrieve("wrapper"),c=b.getStyles("margin","position","overflow");if(a.hideOverflow){c=Object.append(c,{overflow:"hidden"});
}if(a.wrapper){d=document.id(a.wrapper).setStyles(c);}if(!d){d=new
Element("div",{styles:c}).wraps(b);}b.store("wrapper",d).setStyle("margin",0);if(b.getStyle("overflow")=="visible"){b.setStyle("overflow","hidden");
}this.now=[];this.open=true;this.wrapper=d;this.addEvent("complete",function(){this.open=(d["offset"+this.layout.capitalize()]!=0);if(this.open&&this.options.resetHeight){d.setStyle("height","");
}},true);},vertical:function(){this.margin="margin-top";this.layout="height";this.offset=this.element.offsetHeight;},horizontal:function(){this.margin="margin-left";
this.layout="width";this.offset=this.element.offsetWidth;},set:function(a){this.element.setStyle(this.margin,a[0]);this.wrapper.setStyle(this.layout,a[1]);
return this;},compute:function(c,b,a){return[0,1].map(function(d){return
Fx.compute(c[d],b[d],a);});},start:function(b,e){if(!this.check(b,e)){return
this;
}this[e||this.options.mode]();var
d=this.element.getStyle(this.margin).toInt(),c=this.wrapper.getStyle(this.layout).toInt(),a=[[d,c],[0,this.offset]],g=[[d,c],[-this.offset,0]],f;
switch(b){case"in":f=a;break;case"out":f=g;break;case"toggle":f=(c==0)?a:g;}return
this.parent(f[0],f[1]);},slideIn:function(a){return
this.start("in",a);
},slideOut:function(a){return
this.start("out",a);},hide:function(a){this[a||this.options.mode]();this.open=false;return
this.set([-this.offset,0]);},show:function(a){this[a||this.options.mode]();
this.open=true;return this.set([0,this.offset]);},toggle:function(a){return
this.start("toggle",a);}});Element.Properties.slide={set:function(a){this.get("slide").cancel().setOptions(a);
return this;},get:function(){var
a=this.retrieve("slide");if(!a){a=new
Fx.Slide(this,{link:"cancel"});this.store("slide",a);}return
a;}};Element.implement({slide:function(d,e){d=d||"toggle";
var
b=this.get("slide"),a;switch(d){case"hide":b.hide(e);break;case"show":b.show(e);break;case"toggle":var
c=this.retrieve("slide:flag",b.open);b[c?"slideOut":"slideIn"](e);
this.store("slide:flag",!c);a=true;break;default:b.start(d,e);}if(!a){this.eliminate("slide:flag");}return
this;}});Fx.SmoothScroll=new
Class({Extends:Fx.Scroll,options:{axes:["x","y"]},initialize:function(c,d){d=d||document;
this.doc=d.getDocument();this.parent(this.doc,c);var
e=d.getWindow(),a=e.location.href.match(/^[^#]*/)[0]+"#",b=$$(this.options.links||this.doc.links);
b.each(function(g){if(g.href.indexOf(a)!=0){return;}var
f=g.href.substr(a.length);if(f){this.useLink(g,f);}},this);this.addEvent("complete",function(){e.location.hash=this.anchor;
this.element.scrollTo(this.to[0],this.to[1]);},true);},useLink:function(b,a){b.addEvent("click",function(d){var
c=document.id(a)||this.doc.getElement("a[name="+a+"]");
if(!c){return;}d.preventDefault();this.toElement(c,this.options.axes).chain(function(){this.fireEvent("scrolledTo",[b,c]);}.bind(this));this.anchor=a;}.bind(this));
return this;}});Fx.Sort=new
Class({Extends:Fx.Elements,options:{mode:"vertical"},initialize:function(b,a){this.parent(b,a);this.elements.each(function(c){if(c.getStyle("position")=="static"){c.setStyle("position","relative");
}});this.setDefaultOrder();},setDefaultOrder:function(){this.currentOrder=this.elements.map(function(b,a){return
a;});},sort:function(){if(!this.check(arguments)){return this;
}var e=Array.flatten(arguments);var
i=0,a=0,c={},h={},d=this.options.mode=="vertical";var
f=this.elements.map(function(m,k){var
l=m.getComputedSize({styles:["border","padding","margin"]});
var
n;if(d){n={top:i,margin:l["margin-top"],height:l.totalHeight};i+=n.height-l["margin-top"];}else{n={left:a,margin:l["margin-left"],width:l.totalWidth};
a+=n.width;}var j=d?"top":"left";h[k]={};var
o=m.getStyle(j).toInt();h[k][j]=o||0;return
n;},this);this.set(h);e=e.map(function(j){return j.toInt();});
if(e.length!=this.elements.length){this.currentOrder.each(function(j){if(!e.contains(j)){e.push(j);}});if(e.length>this.elements.length){e.splice(this.elements.length-1,e.length-this.elements.length);
}}var b=0;i=a=0;e.each(function(k){var
j={};if(d){j.top=i-f[k].top-b;i+=f[k].height;}else{j.left=a-f[k].left;a+=f[k].width;}b=b+f[k].margin;c[k]=j;},this);
var
g={};Array.clone(e).sort().each(function(j){g[j]=c[j];});this.start(g);this.currentOrder=e;return
this;},rearrangeDOM:function(a){a=a||this.currentOrder;
var b=this.elements[0].getParent();var
c=[];this.elements.setStyle("opacity",0);a.each(function(d){c.push(this.elements[d].inject(b).setStyles({top:0,left:0}));
},this);this.elements.setStyle("opacity",1);this.elements=$$(c);this.setDefaultOrder();return
this;},getDefaultOrder:function(){return
this.elements.map(function(b,a){return a;
});},getCurrentOrder:function(){return
this.currentOrder;},forward:function(){return
this.sort(this.getDefaultOrder());},backward:function(){return
this.sort(this.getDefaultOrder().reverse());
},reverse:function(){return
this.sort(this.currentOrder.reverse());},sortByElements:function(a){return
this.sort(a.map(function(b){return this.elements.indexOf(b);
},this));},swap:function(c,b){if(typeOf(c)=="element"){c=this.elements.indexOf(c);}if(typeOf(b)=="element"){b=this.elements.indexOf(b);}var
a=Array.clone(this.currentOrder);
a[this.currentOrder.indexOf(c)]=b;a[this.currentOrder.indexOf(b)]=c;return
this.sort(a);}});var Drag=new
Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var
b=Array.link(arguments,{options:Type.isObject,element:function(c){return
c!=null;
}});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var
a=typeOf(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element;
this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.ie)?"selectstart":"mousedown";if(Browser.ie&&!Drag.ondragstartFixed){document.ondragstart=Function.from(false);
Drag.ondragstartFixed=true;}this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:Function.from(false)};
this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return
this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start);
return this;},start:function(a){var
j=this.options;if(a.rightClick){return;}if(j.preventDefault){a.preventDefault();}if(j.stopPropagation){a.stopPropagation();
}this.mouse.start=a.page;this.fireEvent("beforeStart",this.element);var
c=j.limit;this.limit={x:[],y:[]};var e,g;for(e in
j.modifiers){if(!j.modifiers[e]){continue;
}var
b=this.element.getStyle(j.modifiers[e]);if(b&&!b.match(/px$/)){if(!g){g=this.element.getCoordinates(this.element.getOffsetParent());}b=g[j.modifiers[e]];
}if(j.style){this.value.now[e]=(b||0).toInt();}else{this.value.now[e]=this.element[j.modifiers[e]];}if(j.invert){this.value.now[e]*=-1;}this.mouse.pos[e]=a.page[e]-this.value.now[e];
if(c&&c[e]){var d=2;while(d--){var
f=c[e][d];if(f||f===0){this.limit[e][d]=(typeof
f=="function")?f():f;}}}}if(typeOf(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid};
}var
h={mousemove:this.bound.check,mouseup:this.bound.cancel};h[this.selection]=this.bound.eventStop;this.document.addEvents(h);},check:function(a){if(this.options.preventDefault){a.preventDefault();
}var
b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});
this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);}},drag:function(b){var
a=this.options;if(a.preventDefault){b.preventDefault();
}this.mouse.now=b.page;for(var c in
a.modifiers){if(!a.modifiers[c]){continue;}this.value.now[c]=this.mouse.now[c]-this.mouse.pos[c];if(a.invert){this.value.now[c]*=-1;
}if(a.limit&&this.limit[c]){if((this.limit[c][1]||this.limit[c][1]===0)&&(this.value.now[c]>this.limit[c][1])){this.value.now[c]=this.limit[c][1];}else{if((this.limit[c][0]||this.limit[c][0]===0)&&(this.value.now[c]<this.limit[c][0])){this.value.now[c]=this.limit[c][0];
}}}if(a.grid[c]){this.value.now[c]-=((this.value.now[c]-(this.limit[c][0]||0))%a.grid[c]);}if(a.style){this.element.setStyle(a.modifiers[c],this.value.now[c]+a.unit);
}else{this.element[a.modifiers[c]]=this.value.now[c];}}this.fireEvent("drag",[this.element,b]);},cancel:function(a){this.document.removeEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});
if(a){this.document.removeEvent(this.selection,this.bound.eventStop);this.fireEvent("cancel",this.element);}},stop:function(b){var
a={mousemove:this.bound.drag,mouseup:this.bound.stop};
a[this.selection]=this.bound.eventStop;this.document.removeEvents(a);if(b){this.fireEvent("complete",[this.element,b]);}}});Element.implement({makeResizable:function(a){var
b=new
Drag(this,Object.merge({modifiers:{x:"width",y:"height"}},a));
this.store("resizer",b);return
b.addEvent("drag",function(){this.fireEvent("resize",b);}.bind(this));}});Drag.Move=new
Class({Extends:Drag,options:{droppables:[],container:false,precalculate:false,includeMargins:true,checkDroppables:true},initialize:function(b,a){this.parent(b,a);
b=this.element;this.droppables=$$(this.options.droppables);this.container=document.id(this.options.container);if(this.container&&typeOf(this.container)!="element"){this.container=document.id(this.container.getDocument().body);
}if(this.options.style){if(this.options.modifiers.x=="left"&&this.options.modifiers.y=="top"){var
c=b.getOffsetParent(),d=b.getStyles("left","top");if(c&&(d.left=="auto"||d.top=="auto")){b.setPosition(b.getPosition(c));
}}if(b.getStyle("position")=="static"){b.setStyle("position","absolute");}}this.addEvent("start",this.checkDroppables,true);this.overed=null;},start:function(a){if(this.container){this.options.limit=this.calculateLimit();
}if(this.options.precalculate){this.positions=this.droppables.map(function(b){return
b.getCoordinates();});}this.parent(a);},calculateLimit:function(){var
j=this.element,e=this.container,d=document.id(j.getOffsetParent())||document.body,h=e.getCoordinates(d),c={},b={},k={},g={},m={};
["top","right","bottom","left"].each(function(q){c[q]=j.getStyle("margin-"+q).toInt();b[q]=j.getStyle("border-"+q).toInt();k[q]=e.getStyle("margin-"+q).toInt();
g[q]=e.getStyle("border-"+q).toInt();m[q]=d.getStyle("padding-"+q).toInt();},this);var
f=j.offsetWidth+c.left+c.right,p=j.offsetHeight+c.top+c.bottom,i=0,l=0,o=h.right-g.right-f,a=h.bottom-g.bottom-p;
if(this.options.includeMargins){i+=c.left;l+=c.top;}else{o+=c.right;a+=c.bottom;}if(j.getStyle("position")=="relative"){var
n=j.getCoordinates(d);n.left-=j.getStyle("left").toInt();
n.top-=j.getStyle("top").toInt();i-=n.left;l-=n.top;if(e.getStyle("position")!="relative"){i+=g.left;l+=g.top;}o+=c.left-n.left;a+=c.top-n.top;if(e!=d){i+=k.left+m.left;
l+=((Browser.ie6||Browser.ie7)?0:k.top)+m.top;}}else{i-=c.left;l-=c.top;if(e!=d){i+=h.left+g.left;l+=h.top+g.top;}}return{x:[i,o],y:[l,a]};},getDroppableCoordinates:function(c){var
b=c.getCoordinates();
if(c.getStyle("position")=="fixed"){var
a=window.getScroll();b.left+=a.x;b.right+=a.x;b.top+=a.y;b.bottom+=a.y;}return
b;},checkDroppables:function(){var
a=this.droppables.filter(function(d,c){d=this.positions?this.positions[c]:this.getDroppableCoordinates(d);
var
b=this.mouse.now;return(b.x>d.left&&b.x<d.right&&b.y<d.bottom&&b.y>d.top);},this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed]);
}if(a){this.fireEvent("enter",[this.element,a]);}this.overed=a;}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables();
}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return
this.parent(a);}});Element.implement({makeDraggable:function(a){var b=new
Drag.Move(this,a);
this.store("dragger",b);return b;}});var Slider=new
Class({Implements:[Events,Options],Binds:["clickedElement","draggedKnob","scrolledElement"],options:{onTick:function(a){this.setKnobPosition(a);
},initialStep:0,snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(f,a,e){this.setOptions(e);e=this.options;this.element=document.id(f);
a=this.knob=document.id(a);this.previousChange=this.previousEnd=this.step=-1;var
b={},d={x:false,y:false};switch(e.mode){case"vertical":this.axis="y";this.property="top";
this.offset="offsetHeight";break;case"horizontal":this.axis="x";this.property="left";this.offset="offsetWidth";}this.setSliderDimensions();this.setRange(e.range);
if(a.getStyle("position")=="static"){a.setStyle("position","relative");}a.setStyle(this.property,-e.offset);d[this.axis]=this.property;b[this.axis]=[-e.offset,this.full-e.offset];
var
c={snap:0,limit:b,modifiers:d,onDrag:this.draggedKnob,onStart:this.draggedKnob,onBeforeStart:(function(){this.isDragging=true;}).bind(this),onCancel:function(){this.isDragging=false;
}.bind(this),onComplete:function(){this.isDragging=false;this.draggedKnob();this.end();}.bind(this)};if(e.snap){this.setSnap(c);}this.drag=new
Drag(a,c);
this.attach();if(e.initialStep!=null){this.set(e.initialStep);}},attach:function(){this.element.addEvent("mousedown",this.clickedElement);if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement);
}this.drag.attach();return
this;},detach:function(){this.element.removeEvent("mousedown",this.clickedElement).removeEvent("mousewheel",this.scrolledElement);
this.drag.detach();return
this;},autosize:function(){this.setSliderDimensions().setKnobPosition(this.toPosition(this.step));this.drag.options.limit[this.axis]=[-this.options.offset,this.full-this.options.offset];
if(this.options.snap){this.setSnap();}return
this;},setSnap:function(a){if(!a){a=this.drag.options;}a.grid=Math.ceil(this.stepWidth);a.limit[this.axis][1]=this.full;
return
this;},setKnobPosition:function(a){if(this.options.snap){a=this.toPosition(this.step);}this.knob.setStyle(this.property,a);return
this;},setSliderDimensions:function(){this.full=this.element.measure(function(){this.half=this.knob[this.offset]/2;
return
this.element[this.offset]-this.knob[this.offset]+(this.options.offset*2);}.bind(this));return
this;},set:function(a){if(!((this.range>0)^(a<this.min))){a=this.min;
}if(!((this.range>0)^(a>this.max))){a=this.max;}this.step=Math.round(a);return
this.checkStep().fireEvent("tick",this.toPosition(this.step)).end();},setRange:function(a,b){this.min=Array.pick([a[0],0]);
this.max=Array.pick([a[1],this.options.steps]);this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps;
this.stepWidth=this.stepSize*this.full/Math.abs(this.range);if(a){this.set(Array.pick([b,this.step]).floor(this.min).max(this.max));}return
this;},clickedElement:function(c){if(this.isDragging||c.target==this.knob){return;
}var
b=this.range<0?-1:1,a=c.page[this.axis]-this.element.getPosition()[this.axis]-this.half;a=a.limit(-this.options.offset,this.full-this.options.offset);
this.step=Math.round(this.min+b*this.toStep(a));this.checkStep().fireEvent("tick",a).end();},scrolledElement:function(a){var
b=(this.options.mode=="horizontal")?(a.wheel<0):(a.wheel>0);
this.set(this.step+(b?-1:1)*this.stepSize);a.stop();},draggedKnob:function(){var
b=this.range<0?-1:1,a=this.drag.value.now[this.axis];a=a.limit(-this.options.offset,this.full-this.options.offset);
this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();},checkStep:function(){var
a=this.step;if(this.previousChange!=a){this.previousChange=a;
this.fireEvent("change",a);}return this;},end:function(){var
a=this.step;if(this.previousEnd!==a){this.previousEnd=a;this.fireEvent("complete",a+"");}return
this;
},toStep:function(a){var
b=(a+this.options.offset)*this.stepSize/this.full*this.steps;return
this.options.steps?Math.round(b-=b%this.stepSize):b;},toPosition:function(a){return(this.full*Math.abs(this.min-a))/(this.steps*this.stepSize)-this.options.offset;
}});var Sortables=new
Class({Implements:[Events,Options],options:{opacity:1,clone:false,revert:false,handle:false,dragOptions:{}},initialize:function(a,b){this.setOptions(b);
this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new
Fx.Morph(null,Object.merge({duration:250,link:"cancel"},this.options.revert));
}},attach:function(){this.addLists(this.lists);return
this;},detach:function(){this.lists=this.removeLists(this.lists);return
this;},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a);
var
b=a.retrieve("sortables:start",function(c){this.start.call(this,c,a);}.bind(this));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b);
},this);return
this;},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.include(a);this.addItems(a.getChildren());},this);return
this;
},removeItems:function(){return
$$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var
b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b);
return a;},this));},removeLists:function(){return
$$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return
a;
},this));},getClone:function(b,a){if(!this.options.clone){return new
Element(a.tagName).inject(document.body);}if(typeOf(this.options.clone)=="function"){return
this.options.clone.call(this,b,a,this.list);
}var
c=a.clone(true).setStyles({margin:0,position:"absolute",visibility:"hidden",width:a.getStyle("width")}).addEvent("mousedown",function(d){a.fireEvent("mousedown",d);
});if(c.get("html").test("radio")){c.getElements("input[type=radio]").each(function(d,e){d.set("name","clone_"+e);if(d.get("checked")){a.getElements("input[type=radio]")[e].set("checked",true);
}});}return
c.inject(this.list).setPosition(a.getPosition(a.getOffsetParent()));},getDroppables:function(){var
a=this.list.getChildren().erase(this.clone).erase(this.element);
if(!this.options.constrain){a.append(this.lists).erase(this.list);}return
a;},insert:function(c,b){var
a="inside";if(this.lists.contains(b)){this.list=b;
this.drag.droppables=this.getDroppables();}else{a=this.element.getAllPrevious().contains(b)?"before":"after";}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone]);
},start:function(b,a){if(!this.idle||b.rightClick||["button","input","a","textarea"].contains(b.target.get("tag"))){return;}this.idle=false;this.element=a;
this.opacity=a.getStyle("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new
Drag.Move(this.clone,Object.merge({droppables:this.getDroppables()},this.options.dragOptions)).addEvents({onSnap:function(){b.stop();
this.clone.setStyle("visibility","visible");this.element.setStyle("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]);
}.bind(this),onEnter:this.insert.bind(this),onCancel:this.end.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b);
},end:function(){this.drag.detach();this.element.setStyle("opacity",this.opacity);if(this.effect){var
b=this.element.getStyles("width","height"),d=this.clone,c=d.computePosition(this.element.getPosition(this.clone.getOffsetParent()));
var
a=function(){this.removeEvent("cancel",a);d.destroy();};this.effect.element=d;this.effect.start({top:c.top,left:c.left,width:b.width,height:b.height,opacity:0.25}).addEvent("cancel",a).chain(a);
}else{this.clone.destroy();}this.reset();},reset:function(){this.idle=true;this.fireEvent("complete",this.element);},serialize:function(){var
c=Array.link(arguments,{modifier:Type.isFunction,index:function(d){return
d!=null;
}});var b=this.lists.map(function(d){return
d.getChildren().map(c.modifier||function(e){return
e.get("id");},this);},this);var
a=c.index;if(this.lists.length==1){a=0;
}return(a||a===0)&&a>=0&&a<this.lists.length?b[a]:b;}});Request.JSONP=new
Class({Implements:[Chain,Events,Options],options:{onRequest:function(a){if(this.options.log&&window.console&&console.log){console.log("JSONP
retrieving script with url:"+a);
}},onError:function(a){if(this.options.log&&window.console&&console.warn){console.warn("JSONP
"+a+" will fail in Internet Explorer, which enforces a 2083 bytes
length limit on URIs");
}},url:"",callbackKey:"callback",injectScript:document.head,data:"",link:"ignore",timeout:0,log:false},initialize:function(a){this.setOptions(a);},send:function(c){if(!Request.prototype.check.call(this,c)){return
this;
}this.running=true;var
d=typeOf(c);if(d=="string"||d=="element"){c={data:c};}c=Object.merge(this.options,c||{});var
e=c.data;switch(typeOf(e)){case"element":e=document.id(e).toQueryString();
break;case"object":case"hash":e=Object.toQueryString(e);}var
b=this.index=Request.JSONP.counter++;var
f=c.url+(c.url.test("\\?")?"&":"?")+(c.callbackKey)+"=Request.JSONP.request_map.request_"+b+(e?"&"+e:"");
if(f.length>2083){this.fireEvent("error",f);}Request.JSONP.request_map["request_"+b]=function(){this.success(arguments,b);}.bind(this);var
a=this.getScript(f).inject(c.injectScript);
this.fireEvent("request",[f,a]);if(c.timeout){this.timeout.delay(c.timeout,this);}return
this;},getScript:function(a){if(!this.script){this.script=new
Element("script",{type:"text/javascript",async:true,src:a});
}return
this.script;},success:function(b,a){if(!this.running){return;}this.clear().fireEvent("complete",b).fireEvent("success",b).callChain();},cancel:function(){if(this.running){this.clear().fireEvent("cancel");
}return this;},isRunning:function(){return
!!this.running;},clear:function(){this.running=false;if(this.script){this.script.destroy();this.script=null;
}return
this;},timeout:function(){if(this.running){this.running=false;this.fireEvent("timeout",[this.script.get("src"),this.script]).fireEvent("failure").cancel();
}return
this;}});Request.JSONP.counter=0;Request.JSONP.request_map={};Request.Queue=new
Class({Implements:[Options,Events],Binds:["attach","request","complete","cancel","success","failure","exception"],options:{stopOnFailure:true,autoAdvance:true,concurrent:1,requests:{}},initialize:function(a){var
b;
if(a){b=a.requests;delete
a.requests;}this.setOptions(a);this.requests={};this.queue=[];this.reqBinders={};if(b){this.addRequests(b);}},addRequest:function(a,b){this.requests[a]=b;
this.attach(a,b);return
this;},addRequests:function(a){Object.each(a,function(c,b){this.addRequest(b,c);},this);return
this;},getName:function(a){return Object.keyOf(this.requests,a);
},attach:function(a,b){if(b._groupSend){return
this;}["request","complete","cancel","success","failure","exception"].each(function(c){if(!this.reqBinders[a]){this.reqBinders[a]={};
}this.reqBinders[a][c]=function(){this["on"+c.capitalize()].apply(this,[a,b].append(arguments));}.bind(this);b.addEvent(c,this.reqBinders[a][c]);},this);
b._groupSend=b.send;b.send=function(c){this.send(a,c);return
b;}.bind(this);return this;},removeRequest:function(b){var
a=typeOf(b)=="object"?this.getName(b):b;
if(!a&&typeOf(a)!="string"){return
this;}b=this.requests[a];if(!b){return
this;}["request","complete","cancel","success","failure","exception"].each(function(c){b.removeEvent(c,this.reqBinders[a][c]);
},this);b.send=b._groupSend;delete b._groupSend;return
this;},getRunning:function(){return
Object.filter(this.requests,function(a){return a.running;});
},isRunning:function(){return
!!(Object.keys(this.getRunning()).length);},send:function(b,a){var
c=function(){this.requests[b]._groupSend(a);this.queue.erase(c);
}.bind(this);c.name=b;if(Object.keys(this.getRunning()).length>=this.options.concurrent||(this.error&&this.options.stopOnFailure)){this.queue.push(c);}else{c();
}return
this;},hasNext:function(a){return(!a)?!!this.queue.length:!!this.queue.filter(function(b){return
b.name==a;}).length;},resume:function(){this.error=false;
(this.options.concurrent-Object.keys(this.getRunning()).length).times(this.runNext,this);return
this;},runNext:function(a){if(!this.queue.length){return this;
}if(!a){this.queue[0]();}else{var
b;this.queue.each(function(c){if(!b&&c.name==a){b=true;c();}});}return
this;},runAll:function(){this.queue.each(function(a){a();
});return
this;},clear:function(a){if(!a){this.queue.empty();}else{this.queue=this.queue.map(function(b){if(b.name!=a){return
b;}else{return false;}}).filter(function(b){return b;
});}return this;},cancel:function(a){this.requests[a].cancel();return
this;},onRequest:function(){this.fireEvent("request",arguments);},onComplete:function(){this.fireEvent("complete",arguments);
if(!this.queue.length){this.fireEvent("end");}},onCancel:function(){if(this.options.autoAdvance&&!this.error){this.runNext();}this.fireEvent("cancel",arguments);
},onSuccess:function(){if(this.options.autoAdvance&&!this.error){this.runNext();}this.fireEvent("success",arguments);},onFailure:function(){this.error=true;
if(!this.options.stopOnFailure&&this.options.autoAdvance){this.runNext();}this.fireEvent("failure",arguments);},onException:function(){this.error=true;
if(!this.options.stopOnFailure&&this.options.autoAdvance){this.runNext();}this.fireEvent("exception",arguments);}});Request.implement({options:{initialDelay:5000,delay:5000,limit:60000},startTimer:function(b){var
a=function(){if(!this.running){this.send({data:b});
}};this.lastDelay=this.options.initialDelay;this.timer=a.delay(this.lastDelay,this);this.completeCheck=function(c){clearTimeout(this.timer);this.lastDelay=(c)?this.options.delay:(this.lastDelay+this.options.delay).min(this.options.limit);
this.timer=a.delay(this.lastDelay,this);};return
this.addEvent("complete",this.completeCheck);},stopTimer:function(){clearTimeout(this.timer);return
this.removeEvent("complete",this.completeCheck);
}});var Asset={javascript:function(d,b){if(!b){b={};}var a=new
Element("script",{src:d,type:"text/javascript"}),e=b.document||document,c=b.onload||b.onLoad;
delete b.onload;delete b.onLoad;delete b.document;if(c){if(typeof
a.onreadystatechange!="undefined"){a.addEvent("readystatechange",function(){if(["loaded","complete"].contains(this.readyState)){c.call(this);
}});}else{a.addEvent("load",c);}}return
a.set(b).inject(e.head);},css:function(d,a){if(!a){a={};}var b=new
Element("link",{rel:"stylesheet",media:"screen",type:"text/css",href:d});
var c=a.onload||a.onLoad,e=a.document||document;delete a.onload;delete
a.onLoad;delete a.document;if(c){b.addEvent("load",c);}return
b.set(a).inject(e.head);
},image:function(c,b){if(!b){b={};}var d=new Image(),a=document.id(d)||new
Element("img");["load","abort","error"].each(function(e){var
g="on"+e,f="on"+e.capitalize(),h=b[g]||b[f]||function(){};
delete b[f];delete
b[g];d[g]=function(){if(!d){return;}if(!a.parentNode){a.width=d.width;a.height=d.height;}d=d.onload=d.onabort=d.onerror=null;h.delay(1,a,a);
a.fireEvent(e,a,1);};});d.src=a.src=c;if(d&&d.complete){d.onload.delay(1);}return
a.set(b);},images:function(c,b){c=Array.from(c);var d=function(){},a=0;
b=Object.merge({onComplete:d,onProgress:d,onError:d,properties:{}},b);return
new Elements(c.map(function(f,e){return
Asset.image(f,Object.append(b.properties,{onload:function(){a++;
b.onProgress.call(this,a,e,f);if(a==c.length){b.onComplete();}},onerror:function(){a++;b.onError.call(this,a,e,f);if(a==c.length){b.onComplete();}}}));
}));}};(function(){var a=this.Color=new
Type("Color",function(c,d){if(arguments.length>=3){d="rgb";c=Array.slice(arguments,0,3);}else{if(typeof
c=="string"){if(c.match(/rgb/)){c=c.rgbToHex().hexToRgb(true);
}else{if(c.match(/hsb/)){c=c.hsbToRgb();}else{c=c.hexToRgb(true);}}}}d=d||"rgb";switch(d){case"hsb":var
b=c;c=c.hsbToRgb();c.hsb=b;break;case"hex":c=c.hexToRgb(true);
break;}c.rgb=c.slice(0,3);c.hsb=c.hsb||c.rgbToHsb();c.hex=c.rgbToHex();return
Object.append(c,this);});a.implement({mix:function(){var
b=Array.slice(arguments);
var d=(typeOf(b.getLast())=="number")?b.pop():50;var
c=this.slice();b.each(function(e){e=new a(e);for(var
f=0;f<3;f++){c[f]=Math.round((c[f]/100*(100-d))+(e[f]/100*d));
}});return new a(c,"rgb");},invert:function(){return new
a(this.map(function(b){return 255-b;}));},setHue:function(b){return new
a([b,this.hsb[1],this.hsb[2]],"hsb");
},setSaturation:function(b){return new
a([this.hsb[0],b,this.hsb[2]],"hsb");},setBrightness:function(b){return
new a([this.hsb[0],this.hsb[1],b],"hsb");
}});this.$RGB=function(e,d,c){return new
a([e,d,c],"rgb");};this.$HSB=function(e,d,c){return new
a([e,d,c],"hsb");};this.$HEX=function(b){return new
a(b,"hex");
};Array.implement({rgbToHsb:function(){var
c=this[0],d=this[1],k=this[2],h=0;var
j=Math.max(c,d,k),f=Math.min(c,d,k);var l=j-f;var i=j/255,g=(j!=0)?l/j:0;
if(g!=0){var e=(j-c)/l;var b=(j-d)/l;var
m=(j-k)/l;if(c==j){h=m-b;}else{if(d==j){h=2+e-m;}else{h=4+b-e;}}h/=6;if(h<0){h++;}}return[Math.round(h*360),Math.round(g*100),Math.round(i*100)];
},hsbToRgb:function(){var
d=Math.round(this[2]/100*255);if(this[1]==0){return[d,d,d];}else{var
b=this[0]%360;var g=b%60;var
h=Math.round((this[2]*(100-this[1]))/10000*255);
var e=Math.round((this[2]*(6000-this[1]*g))/600000*255);var
c=Math.round((this[2]*(6000-this[1]*(60-g)))/600000*255);switch(Math.floor(b/60)){case
0:return[d,c,h];
case 1:return[e,d,h];case 2:return[h,d,c];case 3:return[h,e,d];case
4:return[c,h,d];case 5:return[d,h,e];}}return
false;}});String.implement({rgbToHsb:function(){var
b=this.match(/\d{1,3}/g);
return(b)?b.rgbToHsb():null;},hsbToRgb:function(){var
b=this.match(/\d{1,3}/g);return(b)?b.hsbToRgb():null;}});})();(function(){this.Group=new
Class({initialize:function(){this.instances=Array.flatten(arguments);
},addEvent:function(e,d){var g=this.instances,a=g.length,f=a,c=new
Array(a),b=this;g.each(function(h,j){h.addEvent(e,function(){if(!c[j]){f--;}c[j]=arguments;
if(!f){d.call(b,g,h,c);f=a;c=new Array(a);}});});}});})();Hash.Cookie=new
Class({Extends:Cookie,options:{autoSave:true},initialize:function(b,a){this.parent(b,a);
this.load();},save:function(){var
a=JSON.encode(this.hash);if(!a||a.length>4096){return
false;}if(a=="{}"){this.dispose();}else{this.write(a);}return
true;
},load:function(){this.hash=new Hash(JSON.decode(this.read(),true));return
this;}});Hash.each(Hash.prototype,function(b,a){if(typeof
b=="function"){Hash.Cookie.implement(a,function(){var
c=b.apply(this.hash,arguments);
if(this.options.autoSave){this.save();}return c;});}});(function(){var
a=this.Table=function(){this.length=0;var
c=[],b=[];this.set=function(e,g){var d=c.indexOf(e);
if(d==-1){var f=c.length;c[f]=e;b[f]=g;this.length++;}else{b[d]=g;}return
this;};this.get=function(e){var
d=c.indexOf(e);return(d==-1)?null:b[d];};this.erase=function(e){var
d=c.indexOf(e);
if(d!=-1){this.length--;c.splice(d,1);return b.splice(d,1)[0];}return
null;};this.each=this.forEach=function(f,g){for(var
e=0,d=this.length;e<d;e++){f.call(g,c[e],b[e],this);
}};};if(this.Type){new Type("Table",a);}})();var HtmlTable=new
Class({Implements:[Options,Events,Class.Occlude],options:{properties:{cellpadding:0,cellspacing:0,border:0},rows:[],headers:[],footers:[]},property:"HtmlTable",initialize:function(){var
a=Array.link(arguments,{options:Type.isObject,table:Type.isElement,id:Type.isString});
this.setOptions(a.options);if(!a.table&&a.id){a.table=document.id(a.id);}this.element=a.table||new
Element("table",this.options.properties);if(this.occlude()){return
this.occluded;
}this.build();},build:function(){this.element.store("HtmlTable",this);this.body=document.id(this.element.tBodies[0])||new
Element("tbody").inject(this.element);
$$(this.body.rows);if(this.options.headers.length){this.setHeaders(this.options.headers);}else{this.thead=document.id(this.element.tHead);}if(this.thead){this.head=this.getHead();
}if(this.options.footers.length){this.setFooters(this.options.footers);}this.tfoot=document.id(this.element.tFoot);if(this.tfoot){this.foot=document.id(this.tfoot.rows[0]);
}this.options.rows.each(function(a){this.push(a);},this);},toElement:function(){return
this.element;},empty:function(){this.body.empty();return
this;},set:function(e,a){var
d=(e=="headers")?"tHead":"tFoot",b=d.toLowerCase();
this[b]=(document.id(this.element[d])||new
Element(b).inject(this.element,"top")).empty();var
c=this.push(a,{},this[b],e=="headers"?"th":"td");if(e=="headers"){this.head=this.getHead();
}else{this.foot=this.getHead();}return c;},getHead:function(){var
a=this.thead.rows;return
a.length>1?$$(a):a.length?document.id(a[0]):false;},setHeaders:function(a){this.set("headers",a);
return this;},setFooters:function(a){this.set("footers",a);return
this;},update:function(d,e,a){var
b=d.getChildren(a||"td"),c=b.length-1;e.each(function(i,f){var
j=b[f]||new
Element(a||"td").inject(d),h=(i?i.content:"")||i,g=typeOf(h);
if(i&&i.properties){j.set(i.properties);}if(/(element(s?)|array|collection)/.test(g)){j.empty().adopt(h);}else{j.set("html",h);}if(f>c){b.push(j);}else{b[f]=j;
}});return{tr:d,tds:b};},push:function(e,c,d,a,b){if(typeOf(e)=="element"&&e.get("tag")=="tr"){e.inject(d||this.body,b);return{tr:e,tds:e.getChildren("td")};
}return this.update(new
Element("tr",c).inject(d||this.body,b),e,a);},pushMany:function(d,c,e,a,b){return
d.map(function(f){return this.push(f,c,e,a,b);
},this);}});["adopt","inject","wraps","grab","replaces","dispose"].each(function(a){HtmlTable.implement(a,function(){this.element[a].apply(this.element,arguments);
return
this;});});HtmlTable=Class.refactor(HtmlTable,{options:{classZebra:"table-tr-odd",zebra:true,zebraOnlyVisibleRows:true},initialize:function(){this.previous.apply(this,arguments);
if(this.occluded){return
this.occluded;}if(this.options.zebra){this.updateZebras();}},updateZebras:function(){var
a=0;Array.each(this.body.rows,function(b){if(!this.options.zebraOnlyVisibleRows||b.isDisplayed()){this.zebra(b,a++);
}},this);},setRowStyle:function(b,a){if(this.previous){this.previous(b,a);}this.zebra(b,a);},zebra:function(b,a){return
b[((a%2)?"remove":"add")+"Class"](this.options.classZebra);
},push:function(){var
a=this.previous.apply(this,arguments);if(this.options.zebra){this.updateZebras();}return
a;}});HtmlTable=Class.refactor(HtmlTable,{options:{sortIndex:0,sortReverse:false,parsers:[],defaultParser:"string",classSortable:"table-sortable",classHeadSort:"table-th-sort",classHeadSortRev:"table-th-sort-rev",classNoSort:"table-th-nosort",classGroupHead:"table-tr-group-head",classGroup:"table-tr-group",classCellSort:"table-td-sort",classSortSpan:"table-th-sort-span",sortable:false,thSelector:"th"},initialize:function(){this.previous.apply(this,arguments);
if(this.occluded){return
this.occluded;}this.sorted={index:null,dir:1};if(!this.bound){this.bound={};}this.bound.headClick=this.headClick.bind(this);this.sortSpans=new
Elements();
if(this.options.sortable){this.enableSort();if(this.options.sortIndex!=null){this.sort(this.options.sortIndex,this.options.sortReverse);}}},attachSorts:function(a){this.detachSorts();
if(a!==false){this.element.addEvent("click:relay("+this.options.thSelector+")",this.bound.headClick);}},detachSorts:function(){this.element.removeEvents("click:relay("+this.options.thSelector+")");
},setHeaders:function(){this.previous.apply(this,arguments);if(this.sortEnabled){this.setParsers();}},setParsers:function(){this.parsers=this.detectParsers();
},detectParsers:function(){return
this.head&&this.head.getElements(this.options.thSelector).flatten().map(this.detectParser,this);},detectParser:function(a,b){if(a.hasClass(this.options.classNoSort)||a.retrieve("htmltable-parser")){return
a.retrieve("htmltable-parser");
}var c=new Element("div");c.adopt(a.childNodes).inject(a);var
f=new
Element("span",{"class":this.options.classSortSpan}).inject(c,"top");this.sortSpans.push(f);
var
g=this.options.parsers[b],e=this.body.rows,d;switch(typeOf(g)){case"function":g={convert:g};d=true;break;case"string":g=g;d=true;break;}if(!d){HtmlTable.ParserPriority.some(function(k){var
o=HtmlTable.Parsers[k],m=o.match;
if(!m){return false;}for(var n=0,l=e.length;n<l;n++){var
h=document.id(e[n].cells[b]),p=h?h.get("html").clean():"";if(p&&m.test(p)){g=o;return
true;}}});
}if(!g){g=this.options.defaultParser;}a.store("htmltable-parser",g);return
g;},headClick:function(b,a){if(!this.head||a.hasClass(this.options.classNoSort)){return;
}return
this.sort(Array.indexOf(this.head.getElements(this.options.thSelector).flatten(),a)%this.body.rows[0].cells.length);},serialize:function(){var
a=this.previous.apply(this,arguments)||{};
if(this.options.sortable){a.sortIndex=this.sorted.index;a.sortReverse=this.sorted.reverse;}return
a;},restore:function(a){if(this.options.sortable&&a.sortIndex){this.sort(a.sortIndex,a.sortReverse);
}this.previous.apply(this,arguments);},setSortedState:function(b,a){if(a!=null){this.sorted.reverse=a;}else{if(this.sorted.index==b){this.sorted.reverse=!this.sorted.reverse;
}else{this.sorted.reverse=this.sorted.index==null;}}if(b!=null){this.sorted.index=b;}},setHeadSort:function(a){var
b=$$(!this.head.length?this.head.cells[this.sorted.index]:this.head.map(function(c){return
c.getElements(this.options.thSelector)[this.sorted.index];
},this).clean());if(!b.length){return;}if(a){b.addClass(this.options.classHeadSort);if(this.sorted.reverse){b.addClass(this.options.classHeadSortRev);}else{b.removeClass(this.options.classHeadSortRev);
}}else{b.removeClass(this.options.classHeadSort).removeClass(this.options.classHeadSortRev);}},setRowSort:function(b,a){var
e=b.length,d=this.body,g,f;
while(e){var
h=b[--e],c=h.position,i=d.rows[c];if(i.disabled){continue;}if(!a){g=this.setGroupSort(g,i,h);this.setRowStyle(i,e);}d.appendChild(i);for(f=0;
f<e;f++){if(b[f].position>c){b[f].position--;}}}},setRowStyle:function(b,a){this.previous(b,a);b.cells[this.sorted.index].addClass(this.options.classCellSort);
},setGroupSort:function(b,c,a){if(b==a.value){c.removeClass(this.options.classGroupHead).addClass(this.options.classGroup);}else{c.removeClass(this.options.classGroup).addClass(this.options.classGroupHead);
}return a.value;},getParser:function(){var
a=this.parsers[this.sorted.index];return
typeOf(a)=="string"?HtmlTable.Parsers[a]:a;},sort:function(c,b,e){if(!this.head){return;
}if(!e){this.clearSort();this.setSortedState(c,b);this.setHeadSort(true);}var
f=this.getParser();if(!f){return;}var
a;if(!Browser.ie){a=this.body.getParent();
this.body.dispose();}var
d=this.parseData(f).sort(function(h,g){if(h.value===g.value){return
0;}return
h.value>g.value?1:-1;});if(this.sorted.reverse==(f==HtmlTable.Parsers["input-checked"])){d.reverse(true);
}this.setRowSort(d,e);if(a){a.grab(this.body);}this.fireEvent("stateChanged");return
this.fireEvent("sort",[this.body,this.sorted.index]);},parseData:function(a){return
Array.map(this.body.rows,function(d,b){var
c=a.convert.call(document.id(d.cells[this.sorted.index]));
return{position:b,value:c};},this);},clearSort:function(){this.setHeadSort(false);this.body.getElements("td").removeClass(this.options.classCellSort);},reSort:function(){if(this.sortEnabled){this.sort.call(this,this.sorted.index,this.sorted.reverse);
}return
this;},enableSort:function(){this.element.addClass(this.options.classSortable);this.attachSorts(true);this.setParsers();this.sortEnabled=true;return
this;
},disableSort:function(){this.element.removeClass(this.options.classSortable);this.attachSorts(false);this.sortSpans.each(function(a){a.destroy();});this.sortSpans.empty();
this.sortEnabled=false;return
this;}});HtmlTable.ParserPriority=["date","input-checked","input-value","float","number"];HtmlTable.Parsers={date:{match:/^\d{2}[-\/
]\d{2}[-\/ ]\d{2,4}$/,convert:function(){var
a=Date.parse(this.get("text").stripTags());
return(typeOf(a)=="date")?a.format("db"):"";},type:"date"},"input-checked":{match:/
type="(radio|checkbox)" /,convert:function(){return
this.getElement("input").checked;
}},"input-value":{match:/<input/,convert:function(){return
this.getElement("input").value;}},number:{match:/^\d+[^\d.,]*$/,convert:function(){return
this.get("text").stripTags().toInt();
},number:true},numberLax:{match:/^[^\d]+\d+$/,convert:function(){return
this.get("text").replace(/[^-?^0-9]/,"").stripTags().toInt();},number:true},"float":{match:/^[\d]+\.[\d]+/,convert:function(){return
this.get("text").replace(/[^-?^\d.]/,"").stripTags().toFloat();
},number:true},floatLax:{match:/^[^\d]+[\d]+\.[\d]+$/,convert:function(){return
this.get("text").replace(/[^-?^\d.]/,"").stripTags();},number:true},string:{match:null,convert:function(){return
this.get("text").stripTags().toLowerCase();
}},title:{match:null,convert:function(){return
this.title;}}};HtmlTable.defineParsers=function(a){HtmlTable.Parsers=Object.append(HtmlTable.Parsers,a);
for(var b in a){HtmlTable.ParserPriority.unshift(b);}};(function(){var
a=this.Keyboard=new
Class({Extends:Events,Implements:[Options],options:{defaultEventType:"keydown",active:false,manager:null,events:{},nonParsedEvents:["activate","deactivate","onactivate","ondeactivate","changed","onchanged"]},initialize:function(f){if(f&&f.manager){this._manager=f.manager;
delete
f.manager;}this.setOptions(f);this._setup();},addEvent:function(h,g,f){return
this.parent(a.parse(h,this.options.defaultEventType,this.options.nonParsedEvents),g,f);
},removeEvent:function(g,f){return
this.parent(a.parse(g,this.options.defaultEventType,this.options.nonParsedEvents),f);},toggleActive:function(){return
this[this.isActive()?"deactivate":"activate"]();
},activate:function(f){if(f){if(f.isActive()){return
this;}if(this._activeKB&&f!=this._activeKB){this.previous=this._activeKB;this.previous.fireEvent("deactivate");
}this._activeKB=f.fireEvent("activate");a.manager.fireEvent("changed");}else{if(this._manager){this._manager.activate(this);}}return
this;},isActive:function(){return
this._manager?(this._manager._activeKB==this):(a.manager==this);
},deactivate:function(f){if(f){if(f===this._activeKB){this._activeKB=null;f.fireEvent("deactivate");a.manager.fireEvent("changed");}}else{if(this._manager){this._manager.deactivate(this);
}}return
this;},relinquish:function(){if(this.isActive()&&this._manager&&this._manager.previous){this._manager.activate(this._manager.previous);}else{this.deactivate();
}return
this;},manage:function(f){if(f._manager){f._manager.drop(f);}this._instances.push(f);f._manager=this;if(!this._activeKB){this.activate(f);}return
this;
},drop:function(f){f.relinquish();this._instances.erase(f);if(this._activeKB==f){if(this.previous&&this._instances.contains(this.previous)){this.activate(this.previous);
}else{this._activeKB=this._instances[0];}}return
this;},trace:function(){a.trace(this);},each:function(f){a.each(this,f);},_instances:[],_disable:function(f){if(this._activeKB==f){this._activeKB=null;
}},_setup:function(){this.addEvents(this.options.events);if(a.manager&&!this._manager){a.manager.manage(this);}if(this.options.active){this.activate();
}else{this.relinquish();}},_handle:function(h,g){if(h.preventKeyboardPropagation){return;}var
f=!!this._manager;if(f&&this._activeKB){this._activeKB._handle(h,g);
if(h.preventKeyboardPropagation){return;}}this.fireEvent(g,h);if(!f&&this._activeKB){this._activeKB._handle(h,g);}}});var
b={};var
c=["shift","control","alt","meta"];
var
e=/^(?:shift|control|ctrl|alt|meta)$/;a.parse=function(h,g,k){if(k&&k.contains(h.toLowerCase())){return
h;}h=h.toLowerCase().replace(/^(keyup|keydown):/,function(m,l){g=l;
return"";});if(!b[h]){var
f,j={};h.split("+").each(function(l){if(e.test(l)){j[l]=true;}else{f=l;}});j.control=j.control||j.ctrl;var
i=[];c.each(function(l){if(j[l]){i.push(l);
}});if(f){i.push(f);}b[h]=i.join("+");}return
g+":keys("+b[h]+")";};a.each=function(f,g){var
h=f||a.manager;while(h){g.run(h);h=h._activeKB;}};a.stop=function(f){f.preventKeyboardPropagation=true;
};a.manager=new a({active:true});a.trace=function(f){f=f||a.manager;var
g=window.console&&console.log;if(g){console.log("the following
items have focus: ");
}a.each(f,function(h){if(g){console.log(document.id(h.widget)||h.wiget||h);}});};var
d=function(g){var
f=[];c.each(function(h){if(g[h]){f.push(h);}});if(!e.test(g.key)){f.push(g.key);
}a.manager._handle(g,g.type+":keys("+f.join("+")+")");};document.addEvents({keyup:d,keydown:d});})();Keyboard.prototype.options.nonParsedEvents.combine(["rebound","onrebound"]);
Keyboard.implement({addShortcut:function(b,a){this._shortcuts=this._shortcuts||[];this._shortcutIndex=this._shortcutIndex||{};a.getKeyboard=Function.from(this);
a.name=b;this._shortcutIndex[b]=a;this._shortcuts.push(a);if(a.keys){this.addEvent(a.keys,a.handler);}return
this;},addShortcuts:function(b){for(var a in b){this.addShortcut(a,b[a]);
}return this;},removeShortcut:function(b){var
a=this.getShortcut(b);if(a&&a.keys){this.removeEvent(a.keys,a.handler);delete
this._shortcutIndex[b];this._shortcuts.erase(a);
}return
this;},removeShortcuts:function(a){a.each(this.removeShortcut,this);return
this;},getShortcuts:function(){return
this._shortcuts||[];},getShortcut:function(a){return(this._shortcutIndex||{})[a];
}});Keyboard.rebind=function(b,a){Array.from(a).each(function(c){c.getKeyboard().removeEvent(c.keys,c.handler);c.getKeyboard().addEvent(b,c.handler);c.keys=b;
c.getKeyboard().fireEvent("rebound");});};Keyboard.getActiveShortcuts=function(b){var
a=[],c=[];Keyboard.each(b,[].push.bind(a));a.each(function(d){c.extend(d.getShortcuts());
});return c;};Keyboard.getShortcut=function(c,b,d){d=d||{};var
a=d.many?[]:null,e=d.many?function(g){var
f=g.getShortcut(c);if(f){a.push(f);}}:function(f){if(!a){a=f.getShortcut(c);
}};Keyboard.each(b,e);return a;};Keyboard.getShortcuts=function(b,a){return
Keyboard.getShortcut(b,a,{many:true});};HtmlTable=Class.refactor(HtmlTable,{options:{useKeyboard:true,classRowSelected:"table-tr-selected",classRowHovered:"table-tr-hovered",classSelectable:"table-selectable",shiftForMultiSelect:true,allowMultiSelect:true,selectable:false,selectHiddenRows:false},initialize:function(){this.previous.apply(this,arguments);
if(this.occluded){return this.occluded;}this.selectedRows=new
Elements();if(!this.bound){this.bound={};}this.bound.mouseleave=this.mouseleave.bind(this);
this.bound.clickRow=this.clickRow.bind(this);this.bound.activateKeyboard=function(){if(this.keyboard&&this.selectEnabled){this.keyboard.activate();}}.bind(this);
if(this.options.selectable){this.enableSelect();}},empty:function(){this.selectNone();return
this.previous();},enableSelect:function(){this.selectEnabled=true;
this.attachSelects();this.element.addClass(this.options.classSelectable);return
this;},disableSelect:function(){this.selectEnabled=false;this.attachSelects(false);
this.element.removeClass(this.options.classSelectable);return
this;},push:function(){var
a=this.previous.apply(this,arguments);this.updateSelects();return a;
},toggleRow:function(a){return
this[(this.isSelected(a)?"de":"")+"selectRow"](a);},selectRow:function(b,a){if(this.isSelected(b)||(!a&&!this.body.getChildren().contains(b))){return;
}if(!this.options.allowMultiSelect){this.selectNone();}if(!this.isSelected(b)){this.selectedRows.push(b);b.addClass(this.options.classRowSelected);this.fireEvent("rowFocus",[b,this.selectedRows]);
this.fireEvent("stateChanged");}this.focused=b;document.clearSelection();return
this;},isSelected:function(a){return
this.selectedRows.contains(a);},getSelected:function(){return
this.selectedRows;
},getSelected:function(){return
this.selectedRows;},serialize:function(){var
a=this.previous.apply(this,arguments)||{};if(this.options.selectable){a.selectedRows=this.selectedRows.map(function(b){return
Array.indexOf(this.body.rows,b);
}.bind(this));}return
a;},restore:function(a){if(this.options.selectable&&a.selectedRows){a.selectedRows.each(function(b){this.selectRow(this.body.rows[b]);
}.bind(this));}this.previous.apply(this,arguments);},deselectRow:function(b,a){if(!this.isSelected(b)||(!a&&!this.body.getChildren().contains(b))){return;
}this.selectedRows=new
Elements(Array.from(this.selectedRows).erase(b));b.removeClass(this.options.classRowSelected);this.fireEvent("rowUnfocus",[b,this.selectedRows]);
this.fireEvent("stateChanged");return
this;},selectAll:function(a){if(!a&&!this.options.allowMultiSelect){return;}this.selectRange(0,this.body.rows.length,a);
return this;},selectNone:function(){return
this.selectAll(true);},selectRange:function(b,a,f){if(!this.options.allowMultiSelect&&!f){return;}var
g=f?"deselectRow":"selectRow",e=Array.clone(this.body.rows);
if(typeOf(b)=="element"){b=e.indexOf(b);}if(typeOf(a)=="element"){a=e.indexOf(a);}a=a<e.length-1?a:e.length-1;if(a<b){var
d=b;b=a;a=d;}for(var c=b;c<=a;
c++){if(this.options.selectHiddenRows||e[c].isDisplayed()){this[g](e[c],true);}}return
this;},deselectRange:function(b,a){this.selectRange(b,a,true);},getSelected:function(){return
this.selectedRows;
},enterRow:function(a){if(this.hovered){this.hovered=this.leaveRow(this.hovered);}this.hovered=a.addClass(this.options.classRowHovered);},leaveRow:function(a){a.removeClass(this.options.classRowHovered);
},updateSelects:function(){Array.each(this.body.rows,function(a){var
b=a.retrieve("binders");if(!b&&!this.selectEnabled){return;}if(!b){b={mouseenter:this.enterRow.pass([a],this),mouseleave:this.leaveRow.pass([a],this)};
a.store("binders",b);}if(this.selectEnabled){a.addEvents(b);}else{a.removeEvents(b);}},this);},shiftFocus:function(b,a){if(!this.focused){return
this.selectRow(this.body.rows[0],a);
}var
c=this.getRowByOffset(b,this.options.selectHiddenRows);if(c===null||this.focused==this.body.rows[c]){return
this;}this.toggleRow(this.body.rows[c],a);
},clickRow:function(a,b){var
c=(a.shift||a.meta||a.control)&&this.options.shiftForMultiSelect;if(!c&&!(a.rightClick&&this.isSelected(b)&&this.options.allowMultiSelect)){this.selectNone();
}if(a.rightClick){this.selectRow(b);}else{this.toggleRow(b);}if(a.shift){this.selectRange(this.rangeStart||this.body.rows[0],b,this.rangeStart?!this.isSelected(b):true);
this.focused=b;}this.rangeStart=b;},getRowByOffset:function(e,d){if(!this.focused){return
0;}var
b=Array.indexOf(this.body.rows,this.focused);if((b==0&&e<0)||(b==this.body.rows.length-1&&e>0)){return
null;
}if(d){b+=e;}else{var
a=0,c=0;if(e>0){while(c<e&&b<this.body.rows.length-1){if(this.body.rows[++b].isDisplayed()){c++;}}}else{while(c>e&&b>0){if(this.body.rows[--b].isDisplayed()){c--;
}}}}return b;},attachSelects:function(d){d=d!=null?d:true;var
g=d?"addEvents":"removeEvents";this.element[g]({mouseleave:this.bound.mouseleave,click:this.bound.activateKeyboard});
this.body[g]({"click:relay(tr)":this.bound.clickRow,"contextmenu:relay(tr)":this.bound.clickRow});if(this.options.useKeyboard||this.keyboard){if(!this.keyboard){this.keyboard=new
Keyboard();
}if(!this.selectKeysDefined){this.selectKeysDefined=true;var f,e;var
c=function(i){var h=function(j){clearTimeout(f);j.preventDefault();var
k=this.body.rows[this.getRowByOffset(i,this.options.selectHiddenRows)];
if(j.shift&&k&&this.isSelected(k)){this.deselectRow(this.focused);this.focused=k;}else{if(k&&(!this.options.allowMultiSelect||!j.shift)){this.selectNone();
}this.shiftFocus(i,j);}if(e){f=h.delay(100,this,j);}else{f=(function(){e=true;h(j);}).delay(400);}}.bind(this);return
h;}.bind(this);var b=function(){clearTimeout(f);
e=false;};this.keyboard.addEvents({"keydown:shift+up":c(-1),"keydown:shift+down":c(1),"keyup:shift+up":b,"keyup:shift+down":b,"keyup:up":b,"keyup:down":b});
var
a="";if(this.options.allowMultiSelect&&this.options.shiftForMultiSelect&&this.options.useKeyboard){a="
(Shift multi-selects).";}this.keyboard.addShortcuts({"Select
Previous Row":{keys:"up",shortcut:"up
arrow",handler:c(-1),description:"Select the previous row in the
table."+a},"Select Next
Row":{keys:"down",shortcut:"down
arrow",handler:c(1),description:"Select the next row in the
table."+a}});
}this.keyboard[d?"activate":"deactivate"]();}this.updateSelects();},mouseleave:function(){if(this.hovered){this.leaveRow(this.hovered);}}});var
Scroller=new
Class({Implements:[Events,Options],options:{area:20,velocity:1,onChange:function(a,b){this.element.scrollTo(a,b);
},fps:50},initialize:function(b,a){this.setOptions(a);this.element=document.id(b);this.docBody=document.id(this.element.getDocument().body);this.listener=(typeOf(this.element)!="element")?this.docBody:this.element;
this.timer=null;this.bound={attach:this.attach.bind(this),detach:this.detach.bind(this),getCoords:this.getCoords.bind(this)};},start:function(){this.listener.addEvents({mouseover:this.bound.attach,mouseleave:this.bound.detach});
return
this;},stop:function(){this.listener.removeEvents({mouseover:this.bound.attach,mouseleave:this.bound.detach});this.detach();this.timer=clearInterval(this.timer);
return
this;},attach:function(){this.listener.addEvent("mousemove",this.bound.getCoords);},detach:function(){this.listener.removeEvent("mousemove",this.bound.getCoords);
this.timer=clearInterval(this.timer);},getCoords:function(a){this.page=(this.listener.get("tag")=="body")?a.client:a.page;if(!this.timer){this.timer=this.scroll.periodical(Math.round(1000/this.options.fps),this);
}},scroll:function(){var
c=this.element.getSize(),a=this.element.getScroll(),h=this.element!=this.docBody?this.element.getOffsets():{x:0,y:0},d=this.element.getScrollSize(),g={x:0,y:0},e=this.options.area.top||this.options.area,b=this.options.area.bottom||this.options.area;
for(var f in
this.page){if(this.page[f]<(e+h[f])&&a[f]!=0){g[f]=(this.page[f]-e-h[f])*this.options.velocity;}else{if(this.page[f]+b>(c[f]+h[f])&&a[f]+c[f]!=d[f]){g[f]=(this.page[f]-c[f]+b-h[f])*this.options.velocity;
}}g[f]=g[f].round();}if(g.y||g.x){this.fireEvent("change",[a.x+g.x,a.y+g.y]);}}});(function(){var
a=function(c,b){return(c)?(typeOf(c)=="function"?c(b):b.get(c)):"";
};this.Tips=new
Class({Implements:[Events,Options],options:{onShow:function(){this.tip.setStyle("display","block");},onHide:function(){this.tip.setStyle("display","none");
},title:"title",text:function(b){return
b.get("rel")||b.get("href");},showDelay:100,hideDelay:100,className:"tip-wrap",offset:{x:16,y:16},windowPadding:{x:0,y:0},fixed:false,waiAria:true},initialize:function(){var
b=Array.link(arguments,{options:Type.isObject,elements:function(c){return
c!=null;
}});this.setOptions(b.options);if(b.elements){this.attach(b.elements);}this.container=new
Element("div",{"class":"tip"});if(this.options.id){this.container.set("id",this.options.id);
if(this.options.waiAria){this.attachWaiAria();}}},toElement:function(){if(this.tip){return
this.tip;}this.tip=new
Element("div",{"class":this.options.className,styles:{position:"absolute",top:0,left:0}}).adopt(new
Element("div",{"class":"tip-top"}),this.container,new
Element("div",{"class":"tip-bottom"}));
return this.tip;},attachWaiAria:function(){var
b=this.options.id;this.container.set("role","tooltip");if(!this.waiAria){this.waiAria={show:function(c){if(b){c.set("aria-describedby",b);
}this.container.set("aria-hidden","false");},hide:function(c){if(b){c.erase("aria-describedby");}this.container.set("aria-hidden","true");}};}this.addEvents(this.waiAria);
},detachWaiAria:function(){if(this.waiAria){this.container.erase("role");this.container.erase("aria-hidden");this.removeEvents(this.waiAria);}},attach:function(b){$$(b).each(function(d){var
f=a(this.options.title,d),e=a(this.options.text,d);
d.set("title","").store("tip:native",f).retrieve("tip:title",f);d.retrieve("tip:text",e);this.fireEvent("attach",[d]);var
c=["enter","leave"];if(!this.options.fixed){c.push("move");
}c.each(function(h){var
g=d.retrieve("tip:"+h);if(!g){g=function(i){this["element"+h.capitalize()].apply(this,[i,d]);}.bind(this);}d.store("tip:"+h,g).addEvent("mouse"+h,g);
},this);},this);return
this;},detach:function(b){$$(b).each(function(d){["enter","leave","move"].each(function(e){d.removeEvent("mouse"+e,d.retrieve("tip:"+e)).eliminate("tip:"+e);
});this.fireEvent("detach",[d]);if(this.options.title=="title"){var
c=d.retrieve("tip:native");if(c){d.set("title",c);}}},this);return
this;},elementEnter:function(c,b){clearTimeout(this.timer);
this.timer=(function(){this.container.empty();["title","text"].each(function(e){var
d=b.retrieve("tip:"+e);var
f=this["_"+e+"Element"]=new
Element("div",{"class":"tip-"+e}).inject(this.container);
if(d){this.fill(f,d);}},this);this.show(b);this.position((this.options.fixed)?{page:b.getPosition()}:c);}).delay(this.options.showDelay,this);},elementLeave:function(c,b){clearTimeout(this.timer);
this.timer=this.hide.delay(this.options.hideDelay,this,b);this.fireForParent(c,b);},setTitle:function(b){if(this._titleElement){this._titleElement.empty();
this.fill(this._titleElement,b);}return
this;},setText:function(b){if(this._textElement){this._textElement.empty();this.fill(this._textElement,b);}return
this;
},fireForParent:function(c,b){b=b.getParent();if(!b||b==document.body){return;}if(b.retrieve("tip:enter")){b.fireEvent("mouseenter",c);}else{this.fireForParent(c,b);
}},elementMove:function(c,b){this.position(c);},position:function(f){if(!this.tip){document.id(this);}var
c=window.getSize(),b=window.getScroll(),g={x:this.tip.offsetWidth,y:this.tip.offsetHeight},d={x:"left",y:"top"},e={y:false,x2:false,y2:false,x:false},h={};
for(var i in
d){h[d[i]]=f.page[i]+this.options.offset[i];if(h[d[i]]<0){e[i]=true;}if((h[d[i]]+g[i]-b[i])>c[i]-this.options.windowPadding[i]){h[d[i]]=f.page[i]-this.options.offset[i]-g[i];
e[i+"2"]=true;}}this.fireEvent("bound",e);this.tip.setStyles(h);},fill:function(b,c){if(typeof
c=="string"){b.set("html",c);}else{b.adopt(c);}},show:function(b){if(!this.tip){document.id(this);
}if(!this.tip.getParent()){this.tip.inject(document.body);}this.fireEvent("show",[this.tip,b]);},hide:function(b){if(!this.tip){document.id(this);}this.fireEvent("hide",[this.tip,b]);
}});})();(function(){var
a={json:JSON.decode};Locale.Set.defineParser=function(b,c){a[b]=c;};Locale.Set.from=function(d,c){if(instanceOf(d,Locale.Set)){return
d;
}if(!c&&typeOf(d)=="string"){c="json";}if(a[c]){d=a[c](d);}var
b=new
Locale.Set;b.sets=d.sets||{};if(d.inherits){b.inherits.locales=Array.from(d.inherits.locales);
b.inherits.sets=d.inherits.sets||{};}return
b;};})();Locale.define("ar","Date",{dateOrder:["date","month","year"],shortDate:"%d/%m/%Y",shortTime:"%H:%M"});
Locale.define("ar","FormValidator",{required:"هذا
الحقل مطلوب.",minLength:"رجاءً إدخال
{minLength} أحرف على الأقل (تم إدخال {length}
أحرف).",maxLength:"الرجاء عدم إدخال أكثر
من {maxLength} أحرف (تم إدخال {length}
أحرف).",integer:"الرجاء إدخال عدد صحيح في
هذا الحقل. أي رقم ذو كسر عشري أو مئوي (مثال
1.25 ) غير مسموح.",numeric:'الرجاء إدخال
قيم رقمية في هذا الحقل (مثال "1" أو
"1.1" أو "-1" أو
"-1.1").',digits:"الرجاء أستخدام قيم
رقمية وعلامات ترقيمية فقط في هذا الحقل
(مثال, رقم هاتف مع نقطة أو
شحطة)",alpha:"الرجاء أستخدام أحرف فقط
(ا-ي) في هذا الحقل. أي فراغات أو علامات غير
مسموحة.",alphanum:"الرجاء أستخدام أحرف
فقط (ا-ي) أو أرقام (0-9) فقط في هذا الحقل. أي
فراغات أو علامات غير
مسموحة.",dateSuchAs:"الرجاء إدخال تاريخ
صحيح كالتالي {date}",dateInFormatMDY:"الرجاء
إدخال تاريخ صحيح (مثال,
31-12-1999)",email:"الرجاء إدخال بريد
إلكتروني صحيح.",url:"الرجاء إدخال
عنوان إلكتروني صحيح مثل
http://www.example.com",currencyDollar:"الرجاء إدخال
قيمة $ صحيحة. مثال,
100.00$",oneRequired:"الرجاء إدخال قيمة في
أحد هذه الحقول على
الأقل.",errorPrefix:"خطأ:
",warningPrefix:"تحذير: "});
Locale.define("ca-CA","Date",{months:["Gener","Febrer","Març","Abril","Maig","Juny","Juli","Agost","Setembre","Octubre","Novembre","Desembre"],months_abbr:["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],days:["Diumenge","Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte"],days_abbr:["dg","dl","dt","dc","dj","dv","ds"],dateOrder:["date","month","year"],shortDate:"%d/%m/%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:0,ordinal:"",lessThanMinuteAgo:"fa
menys d`un minut",minuteAgo:"fa un
minut",minutesAgo:"fa {delta} minuts",hourAgo:"fa un
hora",hoursAgo:"fa unes {delta} hores",dayAgo:"fa un
dia",daysAgo:"fa {delta}
dies",lessThanMinuteUntil:"menys d`un minut des
d`ara",minuteUntil:"un minut des
d`ara",minutesUntil:"{delta} minuts des
d`ara",hourUntil:"un hora des d`ara",hoursUntil:"unes
{delta} hores des d`ara",dayUntil:"1 dia des
d`ara",daysUntil:"{delta} dies des d`ara"});
Locale.define("ca-CA","FormValidator",{required:"Aquest
camp es obligatori.",minLength:"Per favor introdueix al menys
{minLength} caracters (has introduit {length}
caracters).",maxLength:"Per favor introdueix no mes de
{maxLength} caracters (has introduit {length}
caracters).",integer:"Per favor introdueix un nombre enter en
aquest camp. Nombres amb decimals (p.e. 1,25) no estan
permesos.",numeric:'Per favor introdueix sols valors numerics en
aquest camp (p.e. "1" o "1,1" o "-1" o
"-1,1").',digits:"Per favor usa sols numeros i
puntuacio en aquest camp (per exemple, un nombre de telefon amb guions i
punts no esta permes).",alpha:"Per favor utilitza lletres nomes
(a-z) en aquest camp. No s´admiteixen espais ni altres
caracters.",alphanum:"Per favor, utilitza nomes lletres (a-z) o
numeros (0-9) en aquest camp. No s´admiteixen espais ni altres
caracters.",dateSuchAs:"Per favor introdueix una data valida com
{date}",dateInFormatMDY:'Per favor introdueix una data valida com
DD/MM/YYYY (p.e. "31/12/1999")',email:'Per favor,
introdueix una adreça de correu electronic valida. Per exemple,
"fred@domain.com".',url:"Per favor introdueix una URL
valida com http://www.example.com.",currencyDollar:"Per favor
introdueix una quantitat valida de €. Per exemple €100,00
.",oneRequired:"Per favor introdueix alguna cosa per al menys una
d´aquestes entrades.",errorPrefix:"Error:
",warningPrefix:"Avis: ",noSpace:"No poden haver espais
en aquesta entrada.",reqChkByNode:"No hi han elements
seleccionats.",requiredChk:"Aquest camp es
obligatori.",reqChkByName:"Per favor selecciona una
{label}.",match:"Aquest camp necessita coincidir amb el camp
{matchName}",startDate:"la data de inici",endDate:"la
data de fi",currendDate:"la data actual",afterDate:"La
data deu ser igual o posterior a {label}.",beforeDate:"La data
deu ser igual o anterior a {label}.",startMonth:"Per favor
selecciona un mes d´orige",sameMonth:"Aquestes dos dates deuen
estar dins del mateix mes - deus canviar una o altra."});
(function(){var a=function(e,d,c,b){if(e==1){return
d;}else{if(e==2||e==3||e==4){return c;}else{return
b;}}};Locale.define("cs-CZ","Date",{months:["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"],months_abbr:["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],days:["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],days_abbr:["ne","po","út","st","čt","pá","so"],dateOrder:["date","month","year"],shortDate:"%d.%m.%Y",shortTime:"%H:%M",AM:"dop.",PM:"odp.",firstDayOfWeek:1,ordinal:".",lessThanMinuteAgo:"před
chvílí",minuteAgo:"přibližně před
minutou",minutesAgo:function(b){return"před {delta}
"+a(b,"minutou","minutami","minutami");
},hourAgo:"přibližně před
hodinou",hoursAgo:function(b){return"před {delta}
"+a(b,"hodinou","hodinami","hodinami");},dayAgo:"před
dnem",daysAgo:function(b){return"před {delta}
"+a(b,"dnem","dny","dny");
},weekAgo:"před týdnem",weeksAgo:function(b){return"před
{delta}
"+a(b,"týdnem","týdny","týdny");},monthAgo:"před
měsícem",monthsAgo:function(b){return"před {delta}
"+a(b,"měsícem","měsíci","měsíci");
},yearAgo:"před rokem",yearsAgo:function(b){return"před
{delta}
"+a(b,"rokem","lety","lety");},lessThanMinuteUntil:"za
chvíli",minuteUntil:"přibližně za
minutu",minutesUntil:function(b){return"za {delta}
"+a(b,"minutu","minuty","minut");
},hourUntil:"přibližně za
hodinu",hoursUntil:function(b){return"za {delta}
"+a(b,"hodinu","hodiny","hodin");},dayUntil:"za
den",daysUntil:function(b){return"za {delta}
"+a(b,"den","dny","dnů");
},weekUntil:"za týden",weeksUntil:function(b){return"za
{delta}
"+a(b,"týden","týdny","týdnů");},monthUntil:"za
měsíc",monthsUntil:function(b){return"za {delta}
"+a(b,"měsíc","měsíce","měsíců");
},yearUntil:"za rok",yearsUntil:function(b){return"za
{delta}
"+a(b,"rok","roky","let");}});})();Locale.define("cs-CZ","FormValidator",{required:"Tato
položka je povinná.",minLength:"Zadejte prosím alespoň
{minLength} znaků (napsáno {length}
znaků).",maxLength:"Zadejte prosím méně než {maxLength}
znaků (nápsáno {length} znaků).",integer:"Zadejte prosím
celé číslo. Desetinná čísla (např. 1.25) nejsou
povolena.",numeric:'Zadejte jen číselné hodnoty (tj.
"1" nebo "1.1" nebo "-1" nebo
"-1.1").',digits:"Zadejte prosím pouze čísla a
interpunkční znaménka(například telefonní číslo s pomlčkami nebo
tečkami je povoleno).",alpha:"Zadejte prosím pouze písmena
(a-z). Mezery nebo jiné znaky nejsou
povoleny.",alphanum:"Zadejte prosím pouze písmena (a-z) nebo
číslice (0-9). Mezery nebo jiné znaky nejsou
povoleny.",dateSuchAs:"Zadejte prosím platné datum jako
{date}",dateInFormatMDY:'Zadejte prosím platné datum jako MM /
DD / RRRR (tj. "12/31/1999")',email:'Zadejte prosím
platnou e-mailovou adresu. Například
"fred@domain.com".',url:"Zadejte prosím platnou URL
adresu jako http://www.example.com.",currencyDollar:"Zadejte
prosím platnou částku. Například
$100.00.",oneRequired:"Zadejte prosím alespoň jednu hodnotu pro
tyto položky.",errorPrefix:"Chyba:
",warningPrefix:"Upozornění: ",noSpace:"V této
položce nejsou povoleny mezery",reqChkByNode:"Nejsou vybrány
žádné položky.",requiredChk:"Tato položka je
vyžadována.",reqChkByName:"Prosím vyberte
{label}.",match:"Tato položka se musí shodovat s položkou
{matchName}",startDate:"datum
zahájení",endDate:"datum
ukončení",currendDate:"aktuální
datum",afterDate:"Datum by mělo být stejné nebo větší než
{label}.",beforeDate:"Datum by mělo být stejné nebo menší
než {label}.",startMonth:"Vyberte počáteční
měsíc.",sameMonth:"Tyto dva datumy musí být ve stejném
měsíci - změňte jeden z nich.",creditcard:"Zadané číslo
kreditní karty je neplatné. Prosím opravte ho. Bylo zadáno {length}
čísel."});
Locale.define("da-DK","Date",{months:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],months_abbr:["jan.","feb.","mar.","apr.","maj.","jun.","jul.","aug.","sep.","okt.","nov.","dec."],days:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],days_abbr:["søn","man","tir","ons","tor","fre","lør"],dateOrder:["date","month","year"],shortDate:"%d-%m-%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:".",lessThanMinuteAgo:"mindre
end et minut siden",minuteAgo:"omkring et minut
siden",minutesAgo:"{delta} minutter
siden",hourAgo:"omkring en time
siden",hoursAgo:"omkring {delta} timer siden",dayAgo:"1
dag siden",daysAgo:"{delta} dage siden",weekAgo:"1 uge
siden",weeksAgo:"{delta} uger siden",monthAgo:"1 måned
siden",monthsAgo:"{delta} måneder siden",yearAgo:"1
år siden",yearsAgo:"{delta} år
siden",lessThanMinuteUntil:"mindre end et minut fra
nu",minuteUntil:"omkring et minut fra
nu",minutesUntil:"{delta} minutter fra
nu",hourUntil:"omkring en time fra
nu",hoursUntil:"omkring {delta} timer fra
nu",dayUntil:"1 dag fra nu",daysUntil:"{delta} dage fra
nu",weekUntil:"1 uge fra nu",weeksUntil:"{delta} uger
fra nu",monthUntil:"1 måned fra
nu",monthsUntil:"{delta} måneder fra nu",yearUntil:"1
år fra nu",yearsUntil:"{delta} år fra nu"});
Locale.define("da-DK","FormValidator",{required:"Feltet
skal udfyldes.",minLength:"Skriv mindst {minLength} tegn (du
skrev {length} tegn).",maxLength:"Skriv maksimalt {maxLength}
tegn (du skrev {length} tegn).",integer:"Skriv et tal i dette
felt. Decimal tal (f.eks. 1.25) er ikke tilladt.",numeric:'Skriv
kun tal i dette felt (i.e. "1" eller "1.1" eller
"-1" eller "-1.1").',digits:"Skriv kun tal og
tegnsætning i dette felt (eksempel, et telefon nummer med bindestreg eller
punktum er tilladt).",alpha:"Skriv kun bogstaver (a-z) i dette
felt. Mellemrum og andre tegn er ikke tilladt.",alphanum:"Skriv
kun bogstaver (a-z) eller tal (0-9) i dette felt. Mellemrum og andre tegn
er ikke tilladt.",dateSuchAs:"Skriv en gyldig dato som
{date}",dateInFormatMDY:'Skriv dato i formatet DD-MM-YYYY (f.eks.
"31-12-1999")',email:'Skriv en gyldig e-mail adresse.
F.eks "fred@domain.com".',url:'Skriv en gyldig URL
adresse. F.eks
"http://www.example.com".',currencyDollar:"Skriv et
gldigt beløb. F.eks Kr.100.00 .",oneRequired:"Et eller flere af
felterne i denne formular skal udfyldes.",errorPrefix:"Fejl:
",warningPrefix:"Advarsel: ",noSpace:"Der må ikke
benyttes mellemrum i dette felt.",reqChkByNode:"Foretag et
valg.",requiredChk:"Dette felt skal
udfyldes.",reqChkByName:"Vælg en
{label}.",match:"Dette felt skal matche {matchName}
feltet",startDate:"start dato",endDate:"slut
dato",currendDate:"dags dato",afterDate:"Datoen skal
være større end eller lig med {label}.",beforeDate:"Datoen skal
være mindre end eller lig med {label}.",startMonth:"Vælg en
start måned",sameMonth:"De valgte datoer skal være i samme
måned - skift en af dem."});
Locale.define("de-DE","Date",{months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],months_abbr:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],days_abbr:["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],dateOrder:["date","month","year"],shortDate:"%d.%m.%Y",shortTime:"%H:%M",AM:"vormittags",PM:"nachmittags",firstDayOfWeek:1,ordinal:".",lessThanMinuteAgo:"vor
weniger als einer Minute",minuteAgo:"vor einer
Minute",minutesAgo:"vor {delta} Minuten",hourAgo:"vor
einer Stunde",hoursAgo:"vor {delta}
Stunden",dayAgo:"vor einem Tag",daysAgo:"vor {delta}
Tagen",weekAgo:"vor einer Woche",weeksAgo:"vor {delta}
Wochen",monthAgo:"vor einem Monat",monthsAgo:"vor
{delta} Monaten",yearAgo:"vor einem Jahr",yearsAgo:"vor
{delta} Jahren",lessThanMinuteUntil:"in weniger als einer
Minute",minuteUntil:"in einer Minute",minutesUntil:"in
{delta} Minuten",hourUntil:"in ca. einer
Stunde",hoursUntil:"in ca. {delta}
Stunden",dayUntil:"in einem Tag",daysUntil:"in {delta}
Tagen",weekUntil:"in einer Woche",weeksUntil:"in
{delta} Wochen",monthUntil:"in einem
Monat",monthsUntil:"in {delta} Monaten",yearUntil:"in
einem Jahr",yearsUntil:"in {delta} Jahren"});
Locale.define("de-CH").inherit("de-DE","Date");Locale.define("de-CH","FormValidator",{required:"Dieses
Feld ist obligatorisch.",minLength:"Geben Sie bitte mindestens
{minLength} Zeichen ein (Sie haben {length} Zeichen
eingegeben).",maxLength:"Bitte geben Sie nicht mehr als
{maxLength} Zeichen ein (Sie haben {length} Zeichen
eingegeben).",integer:"Geben Sie bitte eine ganze Zahl ein.
Dezimalzahlen (z.B. 1.25) sind nicht erlaubt.",numeric:"Geben Sie
bitte nur Zahlenwerte in dieses Eingabefeld ein (z.B.
&quot;1&quot;, &quot;1.1&quot;, &quot;-1&quot; oder
&quot;-1.1&quot;).",digits:"Benutzen Sie bitte nur Zahlen
und Satzzeichen in diesem Eingabefeld (erlaubt ist z.B. eine Telefonnummer
mit Bindestrichen und Punkten).",alpha:"Benutzen Sie bitte nur
Buchstaben (a-z) in diesem Feld. Leerzeichen und andere Zeichen sind nicht
erlaubt.",alphanum:"Benutzen Sie bitte nur Buchstaben (a-z) und
Zahlen (0-9) in diesem Eingabefeld. Leerzeichen und andere Zeichen sind
nicht erlaubt.",dateSuchAs:"Geben Sie bitte ein g&uuml;ltiges
Datum ein. Wie zum Beispiel {date}",dateInFormatMDY:"Geben Sie
bitte ein g&uuml;ltiges Datum ein. Wie zum Beispiel TT.MM.JJJJ (z.B.
&quot;31.12.1999&quot;)",email:"Geben Sie bitte eine
g&uuml;ltige E-Mail Adresse ein. Wie zum Beispiel
&quot;maria@bernasconi.ch&quot;.",url:"Geben Sie bitte
eine g&uuml;ltige URL ein. Wie zum Beispiel
http://www.example.com.",currencyDollar:"Geben Sie bitte einen
g&uuml;ltigen Betrag in Schweizer Franken ein. Wie zum Beispiel 100.00
CHF .",oneRequired:"Machen Sie f&uuml;r mindestens eines der
Eingabefelder einen Eintrag.",errorPrefix:"Fehler:
",warningPrefix:"Warnung: ",noSpace:"In diesem
Eingabefeld darf kein Leerzeichen sein.",reqChkByNode:"Es wurden
keine Elemente gew&auml;hlt.",requiredChk:"Dieses Feld ist
obligatorisch.",reqChkByName:"Bitte w&auml;hlen Sie ein
{label}.",match:"Dieses Eingabefeld muss mit dem Feld {matchName}
&uuml;bereinstimmen.",startDate:"Das
Anfangsdatum",endDate:"Das Enddatum",currendDate:"Das
aktuelle Datum",afterDate:"Das Datum sollte zur gleichen Zeit
oder sp&auml;ter sein {label}.",beforeDate:"Das Datum sollte
zur gleichen Zeit oder fr&uuml;her sein
{label}.",startMonth:"W&auml;hlen Sie bitte einen
Anfangsmonat",sameMonth:"Diese zwei Datumsangaben m&uuml;ssen
im selben Monat sein - Sie m&uuml;ssen eine von beiden
ver&auml;ndern.",creditcard:"Die eingegebene
Kreditkartennummer ist ung&uuml;ltig. Bitte
&uuml;berpr&uuml;fen Sie diese und versuchen Sie es erneut.
{length} Zahlen eingegeben."});
Locale.define("de-DE","FormValidator",{required:"Dieses
Eingabefeld muss ausgefüllt werden.",minLength:"Geben Sie bitte
mindestens {minLength} Zeichen ein (Sie haben nur {length} Zeichen
eingegeben).",maxLength:"Geben Sie bitte nicht mehr als
{maxLength} Zeichen ein (Sie haben {length} Zeichen
eingegeben).",integer:'Geben Sie in diesem Eingabefeld bitte eine
ganze Zahl ein. Dezimalzahlen (z.B. "1.25") sind nicht
erlaubt.',numeric:'Geben Sie in diesem Eingabefeld bitte nur
Zahlenwerte (z.B. "1", "1.1", "-1" oder
"-1.1") ein.',digits:"Geben Sie in diesem Eingabefeld
bitte nur Zahlen und Satzzeichen ein (z.B. eine Telefonnummer mit
Bindestrichen und Punkten ist erlaubt).",alpha:"Geben Sie in
diesem Eingabefeld bitte nur Buchstaben (a-z) ein. Leerzeichen und andere
Zeichen sind nicht erlaubt.",alphanum:"Geben Sie in diesem
Eingabefeld bitte nur Buchstaben (a-z) und Zahlen (0-9) ein. Leerzeichen
oder andere Zeichen sind nicht erlaubt.",dateSuchAs:'Geben Sie
bitte ein gültiges Datum ein (z.B.
"{date}").',dateInFormatMDY:'Geben Sie bitte ein
gültiges Datum im Format TT.MM.JJJJ ein (z.B.
"31.12.1999").',email:'Geben Sie bitte eine gültige
E-Mail-Adresse ein (z.B.
"max@mustermann.de").',url:'Geben Sie bitte eine
gültige URL ein (z.B.
"http://www.example.com").',currencyDollar:"Geben Sie
bitte einen gültigen Betrag in EURO ein (z.B.
100.00€).",oneRequired:"Bitte füllen Sie mindestens ein
Eingabefeld aus.",errorPrefix:"Fehler:
",warningPrefix:"Warnung: ",noSpace:"Es darf kein
Leerzeichen in diesem Eingabefeld sein.",reqChkByNode:"Es wurden
keine Elemente gewählt.",requiredChk:"Dieses Feld muss
ausgefüllt werden.",reqChkByName:"Bitte wählen Sie ein
{label}.",match:"Dieses Eingabefeld muss mit dem {matchName}
Eingabefeld übereinstimmen.",startDate:"Das
Anfangsdatum",endDate:"Das Enddatum",currendDate:"Das
aktuelle Datum",afterDate:"Das Datum sollte zur gleichen Zeit
oder später sein als {label}.",beforeDate:"Das Datum sollte zur
gleichen Zeit oder früher sein als {label}.",startMonth:"Wählen
Sie bitte einen Anfangsmonat",sameMonth:"Diese zwei Datumsangaben
müssen im selben Monat sein - Sie müssen eines von beiden
verändern.",creditcard:"Die eingegebene Kreditkartennummer ist
ungültig. Bitte überprüfen Sie diese und versuchen Sie es erneut.
{length} Zahlen eingegeben."});
Locale.define("EU","Number",{decimal:",",group:".",currency:{prefix:"€
"}});Locale.define("de-DE").inherit("EU","Number");Locale.define("en-GB","Date",{dateOrder:["date","month","year"],shortDate:"%d/%m/%Y",shortTime:"%H:%M"}).inherit("en-US","Date");
Locale.define("es-ES","Date",{months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],months_abbr:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],days:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],days_abbr:["dom","lun","mar","mié","juv","vie","sáb"],dateOrder:["date","month","year"],shortDate:"%d/%m/%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:"",lessThanMinuteAgo:"hace
menos de un minuto",minuteAgo:"hace un
minuto",minutesAgo:"hace {delta} minutos",hourAgo:"hace
una hora",hoursAgo:"hace unas {delta}
horas",dayAgo:"hace un día",daysAgo:"hace {delta}
días",weekAgo:"hace una semana",weeksAgo:"hace unas
{delta} semanas",monthAgo:"hace un mes",monthsAgo:"hace
{delta} meses",yearAgo:"hace un año",yearsAgo:"hace
{delta} años",lessThanMinuteUntil:"menos de un minuto desde
ahora",minuteUntil:"un minuto desde
ahora",minutesUntil:"{delta} minutos desde
ahora",hourUntil:"una hora desde
ahora",hoursUntil:"unas {delta} horas desde
ahora",dayUntil:"un día desde
ahora",daysUntil:"{delta} días desde
ahora",weekUntil:"una semana desde
ahora",weeksUntil:"unas {delta} semanas desde
ahora",monthUntil:"un mes desde
ahora",monthsUntil:"{delta} meses desde
ahora",yearUntil:"un año desde
ahora",yearsUntil:"{delta} años desde ahora"});
Locale.define("es-AR").inherit("es-ES","Date");Locale.define("es-AR","FormValidator",{required:"Este
campo es obligatorio.",minLength:"Por favor ingrese al menos
{minLength} caracteres (ha ingresado {length}
caracteres).",maxLength:"Por favor no ingrese más de {maxLength}
caracteres (ha ingresado {length} caracteres).",integer:"Por
favor ingrese un número entero en este campo. Números con decimales (p.e.
1,25) no se permiten.",numeric:'Por favor ingrese solo valores
numéricos en este campo (p.e. "1" o "1,1" o
"-1" o "-1,1").',digits:"Por favor use sólo
números y puntuación en este campo (por ejemplo, un número de teléfono
con guiones y/o puntos no está permitido).",alpha:"Por favor use
sólo letras (a-z) en este campo. No se permiten espacios ni otros
caracteres.",alphanum:"Por favor, usa sólo letras (a-z) o
números (0-9) en este campo. No se permiten espacios u otros
caracteres.",dateSuchAs:"Por favor ingrese una fecha válida como
{date}",dateInFormatMDY:'Por favor ingrese una fecha válida,
utulizando el formato DD/MM/YYYY (p.e.
"31/12/1999")',email:'Por favor, ingrese una dirección
de e-mail válida. Por ejemplo,
"fred@dominio.com".',url:"Por favor ingrese una URL
válida como http://www.example.com.",currencyDollar:"Por favor
ingrese una cantidad válida de pesos. Por ejemplo $100,00
.",oneRequired:"Por favor ingrese algo para por lo menos una de
estas entradas.",errorPrefix:"Error:
",warningPrefix:"Advertencia: ",noSpace:"No se permiten
espacios en este campo.",reqChkByNode:"No hay elementos
seleccionados.",requiredChk:"Este campo es
obligatorio.",reqChkByName:"Por favor selecciona una
{label}.",match:"Este campo necesita coincidir con el campo
{matchName}",startDate:"la fecha de inicio",endDate:"la
fecha de fin",currendDate:"la fecha
actual",afterDate:"La fecha debe ser igual o posterior a
{label}.",beforeDate:"La fecha debe ser igual o anterior a
{label}.",startMonth:"Por favor selecciona un mes de
origen",sameMonth:"Estas dos fechas deben estar en el mismo mes -
debes cambiar una u otra."});
Locale.define("es-ES","FormValidator",{required:"Este
campo es obligatorio.",minLength:"Por favor introduce al menos
{minLength} caracteres (has introducido {length}
caracteres).",maxLength:"Por favor introduce no m&aacute;s de
{maxLength} caracteres (has introducido {length}
caracteres).",integer:"Por favor introduce un n&uacute;mero
entero en este campo. N&uacute;meros con decimales (p.e. 1,25) no se
permiten.",numeric:'Por favor introduce solo valores
num&eacute;ricos en este campo (p.e. "1" o "1,1" o
"-1" o "-1,1").',digits:"Por favor usa solo
n&uacute;meros y puntuaci&oacute;n en este campo (por ejemplo, un
n&uacute;mero de tel&eacute;fono con guiones y puntos no esta
permitido).",alpha:"Por favor usa letras solo (a-z) en este
campo. No se admiten espacios ni otros caracteres.",alphanum:"Por
favor, usa solo letras (a-z) o n&uacute;meros (0-9) en este campo. No
se admiten espacios ni otros caracteres.",dateSuchAs:"Por favor
introduce una fecha v&aacute;lida como
{date}",dateInFormatMDY:'Por favor introduce una fecha
v&aacute;lida como DD/MM/YYYY (p.e.
"31/12/1999")',email:'Por favor, introduce una
direcci&oacute;n de email v&aacute;lida. Por ejemplo,
"fred@domain.com".',url:"Por favor introduce una URL
v&aacute;lida como
http://www.example.com.",currencyDollar:"Por favor introduce una
cantidad v&aacute;lida de €. Por ejemplo €100,00
.",oneRequired:"Por favor introduce algo para por lo menos una de
estas entradas.",errorPrefix:"Error:
",warningPrefix:"Aviso: ",noSpace:"No pueden haber
espacios en esta entrada.",reqChkByNode:"No hay elementos
seleccionados.",requiredChk:"Este campo es
obligatorio.",reqChkByName:"Por favor selecciona una
{label}.",match:"Este campo necesita coincidir con el campo
{matchName}",startDate:"la fecha de inicio",endDate:"la
fecha de fin",currendDate:"la fecha
actual",afterDate:"La fecha debe ser igual o posterior a
{label}.",beforeDate:"La fecha debe ser igual o anterior a
{label}.",startMonth:"Por favor selecciona un mes de
origen",sameMonth:"Estas dos fechas deben estar en el mismo mes -
debes cambiar una u otra."});
Locale.define("et-EE","Date",{months:["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],months_abbr:["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets"],days:["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],days_abbr:["pühap","esmasp","teisip","kolmap","neljap","reede","laup"],dateOrder:["month","date","year"],shortDate:"%m.%d.%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:"",lessThanMinuteAgo:"vähem
kui minut aega tagasi",minuteAgo:"umbes minut aega
tagasi",minutesAgo:"{delta} minutit
tagasi",hourAgo:"umbes tund aega
tagasi",hoursAgo:"umbes {delta} tundi tagasi",dayAgo:"1
päev tagasi",daysAgo:"{delta} päeva
tagasi",weekAgo:"1 nädal tagasi",weeksAgo:"{delta}
nädalat tagasi",monthAgo:"1 kuu
tagasi",monthsAgo:"{delta} kuud tagasi",yearAgo:"1
aasta tagasi",yearsAgo:"{delta} aastat
tagasi",lessThanMinuteUntil:"vähem kui minuti aja
pärast",minuteUntil:"umbes minuti aja
pärast",minutesUntil:"{delta} minuti
pärast",hourUntil:"umbes tunni aja
pärast",hoursUntil:"umbes {delta} tunni
pärast",dayUntil:"1 päeva pärast",daysUntil:"{delta}
päeva pärast",weekUntil:"1 nädala
pärast",weeksUntil:"{delta} nädala
pärast",monthUntil:"1 kuu
pärast",monthsUntil:"{delta} kuu pärast",yearUntil:"1
aasta pärast",yearsUntil:"{delta} aasta pärast"});
Locale.define("et-EE","FormValidator",{required:"Väli
peab olema täidetud.",minLength:"Palun sisestage vähemalt
{minLength} tähte (te sisestasite {length}
tähte).",maxLength:"Palun ärge sisestage rohkem kui {maxLength}
tähte (te sisestasite {length} tähte).",integer:"Palun
sisestage väljale täisarv. Kümnendarvud (näiteks 1.25) ei ole
lubatud.",numeric:'Palun sisestage ainult numbreid väljale
(näiteks "1", "1.1", "-1" või
"-1.1").',digits:"Palun kasutage ainult numbreid ja
kirjavahemärke (telefoninumbri sisestamisel on lubatud kasutada kriipse ja
punkte).",alpha:"Palun kasutage ainult tähti (a-z). Tühikud ja
teised sümbolid on keelatud.",alphanum:"Palun kasutage ainult
tähti (a-z) või numbreid (0-9). Tühikud ja teised sümbolid on
keelatud.",dateSuchAs:"Palun sisestage kehtiv kuupäev kujul
{date}",dateInFormatMDY:'Palun sisestage kehtiv kuupäev kujul
MM.DD.YYYY (näiteks: "12.31.1999").',email:'Palun
sisestage kehtiv e-maili aadress (näiteks:
"fred@domain.com").',url:"Palun sisestage kehtiv URL
(näiteks: http://www.example.com).",currencyDollar:"Palun
sisestage kehtiv $ summa (näiteks: $100.00).",oneRequired:"Palun
sisestage midagi vähemalt ühele antud
väljadest.",errorPrefix:"Viga:
",warningPrefix:"Hoiatus: ",noSpace:"Väli ei tohi
sisaldada tühikuid.",reqChkByNode:"Ükski väljadest pole
valitud.",requiredChk:"Välja täitmine on
vajalik.",reqChkByName:"Palun valige üks
{label}.",match:"Väli peab sobima {matchName}
väljaga",startDate:"algkuupäev",endDate:"lõppkuupäev",currendDate:"praegune
kuupäev",afterDate:"Kuupäev peab olema võrdne või pärast
{label}.",beforeDate:"Kuupäev peab olema võrdne või enne
{label}.",startMonth:"Palun valige
algkuupäev.",sameMonth:"Antud kaks kuupäeva peavad olema samas
kuus - peate muutma ühte kuupäeva."});
Locale.define("fa","Date",{months:["ژانویه","فوریه","مارس","آپریل","مه","ژوئن","ژوئیه","آگوست","سپتامبر","اکتبر","نوامبر","دسامبر"],months_abbr:["1","2","3","4","5","6","7","8","9","10","11","12"],days:["یکشنبه","دوشنبه","سه
شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],days_abbr:["ي","د","س","چ","پ","ج","ش"],dateOrder:["month","date","year"],shortDate:"%m/%d/%Y",shortTime:"%I:%M%p",AM:"ق.ظ",PM:"ب.ظ",ordinal:"ام",lessThanMinuteAgo:"کمتر
از یک دقیقه پیش",minuteAgo:"حدود یک دقیقه
پیش",minutesAgo:"{delta} دقیقه
پیش",hourAgo:"حدود یک ساعت
پیش",hoursAgo:"حدود {delta} ساعت
پیش",dayAgo:"1 روز پیش",daysAgo:"{delta}
روز پیش",weekAgo:"1 هفته
پیش",weeksAgo:"{delta} هفته پیش",monthAgo:"1
ماه پیش",monthsAgo:"{delta} ماه
پیش",yearAgo:"1 سال پیش",yearsAgo:"{delta}
سال پیش",lessThanMinuteUntil:"کمتر از یک دقیقه
از حالا",minuteUntil:"حدود یک دقیقه از
حالا",minutesUntil:"{delta} دقیقه از
حالا",hourUntil:"حدود یک ساعت از
حالا",hoursUntil:"حدود {delta} ساعت از
حالا",dayUntil:"1 روز از
حالا",daysUntil:"{delta} روز از
حالا",weekUntil:"1 هفته از
حالا",weeksUntil:"{delta} هفته از
حالا",monthUntil:"1 ماه از
حالا",monthsUntil:"{delta} ماه از
حالا",yearUntil:"1 سال از
حالا",yearsUntil:"{delta} سال از حالا"});
Locale.define("fa","FormValidator",{required:"این
فیلد الزامی است.",minLength:"شما باید
حداقل {minLength} حرف وارد کنید ({length} حرف وارد
کرده اید).",maxLength:"لطفا حداکثر {maxLength}
حرف وارد کنید (شما {length} حرف وارد کرده
اید).",integer:"لطفا از عدد صحیح استفاده
کنید. اعداد اعشاری (مانند 1.25) مجاز
نیستند.",numeric:'لطفا فقط داده عددی
وارد کنید (مانند "1" یا "1.1" یا
"1-" یا "1.1-").',digits:"لطفا فقط
از اعداد و علامتها در این فیلد استفاده
کنید (برای مثال شماره تلفن با خط تیره و
نقطه قابل قبول است).",alpha:"لطفا فقط از
حروف الفباء برای این بخش استفاده کنید.
کاراکترهای دیگر و فاصله مجاز
نیستند.",alphanum:"لطفا فقط از حروف
الفباء و اعداد در این بخش استفاده کنید.
کاراکترهای دیگر و فاصله مجاز
نیستند.",dateSuchAs:"لطفا یک تاریخ معتبر
مانند {date} وارد کنید.",dateInFormatMDY:'لطفا
یک تاریخ معتبر به شکل MM/DD/YYYY وارد کنید
(مانند "12/31/1999").',email:'لطفا یک
آدرس ایمیل معتبر وارد کنید. برای مثال
"fred@domain.com".',url:"لطفا یک URL معتبر
مانند http://www.example.com وارد
کنید.",currencyDollar:"لطفا یک محدوده معتبر
برای این بخش وارد کنید مانند 100.00$
.",oneRequired:"لطفا حداقل یکی از فیلدها را
پر کنید.",errorPrefix:"خطا:
",warningPrefix:"هشدار: ",noSpace:"استفاده
از فاصله در این بخش مجاز
نیست.",reqChkByNode:"موردی انتخاب نشده
است.",requiredChk:"این فیلد الزامی
است.",reqChkByName:"لطفا یک {label} را انتخاب
کنید.",match:"این فیلد باید با فیلد
{matchName} مطابقت داشته
باشد.",startDate:"تاریخ
شروع",endDate:"تاریخ
پایان",currendDate:"تاریخ
کنونی",afterDate:"تاریخ میبایست برابر یا
بعد از {label} باشد",beforeDate:"تاریخ
میبایست برابر یا قبل از {label}
باشد",startMonth:"لطفا ماه شروع را انتخاب
کنید",sameMonth:"این دو تاریخ باید در یک
ماه باشند - شما باید یکی یا هر دو را تغییر
دهید.",creditcard:"شماره کارت اعتباری که
وارد کرده اید معتبر نیست. لطفا شماره را
بررسی کنید و مجددا تلاش کنید. {length} رقم
وارد شده است."});
Locale.define("fi-FI","Date",{months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],months_abbr:["tammik.","helmik.","maalisk.","huhtik.","toukok.","kesäk.","heinäk.","elok.","syysk.","lokak.","marrask.","jouluk."],days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],days_abbr:["su","ma","ti","ke","to","pe","la"],dateOrder:["date","month","year"],shortDate:"%d.%m.%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:".",lessThanMinuteAgo:"vajaa
minuutti sitten",minuteAgo:"noin minuutti
sitten",minutesAgo:"{delta} minuuttia
sitten",hourAgo:"noin tunti sitten",hoursAgo:"noin
{delta} tuntia sitten",dayAgo:"päivä
sitten",daysAgo:"{delta} päivää
sitten",weekAgo:"viikko sitten",weeksAgo:"{delta}
viikkoa sitten",monthAgo:"kuukausi
sitten",monthsAgo:"{delta} kuukautta
sitten",yearAgo:"vuosi sitten",yearsAgo:"{delta} vuotta
sitten",lessThanMinuteUntil:"vajaan minuutin
kuluttua",minuteUntil:"noin minuutin
kuluttua",minutesUntil:"{delta} minuutin
kuluttua",hourUntil:"noin tunnin
kuluttua",hoursUntil:"noin {delta} tunnin
kuluttua",dayUntil:"päivän
kuluttua",daysUntil:"{delta} päivän
kuluttua",weekUntil:"viikon
kuluttua",weeksUntil:"{delta} viikon
kuluttua",monthUntil:"kuukauden
kuluttua",monthsUntil:"{delta} kuukauden
kuluttua",yearUntil:"vuoden
kuluttua",yearsUntil:"{delta} vuoden kuluttua"});
Locale.define("fi-FI","FormValidator",{required:"Tämä
kenttä on pakollinen.",minLength:"Ole hyvä ja anna vähintään
{minLength} merkkiä (annoit {length}
merkkiä).",maxLength:"Älä anna enempää kuin {maxLength}
merkkiä (annoit {length} merkkiä).",integer:"Ole hyvä ja anna
kokonaisluku. Luvut, joissa on desimaaleja (esim. 1.25) eivät ole
sallittuja.",numeric:'Anna tähän kenttään lukuarvo (kuten
"1" tai "1.1" tai "-1" tai
"-1.1").',digits:"Käytä pelkästään numeroita ja
välimerkkejä tässä kentässä (syötteet, kuten esim. puhelinnumero,
jossa on väliviivoja, pilkkuja tai pisteitä,
kelpaa).",alpha:"Anna tähän kenttään vain kirjaimia (a-z).
Välilyönnit tai muut merkit eivät ole
sallittuja.",alphanum:"Anna tähän kenttään vain kirjaimia
(a-z) tai numeroita (0-9). Välilyönnit tai muut merkit eivät ole
sallittuja.",dateSuchAs:"Ole hyvä ja anna kelvollinen
päivmäärä, kuten esimerkiksi {date}",dateInFormatMDY:'Ole
hyvä ja anna kelvollinen päivämäärä muodossa pp/kk/vvvv (kuten
"12/31/1999")',email:'Ole hyvä ja anna kelvollinen
sähköpostiosoite (kuten esimerkiksi
"matti@meikalainen.com").',url:"Ole hyvä ja anna
kelvollinen URL, kuten esimerkiksi
http://www.example.com.",currencyDollar:"Ole hyvä ja anna
kelvollinen eurosumma (kuten esimerkiksi 100,00 EUR)
.",oneRequired:"Ole hyvä ja syötä jotakin ainakin johonkin
näistä kentistä.",errorPrefix:"Virhe:
",warningPrefix:"Varoitus: ",noSpace:"Tässä
syötteessä ei voi olla välilyöntejä",reqChkByNode:"Ei
valintoja.",requiredChk:"Tämä kenttä on
pakollinen.",reqChkByName:"Ole hyvä ja valitse
{label}.",match:"Tämän kentän tulee vastata kenttää
{matchName}",startDate:"alkupäivämäärä",endDate:"loppupäivämäärä",currendDate:"nykyinen
päivämäärä",afterDate:"Päivämäärän tulisi olla sama tai
myöhäisempi ajankohta kuin
{label}.",beforeDate:"Päivämäärän tulisi olla sama tai
aikaisempi ajankohta kuin {label}.",startMonth:"Ole hyvä ja
valitse aloituskuukausi",sameMonth:"Näiden kahden
päivämäärän tulee olla saman kuun sisällä -- sinun pitää muuttaa
jompaa kumpaa.",creditcard:"Annettu luottokortin numero ei
kelpaa. Ole hyvä ja tarkista numero sekä yritä uudelleen. {length}
numeroa syötetty."});
Locale.define("fi-FI","Number",{group:"
"}).inherit("EU","Number");Locale.define("fr-FR","Date",{months:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],months_abbr:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],days_abbr:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dateOrder:["date","month","year"],shortDate:"%d/%m/%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:function(a){return(a>1)?"":"er";
},lessThanMinuteAgo:"il y a moins d'une
minute",minuteAgo:"il y a une minute",minutesAgo:"il y
a {delta} minutes",hourAgo:"il y a une
heure",hoursAgo:"il y a {delta} heures",dayAgo:"il y a
un jour",daysAgo:"il y a {delta} jours",weekAgo:"il y a
une semaine",weeksAgo:"il y a {delta}
semaines",monthAgo:"il y a 1 mois",monthsAgo:"il y a
{delta} mois",yearthAgo:"il y a 1 an",yearsAgo:"il y a
{delta} ans",lessThanMinuteUntil:"dans moins d'une
minute",minuteUntil:"dans une
minute",minutesUntil:"dans {delta}
minutes",hourUntil:"dans une heure",hoursUntil:"dans
{delta} heures",dayUntil:"dans un jour",daysUntil:"dans
{delta} jours",weekUntil:"dans 1
semaine",weeksUntil:"dans {delta}
semaines",monthUntil:"dans 1 mois",monthsUntil:"dans
{delta} mois",yearUntil:"dans 1 an",yearsUntil:"dans
{delta} ans"});
Locale.define("fr-FR","FormValidator",{required:"Ce
champ est obligatoire.",length:"Veuillez saisir {length}
caract&egrave;re(s) (vous avez saisi {elLength}
caract&egrave;re(s)",minLength:"Veuillez saisir un minimum de
{minLength} caract&egrave;re(s) (vous avez saisi {length}
caract&egrave;re(s)).",maxLength:"Veuillez saisir un maximum
de {maxLength} caract&egrave;re(s) (vous avez saisi {length}
caract&egrave;re(s)).",integer:'Veuillez saisir un nombre
entier dans ce champ. Les nombres d&eacute;cimaux (ex :
"1,25") ne sont pas
autoris&eacute;s.',numeric:'Veuillez saisir uniquement des
chiffres dans ce champ (ex : "1" ou "1,1" ou
"-1" ou "-1,1").',digits:"Veuillez saisir
uniquement des chiffres et des signes de ponctuation dans ce champ (ex : un
num&eacute;ro de t&eacute;l&eacute;phone avec des traits
d'union est autoris&eacute;).",alpha:"Veuillez saisir
uniquement des lettres (a-z) dans ce champ. Les espaces ou autres
caract&egrave;res ne sont pas
autoris&eacute;s.",alphanum:"Veuillez saisir uniquement des
lettres (a-z) ou des chiffres (0-9) dans ce champ. Les espaces ou autres
caract&egrave;res ne sont pas
autoris&eacute;s.",dateSuchAs:"Veuillez saisir une date
correcte comme {date}",dateInFormatMDY:'Veuillez saisir une date
correcte, au format JJ/MM/AAAA (ex :
"31/11/1999").',email:'Veuillez saisir une adresse de
courrier &eacute;lectronique. Par example
"fred@domaine.com".',url:"Veuillez saisir une URL,
comme http://www.example.com.",currencyDollar:"Veuillez saisir
une quantit&eacute; correcte. Par example
100,00&euro;.",oneRequired:"Veuillez s&eacute;lectionner
au moins une de ces options.",errorPrefix:"Erreur :
",warningPrefix:"Attention : ",noSpace:"Ce champ
n'accepte pas les espaces.",reqChkByNode:"Aucun
&eacute;l&eacute;ment n'est
s&eacute;lectionn&eacute;.",requiredChk:"Ce champ est
obligatoire.",reqChkByName:"Veuillez s&eacute;lectionner
un(e) {label}.",match:"Ce champ doit correspondre avec le champ
{matchName}.",startDate:"date de
d&eacute;but",endDate:"date de
fin",currendDate:"date actuelle",afterDate:"La date
doit &ecirc;tre identique ou post&eacute;rieure &agrave;
{label}.",beforeDate:"La date doit &ecirc;tre identique ou
ant&eacute;rieure &agrave; {label}.",startMonth:"Veuillez
s&eacute;lectionner un mois de
d&eacute;but.",sameMonth:"Ces deux dates doivent
&ecirc;tre dans le m&ecirc;me mois - vous devez en modifier
une.",creditcard:"Le num&eacute;ro de carte de
cr&eacute;dit est invalide. Merci de v&eacute;rifier le
num&eacute;ro et de r&eacute;essayer. Vous avez entr&eacute;
{length} chiffre(s)."});
Locale.define("fr-FR","Number",{group:"
"}).inherit("EU","Number");Locale.define("he-IL","Date",{months:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],months_abbr:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],days:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],days_abbr:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dateOrder:["date","month","year"],shortDate:"%d/%m/%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:0,ordinal:"",lessThanMinuteAgo:"לפני
פחות מדקה",minuteAgo:"לפני
כדקה",minutesAgo:"לפני {delta}
דקות",hourAgo:"לפני
כשעה",hoursAgo:"לפני {delta}
שעות",dayAgo:"לפני יום",daysAgo:"לפני
{delta} ימים",weekAgo:"לפני
שבוע",weeksAgo:"לפני {delta}
שבועות",monthAgo:"לפני
חודש",monthsAgo:"לפני {delta}
חודשים",yearAgo:"לפני
שנה",yearsAgo:"לפני {delta}
שנים",lessThanMinuteUntil:"בעוד פחות
מדקה",minuteUntil:"בעוד
כדקה",minutesUntil:"בעוד {delta}
דקות",hourUntil:"בעוד
כשעה",hoursUntil:"בעוד {delta}
שעות",dayUntil:"בעוד
יום",daysUntil:"בעוד {delta}
ימים",weekUntil:"בעוד
שבוע",weeksUntil:"בעוד {delta}
שבועות",monthUntil:"בעוד
חודש",monthsUntil:"בעוד {delta}
חודשים",yearUntil:"בעוד
שנה",yearsUntil:"בעוד {delta} שנים"});
Locale.define("he-IL","FormValidator",{required:"נא
למלא שדה זה.",minLength:"נא להזין לפחות
{minLength} תווים (הזנת {length}
תווים).",maxLength:"נא להזין עד {maxLength}
תווים (הזנת {length} תווים).",integer:"נא
להזין מספר שלם לשדה זה. מספרים עשרוניים
(כמו 1.25) אינם חוקיים.",numeric:'נא להזין
ערך מספרי בלבד בשדה זה (כמו "1",
"1.1", "-1" או
"-1.1").',digits:"נא להזין רק ספרות
וסימני הפרדה בשדה זה (למשל, מספר טלפון עם
מקפים או נקודות הוא חוקי).",alpha:"נא
להזין רק אותיות באנגלית (a-z) בשדה זה.
רווחים או תווים אחרים אינם
חוקיים.",alphanum:"נא להזין רק אותריות
באנגלית (a-z) או ספרות (0-9) בשדה זה. אווחרים
או תווים אחרים אינם
חוקיים.",dateSuchAs:"נא להזין תאריך חוקי,
כמו {date}",dateInFormatMDY:'נא להזין תאריך
חוקי בפורמט MM/DD/YYYY (כמו
"12/31/1999")',email:'נא להזין כתובת
אימייל חוקית. לדוגמה:
"fred@domain.com".',url:"נא להזין כתובת
אתר חוקית, כמו
http://www.example.com.",currencyDollar:"נא להזין סכום
דולרי חוקי. לדוגמה $100.00.",oneRequired:"נא
לבחור לפחות בשדה אחד.",errorPrefix:"שגיאה:
",warningPrefix:"אזהרה: ",noSpace:"אין
להזין רווחים בשדה זה.",reqChkByNode:"נא
לבחור אחת מהאפשרויות.",requiredChk:"שדה זה
נדרש.",reqChkByName:"נא לבחור
{label}.",match:"שדה זה צריך להתאים לשדה
{matchName}",startDate:"תאריך
ההתחלה",endDate:"תאריך
הסיום",currendDate:"התאריך
הנוכחי",afterDate:"התאריך צריך להיות זהה
או אחרי {label}.",beforeDate:"התאריך צריך
להיות זהה או לפני {label}.",startMonth:"נא
לבחור חודש התחלה",sameMonth:"שני תאריכים
אלה צריכים להיות באותו חודש - נא לשנות אחד
התאריכים.",creditcard:"מספר כרטיס האשראי
שהוזן אינו חוקי. נא לבדוק שנית. הוזנו {length}
ספרות."});
Locale.define("he-IL","Number",{decimal:".",group:",",currency:{suffix:"
₪"}});Locale.define("hu-HU","Date",{months:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],months_abbr:["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."],days:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],days_abbr:["V","H","K","Sze","Cs","P","Szo"],dateOrder:["year","month","date"],shortDate:"%Y.%m.%d.",shortTime:"%I:%M",AM:"de.",PM:"du.",firstDayOfWeek:1,ordinal:".",lessThanMinuteAgo:"alig
egy perce",minuteAgo:"egy perce",minutesAgo:"{delta}
perce",hourAgo:"egy órája",hoursAgo:"{delta}
órája",dayAgo:"1 napja",daysAgo:"{delta}
napja",weekAgo:"1 hete",weeksAgo:"{delta}
hete",monthAgo:"1 hónapja",monthsAgo:"{delta}
hónapja",yearAgo:"1 éve",yearsAgo:"{delta}
éve",lessThanMinuteUntil:"alig egy perc
múlva",minuteUntil:"egy perc
múlva",minutesUntil:"{delta} perc
múlva",hourUntil:"egy óra múlva",hoursUntil:"{delta}
óra múlva",dayUntil:"1 nap múlva",daysUntil:"{delta}
nap múlva",weekUntil:"1 hét
múlva",weeksUntil:"{delta} hét múlva",monthUntil:"1
hónap múlva",monthsUntil:"{delta} hónap
múlva",yearUntil:"1 év múlva",yearsUntil:"{delta}
év múlva"});
Locale.define("hu-HU","FormValidator",{required:"A
mező kitöltése kötelező.",minLength:"Legalább {minLength}
karakter megadása szükséges (megadva {length}
karakter).",maxLength:"Legfeljebb {maxLength} karakter megadása
lehetséges (megadva {length} karakter).",integer:"Egész szám
megadása szükséges. A tizedesjegyek (pl. 1.25) nem
engedélyezettek.",numeric:'Szám megadása szükséges (pl.
"1" vagy "1.1" vagy "-1" vagy
"-1.1").',digits:"Csak számok és írásjelek
megadása lehetséges (pl. telefonszám kötőjelek és/vagy
perjelekkel).",alpha:"Csak betűk (a-z) megadása lehetséges.
Szóköz és egyéb karakterek nem
engedélyezettek.",alphanum:"Csak betűk (a-z) vagy számok (0-9)
megadása lehetséges. Szóköz és egyéb karakterek nem
engedélyezettek.",dateSuchAs:"Valós dátum megadása
szükséges (pl. {date}).",dateInFormatMDY:'Valós dátum
megadása szükséges ÉÉÉÉ.HH.NN. formában. (pl.
"1999.12.31.")',email:'Valós e-mail cím megadása
szükséges (pl. "fred@domain.hu").',url:"Valós URL
megadása szükséges (pl.
http://www.example.com).",currencyDollar:"Valós pénzösszeg
megadása szükséges (pl. 100.00 Ft.).",oneRequired:"Az alábbi
mezők legalább egyikének kitöltése
kötelező.",errorPrefix:"Hiba:
",warningPrefix:"Figyelem: ",noSpace:"A mező nem
tartalmazhat szóközöket.",reqChkByNode:"Nincs egyetlen
kijelölt elem sem.",requiredChk:"A mező kitöltése
kötelező.",reqChkByName:"Egy {label} kiválasztása
szükséges.",match:"A mezőnek egyeznie kell a(z) {matchName}
mezővel.",startDate:"a kezdet dátuma",endDate:"a vég
dátuma",currendDate:"jelenlegi dátum",afterDate:"A
dátum nem lehet kisebb, mint {label}.",beforeDate:"A dátum nem
lehet nagyobb, mint {label}.",startMonth:"Kezdeti hónap
megadása szükséges.",sameMonth:"A két dátumnak ugyanazon
hónapban kell lennie.",creditcard:"A megadott bankkártyaszám
nem valódi (megadva {length} számjegy)."});
Locale.define("it-IT","Date",{months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],months_abbr:["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],days_abbr:["dom","lun","mar","mer","gio","ven","sab"],dateOrder:["date","month","year"],shortDate:"%d/%m/%Y",shortTime:"%H.%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:"º",lessThanMinuteAgo:"meno
di un minuto fa",minuteAgo:"circa un minuto
fa",minutesAgo:"circa {delta} minuti fa",hourAgo:"circa
un'ora fa",hoursAgo:"circa {delta} ore
fa",dayAgo:"circa 1 giorno fa",daysAgo:"circa {delta}
giorni fa",weekAgo:"una settimana fa",weeksAgo:"{delta}
settimane fa",monthAgo:"un mese fa",monthsAgo:"{delta}
mesi fa",yearAgo:"un anno fa",yearsAgo:"{delta} anni
fa",lessThanMinuteUntil:"tra meno di un
minuto",minuteUntil:"tra circa un
minuto",minutesUntil:"tra circa {delta}
minuti",hourUntil:"tra circa
un'ora",hoursUntil:"tra circa {delta}
ore",dayUntil:"tra circa un giorno",daysUntil:"tra
circa {delta} giorni",weekUntil:"tra una
settimana",weeksUntil:"tra {delta}
settimane",monthUntil:"tra un mese",monthsUntil:"tra
{delta} mesi",yearUntil:"tra un anno",yearsUntil:"tra
{delta} anni"});
Locale.define("it-IT","FormValidator",{required:"Il
campo &egrave; obbligatorio.",minLength:"Inserire almeno
{minLength} caratteri (ne sono stati inseriti
{length}).",maxLength:"Inserire al massimo {maxLength} caratteri
(ne sono stati inseriti {length}).",integer:"Inserire un numero
intero. Non sono consentiti decimali (es.:
1.25).",numeric:'Inserire solo valori numerici (es.:
"1" oppure "1.1" oppure "-1" oppure
"-1.1").',digits:"Inserire solo numeri e caratteri di
punteggiatura. Per esempio &egrave; consentito un numero telefonico con
trattini o punti.",alpha:"Inserire solo lettere (a-z). Non sono
consentiti spazi o altri caratteri.",alphanum:"Inserire solo
lettere (a-z) o numeri (0-9). Non sono consentiti spazi o altri
caratteri.",dateSuchAs:"Inserire una data valida del tipo
{date}",dateInFormatMDY:'Inserire una data valida nel formato
MM/GG/AAAA (es.: "12/31/1999")',email:'Inserire un
indirizzo email valido. Per esempio
"nome@dominio.com".',url:'Inserire un indirizzo valido.
Per esempio
"http://www.example.com".',currencyDollar:'Inserire un
importo valido. Per esempio
"$100.00".',oneRequired:"Completare almeno uno dei
campi richiesti.",errorPrefix:"Errore:
",warningPrefix:"Attenzione: ",noSpace:"Non sono
consentiti spazi.",reqChkByNode:"Nessuna voce
selezionata.",requiredChk:"Il campo &egrave;
obbligatorio.",reqChkByName:"Selezionare un(a)
{label}.",match:"Il valore deve corrispondere al campo
{matchName}",startDate:"data
d'inizio",endDate:"data di fine",currendDate:"data
attuale",afterDate:"La data deve corrispondere o essere
successiva al {label}.",beforeDate:"La data deve corrispondere o
essere precedente al {label}.",startMonth:"Selezionare un mese
d'inizio",sameMonth:"Le due date devono essere dello stesso
mese - occorre modificarne una."});
Locale.define("ja-JP","Date",{months:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],months_abbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],days:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],days_abbr:["日","月","火","水","木","金","土"],dateOrder:["year","month","date"],shortDate:"%Y/%m/%d",shortTime:"%H:%M",AM:"午前",PM:"午後",firstDayOfWeek:0,ordinal:"",lessThanMinuteAgo:"1分以内前",minuteAgo:"約1分前",minutesAgo:"約{delta}分前",hourAgo:"約1時間前",hoursAgo:"約{delta}時間前",dayAgo:"1日前",daysAgo:"{delta}日前",weekAgo:"1週間前",weeksAgo:"{delta}週間前",monthAgo:"1ヶ月前",monthsAgo:"{delta}ヶ月前",yearAgo:"1年前",yearsAgo:"{delta}年前",lessThanMinuteUntil:"今から約1分以内",minuteUntil:"今から約1分",minutesUntil:"今から約{delta}分",hourUntil:"今から約1時間",hoursUntil:"今から約{delta}時間",dayUntil:"今から1日間",daysUntil:"今から{delta}日間",weekUntil:"今から1週間",weeksUntil:"今から{delta}週間",monthUntil:"今から1ヶ月",monthsUntil:"今から{delta}ヶ月",yearUntil:"今から1年",yearsUntil:"今から{delta}年"});
Locale.define("ja-JP","FormValidator",{required:"入力は必須です。",minLength:"入力文字数は{minLength}以上にしてください。({length}文字)",maxLength:"入力文字数は{maxLength}以下にしてください。({length}文字)",integer:"整数を入力してください。",numeric:'入力できるのは数値だけです。(例:
"1", "1.1", "-1",
"-1.1"....)',digits:"入力できるのは数値と句読記号です。
(例:
-や+を含む電話番号など).",alpha:"入力できるのは半角英字だけです。それ以外の文字は入力できません。",alphanum:"入力できるのは半角英数字だけです。それ以外の文字は入力できません。",dateSuchAs:"有効な日付を入力してください。{date}",dateInFormatMDY:'日付の書式に誤りがあります。YYYY/MM/DD
(i.e.
"1999/12/31")',email:"メールアドレスに誤りがあります。",url:"URLアドレスに誤りがあります。",currencyDollar:"金額に誤りがあります。",oneRequired:"ひとつ以上入力してください。",errorPrefix:"エラー:
",warningPrefix:"警告:
",noSpace:"スペースは入力できません。",reqChkByNode:"選択されていません。",requiredChk:"この項目は必須です。",reqChkByName:"{label}を選択してください。",match:"{matchName}が入力されている場合必須です。",startDate:"開始日",endDate:"終了日",currendDate:"今日",afterDate:"{label}以降の日付にしてください。",beforeDate:"{label}以前の日付にしてください。",startMonth:"開始月を選択してください。",sameMonth:"日付が同一です。どちらかを変更してください。"});
Locale.define("ja-JP","Number",{decimal:".",group:",",currency:{decimals:0,prefix:"\\"}});Locale.define("nl-NL","Date",{months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],months_abbr:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],days_abbr:["zo","ma","di","wo","do","vr","za"],dateOrder:["date","month","year"],shortDate:"%d-%m-%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:"e",lessThanMinuteAgo:"minder
dan een minuut geleden",minuteAgo:"ongeveer een minuut
geleden",minutesAgo:"{delta} minuten
geleden",hourAgo:"ongeveer een uur
geleden",hoursAgo:"ongeveer {delta} uur
geleden",dayAgo:"een dag geleden",daysAgo:"{delta}
dagen geleden",weekAgo:"een week
geleden",weeksAgo:"{delta} weken geleden",monthAgo:"een
maand geleden",monthsAgo:"{delta} maanden
geleden",yearAgo:"een jaar geleden",yearsAgo:"{delta}
jaar geleden",lessThanMinuteUntil:"over minder dan een
minuut",minuteUntil:"over ongeveer een
minuut",minutesUntil:"over {delta}
minuten",hourUntil:"over ongeveer een
uur",hoursUntil:"over {delta} uur",dayUntil:"over
ongeveer een dag",daysUntil:"over {delta}
dagen",weekUntil:"over een week",weeksUntil:"over
{delta} weken",monthUntil:"over een
maand",monthsUntil:"over {delta}
maanden",yearUntil:"over een jaar",yearsUntil:"over
{delta} jaar"});
Locale.define("nl-NL","FormValidator",{required:"Dit
veld is verplicht.",length:"Vul precies {length} karakters in (je
hebt {elLength} karakters ingevoerd).",minLength:"Vul minimaal
{minLength} karakters in (je hebt {length} karakters
ingevoerd).",maxLength:"Vul niet meer dan {maxLength} karakters
in (je hebt {length} karakters ingevoerd).",integer:"Vul een
getal in. Getallen met decimalen (bijvoorbeeld 1.25) zijn niet
toegestaan.",numeric:'Vul alleen numerieke waarden in
(bijvoorbeeld "1" of "1.1" of "-1" of
"-1.1").',digits:"Vul alleen nummers en leestekens in
(bijvoorbeeld een telefoonnummer met streepjes is
toegestaan).",alpha:"Vul alleen letters in (a-z). Spaties en
andere karakters zijn niet toegestaan.",alphanum:"Vul alleen
letters (a-z) of nummers (0-9) in. Spaties en andere karakters zijn niet
toegestaan.",dateSuchAs:"Vul een geldige datum in, zoals
{date}",dateInFormatMDY:'Vul een geldige datum, in het formaat
MM/DD/YYYY (bijvoorbeeld "12/31/1999")',email:'Vul een
geldig e-mailadres in. Bijvoorbeeld
"fred@domein.nl".',url:"Vul een geldige URL in, zoals
http://www.example.com.",currencyDollar:"Vul een geldig $ bedrag
in. Bijvoorbeeld $100.00 .",oneRequired:"Vul iets in bij in ieder
geval een van deze velden.",warningPrefix:"Waarschuwing:
",errorPrefix:"Fout: ",noSpace:"Spaties zijn niet
toegestaan in dit veld.",reqChkByNode:"Er zijn geen items
geselecteerd.",requiredChk:"Dit veld is
verplicht.",reqChkByName:"Selecteer een
{label}.",match:"Dit veld moet overeen komen met het {matchName}
veld",startDate:"de begin datum",endDate:"de eind
datum",currendDate:"de huidige datum",afterDate:"De
datum moet hetzelfde of na {label} zijn.",beforeDate:"De datum
moet hetzelfde of voor {label} zijn.",startMonth:"Selecteer een
begin maand",sameMonth:"Deze twee data moeten in dezelfde maand
zijn - u moet een van beide aanpassen.",creditcard:"Het ingevulde
creditcardnummer is niet geldig. Controleer het nummer en probeer opnieuw.
{length} getallen ingevuld."});
Locale.define("nl-NL").inherit("EU","Number");Locale.define("no-NO","Date",{dateOrder:["date","month","year"],shortDate:"%d.%m.%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,lessThanMinuteAgo:"kortere
enn et minutt siden",minuteAgo:"omtrent et minutt
siden",minutesAgo:"{delta} minutter
siden",hourAgo:"omtrent en time
siden",hoursAgo:"omtrent {delta} timer
siden",dayAgo:"{delta} dag siden",daysAgo:"{delta}
dager siden"});
Locale.define("no-NO","FormValidator",{required:"Dette
feltet er påkrevd.",minLength:"Vennligst skriv inn minst
{minLength} tegn (du skrev {length} tegn).",maxLength:"Vennligst
skriv inn maksimalt {maxLength} tegn (du skrev {length}
tegn).",integer:"Vennligst skriv inn et tall i dette feltet. Tall
med desimaler (for eksempel 1,25) er ikke
tillat.",numeric:'Vennligst skriv inn kun numeriske verdier i
dette feltet (for eksempel "1", "1.1", "-1"
eller "-1.1").',digits:"Vennligst bruk kun nummer og
skilletegn i dette feltet.",alpha:"Vennligst bruk kun bokstaver
(a-z) i dette feltet. Ingen mellomrom eller andre tegn er
tillat.",alphanum:"Vennligst bruk kun bokstaver (a-z) eller
nummer (0-9) i dette feltet. Ingen mellomrom eller andre tegn er
tillat.",dateSuchAs:"Vennligst skriv inn en gyldig dato, som
{date}",dateInFormatMDY:'Vennligst skriv inn en gyldig dato, i
formatet MM/DD/YYYY (for eksempel
"12/31/1999")',email:'Vennligst skriv inn en gyldig
epost-adresse. For eksempel
"espen@domene.no".',url:"Vennligst skriv inn en gyldig
URL, for eksempel
http://www.example.com.",currencyDollar:"Vennligst fyll ut et
gyldig $ beløp. For eksempel $100.00 .",oneRequired:"Vennligst
fyll ut noe i minst ett av disse feltene.",errorPrefix:"Feil:
",warningPrefix:"Advarsel: "});
Locale.define("pl-PL","Date",{months:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],months_abbr:["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],days:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],days_abbr:["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],dateOrder:["year","month","date"],shortDate:"%Y-%m-%d",shortTime:"%H:%M",AM:"nad
ranem",PM:"po
południu",firstDayOfWeek:1,ordinal:function(a){return(a>3&&a<21)?"ty":["ty","szy","gi","ci","ty"][Math.min(a%10,4)];
},lessThanMinuteAgo:"mniej niż minute
temu",minuteAgo:"około minutę
temu",minutesAgo:"{delta} minut temu",hourAgo:"około
godzinę temu",hoursAgo:"około {delta} godzin
temu",dayAgo:"Wczoraj",daysAgo:"{delta} dni
temu",lessThanMinuteUntil:"za niecałą
minutę",minuteUntil:"za około
minutę",minutesUntil:"za {delta} minut",hourUntil:"za
około godzinę",hoursUntil:"za około {delta}
godzin",dayUntil:"za 1 dzień",daysUntil:"za {delta}
dni"});
Locale.define("pl-PL","FormValidator",{required:"To
pole jest wymagane.",minLength:"Wymagane jest przynajmniej
{minLength} znaków (wpisanych zostało tylko
{length}).",maxLength:"Dozwolone jest nie więcej niż
{maxLength} znaków (wpisanych zostało {length})",integer:"To
pole wymaga liczb całych. Liczby dziesiętne (np. 1.25) są
niedozwolone.",numeric:'Prosimy używać tylko numerycznych
wartości w tym polu (np. "1", "1.1", "-1"
lub "-1.1").',digits:"Prosimy używać liczb oraz
zankow punktuacyjnych w typ polu (dla przykładu, przy numerze telefonu
myślniki i kropki są dozwolone).",alpha:"Prosimy używać tylko
liter (a-z) w tym polu. Spacje oraz inne znaki są
niedozwolone.",alphanum:"Prosimy używać tylko liter (a-z) lub
liczb (0-9) w tym polu. Spacje oraz inne znaki są
niedozwolone.",dateSuchAs:"Prosimy podać prawidłową datę w
formacie: {date}",dateInFormatMDY:'Prosimy podać poprawną date
w formacie DD.MM.RRRR (i.e.
"12.01.2009")',email:'Prosimy podać prawidłowy adres
e-mail, np. "jan@domena.pl".',url:"Prosimy podać
prawidłowy adres URL, np.
http://www.example.com.",currencyDollar:"Prosimy podać
prawidłową sumę w PLN. Dla przykładu: 100.00
PLN.",oneRequired:"Prosimy wypełnić chociaż jedno z
pól.",errorPrefix:"Błąd: ",warningPrefix:"Uwaga:
",noSpace:"W tym polu nie mogą znajdować się
spacje.",reqChkByNode:"Brak zaznaczonych
elementów.",requiredChk:"To pole jest
wymagane.",reqChkByName:"Prosimy wybrać z
{label}.",match:"To pole musi być takie samo jak
{matchName}",startDate:"data początkowa",endDate:"data
końcowa",currendDate:"aktualna data",afterDate:"Podana
data poinna być taka sama lub po {label}.",beforeDate:"Podana
data poinna być taka sama lub przed
{label}.",startMonth:"Prosimy wybrać początkowy
miesiąc.",sameMonth:"Te dwie daty muszą być w zakresie tego
samego miesiąca - wymagana jest zmiana któregoś z pól."});
Locale.define("pt-PT","Date",{months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],months_abbr:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],days:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],days_abbr:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dateOrder:["date","month","year"],shortDate:"%d-%m-%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:"º",lessThanMinuteAgo:"há
menos de um minuto",minuteAgo:"há cerca de um
minuto",minutesAgo:"há {delta} minutos",hourAgo:"há
cerca de uma hora",hoursAgo:"há cerca de {delta}
horas",dayAgo:"há um dia",daysAgo:"há {delta}
dias",weekAgo:"há uma semana",weeksAgo:"há {delta}
semanas",monthAgo:"há um mês",monthsAgo:"há {delta}
meses",yearAgo:"há um ano",yearsAgo:"há {delta}
anos",lessThanMinuteUntil:"em menos de um
minuto",minuteUntil:"em um minuto",minutesUntil:"em
{delta} minutos",hourUntil:"em uma hora",hoursUntil:"em
{delta} horas",dayUntil:"em um dia",daysUntil:"em
{delta} dias",weekUntil:"em uma semana",weeksUntil:"em
{delta} semanas",monthUntil:"em um
mês",monthsUntil:"em {delta} meses",yearUntil:"em um
ano",yearsUntil:"em {delta} anos"});
Locale.define("pt-BR","Date",{shortDate:"%d/%m/%Y"}).inherit("pt-PT","Date");Locale.define("pt-BR","FormValidator",{required:"Este
campo é obrigatório.",minLength:"Digite pelo menos {minLength}
caracteres (tamanho atual: {length}).",maxLength:"Não digite
mais de {maxLength} caracteres (tamanho atual:
{length}).",integer:"Por favor digite apenas um número inteiro
neste campo. Não são permitidos números decimais (por exemplo,
1,25).",numeric:'Por favor digite apenas valores numéricos neste
campo (por exemplo, "1" ou "1.1" ou "-1" ou
"-1,1").',digits:"Por favor use apenas números e
pontuação neste campo (por exemplo, um número de telefone com traços ou
pontos é permitido).",alpha:"Por favor use somente letras (a-z).
Espaço e outros caracteres não são permitidos.",alphanum:"Use
somente letras (a-z) ou números (0-9) neste campo. Espaço e outros
caracteres não são permitidos.",dateSuchAs:"Digite uma data
válida, como {date}",dateInFormatMDY:'Digite uma data válida,
como DD/MM/YYYY (por exemplo,
"31/12/1999")',email:'Digite um endereço de email
válido. Por exemplo "nome@dominio.com".',url:"Digite
uma URL válida. Exemplo:
http://www.example.com.",currencyDollar:"Digite um valor em
dinheiro válido. Exemplo: R$100,00 .",oneRequired:"Digite algo
para pelo menos um desses campos.",errorPrefix:"Erro:
",warningPrefix:"Aviso: ",noSpace:"Não é possível
digitar espaços neste campo.",reqChkByNode:"Não foi selecionado
nenhum item.",requiredChk:"Este campo é
obrigatório.",reqChkByName:"Por favor digite um
{label}.",match:"Este campo deve ser igual ao campo
{matchName}.",startDate:"a data inicial",endDate:"a
data final",currendDate:"a data atual",afterDate:"A
data deve ser igual ou posterior a {label}.",beforeDate:"A data
deve ser igual ou anterior a {label}.",startMonth:"Por favor
selecione uma data inicial.",sameMonth:"Estas duas datas devem
ter o mesmo mês - você deve modificar uma das
duas.",creditcard:"O número do cartão de crédito informado é
inválido. Por favor verifique o valor e tente novamente. {length} números
informados."});
Locale.define("pt-PT","FormValidator",{required:"Este
campo é necessário.",minLength:"Digite pelo menos{minLength}
caracteres (comprimento {length} caracteres).",maxLength:"Não
insira mais de {maxLength} caracteres (comprimento {length}
caracteres).",integer:"Digite um número inteiro neste domínio.
Com números decimais (por exemplo, 1,25), não são
permitidas.",numeric:'Digite apenas valores numéricos neste
domínio (p.ex., "1" ou "1.1" ou "-1" ou
"-1,1").',digits:"Por favor, use números e pontuação
apenas neste campo (p.ex., um número de telefone com traços ou pontos é
permitida).",alpha:"Por favor use somente letras (a-z), com nesta
área. Não utilize espaços nem outros caracteres são
permitidos.",alphanum:"Use somente letras (a-z) ou números (0-9)
neste campo. Não utilize espaços nem outros caracteres são
permitidos.",dateSuchAs:"Digite uma data válida, como
{date}",dateInFormatMDY:'Digite uma data válida, como DD/MM/YYYY
(p.ex. "31/12/1999")',email:'Digite um endereço de
email válido. Por exemplo
"fred@domain.com".',url:"Digite uma URL válida, como
http://www.example.com.",currencyDollar:"Digite um valor válido
$. Por exemplo $ 100,00. ",oneRequired:"Digite algo para pelo
menos um desses insumos.",errorPrefix:"Erro:
",warningPrefix:"Aviso: "});
(function(){var a=function(h,e,d,g,b){var
c=h%10,f=h%100;if(c==1&&f!=11){return
e;}else{if((c==2||c==3||c==4)&&!(f==12||f==13||f==14)){return
d;}else{if(c==0||(c==5||c==6||c==7||c==8||c==9)||(f==11||f==12||f==13||f==14)){return
g;
}else{return
b;}}}};Locale.define("ru-RU","Date",{months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],months_abbr:["янв","февр","март","апр","май","июнь","июль","авг","сент","окт","нояб","дек"],days:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],days_abbr:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],dateOrder:["date","month","year"],shortDate:"%d.%m.%Y",shortTime:"%H:%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:"",lessThanMinuteAgo:"меньше
минуты назад",minuteAgo:"минуту
назад",minutesAgo:function(b){return"{delta}
"+a(b,"минуту","минуты","минут")+"
назад";
},hourAgo:"час
назад",hoursAgo:function(b){return"{delta}
"+a(b,"час","часа","часов")+"
назад";},dayAgo:"вчера",daysAgo:function(b){return"{delta}
"+a(b,"день","дня","дней")+"
назад";
},weekAgo:"неделю
назад",weeksAgo:function(b){return"{delta}
"+a(b,"неделя","недели","недель")+"
назад";},monthAgo:"месяц
назад",monthsAgo:function(b){return"{delta}
"+a(b,"месяц","месяца","месецев")+"
назад";
},yearAgo:"год
назад",yearsAgo:function(b){return"{delta}
"+a(b,"год","года","лет")+"
назад";},lessThanMinuteUntil:"меньше чем через
минуту",minuteUntil:"через
минуту",minutesUntil:function(b){return"через {delta}
"+a(b,"час","часа","часов")+"";
},hourUntil:"через
час",hoursUntil:function(b){return"через {delta}
"+a(b,"час","часа","часов")+"";},dayUntil:"завтра",daysUntil:function(b){return"через
{delta}
"+a(b,"день","дня","дней")+"";
},weekUntil:"через
неделю",weeksUntil:function(b){return"через {delta}
"+a(b,"неделю","недели","недель")+"";},monthUntil:"через
месяц",monthsUntil:function(b){return"через {delta}
"+a(b,"месяц","месяца","месецев")+"";
},yearUntil:"через",yearsUntil:function(b){return"через
{delta}
"+a(b,"год","года","лет")+"";}});})();Locale.define("ru-RU","FormValidator",{required:"Это
поле обязательно к
заполнению.",minLength:"Пожалуйста,
введите хотя бы {minLength} символов (Вы ввели
{length}).",maxLength:"Пожалуйста, введите не
больше {maxLength} символов (Вы ввели
{length}).",integer:"Пожалуйста, введите в
это поле число. Дробные числа (например
1.25) тут не
разрешены.",numeric:'Пожалуйста,
введите в это поле число (например
"1" или "1.1", или "-1", или
"-1.1").',digits:"В этом поле Вы
можете использовать только цифры и знаки
пунктуации (например, телефонный номер
со знаками дефиса или с
точками).",alpha:"В этом поле можно
использовать только латинские буквы (a-z).
Пробелы и другие символы
запрещены.",alphanum:"В этом поле можно
использовать только латинские буквы (a-z)
и цифры (0-9). Пробелы и другие символы
запрещены.",dateSuchAs:"Пожалуйста,
введите корректную дату
{date}",dateInFormatMDY:'Пожалуйста, введите
дату в формате ММ/ДД/ГГГГ (например
"12/31/1999")',email:'Пожалуйста,
введите корректный емейл-адрес. Для
примера
"fred@domain.com".',url:"Пожалуйста,
введите правильную ссылку вида
http://www.example.com.",currencyDollar:"Пожалуйста,
введите сумму в долларах. Например: $100.00
.",oneRequired:"Пожалуйста, выберите хоть
что-нибудь в одном из этих
полей.",errorPrefix:"Ошибка:
",warningPrefix:"Внимание: "});
(function(){var
a=function(f,d,c,e,b){return(f>=1&&f<=3)?arguments[f]:b;};Locale.define("si-SI","Date",{months:["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],months_abbr:["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],days:["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],days_abbr:["ned","pon","tor","sre","čet","pet","sob"],dateOrder:["date","month","year"],shortDate:"%d.%m.%Y",shortTime:"%H.%M",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:".",lessThanMinuteAgo:"manj
kot minuto nazaj",minuteAgo:"minuto
nazaj",minutesAgo:function(b){return"{delta}
"+a(b,"minuto","minuti","minute","minut")+"
nazaj";
},hourAgo:"uro nazaj",hoursAgo:function(b){return"{delta}
"+a(b,"uro","uri","ure","ur")+"
nazaj";},dayAgo:"dan
nazaj",daysAgo:function(b){return"{delta}
"+a(b,"dan","dneva","dni","dni")+"
nazaj";
},weekAgo:"teden nazaj",weeksAgo:function(b){return"{delta}
"+a(b,"teden","tedna","tedne","tednov")+"
nazaj";},monthAgo:"mesec
nazaj",monthsAgo:function(b){return"{delta}
"+a(b,"mesec","meseca","mesece","mesecov")+"
nazaj";
},yearthAgo:"leto nazaj",yearsAgo:function(b){return"{delta}
"+a(b,"leto","leti","leta","let")+"
nazaj";},lessThanMinuteUntil:"še manj kot
minuto",minuteUntil:"še
minuta",minutesUntil:function(b){return"še {delta}
"+a(b,"minuta","minuti","minute","minut");
},hourUntil:"še ura",hoursUntil:function(b){return"še
{delta}
"+a(b,"ura","uri","ure","ur");},dayUntil:"še
dan",daysUntil:function(b){return"še {delta}
"+a(b,"dan","dneva","dnevi","dni");
},weekUntil:"še tedn",weeksUntil:function(b){return"še
{delta}
"+a(b,"teden","tedna","tedni","tednov");},monthUntil:"še
mesec",monthsUntil:function(b){return"še {delta}
"+a(b,"mesec","meseca","meseci","mesecov");
},yearUntil:"še leto",yearsUntil:function(b){return"še
{delta}
"+a(b,"leto","leti","leta","let");}});})();Locale.define("si-SI","FormValidator",{required:"To
polje je obvezno",minLength:"Prosim, vnesite vsaj {minLength}
znakov (vnesli ste {length} znakov).",maxLength:"Prosim, ne
vnesite več kot {maxLength} znakov (vnesli ste {length}
znakov).",integer:"Prosim, vnesite celo število. Decimalna
števila (kot 1,25) niso dovoljena.",numeric:'Prosim, vnesite
samo numerične vrednosti (kot "1" ali "1.1" ali
"-1" ali "-1.1").',digits:"Prosim, uporabite
številke in ločila le na tem polju (na primer, dovoljena je telefonska
številka z pomišlaji ali pikami).",alpha:"Prosim, uporabite le
črke v tem plju. Presledki in drugi znaki niso
dovoljeni.",alphanum:"Prosim, uporabite samo črke ali številke
v tem polju. Presledki in drugi znaki niso
dovoljeni.",dateSuchAs:"Prosim, vnesite pravilen datum kot
{date}",dateInFormatMDY:'Prosim, vnesite pravilen datum kot
MM.DD.YYYY (primer "12.31.1999")',email:'Prosim,
vnesite pravilen email naslov. Na primer
"fred@domain.com".',url:"Prosim, vnesite pravilen URL
kot http://www.example.com.",currencyDollar:"Prosim, vnesit
epravilno vrednost €. Primer 100,00€ .",oneRequired:"Prosimo,
vnesite nekaj za vsaj eno izmed teh polj.",errorPrefix:"Napaka:
",warningPrefix:"Opozorilo: ",noSpace:"To vnosno polje
ne dopušča presledkov.",reqChkByNode:"Nič niste
izbrali.",requiredChk:"To polje je
obvezno",reqChkByName:"Prosim, izberite
{label}.",match:"To polje se mora ujemati z poljem
{matchName}",startDate:"datum začetka",endDate:"datum
konca",currendDate:"trenuten datum",afterDate:"Datum bi
moral biti isti ali po {label}.",beforeDate:"Datum bi moral biti
isti ali pred {label}.",startMonth:"Prosim, vnesite začetni
datum",sameMonth:"Ta dva datuma morata biti v istem mesecu -
premeniti morate eno ali drugo.",creditcard:"Številka kreditne
kartice ni pravilna. Preverite številko ali poskusite še enkrat.
Vnešenih {length} znakov."});
Locale.define("sv-SE","Date",{months:["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],months_abbr:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],days:["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],days_abbr:["sön","mån","tis","ons","tor","fre","lör"],dateOrder:["year","month","date"],shortDate:"%Y-%m-%d",shortTime:"%H:%M",AM:"",PM:"",firstDayOfWeek:1,ordinal:"",lessThanMinuteAgo:"mindre
än en minut sedan",minuteAgo:"ungefär en minut
sedan",minutesAgo:"{delta} minuter
sedan",hourAgo:"ungefär en timme
sedan",hoursAgo:"ungefär {delta} timmar
sedan",dayAgo:"1 dag sedan",daysAgo:"{delta} dagar
sedan",lessThanMinuteUntil:"mindre än en minut
sedan",minuteUntil:"ungefär en minut
sedan",minutesUntil:"{delta} minuter
sedan",hourUntil:"ungefär en timme
sedan",hoursUntil:"ungefär {delta} timmar
sedan",dayUntil:"1 dag sedan",daysUntil:"{delta} dagar
sedan"});
Locale.define("sv-SE","FormValidator",{required:"Fältet
är obligatoriskt.",minLength:"Ange minst {minLength} tecken (du
angav {length} tecken).",maxLength:"Ange högst {maxLength}
tecken (du angav {length} tecken). ",integer:"Ange ett heltal i
fältet. Tal med decimaler (t.ex. 1,25) är inte
tillåtna.",numeric:'Ange endast numeriska värden i detta fält
(t.ex. "1" eller "1.1" eller "-1" eller
"-1,1").',digits:"Använd endast siffror och
skiljetecken i detta fält (till exempel ett telefonnummer med bindestreck
tillåtet).",alpha:"Använd endast bokstäver (a-ö) i detta
fält. Inga mellanslag eller andra tecken är
tillåtna.",alphanum:"Använd endast bokstäver (a-ö) och
siffror (0-9) i detta fält. Inga mellanslag eller andra tecken är
tillåtna.",dateSuchAs:"Ange ett giltigt datum som t.ex.
{date}",dateInFormatMDY:'Ange ett giltigt datum som t.ex.
YYYY-MM-DD (i.e. "1999-12-31")',email:'Ange en giltig
e-postadress. Till exempel
"erik@domain.com".',url:"Ange en giltig webbadress som
http://www.example.com.",currencyDollar:"Ange en giltig belopp.
Exempelvis 100,00.",oneRequired:"Vänligen ange minst ett av
dessa alternativ.",errorPrefix:"Fel:
",warningPrefix:"Varning: ",noSpace:"Det får inte
finnas några mellanslag i detta fält.",reqChkByNode:"Inga
objekt är valda.",requiredChk:"Detta är ett obligatoriskt
fält.",reqChkByName:"Välj en {label}.",match:"Detta
fält måste matcha
{matchName}",startDate:"startdatumet",endDate:"slutdatum",currendDate:"dagens
datum",afterDate:"Datumet bör vara samma eller senare än
{label}.",beforeDate:"Datumet bör vara samma eller tidigare än
{label}.",startMonth:"Välj en start
månad",sameMonth:"Dessa två datum måste vara i samma månad -
du måste ändra det ena eller det andra."});
(function(){var a=function(j,e,c,i,b){var
h=(j/10).toInt(),g=j%10,f=(j/100).toInt();if(h==1&&j>10){return
i;}if(g==1){return e;}if(g>0&&g<5){return c;}return i;
};Locale.define("uk-UA","Date",{months:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],months_abbr:["Січ","Лют","Бер","Квіт","Трав","Черв","Лип","Серп","Вер","Жовт","Лист","Груд"],days:["Неділя","Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота"],days_abbr:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],dateOrder:["date","month","year"],shortDate:"%d/%m/%Y",shortTime:"%H:%M",AM:"до
полудня",PM:"по
полудню",firstDayOfWeek:1,ordinal:"",lessThanMinuteAgo:"меньше
хвилини тому",minuteAgo:"хвилину
тому",minutesAgo:function(b){return"{delta}
"+a(b,"хвилину","хвилини","хвилин")+"
тому";
},hourAgo:"годину
тому",hoursAgo:function(b){return"{delta}
"+a(b,"годину","години","годин")+"
тому";},dayAgo:"вчора",daysAgo:function(b){return"{delta}
"+a(b,"день","дня","днів")+"
тому";
},weekAgo:"тиждень
тому",weeksAgo:function(b){return"{delta}
"+a(b,"тиждень","тижні","тижнів")+"
тому";},monthAgo:"місяць
тому",monthsAgo:function(b){return"{delta}
"+a(b,"місяць","місяці","місяців")+"
тому";
},yearAgo:"рік
тому",yearsAgo:function(b){return"{delta}
"+a(b,"рік","роки","років")+"
тому";},lessThanMinuteUntil:"за
мить",minuteUntil:"через
хвилину",minutesUntil:function(b){return"через
{delta}
"+a(b,"хвилину","хвилини","хвилин");
},hourUntil:"через
годину",hoursUntil:function(b){return"через {delta}
"+a(b,"годину","години","годин");},dayUntil:"завтра",daysUntil:function(b){return"через
{delta}
"+a(b,"день","дня","днів");
},weekUntil:"через
тиждень",weeksUntil:function(b){return"через {delta}
"+a(b,"тиждень","тижні","тижнів");},monthUntil:"через
місяць",monthesUntil:function(b){return"через {delta}
"+a(b,"місяць","місяці","місяців");
},yearUntil:"через
рік",yearsUntil:function(b){return"через {delta}
"+a(b,"рік","роки","років");}});})();Locale.define("uk-UA","FormValidator",{required:"Це
поле повинне бути
заповненим.",minLength:"Введіть хоча б
{minLength} символів (Ви ввели
{length}).",maxLength:"Кількість символів не
може бути більше {maxLength} (Ви ввели
{length}).",integer:"Введіть в це поле число.
Дробові числа (наприклад 1.25) не
дозволені.",numeric:'Введіть в це поле
число (наприклад "1" або "1.1", або
"-1", або "-1.1").',digits:"В цьому
полі ви можете використовувати лише
цифри і знаки пунктіації (наприклад,
телефонний номер з знаками дефізу або з
крапками).",alpha:"В цьому полі можна
використовувати лише латинські літери
(a-z). Пробіли і інші символи
заборонені.",alphanum:"В цьому полі
можна використовувати лише латинські
літери (a-z) і цифри (0-9). Пробіли і інші
символи заборонені.",dateSuchAs:"Введіть
коректну дату
{date}.",dateInFormatMDY:'Введіть дату в
форматі ММ/ДД/РРРР (наприклад
"12/31/2009").',email:'Введіть коректну
адресу електронної пошти (наприклад
"name@domain.com").',url:"Введіть
коректне інтернет-посилання (наприклад
http://www.example.com).",currencyDollar:'Введіть суму
в доларах (наприклад
"$100.00").',oneRequired:"Заповніть одне
з полів.",errorPrefix:"Помилка:
",warningPrefix:"Увага: ",noSpace:"Пробіли
заборонені.",reqChkByNode:"Не відмічено
жодного варіанту.",requiredChk:"Це поле
повинне бути
віміченим.",reqChkByName:"Будь ласка,
відмітьте {label}.",match:"Це поле повинно
відповідати {matchName}",startDate:"початкова
дата",endDate:"кінцева
дата",currendDate:"сьогоднішня
дата",afterDate:"Ця дата повинна бути
такою ж, або пізнішою за
{label}.",beforeDate:"Ця дата повинна бути
такою ж, або ранішою за
{label}.",startMonth:"Будь ласка, виберіть
початковий місяць",sameMonth:"Ці дати
повинні відноситись одного і того ж
місяця. Будь ласка, змініть одну з
них.",creditcard:"Номер кредитної карти
введений неправильно. Будь ласка,
перевірте його. Введено {length}
символів."});
Locale.define("zh-CHS","Date",{months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],months_abbr:["一","二","三","四","五","六","七","八","九","十","十一","十二"],days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],days_abbr:["日","一","二","三","四","五","六"],dateOrder:["year","month","date"],shortDate:"%Y-%m-%d",shortTime:"%I:%M%p",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:"",lessThanMinuteAgo:"不到1分钟前",minuteAgo:"大约1分钟前",minutesAgo:"{delta}分钟之前",hourAgo:"大约1小时前",hoursAgo:"大约{delta}小时前",dayAgo:"1天前",daysAgo:"{delta}天前",weekAgo:"1星期前",weeksAgo:"{delta}星期前",monthAgo:"1个月前",monthsAgo:"{delta}个月前",yearAgo:"1年前",yearsAgo:"{delta}年前",lessThanMinuteUntil:"从现在开始不到1分钟",minuteUntil:"从现在开始約1分钟",minutesUntil:"从现在开始约{delta}分钟",hourUntil:"从现在开始1小时",hoursUntil:"从现在开始约{delta}小时",dayUntil:"从现在开始1天",daysUntil:"从现在开始{delta}天",weekUntil:"从现在开始1星期",weeksUntil:"从现在开始{delta}星期",monthUntil:"从现在开始一个月",monthsUntil:"从现在开始{delta}个月",yearUntil:"从现在开始1年",yearsUntil:"从现在开始{delta}年"});
Locale.define("zh-CHT","Date",{months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],months_abbr:["一","二","三","四","五","六","七","八","九","十","十一","十二"],days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],days_abbr:["日","一","二","三","四","五","六"],dateOrder:["year","month","date"],shortDate:"%Y-%m-%d",shortTime:"%I:%M%p",AM:"AM",PM:"PM",firstDayOfWeek:1,ordinal:"",lessThanMinuteAgo:"不到1分鐘前",minuteAgo:"大約1分鐘前",minutesAgo:"{delta}分鐘之前",hourAgo:"大約1小時前",hoursAgo:"大約{delta}小時前",dayAgo:"1天前",daysAgo:"{delta}天前",weekAgo:"1星期前",weeksAgo:"{delta}星期前",monthAgo:"1个月前",monthsAgo:"{delta}个月前",yearAgo:"1年前",yearsAgo:"{delta}年前",lessThanMinuteUntil:"從現在開始不到1分鐘",minuteUntil:"從現在開始約1分鐘",minutesUntil:"從現在開始約{delta}分鐘",hourUntil:"從現在開始1小時",hoursUntil:"從現在開始約{delta}小時",dayUntil:"從現在開始1天",daysUntil:"從現在開始{delta}天",weekUntil:"從現在開始1星期",weeksUntil:"從現在開始{delta}星期",monthUntil:"從現在開始一個月",monthsUntil:"從現在開始{delta}個月",yearUntil:"從現在開始1年",yearsUntil:"從現在開始{delta}年"});
Locale.define("zh-CHS","FormValidator",{required:"此项必填。",minLength:"请至少输入
{minLength} 个字符 (已输入 {length}
个)。",maxLength:"最多只能输入 {maxLength} 个字符
(已输入 {length}
个)。",integer:'请输入一个整数,不能包含小数点。例如:"1",
"200"。',numeric:'请输入一个数字,例如:"1",
"1.1", "-1",
"-1.1"。',digits:"请输入由数字和标点符号组成的内容。例如电话号码。",alpha:"请输入
A-Z 的 26
个字母,不能包含空格或任何其他字符。",alphanum:"请输入
A-Z 的 26 个字母或 0-9 的 10
个数字,不能包含空格或任何其他字符。",dateSuchAs:"请输入合法的日期格式,如:{date}。",dateInFormatMDY:'请输入合法的日期格式,例如:YYYY-MM-DD
("2010-12-31")。',email:'请输入合法的电子信箱地址,例如:"fred@domain.com"。',url:"请输入合法的
Url
地址,例如:http://www.example.com。",currencyDollar:"请输入合法的货币符号,例如:¥100.0",oneRequired:"请至少选择一项。",errorPrefix:"错误:",warningPrefix:"警告:",noSpace:"不能包含空格。",reqChkByNode:"未选择任何内容。",requiredChk:"此项必填。",reqChkByName:"请选择
{label}.",match:"必须与{matchName}相匹配",startDate:"起始日期",endDate:"结束日期",currendDate:"当前日期",afterDate:"日期必须等于或晚于
{label}.",beforeDate:"日期必须早于或等于
{label}.",startMonth:"请选择起始月份",sameMonth:"您必须修改两个日期中的一个,以确保它们在同一月份。",creditcard:"您输入的信用卡号码不正确。当前已输入{length}个字符。"});
Locale.define("zh-CHT","FormValidator",{required:"此項必填。
",minLength:"請至少輸入{minLength}
個字符(已輸入{length} 個)。
",maxLength:"最多只能輸入{maxLength}
個字符(已輸入{length} 個)。
",integer:'請輸入一個整數,不能包含小數點。例如:"1",
"200"。
',numeric:'請輸入一個數字,例如:"1",
"1.1", "-1", "-1.1"。
',digits:"請輸入由數字和標點符號組成的內容。例如電話號碼。
",alpha:"請輸入AZ 的26
個字母,不能包含空格或任何其他字符。
",alphanum:"請輸入AZ 的26 個字母或0-9 的10
個數字,不能包含空格或任何其他字符。
",dateSuchAs:"請輸入合法的日期格式,如:{date}。
",dateInFormatMDY:'請輸入合法的日期格式,例如:YYYY-MM-DD
("2010-12-31")。
',email:'請輸入合法的電子信箱地址,例如:"fred@domain.com"。
',url:"請輸入合法的Url
地址,例如:http://www.example.com。
",currencyDollar:"請輸入合法的貨幣符號,例如:¥100.0",oneRequired:"請至少選擇一項。
",errorPrefix:"錯誤:",warningPrefix:"警告:",noSpace:"不能包含空格。
",reqChkByNode:"未選擇任何內容。
",requiredChk:"此項必填。
",reqChkByName:"請選擇
{label}.",match:"必須與{matchName}相匹配",startDate:"起始日期",endDate:"結束日期",currendDate:"當前日期",afterDate:"日期必須等於或晚於{label}.",beforeDate:"日期必須早於或等於{label}.",startMonth:"請選擇起始月份",sameMonth:"您必須修改兩個日期中的一個,以確保它們在同一月份。
",creditcard:"您輸入的信用卡號碼不正確。當前已輸入{length}個字符。
"});
Form.Validator.add("validate-currency-yuan",{errorMsg:function(){return
Form.Validator.getMsg("currencyYuan");},test:function(a){return
Form.Validator.getValidator("IsEmpty").test(a)||(/^¥?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(a.get("value"));
}});PK`n�['k���U�Ujs/mootree-uncompressed.jsnu�[���/*
Script: mootree.js
	My Object Oriented Tree
	- Developed by Rasmus Schultz, <http://www.mindplay.dk>
	- Tested with MooTools release 1.2, under Firefox 2, Opera 9 and Internet
Explorer 6 and 7.

License:
	MIT-style license.

Credits:
	Inspired by:
	- WebFX xTree, <http://webfx.eae.net/dhtml/xtree/>
	- Destroydrop dTree, <http://www.destroydrop.com/javascripts/tree/>

Changes:

	rev.12:
	- load() only worked once on the same node, fixed.
	- the script would sometimes try to get 'R' from the server,
fixed.
	- the 'load' attribute is now supported in XML files (see
example_5.html).

	rev.13:
	- enable() and disable() added - the adopt() and load() methods use these
to improve performance by minimizing the number of visual updates.

	rev.14:
	- toggle() was using enable() and disable() which actually caused it to do
extra work - fixed.

	rev.15:
	- adopt() now picks up 'href', 'target',
'title' and 'name' attributes of the a-tag, and stores
them in the data object.
	- adopt() now picks up additional constructor arguments from embedded
comments, e.g. icons, colors, etc.
	- documentation now generates properly with NaturalDocs,
<http://www.naturaldocs.org/>

	rev.16:
	- onClick events added to MooTreeControl and MooTreeNode
	- nodes can now have id's - <MooTreeControl.get> method can be
used to find a node with a given id

	rev.17:
	- changed icon rendering to use innerHTML, making the control faster (and
code size slightly smaller).

	rev.18:
	- migrated to MooTools 1.2 (previous versions no longer supported)

*/

var MooTreeIcon =
['I','L','Lminus','Lplus','Rminus','Rplus','T','Tminus','Tplus','_closed','_doc','_open','minus','plus'];

/*
Class: MooTreeControl
	This class implements a tree control.

Properties:
	root - returns the root <MooTreeNode> object.
	selected - returns the currently selected <MooTreeNode> object, or
null if nothing is currently selected.

Events:
	onExpand - called when a node is expanded or collapsed: function(node,
state) - where node is the <MooTreeNode> object that fired the event,
and state is a boolean meaning true:expanded or false:collapsed.
	onSelect - called when a node is selected or deselected: function(node,
state) - where node is the <MooTreeNode> object that fired the event,
and state is a boolean meaning true:selected or false:deselected.
	onClick - called when a node is clicked: function(node) - where node is
the <MooTreeNode> object that fired the event.

Parameters:
	The constructor takes two object parameters: config and options.
	The first, config, contains global settings for the tree control - you can
use the configuration options listed below.
	The second, options, should contain options for the <MooTreeNode>
constructor - please refer to the options listed in the <MooTreeNode>
documentation.

Config:
	div - a string representing the div Element inside which to build the tree
control.
	mode - optional string, defaults to 'files' - specifies default
icon behavior. In 'files' mode, empty nodes have a document icon
- whereas, in 'folders' mode, all nodes are displayed as folders
(a'la explorer).
	grid - boolean, defaults to false. If set to true, a grid is drawn to
outline the structure of the tree.

	theme - string, optional, defaults to 'mootree.gif' - specifies
the 'theme' GIF to use.

	loader - optional, an options object for the <MooTreeNode>
constructor - defaults to {icon:'mootree_loader.gif',
text:'Loading...', color:'a0a0a0'}

	onExpand - optional function (see Events above)
	onSelect - optional function (see Events above)

*/

var MooTreeControl = new Class({

	initialize: function(config, options) {

		options.control = this;               // make sure our new MooTreeNode
knows who it's owner control is
		options.div = config.div;             // tells the root node which div to
insert itself into
		this.root = new MooTreeNode(options); // create the root node of this
tree control

		this.index = new Object();            // used by the get() method

		this.enabled = true;                  // enable visual updates of the
control

		this.theme = config.theme || 'mootree.gif';

		this.loader = config.loader || {icon:'mootree_loader.gif',
text:'Loading...', color:'#a0a0a0'};

		this.selected = null;                 // set the currently selected node
to nothing
		this.mode = config.mode;              // mode can be "folders"
or "files", and affects the default icons
		this.grid = config.grid;              // grid can be turned on (true) or
off (false)

		this.onExpand = config.onExpand || new Function(); // called when any
node in the tree is expanded/collapsed
		this.onSelect = config.onSelect || new Function(); // called when any
node in the tree is selected/deselected
		this.onClick = config.onClick || new Function(); // called when any node
in the tree is clicked

		this.root.update(true);

	},

	/*
	Property: insert
		Creates a new node under the root node of this tree.

	Parameters:
		options - an object containing the same options available to the
<MooTreeNode> constructor.

	Returns:
		A new <MooTreeNode> instance.
	*/

	insert: function(options) {
		options.control = this;
		return this.root.insert(options);
	},

	/*
	Property: select
		Sets the currently selected node.
		This is called by <MooTreeNode> when a node is selected (e.g. by
clicking it's title with the mouse).

	Parameters:
		node - the <MooTreeNode> object to select.
	*/

	select: function(node) {
		this.onClick(node); node.onClick(); // fire click events
		if (this.selected === node) return; // already selected
		if (this.selected) {
			// deselect previously selected node:
			this.selected.select(false);
			this.onSelect(this.selected, false);
		}
		// select new node:
		this.selected = node;
		node.select(true);
		this.onSelect(node, true);
	},

	/*
	Property: expand
		Expands the entire tree, recursively.
	*/

	expand: function() {
		this.root.toggle(true, true);
	},

	/*
	Property: collapse
		Collapses the entire tree, recursively.
	*/

	collapse: function() {
		this.root.toggle(true, false);
	},

	/*
	Property: get
		Retrieves the node with the given id - or null, if no node with the given
id exists.

	Parameters:
		id - a string, the id of the node you wish to retrieve.

	Note:
		Node id can be assigned via the <MooTreeNode> constructor, e.g.
using the <MooTreeNode.insert> method.
	*/

	get: function(id) {
		return this.index[id] || null;
	},

	/*
	Property: adopt
		Adopts a structure of nested ul/li/a elements as tree nodes, then removes
the original elements.

	Parameters:
		id - a string representing the ul element to be adopted, or an element
reference.
		parentNode - optional, a <MooTreeNode> object under which to import
the specified ul element. Defaults to the root node of the parent control.

	Note:
		The ul/li structure must be properly nested, and each li-element must
contain one a-element, e.g.:

		><ul id="mytree">
		>  <li><a href="test.html">Item
One</a></li>
		>  <li><a href="test.html">Item Two</a>
		>    <ul>
		>      <li><a href="test.html">Item Two Point
One</a></li>
		>      <li><a href="test.html">Item Two Point
Two</a></li>
		>    </ul>
		>  </li>
		>  <li><a href="test.html"><!-- icon:_doc;
color:#ff0000 -->Item Three</a></li>
		></ul>

		The "href", "target", "title" and
"name" attributes of the a-tags are picked up and stored in the
		data property of the node.

		CSS-style comments inside a-tags are parsed, and treated as arguments for
<MooTreeNode> constructor,
		e.g. "icon", "openicon", "color", etc.
	*/

	adopt: function(id, parentNode) {
		if (parentNode === undefined) parentNode = this.root;
		this.disable();
		this._adopt(id, parentNode);
		parentNode.update(true);
		document.id(id).destroy();
		this.enable();
	},

	_adopt: function(id, parentNode) {
		/* adopts a structure of ul/li elements into this tree */
		e = document.id(id);
		var i=0, c = e.getChildren();
		for (i=0; i<c.length; i++) {
			if (c[i].nodeName == 'LI') {
				var con={text:''}, comment='', node=null,
subul=null;
				var n=0, z=0, se=null, s = c[i].getChildren();
				for (n=0; n<s.length; n++) {
					switch (s[n].nodeName) {
						case 'A':
							for (z=0; z<s[n].childNodes.length; z++) {
								se = s[n].childNodes[z];
								switch (se.nodeName) {
									case '#text': con.text += se.nodeValue; break;
									case '#comment': comment += se.nodeValue; break;
								}
							}
							con.data =
s[n].getProperties('href','target','title','name');
						break;
						case 'UL':
							subul = s[n];
						break;
					}
				}
				if (con.label != '') {
					con.data.url = con.data['href']; // (for backwards
compatibility)
					if (comment != '') {
						var bits = comment.split(';');
						for (z=0; z<bits.length; z++) {
							var pcs = bits[z].trim().split(':');
							if (pcs.length == 2) con[pcs[0].trim()] = pcs[1].trim();
						}
					}
					if (c[i].id != null) {
						con.id = 'node_'+c[i].id;
					}
					node = parentNode.insert(con);
					if (subul) this._adopt(subul, node);
				}
			}
		}
	},

	/*
	Property: disable
		Call this to temporarily disable visual updates -- if you need to
insert/remove many nodes
		at a time, many visual updates would normally occur. By temporarily
disabling the control,
		these visual updates will be skipped.

		When you're done making changes, call <MooTreeControl.enable>
to turn on visual updates
		again, and automatically repaint all nodes that were changed.
	*/

	disable: function() {
		this.enabled = false;
	},

	/*
	Property: enable
		Enables visual updates again after a call to
<MooTreeControl.disable>
	*/

	enable: function() {
		this.enabled = true;
		this.root.update(true, true);
	}

});

/*
Class: MooTreeNode
	This class implements the functionality of a single node in a
<MooTreeControl>.

Note:
	You should not manually create objects of this class -- rather, you should
use
	<MooTreeControl.insert> to create nodes in the root of the tree, and
then use
	the similar function <MooTreeNode.insert> to create subnodes.

	Both insert methods have a similar syntax, and both return the newly
created
	<MooTreeNode> object.

Parameters:
	options - an object. See options below.

Options:
	text - this is the displayed text of the node, and as such as is the only
required parameter.
	id - string, optional - if specified, must be a unique node identifier.
Nodes with id can be retrieved using the <MooTreeControl.get> method.
	color - string, optional - if specified, must be a six-digit hexadecimal
RGB color code.

	open - boolean value, defaults to false. Use true if you want the node
open from the start.

	icon - use this to customize the icon of the node. The following
predefined values may be used: '_open', '_closed' and
'_doc'. Alternatively, specify the URL of a GIF or PNG image to
use - this should be exactly 18x18 pixels in size. If you have a strip of
images, you can specify an image number (e.g. 'my_icons.gif#4'
for icon number 4).
	openicon - use this to customize the icon of the node when it's open.

	data - an object containing whatever data you wish to associate with this
node (such as an url and/or an id, etc.)

Events:
	onExpand - called when the node is expanded or collapsed: function(state)
- where state is a boolean meaning true:expanded or false:collapsed.
	onSelect - called when the node is selected or deselected: function(state)
- where state is a boolean meaning true:selected or false:deselected.
	onClick - called when the node is clicked (no arguments).
*/

var MooTreeNode = new Class({

	initialize: function(options) {

		this.text = options.text;       // the text displayed by this node
		this.id = options.id || null;   // the node's unique id
		this.nodes = new Array();       // subnodes nested beneath this node
(MooTreeNode objects)
		this.parent = null;             // this node's parent node (another
MooTreeNode object)
		this.last = true;               // a flag telling whether this node is
the last (bottom) node of it's parent
		this.control = options.control; // owner control of this node's tree
		this.selected = false;          // a flag telling whether this node is
the currently selected node in it's tree

		this.color = options.color || null; // text color of this node

		this.data = options.data || {}; // optional object containing whatever
data you wish to associate with the node (typically an url or an id)

		this.onExpand = options.onExpand || new Function(); // called when the
individual node is expanded/collapsed
		this.onSelect = options.onSelect || new Function(); // called when the
individual node is selected/deselected
		this.onClick = options.onClick || new Function(); // called when the
individual node is clicked

		this.open = options.open ? true : false; // flag: node open or closed?

		this.icon = options.icon;
		this.openicon = options.openicon || this.icon;

		// add the node to the control's node index:
		if (this.id) this.control.index[this.id] = this;

		// create the necessary divs:
		this.div = {
			main: new Element('div').addClass('mooTree_node'),
			indent: new Element('div'),
			gadget: new Element('div'),
			icon: new Element('div'),
			text: new Element('div').addClass('mooTree_text'),
			sub: new Element('div')
		}

		// put the other divs under the main div:
		this.div.main.adopt(this.div.indent);
		this.div.main.adopt(this.div.gadget);
		this.div.main.adopt(this.div.icon);
		this.div.main.adopt(this.div.text);

		// put the main and sub divs in the specified parent div:
		document.id(options.div).adopt(this.div.main);
		document.id(options.div).adopt(this.div.sub);

		// attach event handler to gadget:
		this.div.gadget._node = this;
		this.div.gadget.onclick = this.div.gadget.ondblclick = function() {
			this._node.toggle();
		}

		// attach event handler to icon/text:
		this.div.icon._node = this.div.text._node = this;
		this.div.icon.onclick = this.div.icon.ondblclick = this.div.text.onclick
= this.div.text.ondblclick = function() {
			this._node.control.select(this._node);
		}

	},

	/*
	Property: insert
		Creates a new node, nested inside this one.

	Parameters:
		options - an object containing the same options available to the
<MooTreeNode> constructor.

	Returns:
		A new <MooTreeNode> instance.
	*/

	insert: function(options) {

		// set the parent div and create the node:
		options.div = this.div.sub;
		options.control = this.control;
		var node = new MooTreeNode(options);

		// set the new node's parent:
		node.parent = this;

		// mark this node's last node as no longer being the last, then add
the new last node:
		var n = this.nodes;
		if (n.length) n[n.length-1].last = false;
		n.push(node);

		// repaint the new node:
		node.update();

		// repaint the new node's parent (this node):
		if (n.length == 1) this.update();

		// recursively repaint the new node's previous sibling node:
		if (n.length > 1) n[n.length-2].update(true);

		return node;

	},

	/*
	Property: remove
		Removes this node, and all of it's child nodes. If you want to
remove all the childnodes without removing the node itself, use
<MooTreeNode.clear>
	*/

	remove: function() {
		var p = this.parent;
		this._remove();
		p.update(true);
	},

	_remove: function() {

		// recursively remove this node's subnodes:
		var n = this.nodes;
		while (n.length) n[n.length-1]._remove();

		// remove the node id from the control's index:
		delete this.control.index[this.id];

		// remove this node's divs:
		this.div.main.destroy();
		this.div.sub.destroy();

		if (this.parent) {

			// remove this node from the parent's collection of nodes:
			var p = this.parent.nodes;
			p.erase(this);

			// in case we removed the parent's last node, flag it's
current last node as being the last:
			if (p.length) p[p.length-1].last = true;

		}

	},

	/*
	Property: clear
		Removes all child nodes under this node, without removing the node
itself.
		To remove all nodes including this one, use <MooTreeNode.remove>
	*/

	clear: function() {
		this.control.disable();
		while (this.nodes.length) this.nodes[this.nodes.length-1].remove();
		this.control.enable();
	},

	/*
	Property: update
		Update the tree node's visual appearance.

	Parameters:
		recursive - boolean, defaults to false. If true, recursively updates all
nodes beneath this one.
		invalidated - boolean, defaults to false. If true, updates only nodes
that have been invalidated while the control has been disabled.
	*/

	update: function(recursive, invalidated) {

		var draw = true;

		if (!this.control.enabled) {
			// control is currently disabled, so we don't do any visual updates
			this.invalidated = true;
			draw = false;
		}

		if (invalidated) {
			if (!this.invalidated) {
				draw = false; // this one is still valid, don't draw
			} else {
				this.invalidated = false; // we're drawing this item now
			}
		}

		if (draw) {

			var x;

			// make selected, or not:
			this.div.main.className = 'mooTree_node' + (this.selected ?
' mooTree_selected' : '');

			// update indentations:
			var p = this, i = '';
			while (p.parent) {
				p = p.parent;
				i = this.getImg(p.last || !this.control.grid ? '' :
'I') + i;
			}
			this.div.indent.innerHTML = i;

			// update the text:
			x = this.div.text;
			x.empty();
			x.appendText(this.text);
			if (this.color) x.style.color = this.color;

			// update the icon:
			this.div.icon.innerHTML = this.getImg( this.nodes.length ? ( this.open ?
(this.openicon || this.icon || '_open') : (this.icon ||
'_closed') ) : ( this.icon || (this.control.mode ==
'folders' ? '_closed' : '_doc') ) );

			// update the plus/minus gadget:
			this.div.gadget.innerHTML = this.getImg( ( this.control.grid ? (
this.control.root == this ? (this.nodes.length ? 'R' :
'') : (this.last?'L':'T') ) : '') +
(this.nodes.length ? (this.open?'minus':'plus') :
'') );

			// show/hide subnodes:
			this.div.sub.style.display = this.open ? 'block' :
'none';

		}

		// if recursively updating, update all child nodes:
		if (recursive) this.nodes.forEach( function(node) {
			node.update(true, invalidated);
		});

	},

	/*
	Property: getImg
		Creates a new image, in the form of HTML for a DIV element with
appropriate style.
		You should not need to manually call this method. (though if for some
reason you want to, you can)

	Parameters:
		name - the name of new image to create, defined by <MooTreeIcon> or
located in an external file.

	Returns:
		The HTML for a new div Element.
	*/

	getImg: function(name) {

		var html = '<div class="mooTree_img"';

		if (name != '') {
			var img = this.control.theme;
			var i = MooTreeIcon.indexOf(name);
			if (i == -1) {
				// custom (external) icon:
				var x = name.split('#');
				img = x[0];
				i = (x.length == 2 ? parseInt(x[1])-1 : 0);
			}
			html += ' style="background-image:url(' + img + ');
background-position:-' + (i*18) + 'px 0px;"';
		}

		html += "></div>";

		return html;

	},

	/*
	Property: toggle
		By default (with no arguments) this function toggles the node between
expanded/collapsed.
		Can also be used to recursively expand/collapse all or part of the tree.

	Parameters:
		recursive - boolean, defaults to false. With recursive set to true, all
child nodes are recursively toggle to this node's new state.
		state - boolean. If undefined, the node's state is toggled. If true
or false, the node can be explicitly opened or closed.
	*/

	toggle: function(recursive, state) {

		this.open = (state === undefined ? !this.open : state);
		this.update();

		this.onExpand(this.open);
		this.control.onExpand(this, this.open);

		if (recursive) this.nodes.forEach( function(node) {
			node.toggle(true, this.open);
		}, this);

	},

	/*
	Property: select
		Called by <MooTreeControl> when the selection changes.
		You should not manually call this method - to set the selection, use the
<MooTreeControl.select> method.
	*/

	select: function(state) {
		this.selected = state;
		this.update();
		this.onSelect(state);
	},

	/*
	Property: load
		Asynchronously load an XML structure into a node of this tree.

	Parameters:
		url - string, required, specifies the URL from which to load the XML
document.
		vars - query string, optional.
	*/

	load: function(url, vars) {

		if (this.loading) return; // if this node is already loading, return
		this.loading = true;      // flag this node as loading

		this.toggle(false, true); // expand the node to make the loader visible

		this.clear();

		this.insert(this.control.loader);

		var f = function() {
			new Request({
				method: 'GET',
				url: url,
				onSuccess: this._loaded.bind(this),
				onFailure: this._load_err.bind(this)
			}).send(vars || '');
		}.bind(this).delay(20);

		//window.setTimeout(f.bind(this), 20); // allowing a small delay for the
browser to draw the loader-icon.

	},

	_loaded: function(text, xml) {
		// called on success - import nodes from the root element:
		this.control.disable();
		this.clear();
		this._import(xml.documentElement);
		this.control.enable();
		this.loading = false;
	},

	_import: function(e) {
		// import childnodes from an xml element:
		var n = e.childNodes;
		for (var i=0; i<n.length; i++) if (n[i].tagName == 'node') {
			var opt = {data:{}};
			var a = n[i].attributes;
			for (var t=0; t<a.length; t++) {
				switch (a[t].name) {
					case 'text':
					case 'id':
					case 'icon':
					case 'openicon':
					case 'color':
					case 'open':
						opt[a[t].name] = a[t].value;
						break;
					default:
						opt.data[a[t].name] = a[t].value;
				}
			}
			var node = this.insert(opt);
			if (node.data.load) {
				node.open = false; // can't have a dynamically loading node
that's already open!
				node.insert(this.control.loader);
				node.onExpand = function(state) {
					this.load(this.data.load);
					this.onExpand = new Function();
				}
			}
			// recursively import subnodes of this node:
			if (n[i].childNodes.length) node._import(n[i]);
		}
	},

	_load_err: function(req) {
		window.alert('Error loading: ' + this.text);
	}

});
PK`n�[q4x��
js/mootree.jsnu�[���var
MooTreeIcon="I,L,Lminus,Lplus,Rminus,Rplus,T,Tminus,Tplus,_closed,_doc,_open,minus,plus".split(","),MooTreeControl=new
Class({initialize:function(a,b){b.control=this;b.div=a.div;this.root=new
MooTreeNode(b);this.index={};this.enabled=!0;this.theme=a.theme||"mootree.gif";this.loader=a.loader||{icon:"mootree_loader.gif",text:"Loading...",color:"#a0a0a0"};this.selected=null;this.mode=a.mode;this.grid=a.grid;this.onExpand=a.onExpand||new
Function;this.onSelect=a.onSelect||new Function;this.onClick=
a.onClick||new
Function;this.root.update(!0)},insert:function(a){a.control=this;return
this.root.insert(a)},select:function(a){this.onClick(a);a.onClick();this.selected!==a&&(this.selected&&(this.selected.select(!1),this.onSelect(this.selected,!1)),this.selected=a,a.select(!0),this.onSelect(a,!0))},expand:function(){this.root.toggle(!0,!0)},collapse:function(){this.root.toggle(!0,!1)},get:function(a){return
this.index[a]||null},adopt:function(a,b){void
0===b&&(b=this.root);this.disable();this._adopt(a,
b);b.update(!0);document.id(a).destroy();this.enable()},_adopt:function(a,b){e=document.id(a);for(var
c=0,d=e.getChildren(),c=0;c<d.length;c++)if("LI"==d[c].nodeName){for(var
f={text:""},i="",h=null,l=null,g=0,h=0,k=null,j=d[c].getChildren(),g=0;g<j.length;g++)switch(j[g].nodeName){case
"A":for(h=0;h<j[g].childNodes.length;h++)switch(k=j[g].childNodes[h],k.nodeName){case
"#text":f.text+=k.nodeValue;break;case
"#comment":i+=k.nodeValue}f.data=j[g].getProperties("href","target","title","name");break;
case
"UL":l=j[g]}if(""!=f.label){f.data.url=f.data.href;if(""!=i){i=i.split(";");for(h=0;h<i.length;h++)g=i[h].trim().split(":"),2==g.length&&(f[g[0].trim()]=g[1].trim())}null!=d[c].id&&(f.id="node_"+d[c].id);h=b.insert(f);l&&this._adopt(l,h)}}},disable:function(){this.enabled=!1},enable:function(){this.enabled=!0;this.root.update(!0,!0)}}),MooTreeNode=new
Class({initialize:function(a){this.text=a.text;this.id=a.id||null;this.nodes=[];this.parent=null;this.last=!0;this.control=a.control;this.selected=
!1;this.color=a.color||null;this.data=a.data||{};this.onExpand=a.onExpand||new
Function;this.onSelect=a.onSelect||new Function;this.onClick=a.onClick||new
Function;this.open=a.open?!0:!1;this.icon=a.icon;this.openicon=a.openicon||this.icon;this.id&&(this.control.index[this.id]=this);this.div={main:(new
Element("div")).addClass("mooTree_node"),indent:new
Element("div"),gadget:new Element("div"),icon:new
Element("div"),text:(new
Element("div")).addClass("mooTree_text"),sub:new
Element("div")};this.div.main.adopt(this.div.indent);
this.div.main.adopt(this.div.gadget);this.div.main.adopt(this.div.icon);this.div.main.adopt(this.div.text);document.id(a.div).adopt(this.div.main);document.id(a.div).adopt(this.div.sub);this.div.gadget._node=this;this.div.gadget.onclick=this.div.gadget.ondblclick=function(){this._node.toggle()};this.div.icon._node=this.div.text._node=this;this.div.icon.onclick=this.div.icon.ondblclick=this.div.text.onclick=this.div.text.ondblclick=function(){this._node.control.select(this._node)}},insert:function(a){a.div=
this.div.sub;a.control=this.control;a=new MooTreeNode(a);a.parent=this;var
b=this.nodes;b.length&&(b[b.length-1].last=!1);b.push(a);a.update();1==b.length&&this.update();1<b.length&&b[b.length-2].update(!0);return
a},remove:function(){var
a=this.parent;this._remove();a.update(!0)},_remove:function(){for(var
a=this.nodes;a.length;)a[a.length-1]._remove();delete
this.control.index[this.id];this.div.main.destroy();this.div.sub.destroy();this.parent&&(a=this.parent.nodes,a.erase(this),a.length&&(a[a.length-
1].last=!0))},clear:function(){for(this.control.disable();this.nodes.length;)this.nodes[this.nodes.length-1].remove();this.control.enable()},update:function(a,b){var
c=!0;this.control.enabled||(this.invalidated=!0,c=!1);b&&(this.invalidated?this.invalidated=!1:c=!1);if(c){this.div.main.className="mooTree_node"+(this.selected?"
mooTree_selected":"");for(var
c=this,d="";c.parent;)c=c.parent,d=this.getImg(c.last||!this.control.grid?"":"I")+d;this.div.indent.innerHTML=d;c=this.div.text;c.empty();c.appendText(this.text);
this.color&&(c.style.color=this.color);this.div.icon.innerHTML=this.getImg(this.nodes.length?this.open?this.openicon||this.icon||"_open":this.icon||"_closed":this.icon||("folders"==this.control.mode?"_closed":"_doc"));this.div.gadget.innerHTML=this.getImg((this.control.grid?this.control.root==this?this.nodes.length?"R":"":this.last?"L":"T":"")+(this.nodes.length?this.open?"minus":"plus":""));this.div.sub.style.display=this.open?"block":"none"}a&&this.nodes.forEach(function(a){a.update(!0,b)})},getImg:function(a){var
b=
'<div class="mooTree_img"';if(""!=a){var
c=this.control.theme,d=MooTreeIcon.indexOf(a);-1==d&&(a=a.split("#"),c=a[0],d=2==a.length?parseInt(a[1])-1:0);b+='
style="background-image:url('+c+");
background-position:-"+18*d+'px 0px;"'}return
b+"></div>"},toggle:function(a,b){this.open=void
0===b?!this.open:b;this.update();this.onExpand(this.open);this.control.onExpand(this,this.open);a&&this.nodes.forEach(function(a){a.toggle(!0,this.open)},this)},select:function(a){this.selected=a;this.update();this.onSelect(a)},
load:function(a,b){this.loading||(this.loading=!0,this.toggle(!1,!0),this.clear(),this.insert(this.control.loader),function(){(new
Request({method:"GET",url:a,onSuccess:this._loaded.bind(this),onFailure:this._load_err.bind(this)})).send(b||"")}.bind(this).delay(20))},_loaded:function(a,b){this.control.disable();this.clear();this._import(b.documentElement);this.control.enable();this.loading=!1},_import:function(a){for(var
a=a.childNodes,b=0;b<a.length;b++)if("node"==a[b].tagName){for(var
c={data:{}},
d=a[b].attributes,f=0;f<d.length;f++)switch(d[f].name){case
"text":case "id":case "icon":case
"openicon":case "color":case
"open":c[d[f].name]=d[f].value;break;default:c.data[d[f].name]=d[f].value}c=this.insert(c);c.data.load&&(c.open=!1,c.insert(this.control.loader),c.onExpand=function(){this.load(this.data.load);this.onExpand=new
Function});a[b].childNodes.length&&c._import(a[b])}},_load_err:function(){window.alert("Error
loading:
"+this.text)}});PK`n�[�-�PPjs/multiselect-uncompressed.jsnu�[���/**
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license     GNU General Public License version 2 or later; see
LICENSE.txt
 */

/**
 * JavaScript behavior to allow shift select in administrator grids
 */
(function($) {
    
    Joomla = window.Joomla || {};
    var $boxes;
    Joomla.JMultiSelect = function(table) {
        var $last,
        
        initialize = function(table) {
            $boxes = $('#' +
table).find('input[type=checkbox]');
            $boxes.on('click', function(e) {
                doselect(e)
            });
        },
        
        doselect = function(e) {
            var $current = $(e.target), isChecked, lastIndex, currentIndex,
swap;
            if (e.shiftKey && $last.length) {
                isChecked = $current.is(':checked');
                lastIndex = $boxes.index($last);
                currentIndex = $boxes.index($current);
                if (currentIndex < lastIndex) {
                    // handle selection from bottom up
                    swap = lastIndex;
                    lastIndex = currentIndex;
                    currentIndex = swap;
                }
                $boxes.slice(lastIndex, currentIndex +
1).attr('checked', isChecked);
            }

            $last = $current;
        }
        initialize(table);
    }

})(jQuery);
PK`n�[�����js/multiselect.jsnu�[���/*
        GNU General Public License version 2 or later; see LICENSE.txt
*/
(function(b){Joomla=window.Joomla||{};var
a;Joomla.JMultiSelect=function(f){var
e,c=function(g){a=b("#"+g).find("input[type=checkbox]");a.on("click",function(h){d(h)})},d=function(j){var
h=b(j.target),l,k,g,i;if(j.shiftKey&&e.length){l=h.is(":checked");k=a.index(e);g=a.index(h);if(g<k){i=k;k=g;g=i}a.slice(k,g+1).attr("checked",l)}e=h};c(f)}})(jQuery);
PK`n�[���H		js/passwordstrength.jsnu�[���/*
---
description: Form.PasswordStrength class, and basic dom methods

license: MIT-style

authors:
 - Al Kent

requires:
 - core/1.3.1: '*'

provides:
 - Form.PasswordStrength
 - Element.Events.keyupandchange
 - String.strength
...
*/

if (!this.Form) this.Form = {};

Form.PasswordStrength = new Class({
	
	Implements: [Options, Events],
	
	options: {
		//onUpdate: $empty,
		threshold: 66,
		primer: '',
		height: 5,
		opacity: 1,
		bgcolor: 'transparent'
	},
	
	element: null,
	fx: null,
	
	initialize: function(el, options){
		this.element = document.id(el);
		this.setOptions(options);
		if (this.options.primer) this.options.threshold =
this.options.primer.strength();
		var coord = this.element.getCoordinates();
		var bar = new Element('div', {
			styles: {
				'width': coord.width,
				'height': this.options.height,
				'opacity': this.options.opacity,
				'background-color': this.options.bgcolor
			}
		}).inject(this.element, 'after');
		var meter = new Element('div', {
			styles: {
				'width': 0,
				'height': '100%'
			}
		}).inject(bar);
		this.fx = new Fx.Morph(meter, {
			duration: 'short',
			link: 'cancel',
			unit: '%'
		});
		this.element.addEvent('keyupandchange',
this.animate.bind(this));
		if (this.element.get('value')) this.animate();
	},
	
	animate: function(){
		var value = this.element.get('value');
		var color, strength = value.strength(), ratio = (strength /
this.options.threshold).round(2).limit(0, 1);
		if (ratio < 0.5) color = ('rgb(255, ' + (255 * ratio *
2).round() + ', 0)').rgbToHex();
		else color = ('rgb(' + (255 * (1 - ratio) * 2).round() +
', 255, 0)').rgbToHex();
		this.fx.start({
			'width': 100 * ratio,
			'background-color': color
		});
		this.fireEvent('update', [this.element, strength,
this.options.threshold]);
	}
});

Element.Events.keyupandchange = {
	base: 'keyup',
	condition: function(event){
		var prev = this.retrieve('prev', null);
		var cur = this.get('value');
		if (typeOf(prev) != 'null' && prev == cur) return
false;
		this.store('prev', cur);
		return true;
	}
};

String.implement({
	strength: function(){
		var n = 0;
		if (this.match(/\d/)) n += 10;
		if (this.match(/[a-z]+/)) n += 26;
		if (this.match(/[A-Z]+/)) n += 26;
		if (this.match(/[^\da-zA-Z]/)) n += 33;
		return (n == 0) ? 0 : (this.length * n.log() / (2).log()).round();
	}
});
PK`n�[U�k�
�
js/permissions-uncompressed.jsnu�[���/**
 * Function to send Permissions via Ajax to Com-Config Application
Controller
 */
function sendPermissions(event) {
	// set the icon while storing the values
	var icon = document.getElementById('icon_' + this.id);
	icon.removeAttribute('class');
	icon.setAttribute('style', 'background:
url(../media/system/images/modal/spinner.gif); display: inline-block;
width: 16px; height: 16px');

	//get values and prepare GET-Parameter
	var asset = 'not';
	var component = getUrlParam('component');
	var extension = getUrlParam('extension');
	var option    = getUrlParam('option');
	var view      = getUrlParam('view');
	var title     = component;
	var value     = this.value;
	var context   = '';

	if (document.getElementById('jform_context')){
		context = document.getElementById('jform_context').value;
		context = context.split('.')[0];
	}

	if (option == 'com_config' && component == false
&& extension == false)
	{
		asset = 'root.1';
	}
	else if (extension == false && view == 'component'){
		asset = component;
	}
	else if (context){
		if (view == 'group') {
			asset = context + '.fieldgroup.' +
getUrlParam('id');
		}
		else {
			asset = context + '.field.' + getUrlParam('id');
		}
		title = document.getElementById('jform_title').value;
	}
	else if (extension != false && view != false){
		asset = extension + '.' + view + '.' +
getUrlParam('id');
		title = document.getElementById('jform_title').value;
	}
	else if (extension == false && view != false){
		asset = option + '.' + view + '.' +
getUrlParam('id');
		title = document.getElementById('jform_title').value;
	}

	var id = this.id.replace('jform_rules_', '');
	var lastUnderscoreIndex = id.lastIndexOf('_');

	var permission_data = {
		comp   : asset,
		action : id.substring(0, lastUnderscoreIndex),
		rule   : id.substring(lastUnderscoreIndex + 1),
		value  : value,
		title  : title
	};

	// Remove js messages, if they exist.
	Joomla.removeMessages();

	// doing ajax request
	jQuery.ajax({
		method: "POST",
		url:
document.getElementById('permissions-sliders').getAttribute('data-ajaxuri'),
		data: permission_data,
		datatype: 'json'
	})
	.fail(function (jqXHR, textStatus, error) {
		// Remove the spinning icon.
		icon.removeAttribute('style');

		Joomla.renderMessages(Joomla.ajaxErrorsMessages(jqXHR, textStatus,
error));

		window.scrollTo(0, 0);

		icon.setAttribute('class', 'icon-cancel');
	})
	.done(function (response) {
		// Remove the spinning icon.
		icon.removeAttribute('style');

		if (response.data)
		{
			// Check if everything is OK
			if (response.data.result == true)
			{
				icon.setAttribute('class', 'icon-save');

				jQuery(event.target).parents().next("td").find("span")
					.removeClass()
					.addClass(response['data']['class'])
					.html(response.data.text);
			}
		}

		// Render messages, if any. There are only message in case of errors.
		if (typeof response.messages == 'object' &&
response.messages !== null)
		{
			Joomla.renderMessages(response.messages);

			if (response.data && response.data.result == true)
			{
				icon.setAttribute('class', 'icon-save');
			}
			else
			{
				icon.setAttribute('class', 'icon-cancel');
			}

			window.scrollTo(0, 0);
		}
	});
}

/**
 * Function to get parameters out of the url
 */
function getUrlParam(variable) {
	var query = window.location.search.substring(1);
	var vars = query.split('&');
	for (var i=0;i<vars.length;i++)
	{
		var pair = vars[i].split('=');
		if (pair[0] == variable)
		{
			return pair[1];
		}
	}
	return false;
}
PK`n�[��Ȣiijs/permissions.jsnu�[���function
sendPermissions(e){var
t=document.getElementById("icon_"+this.id);t.removeAttribute("class"),t.setAttribute("style","background:
url(../media/system/images/modal/spinner.gif); display: inline-block;
width: 16px; height: 16px");var
a="not",s=getUrlParam("component"),r=getUrlParam("extension"),o=getUrlParam("option"),l=getUrlParam("view"),n=s,i=this.value,m="";document.getElementById("jform_context")&&(m=document.getElementById("jform_context").value,m=m.split(".")[0]),"com_config"==o&&0==s&&0==r?a="root.1":0==r&&"component"==l?a=s:m?(a="group"==l?m+".fieldgroup."+getUrlParam("id"):m+".field."+getUrlParam("id"),n=document.getElementById("jform_title").value):0!=r&&0!=l?(a=r+"."+l+"."+getUrlParam("id"),n=document.getElementById("jform_title").value):0==r&&0!=l&&(a=o+"."+l+"."+getUrlParam("id"),n=document.getElementById("jform_title").value);var
d=this.id.replace("jform_rules_",""),u=d.lastIndexOf("_"),c={comp:a,action:d.substring(0,u),rule:d.substring(u+1),value:i,title:n};Joomla.removeMessages(),jQuery.ajax({method:"POST",url:document.getElementById("permissions-sliders").getAttribute("data-ajaxuri"),data:c,datatype:"json"}).fail(function(e,a,s){t.removeAttribute("style"),Joomla.renderMessages(Joomla.ajaxErrorsMessages(e,a,s)),window.scrollTo(0,0),t.setAttribute("class","icon-cancel")}).done(function(a){t.removeAttribute("style"),a.data&&1==a.data.result&&(t.setAttribute("class","icon-save"),jQuery(e.target).parents().next("td").find("span").removeClass().addClass(a.data["class"]).html(a.data.text)),"object"==typeof
a.messages&&null!==a.messages&&(Joomla.renderMessages(a.messages),a.data&&1==a.data.result?t.setAttribute("class","icon-save"):t.setAttribute("class","icon-cancel"),window.scrollTo(0,0))})}function
getUrlParam(e){for(var
t=window.location.search.substring(1),a=t.split("&"),s=0;s<a.length;s++){var
r=a[s].split("=");if(r[0]==e)return
r[1]}return!1}PK`n�[%-_*_*%js/polyfill.classlist-uncompressed.jsnu�[���/**
 * Polyfill service v3.13.0
 * For detailed credits and licence information see
http://github.com/financial-times/polyfill-service.
 * 
 * Features requested: Element.prototype.classList
 * 
 * - Object.defineProperty, License: CC0 (required by
"Element.prototype.classList")
 * - _DOMTokenList, License: CC0 (required by
"Element.prototype.classList")
 * - Document, License: CC0 (required by "Element",
"Element.prototype.classList")
 * - Element, License: CC0 (required by
"Element.prototype.classList")
 * - Element.prototype.classList, License: CC0
 *
 * @build     
https://cdn.polyfill.io/v2/polyfill.js?features=Element.prototype.classList&flags=always,gated
 * 
 * @copyright  Copyright (c) 2016 Financial Times
 * @license    MIT License,
https://github.com/Financial-Times/polyfill-service/blob/master/LICENSE.md
 */

(function(undefined) {
if (!(// In IE8, defineProperty could only act on DOM elements, so full
support
// for the feature requires the ability to set a property on an arbitrary
object
'defineProperty' in Object && (function() {
	try {
		var a = {};
		Object.defineProperty(a, 'test', {value:42});
		return true;
	} catch(e) {
		return false
	}
}()))) {

// Object.defineProperty
(function (nativeDefineProperty) {

	var supportsAccessors =
Object.prototype.hasOwnProperty('__defineGetter__');
	var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be
defined on this javascript engine';
	var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and
be writable or have a value';

	Object.defineProperty = function defineProperty(object, property,
descriptor) {

		// Where native support exists, assume it
		if (nativeDefineProperty && (object === window || object ===
document || object === Element.prototype || object instanceof Element)) {
			return nativeDefineProperty(object, property, descriptor);
		}

		if (object === null || !(object instanceof Object || typeof object ===
'object')) {
			throw new TypeError('Object must be an object
(Object.defineProperty polyfill)');
		}

		if (!(descriptor instanceof Object)) {
			throw new TypeError('Descriptor must be an object
(Object.defineProperty polyfill)');
		}

		var propertyString = String(property);
		var hasValueOrWritable = 'value' in descriptor ||
'writable' in descriptor;
		var getterType = 'get' in descriptor && typeof
descriptor.get;
		var setterType = 'set' in descriptor && typeof
descriptor.set;

		// handle descriptor.get
		if (getterType) {
			if (getterType !== 'function') {
				throw new TypeError('Getter expected a function
(Object.defineProperty polyfill)');
			}
			if (!supportsAccessors) {
				throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
			}
			if (hasValueOrWritable) {
				throw new TypeError(ERR_VALUE_ACCESSORS);
			}
			object.__defineGetter__(propertyString, descriptor.get);
		} else {
			object[propertyString] = descriptor.value;
		}

		// handle descriptor.set
		if (setterType) {
			if (setterType !== 'function') {
				throw new TypeError('Setter expected a function
(Object.defineProperty polyfill)');
			}
			if (!supportsAccessors) {
				throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
			}
			if (hasValueOrWritable) {
				throw new TypeError(ERR_VALUE_ACCESSORS);
			}
			object.__defineSetter__(propertyString, descriptor.set);
		}

		// OK to define value unconditionally - if a getter has been specified as
well, an error would be thrown above
		if ('value' in descriptor) {
			object[propertyString] = descriptor.value;
		}

		return object;
	};
}(Object.defineProperty));

}


// _DOMTokenList
var _DOMTokenList = (function () { // eslint-disable-line no-unused-vars

	function tokenize(token) {
		if (/^-?[_a-zA-Z]+[_a-zA-Z0-9-]*$/.test(token)) {
			return String(token);
		} else {
			throw new Error('InvalidCharacterError: DOM Exception 5');
		}
	}

	function toObject(self) {
		for (var index = -1, object = {}, element; element = self[++index];) {
			object[element] = true;
		}

		return object;
	}

	function fromObject(self, object) {
		var array = [], token;

		for (token in object) {
			if (object[token]) {
				array.push(token);
			}
		}

		[].splice.apply(self, [0, self.length].concat(array));
	}

	var DTL = function() {};

	DTL.prototype = {
		constructor: DTL,
		item: function item(index) {
			return this[parseFloat(index)] || null;
		},
		length: Array.prototype.length,
		toString: function toString() {
			return [].join.call(this, ' ');
		},

		add: function add() {
			for (var object = toObject(this), index = 0, token; index in arguments;
++index) {
				token = tokenize(arguments[index]);

				object[token] = true;
			}

			fromObject(this, object);
		},
		contains: function contains(token) {
			return token in toObject(this);
		},
		remove: function remove() {
			for (var object = toObject(this), index = 0, token; index in arguments;
++index) {
				token = tokenize(arguments[index]);

				object[token] = false;
			}

			fromObject(this, object);
		},
		toggle: function toggle(token) {
			var
			object = toObject(this),
			contains = 1 in arguments ? !arguments[1] : tokenize(token) in object;

			object[token] = !contains;

			fromObject(this, object);

			return !contains;
		}
	};

	return DTL;

}());
if (!("Document" in this)) {

// Document
if (this.HTMLDocument) { // IE8

	// HTMLDocument is an extension of Document.  If the browser has
HTMLDocument but not Document, the former will suffice as an alias for the
latter.
	this.Document = this.HTMLDocument;

} else {

	// Create an empty function to act as the missing constructor for the
document object, attach the document object as its prototype.  The function
needs to be anonymous else it is hoisted and causes the feature detect to
prematurely pass, preventing the assignments below being made.
	this.Document = this.HTMLDocument = document.constructor = (new
Function('return function Document() {}')());
	this.Document.prototype = document;
}

}

if (!('Element' in this && 'HTMLElement' in
this)) {

// Element
(function () {

	// IE8
	if (window.Element && !window.HTMLElement) {
		window.HTMLElement = window.Element;
		return;
	}

	// create Element constructor
	window.Element = window.HTMLElement = new Function('return function
Element() {}')();

	// generate sandboxed iframe
	var vbody =
document.appendChild(document.createElement('body'));
	var frame = vbody.appendChild(document.createElement('iframe'));

	// use sandboxed iframe to replicate Element functionality
	var frameDocument = frame.contentWindow.document;
	var prototype = Element.prototype =
frameDocument.appendChild(frameDocument.createElement('*'));
	var cache = {};

	// polyfill Element.prototype on an element
	var shiv = function (element, deep) {
		var
		childNodes = element.childNodes || [],
		index = -1,
		key, value, childNode;

		if (element.nodeType === 1 && element.constructor !== Element) {
			element.constructor = Element;

			for (key in cache) {
				value = cache[key];
				element[key] = value;
			}
		}

		while (childNode = deep && childNodes[++index]) {
			shiv(childNode, deep);
		}

		return element;
	};

	var elements = document.getElementsByTagName('*');
	var nativeCreateElement = document.createElement;
	var interval;
	var loopLimit = 100;

	prototype.attachEvent('onpropertychange', function (event) {
		var
		propertyName = event.propertyName,
		nonValue = !cache.hasOwnProperty(propertyName),
		newValue = prototype[propertyName],
		oldValue = cache[propertyName],
		index = -1,
		element;

		while (element = elements[++index]) {
			if (element.nodeType === 1) {
				if (nonValue || element[propertyName] === oldValue) {
					element[propertyName] = newValue;
				}
			}
		}

		cache[propertyName] = newValue;
	});

	prototype.constructor = Element;

	if (!prototype.hasAttribute) {
		// <Element>.hasAttribute
		prototype.hasAttribute = function hasAttribute(name) {
			return this.getAttribute(name) !== null;
		};
	}

	// Apply Element prototype to the pre-existing DOM as soon as the body
element appears.
	function bodyCheck() {
		if (!(loopLimit--)) clearTimeout(interval);
		if (document.body && !document.body.prototype &&
/(complete|interactive)/.test(document.readyState)) {
			shiv(document, true);
			if (interval && document.body.prototype) clearTimeout(interval);
			return (!!document.body.prototype);
		}
		return false;
	}
	if (!bodyCheck(true)) {
		document.onreadystatechange = bodyCheck;
		interval = setInterval(bodyCheck, 25);
	}

	// Apply to any new elements created after load
	document.createElement = function createElement(nodeName) {
		var element = nativeCreateElement(String(nodeName).toLowerCase());
		return shiv(element);
	};

	// remove sandboxed iframe
	document.removeChild(vbody);
}());

}

if (!('document' in this && "classList" in
document.documentElement)) {

// Element.prototype.classList
Object.defineProperty(Element.prototype, 'classList', {
	configurable: true,
	get: function () {

		function pull() {
			var className = (typeof element.className === "object" ?
element.className.baseVal : element.className);
			[].splice.apply(classList, [0, classList.length].concat((className ||
'').replace(/^\s+|\s+$/g, '').split(/\s+/)));
		}

		function push() {
			if (element.attachEvent) {
				element.detachEvent('onpropertychange', pull);
			}

			if (typeof element.className === "object") {
				element.className.baseVal = original.toString.call(classList);
			} else {
				element.className = original.toString.call(classList);
			}

			if (element.attachEvent) {
				element.attachEvent('onpropertychange', pull);
			}
		}

		var element = this;
		var original = _DOMTokenList.prototype;
		var ClassList = function ClassList() {};
		var classList;

		ClassList.prototype = new _DOMTokenList;

		ClassList.prototype.item = function item(index) { // eslint-disable-line
no-unused-vars
			return pull(), original.item.apply(classList, arguments);
		};

		ClassList.prototype.toString = function toString() {
			return pull(), original.toString.apply(classList, arguments);
		};

		ClassList.prototype.add = function add() {
			return pull(), original.add.apply(classList, arguments), push();
		};

		ClassList.prototype.contains = function contains(token) { //
eslint-disable-line no-unused-vars
			return pull(), original.contains.apply(classList, arguments);
		};

		ClassList.prototype.remove = function remove() {
			return pull(), original.remove.apply(classList, arguments), push();
		};

		ClassList.prototype.toggle = function toggle(token) {
			return pull(), token = original.toggle.apply(classList, arguments),
push(), token;
		};

		classList = new ClassList;

		if (element.attachEvent) {
			element.attachEvent('onpropertychange', pull);
		}

		return classList;
	}
});

}


})
.call('object' === typeof window && window ||
'object' === typeof self && self || 'object'
=== typeof global && global || {});
PK`n�[��g��js/polyfill.classlist.jsnu�[���(function(){"defineProperty"in
Object&&function(){try{var t={};return
Object.defineProperty(t,"test",{value:42}),!0}catch(e){return!1}}()||!function(t){var
e=Object.prototype.hasOwnProperty("__defineGetter__"),n="Getters
& setters cannot be defined on this javascript engine",o="A
property cannot both have accessors and be writable or have a
value";Object.defineProperty=function(r,i,c){if(t&&(r===window||r===document||r===Element.prototype||r
instanceof Element))return t(r,i,c);if(null===r||!(r instanceof
Object||"object"==typeof r))throw new TypeError("Object must
be an object (Object.defineProperty polyfill)");if(!(c instanceof
Object))throw new TypeError("Descriptor must be an object
(Object.defineProperty polyfill)");var
a=String(i),u="value"in c||"writable"in
c,p="get"in c&&typeof c.get,l="set"in
c&&typeof c.set;if(p){if("function"!==p)throw new
TypeError("Getter expected a function (Object.defineProperty
polyfill)");if(!e)throw new TypeError(n);if(u)throw new
TypeError(o);r.__defineGetter__(a,c.get)}else
r[a]=c.value;if(l){if("function"!==l)throw new
TypeError("Setter expected a function (Object.defineProperty
polyfill)");if(!e)throw new TypeError(n);if(u)throw new
TypeError(o);r.__defineSetter__(a,c.set)}return"value"in
c&&(r[a]=c.value),r}}(Object.defineProperty);var
t=function(){function t(t){if(/^-?[_a-zA-Z]+[_a-zA-Z0-9-]*$/.test(t))return
String(t);throw new Error("InvalidCharacterError: DOM Exception
5")}function e(t){for(var e,n=-1,o={};e=t[++n];)o[e]=!0;return
o}function n(t,e){var n,o=[];for(n in
e)e[n]&&o.push(n);[].splice.apply(t,[0,t.length].concat(o))}var
o=function(){};return o.prototype={constructor:o,item:function(t){return
this[parseFloat(t)]||null},length:Array.prototype.length,toString:function(){return[].join.call(this,"
")},add:function(){for(var o,r=e(this),i=0;i in
arguments;++i)o=t(arguments[i]),r[o]=!0;n(this,r)},contains:function(t){return
t in e(this)},remove:function(){for(var o,r=e(this),i=0;i in
arguments;++i)o=t(arguments[i]),r[o]=!1;n(this,r)},toggle:function(o){var
r=e(this),i=1 in arguments?!arguments[1]:t(o)in r;return
r[o]=!i,n(this,r),!i}},o}();"Document"in
this||(this.HTMLDocument?this.Document=this.HTMLDocument:(this.Document=this.HTMLDocument=document.constructor=new
Function("return function Document()
{}")(),this.Document.prototype=document)),"Element"in
this&&"HTMLElement"in this||!function(){function
t(){return
l--||clearTimeout(e),document.body&&!document.body.prototype&&/(complete|interactive)/.test(document.readyState)?(a(document,!0),e&&document.body.prototype&&clearTimeout(e),!!document.body.prototype):!1}if(window.Element&&!window.HTMLElement)return
void(window.HTMLElement=window.Element);window.Element=window.HTMLElement=new
Function("return function Element() {}")();var
e,n=document.appendChild(document.createElement("body")),o=n.appendChild(document.createElement("iframe")),r=o.contentWindow.document,i=Element.prototype=r.appendChild(r.createElement("*")),c={},a=function(t,e){var
n,o,r,i=t.childNodes||[],u=-1;if(1===t.nodeType&&t.constructor!==Element){t.constructor=Element;for(n
in c)o=c[n],t[n]=o}for(;r=e&&i[++u];)a(r,e);return
t},u=document.getElementsByTagName("*"),p=document.createElement,l=100;i.attachEvent("onpropertychange",function(t){for(var
e,n=t.propertyName,o=!c.hasOwnProperty(n),r=i[n],a=c[n],p=-1;e=u[++p];)1===e.nodeType&&(o||e[n]===a)&&(e[n]=r);c[n]=r}),i.constructor=Element,i.hasAttribute||(i.hasAttribute=function(t){return
null!==this.getAttribute(t)}),t(!0)||(document.onreadystatechange=t,e=setInterval(t,25)),document.createElement=function(t){var
e=p(String(t).toLowerCase());return
a(e)},document.removeChild(n)}(),"document"in
this&&"classList"in
document.documentElement||Object.defineProperty(Element.prototype,"classList",{configurable:!0,get:function(){function
e(){var t="object"==typeof
r.className?r.className.baseVal:r.className;[].splice.apply(o,[0,o.length].concat((t||"").replace(/^\s+|\s+$/g,"").split(/\s+/)))}function
n(){r.attachEvent&&r.detachEvent("onpropertychange",e),"object"==typeof
r.className?r.className.baseVal=i.toString.call(o):r.className=i.toString.call(o),r.attachEvent&&r.attachEvent("onpropertychange",e)}var
o,r=this,i=t.prototype,c=function(){};return c.prototype=new
t,c.prototype.item=function(){return
e(),i.item.apply(o,arguments)},c.prototype.toString=function(){return
e(),i.toString.apply(o,arguments)},c.prototype.add=function(){return
e(),i.add.apply(o,arguments),n()},c.prototype.contains=function(){return
e(),i.contains.apply(o,arguments)},c.prototype.remove=function(){return
e(),i.remove.apply(o,arguments),n()},c.prototype.toggle=function(t){return
e(),t=i.toggle.apply(o,arguments),n(),t},o=new
c,r.attachEvent&&r.attachEvent("onpropertychange",e),o}})}).call("object"==typeof
window&&window||"object"==typeof
self&&self||"object"==typeof global&&global||{});
PK`n�[X�Ap4p4!js/polyfill.event-uncompressed.jsnu�[���/**
 * Polyfill service v3.13.0
 * For detailed credits and licence information see
http://github.com/financial-times/polyfill-service.
 * 
 * Features requested: Event
 * 
 * - Window, License: CC0 (required by "Event")
 * - Document, License: CC0 (required by "Element",
"Event")
 * - Element, License: CC0 (required by "Event")
 * - Object.defineProperty, License: CC0 (required by "Event")
 * - Event, License: CC0
 *
 * @build     
https://cdn.polyfill.io/v2/polyfill.js?features=Event&flags=always,gated
 * 
 * @copyright  Copyright (c) 2016 Financial Times
 * @license    MIT License,
https://github.com/Financial-Times/polyfill-service/blob/master/LICENSE.md
 */

(function(undefined) {
if (!('Window' in this)) {

// Window
(function(global) {
	if (global.constructor) {
		global.Window = global.constructor;
	} else {
		(global.Window = global.constructor = new Function('return function
Window() {}')()).prototype = this;
	}
}(this));

}

if (!("Document" in this)) {

// Document
if (this.HTMLDocument) { // IE8

	// HTMLDocument is an extension of Document.  If the browser has
HTMLDocument but not Document, the former will suffice as an alias for the
latter.
	this.Document = this.HTMLDocument;

} else {

	// Create an empty function to act as the missing constructor for the
document object, attach the document object as its prototype.  The function
needs to be anonymous else it is hoisted and causes the feature detect to
prematurely pass, preventing the assignments below being made.
	this.Document = this.HTMLDocument = document.constructor = (new
Function('return function Document() {}')());
	this.Document.prototype = document;
}

}

if (!('Element' in this && 'HTMLElement' in
this)) {

// Element
(function () {

	// IE8
	if (window.Element && !window.HTMLElement) {
		window.HTMLElement = window.Element;
		return;
	}

	// create Element constructor
	window.Element = window.HTMLElement = new Function('return function
Element() {}')();

	// generate sandboxed iframe
	var vbody =
document.appendChild(document.createElement('body'));
	var frame = vbody.appendChild(document.createElement('iframe'));

	// use sandboxed iframe to replicate Element functionality
	var frameDocument = frame.contentWindow.document;
	var prototype = Element.prototype =
frameDocument.appendChild(frameDocument.createElement('*'));
	var cache = {};

	// polyfill Element.prototype on an element
	var shiv = function (element, deep) {
		var
		childNodes = element.childNodes || [],
		index = -1,
		key, value, childNode;

		if (element.nodeType === 1 && element.constructor !== Element) {
			element.constructor = Element;

			for (key in cache) {
				value = cache[key];
				element[key] = value;
			}
		}

		while (childNode = deep && childNodes[++index]) {
			shiv(childNode, deep);
		}

		return element;
	};

	var elements = document.getElementsByTagName('*');
	var nativeCreateElement = document.createElement;
	var interval;
	var loopLimit = 100;

	prototype.attachEvent('onpropertychange', function (event) {
		var
		propertyName = event.propertyName,
		nonValue = !cache.hasOwnProperty(propertyName),
		newValue = prototype[propertyName],
		oldValue = cache[propertyName],
		index = -1,
		element;

		while (element = elements[++index]) {
			if (element.nodeType === 1) {
				if (nonValue || element[propertyName] === oldValue) {
					element[propertyName] = newValue;
				}
			}
		}

		cache[propertyName] = newValue;
	});

	prototype.constructor = Element;

	if (!prototype.hasAttribute) {
		// <Element>.hasAttribute
		prototype.hasAttribute = function hasAttribute(name) {
			return this.getAttribute(name) !== null;
		};
	}

	// Apply Element prototype to the pre-existing DOM as soon as the body
element appears.
	function bodyCheck() {
		if (!(loopLimit--)) clearTimeout(interval);
		if (document.body && !document.body.prototype &&
/(complete|interactive)/.test(document.readyState)) {
			shiv(document, true);
			if (interval && document.body.prototype) clearTimeout(interval);
			return (!!document.body.prototype);
		}
		return false;
	}
	if (!bodyCheck(true)) {
		document.onreadystatechange = bodyCheck;
		interval = setInterval(bodyCheck, 25);
	}

	// Apply to any new elements created after load
	document.createElement = function createElement(nodeName) {
		var element = nativeCreateElement(String(nodeName).toLowerCase());
		return shiv(element);
	};

	// remove sandboxed iframe
	document.removeChild(vbody);
}());

}

if (!(// In IE8, defineProperty could only act on DOM elements, so full
support
// for the feature requires the ability to set a property on an arbitrary
object
'defineProperty' in Object && (function() {
	try {
		var a = {};
		Object.defineProperty(a, 'test', {value:42});
		return true;
	} catch(e) {
		return false
	}
}()))) {

// Object.defineProperty
(function (nativeDefineProperty) {

	var supportsAccessors =
Object.prototype.hasOwnProperty('__defineGetter__');
	var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be
defined on this javascript engine';
	var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and
be writable or have a value';

	Object.defineProperty = function defineProperty(object, property,
descriptor) {

		// Where native support exists, assume it
		if (nativeDefineProperty && (object === window || object ===
document || object === Element.prototype || object instanceof Element)) {
			return nativeDefineProperty(object, property, descriptor);
		}

		if (object === null || !(object instanceof Object || typeof object ===
'object')) {
			throw new TypeError('Object must be an object
(Object.defineProperty polyfill)');
		}

		if (!(descriptor instanceof Object)) {
			throw new TypeError('Descriptor must be an object
(Object.defineProperty polyfill)');
		}

		var propertyString = String(property);
		var hasValueOrWritable = 'value' in descriptor ||
'writable' in descriptor;
		var getterType = 'get' in descriptor && typeof
descriptor.get;
		var setterType = 'set' in descriptor && typeof
descriptor.set;

		// handle descriptor.get
		if (getterType) {
			if (getterType !== 'function') {
				throw new TypeError('Getter expected a function
(Object.defineProperty polyfill)');
			}
			if (!supportsAccessors) {
				throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
			}
			if (hasValueOrWritable) {
				throw new TypeError(ERR_VALUE_ACCESSORS);
			}
			object.__defineGetter__(propertyString, descriptor.get);
		} else {
			object[propertyString] = descriptor.value;
		}

		// handle descriptor.set
		if (setterType) {
			if (setterType !== 'function') {
				throw new TypeError('Setter expected a function
(Object.defineProperty polyfill)');
			}
			if (!supportsAccessors) {
				throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
			}
			if (hasValueOrWritable) {
				throw new TypeError(ERR_VALUE_ACCESSORS);
			}
			object.__defineSetter__(propertyString, descriptor.set);
		}

		// OK to define value unconditionally - if a getter has been specified as
well, an error would be thrown above
		if ('value' in descriptor) {
			object[propertyString] = descriptor.value;
		}

		return object;
	};
}(Object.defineProperty));

}

if (!((function(global) {

	if (!('Event' in global)) return false;
	if (typeof global.Event === 'function') return true;

	try {

		// In IE 9-11, the Event object exists but cannot be instantiated
		new Event('click');
		return true;
	} catch(e) {
		return false;
	}
}(this)))) {

// Event
(function () {
	var unlistenableWindowEvents = {
		click: 1,
		dblclick: 1,
		keyup: 1,
		keypress: 1,
		keydown: 1,
		mousedown: 1,
		mouseup: 1,
		mousemove: 1,
		mouseover: 1,
		mouseenter: 1,
		mouseleave: 1,
		mouseout: 1,
		storage: 1,
		storagecommit: 1,
		textinput: 1
	};

	function indexOf(array, element) {
		var
		index = -1,
		length = array.length;

		while (++index < length) {
			if (index in array && array[index] === element) {
				return index;
			}
		}

		return -1;
	}

	var existingProto = (window.Event && window.Event.prototype) ||
null;
	window.Event = Window.prototype.Event = function Event(type,
eventInitDict) {
		if (!type) {
			throw new Error('Not enough arguments');
		}

		// Shortcut if browser supports createEvent
		if ('createEvent' in document) {
			var event = document.createEvent('Event');
			var bubbles = eventInitDict && eventInitDict.bubbles !==
undefined ? eventInitDict.bubbles : false;
			var cancelable = eventInitDict && eventInitDict.cancelable !==
undefined ? eventInitDict.cancelable : false;

			event.initEvent(type, bubbles, cancelable);

			return event;
		}

		var event = document.createEventObject();

		event.type = type;
		event.bubbles = eventInitDict && eventInitDict.bubbles !==
undefined ? eventInitDict.bubbles : false;
		event.cancelable = eventInitDict && eventInitDict.cancelable !==
undefined ? eventInitDict.cancelable : false;

		return event;
	};
	if (existingProto) {
		Object.defineProperty(window.Event, 'prototype', {
			configurable: false,
			enumerable: false,
			writable: true,
			value: existingProto
		});
	}

	if (!('createEvent' in document)) {
		window.addEventListener = Window.prototype.addEventListener =
Document.prototype.addEventListener = Element.prototype.addEventListener =
function addEventListener() {
			var
			element = this,
			type = arguments[0],
			listener = arguments[1];

			if (element === window && type in unlistenableWindowEvents) {
				throw new Error('In IE8 the event: ' + type + ' is not
available on the window object. Please see
https://github.com/Financial-Times/polyfill-service/issues/317 for more
information.');
			}

			if (!element._events) {
				element._events = {};
			}

			if (!element._events[type]) {
				element._events[type] = function (event) {
					var
					list = element._events[event.type].list,
					events = list.slice(),
					index = -1,
					length = events.length,
					eventElement;

					event.preventDefault = function preventDefault() {
						if (event.cancelable !== false) {
							event.returnValue = false;
						}
					};

					event.stopPropagation = function stopPropagation() {
						event.cancelBubble = true;
					};

					event.stopImmediatePropagation = function stopImmediatePropagation() {
						event.cancelBubble = true;
						event.cancelImmediate = true;
					};

					event.currentTarget = element;
					event.relatedTarget = event.fromElement || null;
					event.target = event.target || event.srcElement || element;
					event.timeStamp = new Date().getTime();

					if (event.clientX) {
						event.pageX = event.clientX + document.documentElement.scrollLeft;
						event.pageY = event.clientY + document.documentElement.scrollTop;
					}

					while (++index < length && !event.cancelImmediate) {
						if (index in events) {
							eventElement = events[index];

							if (indexOf(list, eventElement) !== -1 && typeof
eventElement === 'function') {
								eventElement.call(element, event);
							}
						}
					}
				};

				element._events[type].list = [];

				if (element.attachEvent) {
					element.attachEvent('on' + type, element._events[type]);
				}
			}

			element._events[type].list.push(listener);
		};

		window.removeEventListener = Window.prototype.removeEventListener =
Document.prototype.removeEventListener =
Element.prototype.removeEventListener = function removeEventListener() {
			var
			element = this,
			type = arguments[0],
			listener = arguments[1],
			index;

			if (element._events && element._events[type] &&
element._events[type].list) {
				index = indexOf(element._events[type].list, listener);

				if (index !== -1) {
					element._events[type].list.splice(index, 1);

					if (!element._events[type].list.length) {
						if (element.detachEvent) {
							element.detachEvent('on' + type, element._events[type]);
						}
						delete element._events[type];
					}
				}
			}
		};

		window.dispatchEvent = Window.prototype.dispatchEvent =
Document.prototype.dispatchEvent = Element.prototype.dispatchEvent =
function dispatchEvent(event) {
			if (!arguments.length) {
				throw new Error('Not enough arguments');
			}

			if (!event || typeof event.type !== 'string') {
				throw new Error('DOM Events Exception 0');
			}

			var element = this, type = event.type;

			try {
				if (!event.bubbles) {
					event.cancelBubble = true;

					var cancelBubbleEvent = function (event) {
						event.cancelBubble = true;

						(element || window).detachEvent('on' + type,
cancelBubbleEvent);
					};

					this.attachEvent('on' + type, cancelBubbleEvent);
				}

				this.fireEvent('on' + type, event);
			} catch (error) {
				event.target = element;

				do {
					event.currentTarget = element;

					if ('_events' in element && typeof
element._events[type] === 'function') {
						element._events[type].call(element, event);
					}

					if (typeof element['on' + type] === 'function') {
						element['on' + type].call(element, event);
					}

					element = element.nodeType === 9 ? element.parentWindow :
element.parentNode;
				} while (element && !event.cancelBubble);
			}

			return true;
		};

		// Add the DOMContentLoaded Event
		document.attachEvent('onreadystatechange', function() {
			if (document.readyState === 'complete') {
				document.dispatchEvent(new Event('DOMContentLoaded', {
					bubbles: true
				}));
			}
		});
	}
}());

}


})
.call('object' === typeof window && window ||
'object' === typeof self && self || 'object'
=== typeof global && global || {});
PK`n�[KQ��FFjs/polyfill.event.jsnu�[���(function(e){"Window"in
this||!function(e){e.constructor?e.Window=e.constructor:(e.Window=e.constructor=new
Function("return function Window()
{}")()).prototype=this}(this),"Document"in
this||(this.HTMLDocument?this.Document=this.HTMLDocument:(this.Document=this.HTMLDocument=document.constructor=new
Function("return function Document()
{}")(),this.Document.prototype=document)),"Element"in
this&&"HTMLElement"in this||!function(){function
e(){return
s--||clearTimeout(t),document.body&&!document.body.prototype&&/(complete|interactive)/.test(document.readyState)?(a(document,!0),t&&document.body.prototype&&clearTimeout(t),!!document.body.prototype):!1}if(window.Element&&!window.HTMLElement)return
void(window.HTMLElement=window.Element);window.Element=window.HTMLElement=new
Function("return function Element() {}")();var
t,n=document.appendChild(document.createElement("body")),o=n.appendChild(document.createElement("iframe")),r=o.contentWindow.document,i=Element.prototype=r.appendChild(r.createElement("*")),c={},a=function(e,t){var
n,o,r,i=e.childNodes||[],u=-1;if(1===e.nodeType&&e.constructor!==Element){e.constructor=Element;for(n
in c)o=c[n],e[n]=o}for(;r=t&&i[++u];)a(r,t);return
e},u=document.getElementsByTagName("*"),l=document.createElement,s=100;i.attachEvent("onpropertychange",function(e){for(var
t,n=e.propertyName,o=!c.hasOwnProperty(n),r=i[n],a=c[n],l=-1;t=u[++l];)1===t.nodeType&&(o||t[n]===a)&&(t[n]=r);c[n]=r}),i.constructor=Element,i.hasAttribute||(i.hasAttribute=function(e){return
null!==this.getAttribute(e)}),e(!0)||(document.onreadystatechange=e,t=setInterval(e,25)),document.createElement=function(e){var
t=l(String(e).toLowerCase());return
a(t)},document.removeChild(n)}(),"defineProperty"in
Object&&function(){try{var e={};return
Object.defineProperty(e,"test",{value:42}),!0}catch(t){return!1}}()||!function(e){var
t=Object.prototype.hasOwnProperty("__defineGetter__"),n="Getters
& setters cannot be defined on this javascript engine",o="A
property cannot both have accessors and be writable or have a
value";Object.defineProperty=function(r,i,c){if(e&&(r===window||r===document||r===Element.prototype||r
instanceof Element))return e(r,i,c);if(null===r||!(r instanceof
Object||"object"==typeof r))throw new TypeError("Object must
be an object (Object.defineProperty polyfill)");if(!(c instanceof
Object))throw new TypeError("Descriptor must be an object
(Object.defineProperty polyfill)");var
a=String(i),u="value"in c||"writable"in
c,l="get"in c&&typeof c.get,s="set"in
c&&typeof c.set;if(l){if("function"!==l)throw new
TypeError("Getter expected a function (Object.defineProperty
polyfill)");if(!t)throw new TypeError(n);if(u)throw new
TypeError(o);r.__defineGetter__(a,c.get)}else
r[a]=c.value;if(s){if("function"!==s)throw new
TypeError("Setter expected a function (Object.defineProperty
polyfill)");if(!t)throw new TypeError(n);if(u)throw new
TypeError(o);r.__defineSetter__(a,c.set)}return"value"in
c&&(r[a]=c.value),r}}(Object.defineProperty),function(e){if(!("Event"in
e))return!1;if("function"==typeof e.Event)return!0;try{return new
Event("click"),!0}catch(t){return!1}}(this)||!function(){function
t(e,t){for(var n=-1,o=e.length;++n<o;)if(n in e&&e[n]===t)return
n;return-1}var
n={click:1,dblclick:1,keyup:1,keypress:1,keydown:1,mousedown:1,mouseup:1,mousemove:1,mouseover:1,mouseenter:1,mouseleave:1,mouseout:1,storage:1,storagecommit:1,textinput:1},o=window.Event&&window.Event.prototype||null;window.Event=Window.prototype.Event=function(t,n){if(!t)throw
new Error("Not enough arguments");if("createEvent"in
document){var
o=document.createEvent("Event"),r=n&&n.bubbles!==e?n.bubbles:!1,i=n&&n.cancelable!==e?n.cancelable:!1;return
o.initEvent(t,r,i),o}var o=document.createEventObject();return
o.type=t,o.bubbles=n&&n.bubbles!==e?n.bubbles:!1,o.cancelable=n&&n.cancelable!==e?n.cancelable:!1,o},o&&Object.defineProperty(window.Event,"prototype",{configurable:!1,enumerable:!1,writable:!0,value:o}),"createEvent"in
document||(window.addEventListener=Window.prototype.addEventListener=Document.prototype.addEventListener=Element.prototype.addEventListener=function(){var
e=this,o=arguments[0],r=arguments[1];if(e===window&&o in n)throw
new Error("In IE8 the event: "+o+" is not available on the
window object. Please see
https://github.com/Financial-Times/polyfill-service/issues/317 for more
information.");e._events||(e._events={}),e._events[o]||(e._events[o]=function(n){var
o,r=e._events[n.type].list,i=r.slice(),c=-1,a=i.length;for(n.preventDefault=function(){n.cancelable!==!1&&(n.returnValue=!1)},n.stopPropagation=function(){n.cancelBubble=!0},n.stopImmediatePropagation=function(){n.cancelBubble=!0,n.cancelImmediate=!0},n.currentTarget=e,n.relatedTarget=n.fromElement||null,n.target=n.target||n.srcElement||e,n.timeStamp=(new
Date).getTime(),n.clientX&&(n.pageX=n.clientX+document.documentElement.scrollLeft,n.pageY=n.clientY+document.documentElement.scrollTop);++c<a&&!n.cancelImmediate;)c
in i&&(o=i[c],-1!==t(r,o)&&"function"==typeof
o&&o.call(e,n))},e._events[o].list=[],e.attachEvent&&e.attachEvent("on"+o,e._events[o])),e._events[o].list.push(r)},window.removeEventListener=Window.prototype.removeEventListener=Document.prototype.removeEventListener=Element.prototype.removeEventListener=function(){var
e,n=this,o=arguments[0],r=arguments[1];n._events&&n._events[o]&&n._events[o].list&&(e=t(n._events[o].list,r),-1!==e&&(n._events[o].list.splice(e,1),n._events[o].list.length||(n.detachEvent&&n.detachEvent("on"+o,n._events[o]),delete
n._events[o])))},window.dispatchEvent=Window.prototype.dispatchEvent=Document.prototype.dispatchEvent=Element.prototype.dispatchEvent=function(e){if(!arguments.length)throw
new Error("Not enough
arguments");if(!e||"string"!=typeof e.type)throw new
Error("DOM Events Exception 0");var
t=this,n=e.type;try{if(!e.bubbles){e.cancelBubble=!0;var
o=function(e){e.cancelBubble=!0,(t||window).detachEvent("on"+n,o)};this.attachEvent("on"+n,o)}this.fireEvent("on"+n,e)}catch(r){e.target=t;do
e.currentTarget=t,"_events"in
t&&"function"==typeof
t._events[n]&&t._events[n].call(t,e),"function"==typeof
t["on"+n]&&t["on"+n].call(t,e),t=9===t.nodeType?t.parentWindow:t.parentNode;while(t&&!e.cancelBubble)}return!0},document.attachEvent("onreadystatechange",function(){"complete"===document.readyState&&document.dispatchEvent(new
Event("DOMContentLoaded",{bubbles:!0}))}))}()}).call("object"==typeof
window&&window||"object"==typeof
self&&self||"object"==typeof global&&global||{});
PK`n�[��X�~~"js/polyfill.filter-uncompressed.jsnu�[���/*
Polyfill service v3.14.0
 * For detailed credits and licence information see
https://github.com/financial-times/polyfill-service.
 * 
 * UA detected: ie/8.0.0
 * Features requested: Array.prototype.filter
 * 
 * - Array.prototype.filter, License: CC0 */

(function(undefined) {
if (!('filter' in Array.prototype)) {

// Array.prototype.filter
Array.prototype.filter = function filter(callback) {
	if (this === undefined || this === null) {
		throw new TypeError(this + ' is not an object');
	}

	if (!(callback instanceof Function)) {
		throw new TypeError(callback + ' is not a function');
	}

	var
	object = Object(this),
	scope = arguments[1],
	arraylike = object instanceof String ? object.split('') :
object,
	length = Math.max(Math.min(arraylike.length, 9007199254740991), 0) || 0,
	index = -1,
	result = [],
	element;

	while (++index < length) {
		element = arraylike[index];

		if (index in arraylike && callback.call(scope, element, index,
object)) {
			result.push(element);
		}
	}

	return result;
};

}

})
.call('object' === typeof window && window ||
'object' === typeof self && self || 'object'
=== typeof global && global || {});
PK`n�[	���

js/polyfill.filter.jsnu�[���(function(a){"filter"in
Array.prototype||(Array.prototype.filter=function(c){if(this===a||null===this)throw
new TypeError(this+" is not an object");if(!(c instanceof
Function))throw new TypeError(c+" is not a function");for(var
j,d=Object(this),e=arguments[1],f=d instanceof
String?d.split(""):d,g=Math.max(Math.min(f.length,9007199254740991),0)||0,h=-1,i=[];++h<g;)j=f[h],h
in f&&c.call(e,j,h,d)&&i.push(j);return
i})}).call("object"==typeof
window&&window||"object"==typeof
self&&self||"object"==typeof
global&&global||{});PK`n�[�S�DDjs/polyfill.map-uncompressed.jsnu�[���/*
Polyfill service v3.14.0
 * For detailed credits and licence information see
https://github.com/financial-times/polyfill-service.
 * 
 * UA detected: ie/8.0.0
 * Features requested: Array.prototype.map
 * 
 * - Array.prototype.map, License: CC0 */

(function(undefined) {
if (!('map' in Array.prototype)) {

// Array.prototype.map
Array.prototype.map = function map(callback) {
	if (this === undefined || this === null) {
		throw new TypeError(this + ' is not an object');
	}

	if (!(callback instanceof Function)) {
		throw new TypeError(callback + ' is not a function');
	}

	var
	object = Object(this),
	scope = arguments[1],
	arraylike = object instanceof String ? object.split('') :
object,
	length = Math.max(Math.min(arraylike.length, 9007199254740991), 0) || 0,
	index = -1,
	result = [];

	while (++index < length) {
		if (index in arraylike) {
			result[index] = callback.call(scope, arraylike[index], index, object);
		}
	}

	return result;
};

}

})
.call('object' === typeof window && window ||
'object' === typeof self && self || 'object'
=== typeof global && global || {});
PK`n�[_�>B��js/polyfill.map.jsnu�[���(function(a){"map"in
Array.prototype||(Array.prototype.map=function(c){if(this===a||null===this)throw
new TypeError(this+" is not an object");if(!(c instanceof
Function))throw new TypeError(c+" is not a function");for(var
d=Object(this),e=arguments[1],f=d instanceof
String?d.split(""):d,g=Math.max(Math.min(f.length,9007199254740991),0)||0,h=-1,i=[];++h<g;)h
in f&&(i[h]=c.call(e,f[h],h,d));return
i})}).call("object"==typeof
window&&window||"object"==typeof
self&&self||"object"==typeof
global&&global||{});PK`n�[}h[&EuEu!js/polyfill.xpath-uncompressed.jsnu�[���(function(undefined)
{
    if (!('evaluate' in Array.prototype)) {
        (function(){'use strict';var k=this;
            function aa(a){var b=typeof
a;if("object"==b)if(a){if(a instanceof
Array)return"array";if(a instanceof Object)return b;var
c=Object.prototype.toString.call(a);if("[object
Window]"==c)return"object";if("[object
Array]"==c||"number"==typeof
a.length&&"undefined"!=typeof
a.splice&&"undefined"!=typeof
a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object
Function]"==c||"undefined"!=typeof
a.call&&"undefined"!=typeof
a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else
return"null";else if("function"==
                b&&"undefined"==typeof
a.call)return"object";return b}function
l(a){return"string"==typeof a}function ba(a,b,c){return
a.call.apply(a.bind,arguments)}function ca(a,b,c){if(!a)throw
Error();if(2<arguments.length){var
d=Array.prototype.slice.call(arguments,2);return function(){var
c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return
a.apply(b,c)}}return function(){return a.apply(b,arguments)}}
            function
da(a,b,c){da=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native
code")?ba:ca;return da.apply(null,arguments)}function ea(a,b){var
c=Array.prototype.slice.call(arguments,1);return function(){var
b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}}
            function m(a){var b=n;function
c(){}c.prototype=b.prototype;a.G=b.prototype;a.prototype=new
c;a.prototype.constructor=a;a.F=function(a,c,f){for(var
g=Array(arguments.length-2),h=2;h<arguments.length;h++)g[h-2]=arguments[h];return
b.prototype[c].apply(a,g)}};/*

             The MIT License

             Copyright (c) 2007 Cybozu Labs, Inc.
             Copyright (c) 2012 Google Inc.

             Permission is hereby granted, free of charge, to any person
obtaining a copy
             of this software and associated documentation files (the
"Software"), to
             deal in the Software without restriction, including without
limitation the
             rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or
             sell copies of the Software, and to permit persons to whom the
Software is
             furnished to do so, subject to the following conditions:

             The above copyright notice and this permission notice shall be
included in
             all copies or substantial portions of the Software.

             THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY
OF ANY KIND, EXPRESS OR
             IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY,
             FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE
             AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
OR OTHER
             LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING
             FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS
             IN THE SOFTWARE.
             */
            var fa=String.prototype.trim?function(a){return
a.trim()}:function(a){return
a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")};function
q(a,b){return-1!=a.indexOf(b)}function ga(a,b){return
a<b?-1:a>b?1:0};var ha=Array.prototype.indexOf?function(a,b,c){return
Array.prototype.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(l(a))return
l(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in
a&&a[c]===b)return
c;return-1},r=Array.prototype.forEach?function(a,b,c){Array.prototype.forEach.call(a,b,c)}:function(a,b,c){for(var
d=a.length,e=l(a)?a.split(""):a,f=0;f<d;f++)f in
e&&b.call(c,e[f],f,a)},ia=Array.prototype.filter?function(a,b,c){return
Array.prototype.filter.call(a,
                b,c)}:function(a,b,c){for(var
d=a.length,e=[],f=0,g=l(a)?a.split(""):a,h=0;h<d;h++)if(h in
g){var p=g[h];b.call(c,p,h,a)&&(e[f++]=p)}return
e},t=Array.prototype.reduce?function(a,b,c,d){d&&(b=da(b,d));return
Array.prototype.reduce.call(a,b,c)}:function(a,b,c,d){var
e=c;r(a,function(c,g){e=b.call(d,e,c,g,a)});return
e},ja=Array.prototype.some?function(a,b,c){return
Array.prototype.some.call(a,b,c)}:function(a,b,c){for(var
d=a.length,e=l(a)?a.split(""):a,f=0;f<d;f++)if(f in
e&&b.call(c,e[f],f,a))return!0;
                return!1};function ka(a,b){a:{for(var
c=a.length,d=l(a)?a.split(""):a,e=0;e<c;e++)if(e in
d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return
0>b?null:l(a)?a.charAt(b):a[b]}function la(a){return
Array.prototype.concat.apply(Array.prototype,arguments)}function
ma(a,b,c){return
2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var
u;a:{var na=k.navigator;if(na){var oa=na.userAgent;if(oa){u=oa;break
a}}u=""};var
pa=q(u,"Opera"),v=q(u,"Trident")||q(u,"MSIE"),qa=q(u,"Edge"),ra=q(u,"Gecko")&&!(q(u.toLowerCase(),"webkit")&&!q(u,"Edge"))&&!(q(u,"Trident")||q(u,"MSIE"))&&!q(u,"Edge"),sa=q(u.toLowerCase(),"webkit")&&!q(u,"Edge");function
ta(){var a=k.document;return a?a.documentMode:void 0}var ua;
            a:{var va="",wa=function(){var
a=u;if(ra)return/rv\:([^\);]+)(\)|;)/.exec(a);if(qa)return/Edge\/([\d\.]+)/.exec(a);if(v)return/\b(?:MSIE|rv)[:
]([^\);]+)(\)|;)/.exec(a);if(sa)return/WebKit\/(\S+)/.exec(a);if(pa)return/(?:Version)[
\/]?(\S+)/.exec(a)}();wa&&(va=wa?wa[1]:"");if(v){var
xa=ta();if(null!=xa&&xa>parseFloat(va)){ua=String(xa);break
a}}ua=va}var ya={};
            function za(a){if(!ya[a]){for(var
b=0,c=fa(String(ua)).split("."),d=fa(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f<e;f++){var
g=c[f]||"",h=d[f]||"",p=/(\d*)(\D*)/g,x=/(\d*)(\D*)/g;do{var
D=p.exec(g)||["","",""],X=x.exec(h)||["","",""];if(0==D[0].length&&0==X[0].length)break;b=ga(0==D[1].length?0:parseInt(D[1],10),0==X[1].length?0:parseInt(X[1],10))||ga(0==D[2].length,0==X[2].length)||ga(D[2],X[2])}while(0==b)}ya[a]=0<=b}}
            var
Aa=k.document,Ba=Aa&&v?ta()||("CSS1Compat"==Aa.compatMode?parseInt(ua,10):5):void
0;!ra&&!v||v&&9<=Number(Ba)||ra&&za("1.9.1");v&&za("9");function
Ca(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return
a==b||a.contains(b);if("undefined"!=typeof
a.compareDocumentPosition)return
a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return
b==a}
            function Da(a,b){if(a==b)return
0;if(a.compareDocumentPosition)return
a.compareDocumentPosition(b)&2?1:-1;if(v&&!(9<=Number(Ba))){if(9==a.nodeType)return-1;if(9==b.nodeType)return
1}if("sourceIndex"in
a||a.parentNode&&"sourceIndex"in a.parentNode){var
c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return
a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return
e==f?Ea(a,b):!c&&Ca(e,b)?-1*Fa(a,b):!d&&Ca(f,a)?Fa(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType?
               
a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange();a.selectNode(b);a.collapse(!0);return
c.compareBoundaryPoints(k.Range.START_TO_END,a)}function Fa(a,b){var
c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return
Ea(b,a)}function Ea(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return
1};var
w=v&&!(9<=Number(Ba)),Ga=v&&!(8<=Number(Ba));function
y(a,b,c,d){this.a=a;this.nodeName=c;this.nodeValue=d;this.nodeType=2;this.parentNode=this.ownerElement=b}function
Ha(a,b){var
c=Ga&&"href"==b.nodeName?a.getAttribute(b.nodeName,2):b.nodeValue;return
new y(b,a,b.nodeName,c)};function z(a){var
b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void
0==b||null==b?a.innerText:b,b=void
0==b||null==b?"":b);if("string"!=typeof
b)if(w&&"title"==a.nodeName.toLowerCase()&&1==c)b=a.text;else
if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;for(var
c=0,d=[],b="";a;){do
1!=a.nodeType&&(b+=a.nodeValue),w&&"title"==a.nodeName.toLowerCase()&&(b+=a.text),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else
b=a.nodeValue;return""+b}
            function
A(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}catch(d){return!1}Ga&&"class"==b&&(b="className");return
null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function
B(a,b,c,d,e){return(w?Ia:Ja).call(null,a,b,l(c)?c:null,l(d)?d:null,e||new
C)}
            function Ia(a,b,c,d,e){if(a instanceof
E||8==a.b||c&&null===a.b){var f=b.all;if(!f)return
e;a=Ka(a);if("*"!=a&&(f=b.getElementsByTagName(a),!f))return
e;if(c){for(var
g=[],h=0;b=f[h++];)A(b,c,d)&&g.push(b);f=g}for(h=0;b=f[h++];)"*"==a&&"!"==b.tagName||F(e,b);return
e}La(a,b,c,d,e);return e}
            function
Ja(a,b,c,d,e){b.getElementsByName&&d&&"name"==c&&!v?(b=b.getElementsByName(d),r(b,function(b){a.a(b)&&F(e,b)})):b.getElementsByClassName&&d&&"class"==c?(b=b.getElementsByClassName(d),r(b,function(b){b.className==d&&a.a(b)&&F(e,b)})):a
instanceof
G?La(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.f()),r(b,function(a){A(a,c,d)&&F(e,a)}));return
e}
            function Ma(a,b,c,d,e){var f;if((a instanceof
E||8==a.b||c&&null===a.b)&&(f=b.childNodes)){var
g=Ka(a);if("*"!=g&&(f=ia(f,function(a){return
a.tagName&&a.tagName.toLowerCase()==g}),!f))return
e;c&&(f=ia(f,function(a){return
A(a,c,d)}));r(f,function(a){"*"==g&&("!"==a.tagName||"*"==g&&1!=a.nodeType)||F(e,a)});return
e}return Na(a,b,c,d,e)}function
Na(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a.a(b)&&F(e,b);return
e}
            function
La(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a.a(b)&&F(e,b),La(a,b,c,d,e)}function
Ka(a){if(a instanceof
G){if(8==a.b)return"!";if(null===a.b)return"*"}return
a.f()};function C(){this.b=this.a=null;this.l=0}function
Oa(a){this.node=a;this.a=this.b=null}function Pa(a,b){if(!a.a)return
b;if(!b.a)return a;var c=a.a;b=b.a;for(var
d=null,e,f=0;c&&b;){e=c.node;var g=b.node;e==g||e instanceof
y&&g instanceof
y&&e.a==g.a?(e=c,c=c.a,b=b.a):0<Da(c.node,b.node)?(e=b,b=b.a):(e=c,c=c.a);(e.b=d)?d.a=e:a.a=e;d=e;f++}for(e=c||b;e;)e.b=d,d=d.a=e,f++,e=e.a;a.b=d;a.l=f;return
a}function Qa(a,b){b=new Oa(b);b.a=a.a;a.b?a.a.b=b:a.a=a.b=b;a.a=b;a.l++}
            function F(a,b){b=new
Oa(b);b.b=a.b;a.a?a.b.a=b:a.a=a.b=b;a.b=b;a.l++}function
Ra(a){return(a=a.a)?a.node:null}function
Sa(a){return(a=Ra(a))?z(a):""}function H(a,b){return new
Ta(a,!!b)}function
Ta(a,b){this.f=a;this.b=(this.c=b)?a.b:a.a;this.a=null}function I(a){var
b=a.b;if(null==b)return null;var c=a.a=b;a.b=a.c?b.b:b.a;return
c.node};function n(a){this.i=a;this.b=this.g=!1;this.f=null}function
J(a){return"\n 
"+a.toString().split("\n").join("\n  ")}function
Ua(a,b){a.g=b}function Va(a,b){a.b=b}function K(a,b){a=a.a(b);return a
instanceof C?+Sa(a):+a}function L(a,b){a=a.a(b);return a instanceof
C?Sa(a):""+a}function M(a,b){a=a.a(b);return a instanceof
C?!!a.l:!!a};function
N(a,b,c){n.call(this,a.i);this.c=a;this.h=b;this.o=c;this.g=b.g||c.g;this.b=b.b||c.b;this.c==Wa&&(c.b||c.g||4==c.i||0==c.i||!b.f?b.b||b.g||4==b.i||0==b.i||!c.f||(this.f={name:c.f.name,s:b}):this.f={name:b.f.name,s:c})}m(N);
            function O(a,b,c,d,e){b=b.a(d);c=c.a(d);var f;if(b instanceof
C&&c instanceof
C){b=H(b);for(d=I(b);d;d=I(b))for(e=H(c),f=I(e);f;f=I(e))if(a(z(d),z(f)))return!0;return!1}if(b
instanceof C||c instanceof C){b instanceof
C?(e=b,d=c):(e=c,d=b);f=H(e);for(var g=typeof
d,h=I(f);h;h=I(f)){switch(g){case "number":h=+z(h);break;case
"boolean":h=!!z(h);break;case
"string":h=z(h);break;default:throw Error("Illegal primitive
type for
comparison.");}if(e==b&&a(h,d)||e==c&&a(d,h))return!0}return!1}return
e?"boolean"==
            typeof b||"boolean"==typeof
c?a(!!b,!!c):"number"==typeof b||"number"==typeof
c?a(+b,+c):a(b,c):a(+b,+c)}N.prototype.a=function(a){return
this.c.m(this.h,this.o,a)};N.prototype.toString=function(){var
a="Binary Expression: "+this.c,a=a+J(this.h);return
a+=J(this.o)};function
Xa(a,b,c,d){this.a=a;this.w=b;this.i=c;this.m=d}Xa.prototype.toString=function(){return
this.a};var Ya={};
            function P(a,b,c,d){if(Ya.hasOwnProperty(a))throw
Error("Binary operator already created: "+a);a=new
Xa(a,b,c,d);return
Ya[a.toString()]=a}P("div",6,1,function(a,b,c){return
K(a,c)/K(b,c)});P("mod",6,1,function(a,b,c){return
K(a,c)%K(b,c)});P("*",6,1,function(a,b,c){return
K(a,c)*K(b,c)});P("+",5,1,function(a,b,c){return
K(a,c)+K(b,c)});P("-",5,1,function(a,b,c){return
K(a,c)-K(b,c)});P("<",4,2,function(a,b,c){return
O(function(a,b){return a<b},a,b,c)});
            P(">",4,2,function(a,b,c){return
O(function(a,b){return
a>b},a,b,c)});P("<=",4,2,function(a,b,c){return
O(function(a,b){return
a<=b},a,b,c)});P(">=",4,2,function(a,b,c){return
O(function(a,b){return a>=b},a,b,c)});var
Wa=P("=",3,2,function(a,b,c){return O(function(a,b){return
a==b},a,b,c,!0)});P("!=",3,2,function(a,b,c){return
O(function(a,b){return
a!=b},a,b,c,!0)});P("and",2,2,function(a,b,c){return
M(a,c)&&M(b,c)});P("or",1,2,function(a,b,c){return
M(a,c)||M(b,c)});function
Q(a,b,c){this.a=a;this.b=b||1;this.f=c||1};function
Za(a,b){if(b.a.length&&4!=a.i)throw Error("Primary expression
must evaluate to nodeset if filter has
predicate(s).");n.call(this,a.i);this.c=a;this.h=b;this.g=a.g;this.b=a.b}m(Za);Za.prototype.a=function(a){a=this.c.a(a);return
$a(this.h,a)};Za.prototype.toString=function(){var
a;a="Filter:"+J(this.c);return a+=J(this.h)};function
ab(a,b){if(b.length<a.A)throw Error("Function "+a.j+"
expects at least"+a.A+" arguments, "+b.length+"
given");if(null!==a.v&&b.length>a.v)throw
Error("Function "+a.j+" expects at most "+a.v+"
arguments, "+b.length+"
given");a.B&&r(b,function(b,d){if(4!=b.i)throw
Error("Argument "+d+" to function "+a.j+" is not
of type Nodeset:
"+b);});n.call(this,a.i);this.h=a;this.c=b;Ua(this,a.g||ja(b,function(a){return
a.g}));Va(this,a.D&&!b.length||a.C&&!!b.length||ja(b,function(a){return
a.b}))}m(ab);
            ab.prototype.a=function(a){return
this.h.m.apply(null,la(a,this.c))};ab.prototype.toString=function(){var
a="Function: "+this.h;if(this.c.length)var
b=t(this.c,function(a,b){return
a+J(b)},"Arguments:"),a=a+J(b);return a};function
bb(a,b,c,d,e,f,g,h,p){this.j=a;this.i=b;this.g=c;this.D=d;this.C=e;this.m=f;this.A=g;this.v=void
0!==h?h:g;this.B=!!p}bb.prototype.toString=function(){return this.j};var
cb={};
            function R(a,b,c,d,e,f,g,h){if(cb.hasOwnProperty(a))throw
Error("Function already created: "+a+".");cb[a]=new
bb(a,b,c,d,!1,e,f,g,h)}R("boolean",2,!1,!1,function(a,b){return
M(b,a)},1);R("ceiling",1,!1,!1,function(a,b){return
Math.ceil(K(b,a))},1);R("concat",3,!1,!1,function(a,b){return
t(ma(arguments,1),function(b,d){return
b+L(d,a)},"")},2,null);R("contains",2,!1,!1,function(a,b,c){return
q(L(b,a),L(c,a))},2);R("count",1,!1,!1,function(a,b){return
b.a(a).l},1,1,!0);
           
R("false",2,!1,!1,function(){return!1},0);R("floor",1,!1,!1,function(a,b){return
Math.floor(K(b,a))},1);R("id",4,!1,!1,function(a,b){function
c(a){if(w){var b=e.all[a];if(b){if(b.nodeType&&a==b.id)return
b;if(b.length)return ka(b,function(b){return a==b.id})}return null}return
e.getElementById(a)}var
d=a.a,e=9==d.nodeType?d:d.ownerDocument;a=L(b,a).split(/\s+/);var
f=[];r(a,function(a){a=c(a);!a||0<=ha(f,a)||f.push(a)});f.sort(Da);var
g=new C;r(f,function(a){F(g,a)});return g},1);
           
R("lang",2,!1,!1,function(){return!1},1);R("last",1,!0,!1,function(a){if(1!=arguments.length)throw
Error("Function last expects ()");return
a.f},0);R("local-name",3,!1,!0,function(a,b){return(a=b?Ra(b.a(a)):a.a)?a.localName||a.nodeName.toLowerCase():""},0,1,!0);R("name",3,!1,!0,function(a,b){return(a=b?Ra(b.a(a)):a.a)?a.nodeName.toLowerCase():""},0,1,!0);R("namespace-uri",3,!0,!1,function(){return""},0,1,!0);
           
R("normalize-space",3,!1,!0,function(a,b){return(b?L(b,a):z(a.a)).replace(/[\s\xa0]+/g,"
").replace(/^\s+|\s+$/g,"")},0,1);R("not",2,!1,!1,function(a,b){return!M(b,a)},1);R("number",1,!1,!0,function(a,b){return
b?K(b,a):+z(a.a)},0,1);R("position",1,!0,!1,function(a){return
a.b},0);R("round",1,!1,!1,function(a,b){return
Math.round(K(b,a))},1);R("starts-with",2,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);return
0==b.lastIndexOf(a,0)},2);R("string",3,!1,!0,function(a,b){return
b?L(b,a):z(a.a)},0,1);
           
R("string-length",1,!1,!0,function(a,b){return(b?L(b,a):z(a.a)).length},0,1);R("substring",3,!1,!1,function(a,b,c,d){c=K(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return"";d=d?K(d,a):Infinity;if(isNaN(d)||-Infinity===d)return"";c=Math.round(c)-1;var
e=Math.max(c,0);a=L(b,a);return
Infinity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);R("substring-after",3,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);c=b.indexOf(a);return-1==c?"":b.substring(c+a.length)},2);
           
R("substring-before",3,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);a=b.indexOf(a);return-1==a?"":b.substring(0,a)},2);R("sum",1,!1,!1,function(a,b){a=H(b.a(a));b=0;for(var
c=I(a);c;c=I(a))b+=+z(c);return
b},1,1,!0);R("translate",3,!1,!1,function(a,b,c,d){b=L(b,a);c=L(c,a);var
e=L(d,a);a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f in
a||(a[f]=e.charAt(d))}c="";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f
in a?a[f]:f;return
c},3);R("true",2,!1,!1,function(){return!0},0);function
G(a,b){this.h=a;this.c=void 0!==b?b:null;this.b=null;switch(a){case
"comment":this.b=8;break;case
"text":this.b=3;break;case
"processing-instruction":this.b=7;break;case
"node":break;default:throw Error("Unexpected
argument");}}function
db(a){return"comment"==a||"text"==a||"processing-instruction"==a||"node"==a}G.prototype.a=function(a){return
null===this.b||this.b==a.nodeType};G.prototype.f=function(){return this.h};
            G.prototype.toString=function(){var a="Kind Test:
"+this.h;null===this.c||(a+=J(this.c));return a};function
eb(a){this.b=a;this.a=0}function fb(a){a=a.match(gb);for(var
b=0;b<a.length;b++)hb.test(a[b])&&a.splice(b,1);return new
eb(a)}var
gb=/\$?(?:(?![0-9-\.])(?:\*|[\w-\.]+):)?(?![0-9-\.])(?:\*|[\w-\.]+)|\/\/|\.\.|::|\d+(?:\.\d*)?|\.\d+|"[^"]*"|'[^']*'|[!<>]=|\s+|./g,hb=/^\s/;function
S(a,b){return a.b[a.a+(b||0)]}function T(a){return a.b[a.a++]}function
ib(a){return a.b.length<=a.a};function
jb(a){n.call(this,3);this.c=a.substring(1,a.length-1)}m(jb);jb.prototype.a=function(){return
this.c};jb.prototype.toString=function(){return"Literal:
"+this.c};function
E(a,b){this.j=a.toLowerCase();a="*"==this.j?"*":"http://www.w3.org/1999/xhtml";this.c=b?b.toLowerCase():a}E.prototype.a=function(a){var
b=a.nodeType;if(1!=b&&2!=b)return!1;b=void
0!==a.localName?a.localName:a.nodeName;return"*"!=this.j&&this.j!=b.toLowerCase()?!1:"*"==this.c?!0:this.c==(a.namespaceURI?a.namespaceURI.toLowerCase():"http://www.w3.org/1999/xhtml")};E.prototype.f=function(){return
this.j};
            E.prototype.toString=function(){return"Name Test:
"+("http://www.w3.org/1999/xhtml"==this.c?"":this.c+":")+this.j};function
kb(a){n.call(this,1);this.c=a}m(kb);kb.prototype.a=function(){return
this.c};kb.prototype.toString=function(){return"Number:
"+this.c};function
lb(a,b){n.call(this,a.i);this.h=a;this.c=b;this.g=a.g;this.b=a.b;1==this.c.length&&(a=this.c[0],a.u||a.c!=mb||(a=a.o,"*"!=a.f()&&(this.f={name:a.f(),s:null})))}m(lb);function
nb(){n.call(this,4)}m(nb);nb.prototype.a=function(a){var b=new
C;a=a.a;9==a.nodeType?F(b,a):F(b,a.ownerDocument);return
b};nb.prototype.toString=function(){return"Root Helper
Expression"};function
ob(){n.call(this,4)}m(ob);ob.prototype.a=function(a){var b=new
C;F(b,a.a);return b};ob.prototype.toString=function(){return"Context
Helper Expression"};
            function
pb(a){return"/"==a||"//"==a}lb.prototype.a=function(a){var
b=this.h.a(a);if(!(b instanceof C))throw Error("Filter expression must
evaluate to nodeset.");a=this.c;for(var
c=0,d=a.length;c<d&&b.l;c++){var
e=a[c],f=H(b,e.c.a),g;if(e.g||e.c!=qb)if(e.g||e.c!=rb)for(g=I(f),b=e.a(new
Q(g));null!=(g=I(f));)g=e.a(new Q(g)),b=Pa(b,g);else g=I(f),b=e.a(new
Q(g));else{for(g=I(f);(b=I(f))&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.a(new
Q(g))}}return b};
            lb.prototype.toString=function(){var a;a="Path
Expression:"+J(this.h);if(this.c.length){var
b=t(this.c,function(a,b){return a+J(b)},"Steps:");a+=J(b)}return
a};function sb(a,b){this.a=a;this.b=!!b}
            function $a(a,b,c){for(c=c||0;c<a.a.length;c++)for(var
d=a.a[c],e=H(b),f=b.l,g,h=0;g=I(e);h++){var p=a.b?f-h:h+1;g=d.a(new
Q(g,p,f));if("number"==typeof g)p=p==g;else
if("string"==typeof g||"boolean"==typeof g)p=!!g;else
if(g instanceof C)p=0<g.l;else throw Error("Predicate.evaluate
returned an unexpected type.");if(!p){p=e;g=p.f;var x=p.a;if(!x)throw
Error("Next must be called at least once before remove.");var
D=x.b,x=x.a;D?D.a=x:g.a=x;x?x.b=D:g.b=D;g.l--;p.a=null}}return b}
            sb.prototype.toString=function(){return
t(this.a,function(a,b){return a+J(b)},"Predicates:")};function
U(a,b,c,d){n.call(this,4);this.c=a;this.o=b;this.h=c||new
sb([]);this.u=!!d;b=this.h;b=0<b.a.length?b.a[0].f:null;a.b&&b&&(a=b.name,a=w?a.toLowerCase():a,this.f={name:a,s:b.s});a:{a=this.h;for(b=0;b<a.a.length;b++)if(c=a.a[b],c.g||1==c.i||0==c.i){a=!0;break
a}a=!1}this.g=a}m(U);
            U.prototype.a=function(a){var
b=a.a,c=this.f,d=null,e=null,f=0;c&&(d=c.name,e=c.s?L(c.s,a):null,f=1);if(this.u)if(this.g||this.c!=tb)if(b=H((new
U(ub,new
G("node"))).a(a)),c=I(b))for(a=this.m(c,d,e,f);null!=(c=I(b));)a=Pa(a,this.m(c,d,e,f));else
a=new C;else a=B(this.o,b,d,e),a=$a(this.h,a,f);else
a=this.m(a.a,d,e,f);return
a};U.prototype.m=function(a,b,c,d){a=this.c.f(this.o,a,b,c);return
a=$a(this.h,a,d)};
            U.prototype.toString=function(){var
a;a="Step:"+J("Operator:
"+(this.u?"//":"/"));this.c.j&&(a+=J("Axis:
"+this.c));a+=J(this.o);if(this.h.a.length){var
b=t(this.h.a,function(a,b){return
a+J(b)},"Predicates:");a+=J(b)}return a};function
vb(a,b,c,d){this.j=a;this.f=b;this.a=c;this.b=d}vb.prototype.toString=function(){return
this.j};var wb={};function V(a,b,c,d){if(wb.hasOwnProperty(a))throw
Error("Axis already created: "+a);b=new vb(a,b,c,!!d);return
wb[a]=b}
            V("ancestor",function(a,b){for(var c=new
C;b=b.parentNode;)a.a(b)&&Qa(c,b);return
c},!0);V("ancestor-or-self",function(a,b){var c=new C;do
a.a(b)&&Qa(c,b);while(b=b.parentNode);return c},!0);
            var mb=V("attribute",function(a,b){var c=new
C,d=a.f();if("style"==d&&w&&b.style)return
F(c,new y(b.style,b,"style",b.style.cssText)),c;var
e=b.attributes;if(e)if(a instanceof
G&&null===a.b||"*"==d)for(a=0;d=e[a];a++)w?d.nodeValue&&F(c,Ha(b,d)):F(c,d);else(d=e.getNamedItem(d))&&(w?d.nodeValue&&F(c,Ha(b,d)):F(c,d));return
c},!1),tb=V("child",function(a,b,c,d,e){return(w?Ma:Na).call(null,a,b,l(c)?c:null,l(d)?d:null,e||new
C)},!1,!0);V("descendant",B,!1,!0);
            var ub=V("descendant-or-self",function(a,b,c,d){var
e=new C;A(b,c,d)&&a.a(b)&&F(e,b);return
B(a,b,c,d,e)},!1,!0),qb=V("following",function(a,b,c,d){var e=new
C;do for(var
f=b;f=f.nextSibling;)A(f,c,d)&&a.a(f)&&F(e,f),e=B(a,f,c,d,e);while(b=b.parentNode);return
e},!1,!0);V("following-sibling",function(a,b){for(var c=new
C;b=b.nextSibling;)a.a(b)&&F(c,b);return
c},!1);V("namespace",function(){return new C},!1);
            var xb=V("parent",function(a,b){var c=new
C;if(9==b.nodeType)return c;if(2==b.nodeType)return
F(c,b.ownerElement),c;b=b.parentNode;a.a(b)&&F(c,b);return
c},!1),rb=V("preceding",function(a,b,c,d){var e=new C,f=[];do
f.unshift(b);while(b=b.parentNode);for(var g=1,h=f.length;g<h;g++){var
p=[];for(b=f[g];b=b.previousSibling;)p.unshift(b);for(var
x=0,D=p.length;x<D;x++)b=p[x],A(b,c,d)&&a.a(b)&&F(e,b),e=B(a,b,c,d,e)}return
e},!0,!0);
            V("preceding-sibling",function(a,b){for(var c=new
C;b=b.previousSibling;)a.a(b)&&Qa(c,b);return c},!0);var
yb=V("self",function(a,b){var c=new
C;a.a(b)&&F(c,b);return c},!1);function
zb(a){n.call(this,1);this.c=a;this.g=a.g;this.b=a.b}m(zb);zb.prototype.a=function(a){return-K(this.c,a)};zb.prototype.toString=function(){return"Unary
Expression: -"+J(this.c)};function
Ab(a){n.call(this,4);this.c=a;Ua(this,ja(this.c,function(a){return
a.g}));Va(this,ja(this.c,function(a){return
a.b}))}m(Ab);Ab.prototype.a=function(a){var b=new
C;r(this.c,function(c){c=c.a(a);if(!(c instanceof C))throw Error("Path
expression must evaluate to NodeSet.");b=Pa(b,c)});return
b};Ab.prototype.toString=function(){return t(this.c,function(a,b){return
a+J(b)},"Union Expression:")};function
Bb(a,b){this.a=a;this.b=b}function Cb(a){for(var
b,c=[];;){W(a,"Missing right hand side of binary
expression.");b=Db(a);var d=T(a.a);if(!d)break;var
e=(d=Ya[d]||null)&&d.w;if(!e){a.a.a--;break}for(;c.length&&e<=c[c.length-1].w;)b=new
N(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new
N(c.pop(),c.pop(),b);return b}function W(a,b){if(ib(a.a))throw
Error(b);}function Eb(a,b){a=T(a.a);if(a!=b)throw Error("Bad token,
expected: "+b+" got: "+a);}
            function Fb(a){a=T(a.a);if(")"!=a)throw
Error("Bad token: "+a);}function
Gb(a){a=T(a.a);if(2>a.length)throw Error("Unclosed literal
string");return new jb(a)}
            function Hb(a){var
b,c=[],d;if(pb(S(a.a))){b=T(a.a);d=S(a.a);if("/"==b&&(ib(a.a)||"."!=d&&".."!=d&&"@"!=d&&"*"!=d&&!/(?![0-9])[\w]/.test(d)))return
new nb;d=new nb;W(a,"Missing next location
step.");b=Ib(a,b);c.push(b)}else{a:{b=S(a.a);d=b.charAt(0);switch(d){case
"$":throw Error("Variable reference not allowed in HTML
XPath");case "(":T(a.a);b=Cb(a);W(a,'unclosed
"("');Eb(a,")");break;case '"':case
"'":b=Gb(a);break;default:if(isNaN(+b))if(!db(b)&&/(?![0-9])[\w]/.test(d)&&"("==S(a.a,1)){b=T(a.a);
               
b=cb[b]||null;T(a.a);for(d=[];")"!=S(a.a);){W(a,"Missing
function argument
list.");d.push(Cb(a));if(","!=S(a.a))break;T(a.a)}W(a,"Unclosed
function argument list.");Fb(a);b=new ab(b,d)}else{b=null;break a}else
b=new kb(+T(a.a))}"["==S(a.a)&&(d=new sb(Jb(a)),b=new
Za(b,d))}if(b)if(pb(S(a.a)))d=b;else return b;else
b=Ib(a,"/"),d=new
ob,c.push(b)}for(;pb(S(a.a));)b=T(a.a),W(a,"Missing next location
step."),b=Ib(a,b),c.push(b);return new lb(d,c)}
            function Ib(a,b){var
c,d;if("/"!=b&&"//"!=b)throw Error('Step
op should be "/" or
"//"');if("."==S(a.a))return d=new U(yb,new
G("node")),T(a.a),d;if(".."==S(a.a))return d=new
U(xb,new G("node")),T(a.a),d;var
e;if("@"==S(a.a))e=mb,T(a.a),W(a,"Missing attribute
name");else
if("::"==S(a.a,1)){if(!/(?![0-9])[\w]/.test(S(a.a).charAt(0)))throw
Error("Bad token: "+T(a.a));c=T(a.a);e=wb[c]||null;if(!e)throw
Error("No axis with name: "+c);T(a.a);W(a,"Missing node
name")}else
e=tb;c=S(a.a);if(/(?![0-9])[\w\*]/.test(c.charAt(0)))if("("==
                S(a.a,1)){if(!db(c))throw Error("Invalid node type:
"+c);c=T(a.a);if(!db(c))throw Error("Invalid type name:
"+c);Eb(a,"(");W(a,"Bad nodetype");var
f=S(a.a).charAt(0),g=null;if('"'==f||"'"==f)g=Gb(a);W(a,"Bad
nodetype");Fb(a);c=new G(c,g)}else
if(c=T(a.a),f=c.indexOf(":"),-1==f)c=new E(c);else{var
g=c.substring(0,f),h;if("*"==g)h="*";else
if(h=a.b(g),!h)throw Error("Namespace prefix not declared:
"+g);c=c.substr(f+1);c=new E(c,h)}else throw Error("Bad token:
"+T(a.a));a=new sb(Jb(a),e.a);return d||
                new U(e,c,a,"//"==b)}function Jb(a){for(var
b=[];"["==S(a.a);){T(a.a);W(a,"Missing predicate
expression.");var c=Cb(a);b.push(c);W(a,"Unclosed predicate
expression.");Eb(a,"]")}return b}function
Db(a){if("-"==S(a.a))return T(a.a),new zb(Db(a));var
b=Hb(a);if("|"!=S(a.a))a=b;else{for(b=[b];"|"==T(a.a);)W(a,"Missing
next union location path."),b.push(Hb(a));a.a.a--;a=new Ab(b)}return
a};function Kb(a){switch(a.nodeType){case 1:return ea(Lb,a);case 9:return
Kb(a.documentElement);case 11:case 10:case 6:case 12:return
Mb;default:return a.parentNode?Kb(a.parentNode):Mb}}function Mb(){return
null}function Lb(a,b){if(a.prefix==b)return
a.namespaceURI||"http://www.w3.org/1999/xhtml";var
c=a.getAttributeNode("xmlns:"+b);return
c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?Lb(a.parentNode,b):null};function
Nb(a,b){if(!a.length)throw Error("Empty XPath
expression.");a=fb(a);if(ib(a))throw Error("Invalid XPath
expression.");b?"function"==aa(b)||(b=da(b.lookupNamespaceURI,b)):b=function(){return
null};var c=Cb(new Bb(a,b));if(!ib(a))throw Error("Bad token:
"+T(a));this.evaluate=function(a,b){a=c.a(new Q(a));return new
Y(a,b)}}
            function Y(a,b){if(0==b)if(a instanceof C)b=4;else
if("string"==typeof a)b=2;else if("number"==typeof
a)b=1;else if("boolean"==typeof a)b=3;else throw
Error("Unexpected evaluation
result.");if(2!=b&&1!=b&&3!=b&&!(a instanceof
C))throw Error("value could not be converted to the specified
type");this.resultType=b;var c;switch(b){case 2:this.stringValue=a
instanceof C?Sa(a):""+a;break;case 1:this.numberValue=a
instanceof C?+Sa(a):+a;break;case 3:this.booleanValue=a instanceof
C?0<a.l:!!a;break;case 4:case 5:case 6:case 7:var d=
                H(a);c=[];for(var e=I(d);e;e=I(d))c.push(e instanceof
y?e.a:e);this.snapshotLength=a.l;this.invalidIteratorState=!1;break;case
8:case 9:a=Ra(a);this.singleNodeValue=a instanceof
y?a.a:a;break;default:throw Error("Unknown XPathResult
type.");}var
f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw
Error("iterateNext called with wrong result type");return
f>=c.length?null:c[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw
Error("snapshotItem called with wrong result type");return
a>=c.length||
           
0>a?null:c[a]}}Y.ANY_TYPE=0;Y.NUMBER_TYPE=1;Y.STRING_TYPE=2;Y.BOOLEAN_TYPE=3;Y.UNORDERED_NODE_ITERATOR_TYPE=4;Y.ORDERED_NODE_ITERATOR_TYPE=5;Y.UNORDERED_NODE_SNAPSHOT_TYPE=6;Y.ORDERED_NODE_SNAPSHOT_TYPE=7;Y.ANY_UNORDERED_NODE_TYPE=8;Y.FIRST_ORDERED_NODE_TYPE=9;function
Ob(a){this.lookupNamespaceURI=Kb(a)}
            function Pb(a,b){a=a||k;var
c=a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Y,c.evaluate=function(a,b,c,g){return(new
Nb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){return new
Nb(a,b)},c.createNSResolver=function(a){return new Ob(a)}}var
Qb=["wgxpath","install"],Z=k;Qb[0]in
Z||!Z.execScript||Z.execScript("var "+Qb[0]);for(var
Rb;Qb.length&&(Rb=Qb.shift());)Qb.length||void
0===Pb?Z[Rb]?Z=Z[Rb]:Z=Z[Rb]={}:Z[Rb]=Pb;}).call(this)
    }

    setTimeout(function(){wgxpath.install()}, 100);
})
    .call('object' === typeof window && window ||
'object' === typeof self && self || 'object'
=== typeof global && global || {});

PK`n�[�a�+ssjs/polyfill.xpath.jsnu�[���(function(undefined)
{
    if (!('evaluate' in Array.prototype)) {
(function(){'use strict';var k=this;
    function aa(a){var b=typeof a;if("object"==b)if(a){if(a
instanceof Array)return"array";if(a instanceof Object)return
b;var c=Object.prototype.toString.call(a);if("[object
Window]"==c)return"object";if("[object
Array]"==c||"number"==typeof
a.length&&"undefined"!=typeof
a.splice&&"undefined"!=typeof
a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object
Function]"==c||"undefined"!=typeof
a.call&&"undefined"!=typeof
a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else
return"null";else if("function"==
        b&&"undefined"==typeof
a.call)return"object";return b}function
l(a){return"string"==typeof a}function ba(a,b,c){return
a.call.apply(a.bind,arguments)}function ca(a,b,c){if(!a)throw
Error();if(2<arguments.length){var
d=Array.prototype.slice.call(arguments,2);return function(){var
c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return
a.apply(b,c)}}return function(){return a.apply(b,arguments)}}
    function
da(a,b,c){da=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native
code")?ba:ca;return da.apply(null,arguments)}function ea(a,b){var
c=Array.prototype.slice.call(arguments,1);return function(){var
b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}}
    function m(a){var b=n;function
c(){}c.prototype=b.prototype;a.G=b.prototype;a.prototype=new
c;a.prototype.constructor=a;a.F=function(a,c,f){for(var
g=Array(arguments.length-2),h=2;h<arguments.length;h++)g[h-2]=arguments[h];return
b.prototype[c].apply(a,g)}};/*

     The MIT License

     Copyright (c) 2007 Cybozu Labs, Inc.
     Copyright (c) 2012 Google Inc.

     Permission is hereby granted, free of charge, to any person obtaining
a copy
     of this software and associated documentation files (the
"Software"), to
     deal in the Software without restriction, including without limitation
the
     rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or
     sell copies of the Software, and to permit persons to whom the
Software is
     furnished to do so, subject to the following conditions:

     The above copyright notice and this permission notice shall be
included in
     all copies or substantial portions of the Software.

     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR
     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY,
     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE
     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING
     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS
     IN THE SOFTWARE.
     */
    var fa=String.prototype.trim?function(a){return
a.trim()}:function(a){return
a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")};function
q(a,b){return-1!=a.indexOf(b)}function ga(a,b){return
a<b?-1:a>b?1:0};var ha=Array.prototype.indexOf?function(a,b,c){return
Array.prototype.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(l(a))return
l(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in
a&&a[c]===b)return
c;return-1},r=Array.prototype.forEach?function(a,b,c){Array.prototype.forEach.call(a,b,c)}:function(a,b,c){for(var
d=a.length,e=l(a)?a.split(""):a,f=0;f<d;f++)f in
e&&b.call(c,e[f],f,a)},ia=Array.prototype.filter?function(a,b,c){return
Array.prototype.filter.call(a,
        b,c)}:function(a,b,c){for(var
d=a.length,e=[],f=0,g=l(a)?a.split(""):a,h=0;h<d;h++)if(h in
g){var p=g[h];b.call(c,p,h,a)&&(e[f++]=p)}return
e},t=Array.prototype.reduce?function(a,b,c,d){d&&(b=da(b,d));return
Array.prototype.reduce.call(a,b,c)}:function(a,b,c,d){var
e=c;r(a,function(c,g){e=b.call(d,e,c,g,a)});return
e},ja=Array.prototype.some?function(a,b,c){return
Array.prototype.some.call(a,b,c)}:function(a,b,c){for(var
d=a.length,e=l(a)?a.split(""):a,f=0;f<d;f++)if(f in
e&&b.call(c,e[f],f,a))return!0;
        return!1};function ka(a,b){a:{for(var
c=a.length,d=l(a)?a.split(""):a,e=0;e<c;e++)if(e in
d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return
0>b?null:l(a)?a.charAt(b):a[b]}function la(a){return
Array.prototype.concat.apply(Array.prototype,arguments)}function
ma(a,b,c){return
2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var
u;a:{var na=k.navigator;if(na){var oa=na.userAgent;if(oa){u=oa;break
a}}u=""};var
pa=q(u,"Opera"),v=q(u,"Trident")||q(u,"MSIE"),qa=q(u,"Edge"),ra=q(u,"Gecko")&&!(q(u.toLowerCase(),"webkit")&&!q(u,"Edge"))&&!(q(u,"Trident")||q(u,"MSIE"))&&!q(u,"Edge"),sa=q(u.toLowerCase(),"webkit")&&!q(u,"Edge");function
ta(){var a=k.document;return a?a.documentMode:void 0}var ua;
    a:{var va="",wa=function(){var
a=u;if(ra)return/rv\:([^\);]+)(\)|;)/.exec(a);if(qa)return/Edge\/([\d\.]+)/.exec(a);if(v)return/\b(?:MSIE|rv)[:
]([^\);]+)(\)|;)/.exec(a);if(sa)return/WebKit\/(\S+)/.exec(a);if(pa)return/(?:Version)[
\/]?(\S+)/.exec(a)}();wa&&(va=wa?wa[1]:"");if(v){var
xa=ta();if(null!=xa&&xa>parseFloat(va)){ua=String(xa);break
a}}ua=va}var ya={};
    function za(a){if(!ya[a]){for(var
b=0,c=fa(String(ua)).split("."),d=fa(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f<e;f++){var
g=c[f]||"",h=d[f]||"",p=/(\d*)(\D*)/g,x=/(\d*)(\D*)/g;do{var
D=p.exec(g)||["","",""],X=x.exec(h)||["","",""];if(0==D[0].length&&0==X[0].length)break;b=ga(0==D[1].length?0:parseInt(D[1],10),0==X[1].length?0:parseInt(X[1],10))||ga(0==D[2].length,0==X[2].length)||ga(D[2],X[2])}while(0==b)}ya[a]=0<=b}}
    var
Aa=k.document,Ba=Aa&&v?ta()||("CSS1Compat"==Aa.compatMode?parseInt(ua,10):5):void
0;!ra&&!v||v&&9<=Number(Ba)||ra&&za("1.9.1");v&&za("9");function
Ca(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return
a==b||a.contains(b);if("undefined"!=typeof
a.compareDocumentPosition)return
a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return
b==a}
    function Da(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return
a.compareDocumentPosition(b)&2?1:-1;if(v&&!(9<=Number(Ba))){if(9==a.nodeType)return-1;if(9==b.nodeType)return
1}if("sourceIndex"in
a||a.parentNode&&"sourceIndex"in a.parentNode){var
c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return
a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return
e==f?Ea(a,b):!c&&Ca(e,b)?-1*Fa(a,b):!d&&Ca(f,a)?Fa(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType?
       
a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange();a.selectNode(b);a.collapse(!0);return
c.compareBoundaryPoints(k.Range.START_TO_END,a)}function Fa(a,b){var
c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return
Ea(b,a)}function Ea(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return
1};var
w=v&&!(9<=Number(Ba)),Ga=v&&!(8<=Number(Ba));function
y(a,b,c,d){this.a=a;this.nodeName=c;this.nodeValue=d;this.nodeType=2;this.parentNode=this.ownerElement=b}function
Ha(a,b){var
c=Ga&&"href"==b.nodeName?a.getAttribute(b.nodeName,2):b.nodeValue;return
new y(b,a,b.nodeName,c)};function z(a){var
b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void
0==b||null==b?a.innerText:b,b=void
0==b||null==b?"":b);if("string"!=typeof
b)if(w&&"title"==a.nodeName.toLowerCase()&&1==c)b=a.text;else
if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;for(var
c=0,d=[],b="";a;){do
1!=a.nodeType&&(b+=a.nodeValue),w&&"title"==a.nodeName.toLowerCase()&&(b+=a.text),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else
b=a.nodeValue;return""+b}
    function
A(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}catch(d){return!1}Ga&&"class"==b&&(b="className");return
null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function
B(a,b,c,d,e){return(w?Ia:Ja).call(null,a,b,l(c)?c:null,l(d)?d:null,e||new
C)}
    function Ia(a,b,c,d,e){if(a instanceof
E||8==a.b||c&&null===a.b){var f=b.all;if(!f)return
e;a=Ka(a);if("*"!=a&&(f=b.getElementsByTagName(a),!f))return
e;if(c){for(var
g=[],h=0;b=f[h++];)A(b,c,d)&&g.push(b);f=g}for(h=0;b=f[h++];)"*"==a&&"!"==b.tagName||F(e,b);return
e}La(a,b,c,d,e);return e}
    function
Ja(a,b,c,d,e){b.getElementsByName&&d&&"name"==c&&!v?(b=b.getElementsByName(d),r(b,function(b){a.a(b)&&F(e,b)})):b.getElementsByClassName&&d&&"class"==c?(b=b.getElementsByClassName(d),r(b,function(b){b.className==d&&a.a(b)&&F(e,b)})):a
instanceof
G?La(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.f()),r(b,function(a){A(a,c,d)&&F(e,a)}));return
e}
    function Ma(a,b,c,d,e){var f;if((a instanceof
E||8==a.b||c&&null===a.b)&&(f=b.childNodes)){var
g=Ka(a);if("*"!=g&&(f=ia(f,function(a){return
a.tagName&&a.tagName.toLowerCase()==g}),!f))return
e;c&&(f=ia(f,function(a){return
A(a,c,d)}));r(f,function(a){"*"==g&&("!"==a.tagName||"*"==g&&1!=a.nodeType)||F(e,a)});return
e}return Na(a,b,c,d,e)}function
Na(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a.a(b)&&F(e,b);return
e}
    function
La(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a.a(b)&&F(e,b),La(a,b,c,d,e)}function
Ka(a){if(a instanceof
G){if(8==a.b)return"!";if(null===a.b)return"*"}return
a.f()};function C(){this.b=this.a=null;this.l=0}function
Oa(a){this.node=a;this.a=this.b=null}function Pa(a,b){if(!a.a)return
b;if(!b.a)return a;var c=a.a;b=b.a;for(var
d=null,e,f=0;c&&b;){e=c.node;var g=b.node;e==g||e instanceof
y&&g instanceof
y&&e.a==g.a?(e=c,c=c.a,b=b.a):0<Da(c.node,b.node)?(e=b,b=b.a):(e=c,c=c.a);(e.b=d)?d.a=e:a.a=e;d=e;f++}for(e=c||b;e;)e.b=d,d=d.a=e,f++,e=e.a;a.b=d;a.l=f;return
a}function Qa(a,b){b=new Oa(b);b.a=a.a;a.b?a.a.b=b:a.a=a.b=b;a.a=b;a.l++}
    function F(a,b){b=new
Oa(b);b.b=a.b;a.a?a.b.a=b:a.a=a.b=b;a.b=b;a.l++}function
Ra(a){return(a=a.a)?a.node:null}function
Sa(a){return(a=Ra(a))?z(a):""}function H(a,b){return new
Ta(a,!!b)}function
Ta(a,b){this.f=a;this.b=(this.c=b)?a.b:a.a;this.a=null}function I(a){var
b=a.b;if(null==b)return null;var c=a.a=b;a.b=a.c?b.b:b.a;return
c.node};function n(a){this.i=a;this.b=this.g=!1;this.f=null}function
J(a){return"\n 
"+a.toString().split("\n").join("\n  ")}function
Ua(a,b){a.g=b}function Va(a,b){a.b=b}function K(a,b){a=a.a(b);return a
instanceof C?+Sa(a):+a}function L(a,b){a=a.a(b);return a instanceof
C?Sa(a):""+a}function M(a,b){a=a.a(b);return a instanceof
C?!!a.l:!!a};function
N(a,b,c){n.call(this,a.i);this.c=a;this.h=b;this.o=c;this.g=b.g||c.g;this.b=b.b||c.b;this.c==Wa&&(c.b||c.g||4==c.i||0==c.i||!b.f?b.b||b.g||4==b.i||0==b.i||!c.f||(this.f={name:c.f.name,s:b}):this.f={name:b.f.name,s:c})}m(N);
    function O(a,b,c,d,e){b=b.a(d);c=c.a(d);var f;if(b instanceof
C&&c instanceof
C){b=H(b);for(d=I(b);d;d=I(b))for(e=H(c),f=I(e);f;f=I(e))if(a(z(d),z(f)))return!0;return!1}if(b
instanceof C||c instanceof C){b instanceof
C?(e=b,d=c):(e=c,d=b);f=H(e);for(var g=typeof
d,h=I(f);h;h=I(f)){switch(g){case "number":h=+z(h);break;case
"boolean":h=!!z(h);break;case
"string":h=z(h);break;default:throw Error("Illegal primitive
type for
comparison.");}if(e==b&&a(h,d)||e==c&&a(d,h))return!0}return!1}return
e?"boolean"==
    typeof b||"boolean"==typeof
c?a(!!b,!!c):"number"==typeof b||"number"==typeof
c?a(+b,+c):a(b,c):a(+b,+c)}N.prototype.a=function(a){return
this.c.m(this.h,this.o,a)};N.prototype.toString=function(){var
a="Binary Expression: "+this.c,a=a+J(this.h);return
a+=J(this.o)};function
Xa(a,b,c,d){this.a=a;this.w=b;this.i=c;this.m=d}Xa.prototype.toString=function(){return
this.a};var Ya={};
    function P(a,b,c,d){if(Ya.hasOwnProperty(a))throw Error("Binary
operator already created: "+a);a=new Xa(a,b,c,d);return
Ya[a.toString()]=a}P("div",6,1,function(a,b,c){return
K(a,c)/K(b,c)});P("mod",6,1,function(a,b,c){return
K(a,c)%K(b,c)});P("*",6,1,function(a,b,c){return
K(a,c)*K(b,c)});P("+",5,1,function(a,b,c){return
K(a,c)+K(b,c)});P("-",5,1,function(a,b,c){return
K(a,c)-K(b,c)});P("<",4,2,function(a,b,c){return
O(function(a,b){return a<b},a,b,c)});
    P(">",4,2,function(a,b,c){return O(function(a,b){return
a>b},a,b,c)});P("<=",4,2,function(a,b,c){return
O(function(a,b){return
a<=b},a,b,c)});P(">=",4,2,function(a,b,c){return
O(function(a,b){return a>=b},a,b,c)});var
Wa=P("=",3,2,function(a,b,c){return O(function(a,b){return
a==b},a,b,c,!0)});P("!=",3,2,function(a,b,c){return
O(function(a,b){return
a!=b},a,b,c,!0)});P("and",2,2,function(a,b,c){return
M(a,c)&&M(b,c)});P("or",1,2,function(a,b,c){return
M(a,c)||M(b,c)});function
Q(a,b,c){this.a=a;this.b=b||1;this.f=c||1};function
Za(a,b){if(b.a.length&&4!=a.i)throw Error("Primary expression
must evaluate to nodeset if filter has
predicate(s).");n.call(this,a.i);this.c=a;this.h=b;this.g=a.g;this.b=a.b}m(Za);Za.prototype.a=function(a){a=this.c.a(a);return
$a(this.h,a)};Za.prototype.toString=function(){var
a;a="Filter:"+J(this.c);return a+=J(this.h)};function
ab(a,b){if(b.length<a.A)throw Error("Function "+a.j+"
expects at least"+a.A+" arguments, "+b.length+"
given");if(null!==a.v&&b.length>a.v)throw
Error("Function "+a.j+" expects at most "+a.v+"
arguments, "+b.length+"
given");a.B&&r(b,function(b,d){if(4!=b.i)throw
Error("Argument "+d+" to function "+a.j+" is not
of type Nodeset:
"+b);});n.call(this,a.i);this.h=a;this.c=b;Ua(this,a.g||ja(b,function(a){return
a.g}));Va(this,a.D&&!b.length||a.C&&!!b.length||ja(b,function(a){return
a.b}))}m(ab);
    ab.prototype.a=function(a){return
this.h.m.apply(null,la(a,this.c))};ab.prototype.toString=function(){var
a="Function: "+this.h;if(this.c.length)var
b=t(this.c,function(a,b){return
a+J(b)},"Arguments:"),a=a+J(b);return a};function
bb(a,b,c,d,e,f,g,h,p){this.j=a;this.i=b;this.g=c;this.D=d;this.C=e;this.m=f;this.A=g;this.v=void
0!==h?h:g;this.B=!!p}bb.prototype.toString=function(){return this.j};var
cb={};
    function R(a,b,c,d,e,f,g,h){if(cb.hasOwnProperty(a))throw
Error("Function already created: "+a+".");cb[a]=new
bb(a,b,c,d,!1,e,f,g,h)}R("boolean",2,!1,!1,function(a,b){return
M(b,a)},1);R("ceiling",1,!1,!1,function(a,b){return
Math.ceil(K(b,a))},1);R("concat",3,!1,!1,function(a,b){return
t(ma(arguments,1),function(b,d){return
b+L(d,a)},"")},2,null);R("contains",2,!1,!1,function(a,b,c){return
q(L(b,a),L(c,a))},2);R("count",1,!1,!1,function(a,b){return
b.a(a).l},1,1,!0);
   
R("false",2,!1,!1,function(){return!1},0);R("floor",1,!1,!1,function(a,b){return
Math.floor(K(b,a))},1);R("id",4,!1,!1,function(a,b){function
c(a){if(w){var b=e.all[a];if(b){if(b.nodeType&&a==b.id)return
b;if(b.length)return ka(b,function(b){return a==b.id})}return null}return
e.getElementById(a)}var
d=a.a,e=9==d.nodeType?d:d.ownerDocument;a=L(b,a).split(/\s+/);var
f=[];r(a,function(a){a=c(a);!a||0<=ha(f,a)||f.push(a)});f.sort(Da);var
g=new C;r(f,function(a){F(g,a)});return g},1);
   
R("lang",2,!1,!1,function(){return!1},1);R("last",1,!0,!1,function(a){if(1!=arguments.length)throw
Error("Function last expects ()");return
a.f},0);R("local-name",3,!1,!0,function(a,b){return(a=b?Ra(b.a(a)):a.a)?a.localName||a.nodeName.toLowerCase():""},0,1,!0);R("name",3,!1,!0,function(a,b){return(a=b?Ra(b.a(a)):a.a)?a.nodeName.toLowerCase():""},0,1,!0);R("namespace-uri",3,!0,!1,function(){return""},0,1,!0);
   
R("normalize-space",3,!1,!0,function(a,b){return(b?L(b,a):z(a.a)).replace(/[\s\xa0]+/g,"
").replace(/^\s+|\s+$/g,"")},0,1);R("not",2,!1,!1,function(a,b){return!M(b,a)},1);R("number",1,!1,!0,function(a,b){return
b?K(b,a):+z(a.a)},0,1);R("position",1,!0,!1,function(a){return
a.b},0);R("round",1,!1,!1,function(a,b){return
Math.round(K(b,a))},1);R("starts-with",2,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);return
0==b.lastIndexOf(a,0)},2);R("string",3,!1,!0,function(a,b){return
b?L(b,a):z(a.a)},0,1);
   
R("string-length",1,!1,!0,function(a,b){return(b?L(b,a):z(a.a)).length},0,1);R("substring",3,!1,!1,function(a,b,c,d){c=K(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return"";d=d?K(d,a):Infinity;if(isNaN(d)||-Infinity===d)return"";c=Math.round(c)-1;var
e=Math.max(c,0);a=L(b,a);return
Infinity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);R("substring-after",3,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);c=b.indexOf(a);return-1==c?"":b.substring(c+a.length)},2);
   
R("substring-before",3,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);a=b.indexOf(a);return-1==a?"":b.substring(0,a)},2);R("sum",1,!1,!1,function(a,b){a=H(b.a(a));b=0;for(var
c=I(a);c;c=I(a))b+=+z(c);return
b},1,1,!0);R("translate",3,!1,!1,function(a,b,c,d){b=L(b,a);c=L(c,a);var
e=L(d,a);a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f in
a||(a[f]=e.charAt(d))}c="";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f
in a?a[f]:f;return
c},3);R("true",2,!1,!1,function(){return!0},0);function
G(a,b){this.h=a;this.c=void 0!==b?b:null;this.b=null;switch(a){case
"comment":this.b=8;break;case
"text":this.b=3;break;case
"processing-instruction":this.b=7;break;case
"node":break;default:throw Error("Unexpected
argument");}}function
db(a){return"comment"==a||"text"==a||"processing-instruction"==a||"node"==a}G.prototype.a=function(a){return
null===this.b||this.b==a.nodeType};G.prototype.f=function(){return this.h};
    G.prototype.toString=function(){var a="Kind Test:
"+this.h;null===this.c||(a+=J(this.c));return a};function
eb(a){this.b=a;this.a=0}function fb(a){a=a.match(gb);for(var
b=0;b<a.length;b++)hb.test(a[b])&&a.splice(b,1);return new
eb(a)}var
gb=/\$?(?:(?![0-9-\.])(?:\*|[\w-\.]+):)?(?![0-9-\.])(?:\*|[\w-\.]+)|\/\/|\.\.|::|\d+(?:\.\d*)?|\.\d+|"[^"]*"|'[^']*'|[!<>]=|\s+|./g,hb=/^\s/;function
S(a,b){return a.b[a.a+(b||0)]}function T(a){return a.b[a.a++]}function
ib(a){return a.b.length<=a.a};function
jb(a){n.call(this,3);this.c=a.substring(1,a.length-1)}m(jb);jb.prototype.a=function(){return
this.c};jb.prototype.toString=function(){return"Literal:
"+this.c};function
E(a,b){this.j=a.toLowerCase();a="*"==this.j?"*":"http://www.w3.org/1999/xhtml";this.c=b?b.toLowerCase():a}E.prototype.a=function(a){var
b=a.nodeType;if(1!=b&&2!=b)return!1;b=void
0!==a.localName?a.localName:a.nodeName;return"*"!=this.j&&this.j!=b.toLowerCase()?!1:"*"==this.c?!0:this.c==(a.namespaceURI?a.namespaceURI.toLowerCase():"http://www.w3.org/1999/xhtml")};E.prototype.f=function(){return
this.j};
    E.prototype.toString=function(){return"Name Test:
"+("http://www.w3.org/1999/xhtml"==this.c?"":this.c+":")+this.j};function
kb(a){n.call(this,1);this.c=a}m(kb);kb.prototype.a=function(){return
this.c};kb.prototype.toString=function(){return"Number:
"+this.c};function
lb(a,b){n.call(this,a.i);this.h=a;this.c=b;this.g=a.g;this.b=a.b;1==this.c.length&&(a=this.c[0],a.u||a.c!=mb||(a=a.o,"*"!=a.f()&&(this.f={name:a.f(),s:null})))}m(lb);function
nb(){n.call(this,4)}m(nb);nb.prototype.a=function(a){var b=new
C;a=a.a;9==a.nodeType?F(b,a):F(b,a.ownerDocument);return
b};nb.prototype.toString=function(){return"Root Helper
Expression"};function
ob(){n.call(this,4)}m(ob);ob.prototype.a=function(a){var b=new
C;F(b,a.a);return b};ob.prototype.toString=function(){return"Context
Helper Expression"};
    function
pb(a){return"/"==a||"//"==a}lb.prototype.a=function(a){var
b=this.h.a(a);if(!(b instanceof C))throw Error("Filter expression must
evaluate to nodeset.");a=this.c;for(var
c=0,d=a.length;c<d&&b.l;c++){var
e=a[c],f=H(b,e.c.a),g;if(e.g||e.c!=qb)if(e.g||e.c!=rb)for(g=I(f),b=e.a(new
Q(g));null!=(g=I(f));)g=e.a(new Q(g)),b=Pa(b,g);else g=I(f),b=e.a(new
Q(g));else{for(g=I(f);(b=I(f))&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.a(new
Q(g))}}return b};
    lb.prototype.toString=function(){var a;a="Path
Expression:"+J(this.h);if(this.c.length){var
b=t(this.c,function(a,b){return a+J(b)},"Steps:");a+=J(b)}return
a};function sb(a,b){this.a=a;this.b=!!b}
    function $a(a,b,c){for(c=c||0;c<a.a.length;c++)for(var
d=a.a[c],e=H(b),f=b.l,g,h=0;g=I(e);h++){var p=a.b?f-h:h+1;g=d.a(new
Q(g,p,f));if("number"==typeof g)p=p==g;else
if("string"==typeof g||"boolean"==typeof g)p=!!g;else
if(g instanceof C)p=0<g.l;else throw Error("Predicate.evaluate
returned an unexpected type.");if(!p){p=e;g=p.f;var x=p.a;if(!x)throw
Error("Next must be called at least once before remove.");var
D=x.b,x=x.a;D?D.a=x:g.a=x;x?x.b=D:g.b=D;g.l--;p.a=null}}return b}
    sb.prototype.toString=function(){return t(this.a,function(a,b){return
a+J(b)},"Predicates:")};function
U(a,b,c,d){n.call(this,4);this.c=a;this.o=b;this.h=c||new
sb([]);this.u=!!d;b=this.h;b=0<b.a.length?b.a[0].f:null;a.b&&b&&(a=b.name,a=w?a.toLowerCase():a,this.f={name:a,s:b.s});a:{a=this.h;for(b=0;b<a.a.length;b++)if(c=a.a[b],c.g||1==c.i||0==c.i){a=!0;break
a}a=!1}this.g=a}m(U);
    U.prototype.a=function(a){var
b=a.a,c=this.f,d=null,e=null,f=0;c&&(d=c.name,e=c.s?L(c.s,a):null,f=1);if(this.u)if(this.g||this.c!=tb)if(b=H((new
U(ub,new
G("node"))).a(a)),c=I(b))for(a=this.m(c,d,e,f);null!=(c=I(b));)a=Pa(a,this.m(c,d,e,f));else
a=new C;else a=B(this.o,b,d,e),a=$a(this.h,a,f);else
a=this.m(a.a,d,e,f);return
a};U.prototype.m=function(a,b,c,d){a=this.c.f(this.o,a,b,c);return
a=$a(this.h,a,d)};
    U.prototype.toString=function(){var
a;a="Step:"+J("Operator:
"+(this.u?"//":"/"));this.c.j&&(a+=J("Axis:
"+this.c));a+=J(this.o);if(this.h.a.length){var
b=t(this.h.a,function(a,b){return
a+J(b)},"Predicates:");a+=J(b)}return a};function
vb(a,b,c,d){this.j=a;this.f=b;this.a=c;this.b=d}vb.prototype.toString=function(){return
this.j};var wb={};function V(a,b,c,d){if(wb.hasOwnProperty(a))throw
Error("Axis already created: "+a);b=new vb(a,b,c,!!d);return
wb[a]=b}
    V("ancestor",function(a,b){for(var c=new
C;b=b.parentNode;)a.a(b)&&Qa(c,b);return
c},!0);V("ancestor-or-self",function(a,b){var c=new C;do
a.a(b)&&Qa(c,b);while(b=b.parentNode);return c},!0);
    var mb=V("attribute",function(a,b){var c=new
C,d=a.f();if("style"==d&&w&&b.style)return
F(c,new y(b.style,b,"style",b.style.cssText)),c;var
e=b.attributes;if(e)if(a instanceof
G&&null===a.b||"*"==d)for(a=0;d=e[a];a++)w?d.nodeValue&&F(c,Ha(b,d)):F(c,d);else(d=e.getNamedItem(d))&&(w?d.nodeValue&&F(c,Ha(b,d)):F(c,d));return
c},!1),tb=V("child",function(a,b,c,d,e){return(w?Ma:Na).call(null,a,b,l(c)?c:null,l(d)?d:null,e||new
C)},!1,!0);V("descendant",B,!1,!0);
    var ub=V("descendant-or-self",function(a,b,c,d){var e=new
C;A(b,c,d)&&a.a(b)&&F(e,b);return
B(a,b,c,d,e)},!1,!0),qb=V("following",function(a,b,c,d){var e=new
C;do for(var
f=b;f=f.nextSibling;)A(f,c,d)&&a.a(f)&&F(e,f),e=B(a,f,c,d,e);while(b=b.parentNode);return
e},!1,!0);V("following-sibling",function(a,b){for(var c=new
C;b=b.nextSibling;)a.a(b)&&F(c,b);return
c},!1);V("namespace",function(){return new C},!1);
    var xb=V("parent",function(a,b){var c=new
C;if(9==b.nodeType)return c;if(2==b.nodeType)return
F(c,b.ownerElement),c;b=b.parentNode;a.a(b)&&F(c,b);return
c},!1),rb=V("preceding",function(a,b,c,d){var e=new C,f=[];do
f.unshift(b);while(b=b.parentNode);for(var g=1,h=f.length;g<h;g++){var
p=[];for(b=f[g];b=b.previousSibling;)p.unshift(b);for(var
x=0,D=p.length;x<D;x++)b=p[x],A(b,c,d)&&a.a(b)&&F(e,b),e=B(a,b,c,d,e)}return
e},!0,!0);
    V("preceding-sibling",function(a,b){for(var c=new
C;b=b.previousSibling;)a.a(b)&&Qa(c,b);return c},!0);var
yb=V("self",function(a,b){var c=new
C;a.a(b)&&F(c,b);return c},!1);function
zb(a){n.call(this,1);this.c=a;this.g=a.g;this.b=a.b}m(zb);zb.prototype.a=function(a){return-K(this.c,a)};zb.prototype.toString=function(){return"Unary
Expression: -"+J(this.c)};function
Ab(a){n.call(this,4);this.c=a;Ua(this,ja(this.c,function(a){return
a.g}));Va(this,ja(this.c,function(a){return
a.b}))}m(Ab);Ab.prototype.a=function(a){var b=new
C;r(this.c,function(c){c=c.a(a);if(!(c instanceof C))throw Error("Path
expression must evaluate to NodeSet.");b=Pa(b,c)});return
b};Ab.prototype.toString=function(){return t(this.c,function(a,b){return
a+J(b)},"Union Expression:")};function
Bb(a,b){this.a=a;this.b=b}function Cb(a){for(var
b,c=[];;){W(a,"Missing right hand side of binary
expression.");b=Db(a);var d=T(a.a);if(!d)break;var
e=(d=Ya[d]||null)&&d.w;if(!e){a.a.a--;break}for(;c.length&&e<=c[c.length-1].w;)b=new
N(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new
N(c.pop(),c.pop(),b);return b}function W(a,b){if(ib(a.a))throw
Error(b);}function Eb(a,b){a=T(a.a);if(a!=b)throw Error("Bad token,
expected: "+b+" got: "+a);}
    function Fb(a){a=T(a.a);if(")"!=a)throw Error("Bad
token: "+a);}function Gb(a){a=T(a.a);if(2>a.length)throw
Error("Unclosed literal string");return new jb(a)}
    function Hb(a){var
b,c=[],d;if(pb(S(a.a))){b=T(a.a);d=S(a.a);if("/"==b&&(ib(a.a)||"."!=d&&".."!=d&&"@"!=d&&"*"!=d&&!/(?![0-9])[\w]/.test(d)))return
new nb;d=new nb;W(a,"Missing next location
step.");b=Ib(a,b);c.push(b)}else{a:{b=S(a.a);d=b.charAt(0);switch(d){case
"$":throw Error("Variable reference not allowed in HTML
XPath");case "(":T(a.a);b=Cb(a);W(a,'unclosed
"("');Eb(a,")");break;case '"':case
"'":b=Gb(a);break;default:if(isNaN(+b))if(!db(b)&&/(?![0-9])[\w]/.test(d)&&"("==S(a.a,1)){b=T(a.a);
       
b=cb[b]||null;T(a.a);for(d=[];")"!=S(a.a);){W(a,"Missing
function argument
list.");d.push(Cb(a));if(","!=S(a.a))break;T(a.a)}W(a,"Unclosed
function argument list.");Fb(a);b=new ab(b,d)}else{b=null;break a}else
b=new kb(+T(a.a))}"["==S(a.a)&&(d=new sb(Jb(a)),b=new
Za(b,d))}if(b)if(pb(S(a.a)))d=b;else return b;else
b=Ib(a,"/"),d=new
ob,c.push(b)}for(;pb(S(a.a));)b=T(a.a),W(a,"Missing next location
step."),b=Ib(a,b),c.push(b);return new lb(d,c)}
    function Ib(a,b){var
c,d;if("/"!=b&&"//"!=b)throw Error('Step
op should be "/" or
"//"');if("."==S(a.a))return d=new U(yb,new
G("node")),T(a.a),d;if(".."==S(a.a))return d=new
U(xb,new G("node")),T(a.a),d;var
e;if("@"==S(a.a))e=mb,T(a.a),W(a,"Missing attribute
name");else
if("::"==S(a.a,1)){if(!/(?![0-9])[\w]/.test(S(a.a).charAt(0)))throw
Error("Bad token: "+T(a.a));c=T(a.a);e=wb[c]||null;if(!e)throw
Error("No axis with name: "+c);T(a.a);W(a,"Missing node
name")}else
e=tb;c=S(a.a);if(/(?![0-9])[\w\*]/.test(c.charAt(0)))if("("==
        S(a.a,1)){if(!db(c))throw Error("Invalid node type:
"+c);c=T(a.a);if(!db(c))throw Error("Invalid type name:
"+c);Eb(a,"(");W(a,"Bad nodetype");var
f=S(a.a).charAt(0),g=null;if('"'==f||"'"==f)g=Gb(a);W(a,"Bad
nodetype");Fb(a);c=new G(c,g)}else
if(c=T(a.a),f=c.indexOf(":"),-1==f)c=new E(c);else{var
g=c.substring(0,f),h;if("*"==g)h="*";else
if(h=a.b(g),!h)throw Error("Namespace prefix not declared:
"+g);c=c.substr(f+1);c=new E(c,h)}else throw Error("Bad token:
"+T(a.a));a=new sb(Jb(a),e.a);return d||
        new U(e,c,a,"//"==b)}function Jb(a){for(var
b=[];"["==S(a.a);){T(a.a);W(a,"Missing predicate
expression.");var c=Cb(a);b.push(c);W(a,"Unclosed predicate
expression.");Eb(a,"]")}return b}function
Db(a){if("-"==S(a.a))return T(a.a),new zb(Db(a));var
b=Hb(a);if("|"!=S(a.a))a=b;else{for(b=[b];"|"==T(a.a);)W(a,"Missing
next union location path."),b.push(Hb(a));a.a.a--;a=new Ab(b)}return
a};function Kb(a){switch(a.nodeType){case 1:return ea(Lb,a);case 9:return
Kb(a.documentElement);case 11:case 10:case 6:case 12:return
Mb;default:return a.parentNode?Kb(a.parentNode):Mb}}function Mb(){return
null}function Lb(a,b){if(a.prefix==b)return
a.namespaceURI||"http://www.w3.org/1999/xhtml";var
c=a.getAttributeNode("xmlns:"+b);return
c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?Lb(a.parentNode,b):null};function
Nb(a,b){if(!a.length)throw Error("Empty XPath
expression.");a=fb(a);if(ib(a))throw Error("Invalid XPath
expression.");b?"function"==aa(b)||(b=da(b.lookupNamespaceURI,b)):b=function(){return
null};var c=Cb(new Bb(a,b));if(!ib(a))throw Error("Bad token:
"+T(a));this.evaluate=function(a,b){a=c.a(new Q(a));return new
Y(a,b)}}
    function Y(a,b){if(0==b)if(a instanceof C)b=4;else
if("string"==typeof a)b=2;else if("number"==typeof
a)b=1;else if("boolean"==typeof a)b=3;else throw
Error("Unexpected evaluation
result.");if(2!=b&&1!=b&&3!=b&&!(a instanceof
C))throw Error("value could not be converted to the specified
type");this.resultType=b;var c;switch(b){case 2:this.stringValue=a
instanceof C?Sa(a):""+a;break;case 1:this.numberValue=a
instanceof C?+Sa(a):+a;break;case 3:this.booleanValue=a instanceof
C?0<a.l:!!a;break;case 4:case 5:case 6:case 7:var d=
        H(a);c=[];for(var e=I(d);e;e=I(d))c.push(e instanceof
y?e.a:e);this.snapshotLength=a.l;this.invalidIteratorState=!1;break;case
8:case 9:a=Ra(a);this.singleNodeValue=a instanceof
y?a.a:a;break;default:throw Error("Unknown XPathResult
type.");}var
f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw
Error("iterateNext called with wrong result type");return
f>=c.length?null:c[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw
Error("snapshotItem called with wrong result type");return
a>=c.length||
   
0>a?null:c[a]}}Y.ANY_TYPE=0;Y.NUMBER_TYPE=1;Y.STRING_TYPE=2;Y.BOOLEAN_TYPE=3;Y.UNORDERED_NODE_ITERATOR_TYPE=4;Y.ORDERED_NODE_ITERATOR_TYPE=5;Y.UNORDERED_NODE_SNAPSHOT_TYPE=6;Y.ORDERED_NODE_SNAPSHOT_TYPE=7;Y.ANY_UNORDERED_NODE_TYPE=8;Y.FIRST_ORDERED_NODE_TYPE=9;function
Ob(a){this.lookupNamespaceURI=Kb(a)}
    function Pb(a,b){a=a||k;var
c=a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Y,c.evaluate=function(a,b,c,g){return(new
Nb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){return new
Nb(a,b)},c.createNSResolver=function(a){return new Ob(a)}}var
Qb=["wgxpath","install"],Z=k;Qb[0]in
Z||!Z.execScript||Z.execScript("var "+Qb[0]);for(var
Rb;Qb.length&&(Rb=Qb.shift());)Qb.length||void
0===Pb?Z[Rb]?Z=Z[Rb]:Z=Z[Rb]={}:Z[Rb]=Pb;}).call(this)
    }

    setTimeout(function(){wgxpath.install()}, 100);
})
    .call('object' === typeof window && window ||
'object' === typeof self && self || 'object'
=== typeof global && global || {});

PK`n�[nC�ejs/progressbar-uncompressed.jsnu�[���/*
 name: Fx.ProgressBar

 description: Creates a progressbar with WAI-ARIA and optional HTML5
support.

 license: MIT-style

 authors:
 - Harald Kirschner <mail [at] digitarald [dot] de>
 - Rouven Weßling <me [at] rouvenwessling [dot] de>

 requires: [Core/Fx, Core/Class, Core/Element]

 provides: Fx.ProgressBar
 */

Fx.ProgressBar = function(_element, _options) {
    var $, useHtml5, now, $element, indeterminate, options = {
        onComplete : function() {
        },
        text : null,
        html5 : true
    },
    
    initialize = function(_element, _options) {
        $ = jQuery.noConflict();
        $.extend(options, _options);

        var element, classes = $(_element).attr('class'), id =
$(_element).attr('id'), progress;

        element = $(_element).get(0);
        useHtml5 = options.html5 && supportsHtml5();
        if (useHtml5) {
            progress = $('<progress></progress>', {
                'value' : 10,
                'max' : 100,
                'class' : classes,
                'id' : id
            });
            $(element).replaceWith(progress);
            element = progress;
        } else {
            progress = $('<div>', {
                'id' : id,
                'class' : classes,
                'class' : 'progress progress-striped',
                'role' : 'progressbar',
                'aria-valuenow' : '0', // WAI-ARIA
                'aria-valuemin' : '0',
                'aria-valuemax' : '100'
            }).html($('<div>', {
                'class' : 'bar'
            })).get(0);
            $(element).replaceWith(progress);
            element = progress;
        }

        $element = $(element);
        set(0);
    },
    
    supportsHtml5 = function() {
        return 'value' in
document.createElement('progress');
    },
    
    setIndeterminate = function() {
        indeterminate = true;

        if (useHtml5) {
            $element.removeAttr('value');
        } else {
            $element.find('.bar').css('width',
'100%').addClass('active');
           
$element.removeAttr('aria-valuenow').attr('title',
'');
        }
    },
    
    set = function(to) {
        var $text = $(options.text);

        if (to >= 100) {
            to = 100;
        }
        now = to;

        if (useHtml5) {
            $element.val(to);
        } else {
            $element.find('.bar').css('width', to +
'%');
           
$element.removeAttr('aria-valuenow').attr('title',
Math.round(to) + '%');
        }

        if ($text.length) {
            $text.text(Math.round(to) + '%');
        }
        if (to >= 100) {
            options.onComplete('complete');
        }

        return this;
    };
    
    initialize(_element, _options);

    return {
        set : set,
        setIndeterminate : setIndeterminate,
        element : $element.get(0)
    };
}
PK`n�[5N`$WWjs/progressbar.jsnu�[���/*
        license: MIT-style
*/
Fx.ProgressBar=function(e,k){var
g,h,c,j,a,l={onComplete:function(){},text:null,html5:true},f=function(n,m){g=jQuery.noConflict();g.extend(l,m);var
q,p=g(n).attr("class"),r=g(n).attr("id"),o;q=g(n).get(0);h=l.html5&&b();if(h){o=g("<progress></progress>",{value:10,max:100,"class":p,id:r});g(q).replaceWith(o);q=o}else{o=g("<div>",{id:r,"class":p,"class":"progress
progress-striped",role:"progressbar","aria-valuenow":"0","aria-valuemin":"0","aria-valuemax":"100"}).html(g("<div>",{"class":"bar"})).get(0);g(q).replaceWith(o);q=o}j=g(q);i(0)},b=function(){return"value"
in
document.createElement("progress")},d=function(){a=true;if(h){j.removeAttr("value")}else{j.find(".bar").css("width","100%").addClass("active");j.removeAttr("aria-valuenow").attr("title","")}},i=function(n){var
m=g(l.text);if(n>=100){n=100}c=n;if(h){j.val(n)}else{j.find(".bar").css("width",n+"%");j.removeAttr("aria-valuenow").attr("title",Math.round(n)+"%")}if(m.length){m.text(Math.round(n)+"%")}if(n>=100){l.onComplete("complete")}return
this};f(e,k);return{set:i,setIndeterminate:d,element:j.get(0)}};
PK`n�[^5��d9d9js/punycode-uncompressed.jsnu�[���/*!
https://mths.be/punycode v1.4.1 by @mathias - do not update to v2 */
;(function(root) {

	/** Detect free variables */
	var freeExports = typeof exports == 'object' && exports
&&
		!exports.nodeType && exports;
	var freeModule = typeof module == 'object' && module
&&
		!module.nodeType && module;
	var freeGlobal = typeof global == 'object' && global;
	if (
		freeGlobal.global === freeGlobal ||
		freeGlobal.window === freeGlobal ||
		freeGlobal.self === freeGlobal
	) {
		root = freeGlobal;
	}

	/**
	 * The `punycode` object.
	 * @name punycode
	 * @type Object
	 */
	var punycode,

	/** Highest positive signed 32-bit float value */
	maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1

	/** Bootstring parameters */
	base = 36,
	tMin = 1,
	tMax = 26,
	skew = 38,
	damp = 700,
	initialBias = 72,
	initialN = 128, // 0x80
	delimiter = '-', // '\x2D'

	/** Regular expressions */
	regexPunycode = /^xn--/,
	regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII
chars
	regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators

	/** Error messages */
	errors = {
		'overflow': 'Overflow: input needs wider integers to
process',
		'not-basic': 'Illegal input >= 0x80 (not a basic code
point)',
		'invalid-input': 'Invalid input'
	},

	/** Convenience shortcuts */
	baseMinusTMin = base - tMin,
	floor = Math.floor,
	stringFromCharCode = String.fromCharCode,

	/** Temporary variable */
	key;

	/*--------------------------------------------------------------------------*/

	/**
	 * A generic error utility function.
	 * @private
	 * @param {String} type The error type.
	 * @returns {Error} Throws a `RangeError` with the applicable error
message.
	 */
	function error(type) {
		throw new RangeError(errors[type]);
	}

	/**
	 * A generic `Array#map` utility function.
	 * @private
	 * @param {Array} array The array to iterate over.
	 * @param {Function} callback The function that gets called for every
array
	 * item.
	 * @returns {Array} A new array of values returned by the callback
function.
	 */
	function map(array, fn) {
		var length = array.length;
		var result = [];
		while (length--) {
			result[length] = fn(array[length]);
		}
		return result;
	}

	/**
	 * A simple `Array#map`-like wrapper to work with domain name strings or
email
	 * addresses.
	 * @private
	 * @param {String} domain The domain name or email address.
	 * @param {Function} callback The function that gets called for every
	 * character.
	 * @returns {Array} A new string of characters returned by the callback
	 * function.
	 */
	function mapDomain(string, fn) {
		var parts = string.split('@');
		var result = '';
		if (parts.length > 1) {
			// In email addresses, only the domain name should be punycoded. Leave
			// the local part (i.e. everything up to `@`) intact.
			result = parts[0] + '@';
			string = parts[1];
		}
		// Avoid `split(regex)` for IE8 compatibility. See #17.
		string = string.replace(regexSeparators, '\x2E');
		var labels = string.split('.');
		var encoded = map(labels, fn).join('.');
		return result + encoded;
	}

	/**
	 * Creates an array containing the numeric code points of each Unicode
	 * character in the string. While JavaScript uses UCS-2 internally,
	 * this function will convert a pair of surrogate halves (each of which
	 * UCS-2 exposes as separate characters) into a single code point,
	 * matching UTF-16.
	 * @see `punycode.ucs2.encode`
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode.ucs2
	 * @name decode
	 * @param {String} string The Unicode input string (UCS-2).
	 * @returns {Array} The new array of code points.
	 */
	function ucs2decode(string) {
		var output = [],
		    counter = 0,
		    length = string.length,
		    value,
		    extra;
		while (counter < length) {
			value = string.charCodeAt(counter++);
			if (value >= 0xD800 && value <= 0xDBFF && counter
< length) {
				// high surrogate, and there is a next character
				extra = string.charCodeAt(counter++);
				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) +
0x10000);
				} else {
					// unmatched surrogate; only append this code unit, in case the next
					// code unit is the high surrogate of a surrogate pair
					output.push(value);
					counter--;
				}
			} else {
				output.push(value);
			}
		}
		return output;
	}

	/**
	 * Creates a string based on an array of numeric code points.
	 * @see `punycode.ucs2.decode`
	 * @memberOf punycode.ucs2
	 * @name encode
	 * @param {Array} codePoints The array of numeric code points.
	 * @returns {String} The new Unicode string (UCS-2).
	 */
	function ucs2encode(array) {
		return map(array, function(value) {
			var output = '';
			if (value > 0xFFFF) {
				value -= 0x10000;
				output += stringFromCharCode(value >>> 10 & 0x3FF |
0xD800);
				value = 0xDC00 | value & 0x3FF;
			}
			output += stringFromCharCode(value);
			return output;
		}).join('');
	}

	/**
	 * Converts a basic code point into a digit/integer.
	 * @see `digitToBasic()`
	 * @private
	 * @param {Number} codePoint The basic numeric code point value.
	 * @returns {Number} The numeric value of a basic code point (for use in
	 * representing integers) in the range `0` to `base - 1`, or `base` if
	 * the code point does not represent a value.
	 */
	function basicToDigit(codePoint) {
		if (codePoint - 48 < 10) {
			return codePoint - 22;
		}
		if (codePoint - 65 < 26) {
			return codePoint - 65;
		}
		if (codePoint - 97 < 26) {
			return codePoint - 97;
		}
		return base;
	}

	/**
	 * Converts a digit/integer into a basic code point.
	 * @see `basicToDigit()`
	 * @private
	 * @param {Number} digit The numeric value of a basic code point.
	 * @returns {Number} The basic code point whose value (when used for
	 * representing integers) is `digit`, which needs to be in the range
	 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
	 * used; else, the lowercase form is used. The behavior is undefined
	 * if `flag` is non-zero and `digit` has no uppercase form.
	 */
	function digitToBasic(digit, flag) {
		//  0..25 map to ASCII a..z or A..Z
		// 26..35 map to ASCII 0..9
		return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
	}

	/**
	 * Bias adaptation function as per section 3.4 of RFC 3492.
	 * https://tools.ietf.org/html/rfc3492#section-3.4
	 * @private
	 */
	function adapt(delta, numPoints, firstTime) {
		var k = 0;
		delta = firstTime ? floor(delta / damp) : delta >> 1;
		delta += floor(delta / numPoints);
		for (/* no initialization */; delta > baseMinusTMin * tMax >> 1;
k += base) {
			delta = floor(delta / baseMinusTMin);
		}
		return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
	}

	/**
	 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
	 * symbols.
	 * @memberOf punycode
	 * @param {String} input The Punycode string of ASCII-only symbols.
	 * @returns {String} The resulting string of Unicode symbols.
	 */
	function decode(input) {
		// Don't use UCS-2
		var output = [],
		    inputLength = input.length,
		    out,
		    i = 0,
		    n = initialN,
		    bias = initialBias,
		    basic,
		    j,
		    index,
		    oldi,
		    w,
		    k,
		    digit,
		    t,
		    /** Cached calculation results */
		    baseMinusT;

		// Handle the basic code points: let `basic` be the number of input code
		// points before the last delimiter, or `0` if there is none, then copy
		// the first basic code points to the output.

		basic = input.lastIndexOf(delimiter);
		if (basic < 0) {
			basic = 0;
		}

		for (j = 0; j < basic; ++j) {
			// if it's not a basic code point
			if (input.charCodeAt(j) >= 0x80) {
				error('not-basic');
			}
			output.push(input.charCodeAt(j));
		}

		// Main decoding loop: start just after the last delimiter if any basic
code
		// points were copied; start at the beginning otherwise.

		for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no
final expression */) {

			// `index` is the index of the next character to be consumed.
			// Decode a generalized variable-length integer into `delta`,
			// which gets added to `i`. The overflow checking is easier
			// if we increase `i` as we go, then subtract off its starting
			// value at the end to obtain `delta`.
			for (oldi = i, w = 1, k = base; /* no condition */; k += base) {

				if (index >= inputLength) {
					error('invalid-input');
				}

				digit = basicToDigit(input.charCodeAt(index++));

				if (digit >= base || digit > floor((maxInt - i) / w)) {
					error('overflow');
				}

				i += digit * w;
				t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

				if (digit < t) {
					break;
				}

				baseMinusT = base - t;
				if (w > floor(maxInt / baseMinusT)) {
					error('overflow');
				}

				w *= baseMinusT;

			}

			out = output.length + 1;
			bias = adapt(i - oldi, out, oldi == 0);

			// `i` was supposed to wrap around from `out` to `0`,
			// incrementing `n` each time, so we'll fix that now:
			if (floor(i / out) > maxInt - n) {
				error('overflow');
			}

			n += floor(i / out);
			i %= out;

			// Insert `n` at position `i` of the output
			output.splice(i++, 0, n);

		}

		return ucs2encode(output);
	}

	/**
	 * Converts a string of Unicode symbols (e.g. a domain name label) to a
	 * Punycode string of ASCII-only symbols.
	 * @memberOf punycode
	 * @param {String} input The string of Unicode symbols.
	 * @returns {String} The resulting Punycode string of ASCII-only symbols.
	 */
	function encode(input) {
		var n,
		    delta,
		    handledCPCount,
		    basicLength,
		    bias,
		    j,
		    m,
		    q,
		    k,
		    t,
		    currentValue,
		    output = [],
		    /** `inputLength` will hold the number of code points in `input`. */
		    inputLength,
		    /** Cached calculation results */
		    handledCPCountPlusOne,
		    baseMinusT,
		    qMinusT;

		// Convert the input in UCS-2 to Unicode
		input = ucs2decode(input);

		// Cache the length
		inputLength = input.length;

		// Initialize the state
		n = initialN;
		delta = 0;
		bias = initialBias;

		// Handle the basic code points
		for (j = 0; j < inputLength; ++j) {
			currentValue = input[j];
			if (currentValue < 0x80) {
				output.push(stringFromCharCode(currentValue));
			}
		}

		handledCPCount = basicLength = output.length;

		// `handledCPCount` is the number of code points that have been handled;
		// `basicLength` is the number of basic code points.

		// Finish the basic string - if it is not empty - with a delimiter
		if (basicLength) {
			output.push(delimiter);
		}

		// Main encoding loop:
		while (handledCPCount < inputLength) {

			// All non-basic code points < n have been handled already. Find the
next
			// larger one:
			for (m = maxInt, j = 0; j < inputLength; ++j) {
				currentValue = input[j];
				if (currentValue >= n && currentValue < m) {
					m = currentValue;
				}
			}

			// Increase `delta` enough to advance the decoder's <n,i>
state to <m,0>,
			// but guard against overflow
			handledCPCountPlusOne = handledCPCount + 1;
			if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
				error('overflow');
			}

			delta += (m - n) * handledCPCountPlusOne;
			n = m;

			for (j = 0; j < inputLength; ++j) {
				currentValue = input[j];

				if (currentValue < n && ++delta > maxInt) {
					error('overflow');
				}

				if (currentValue == n) {
					// Represent delta as a generalized variable-length integer
					for (q = delta, k = base; /* no condition */; k += base) {
						t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
						if (q < t) {
							break;
						}
						qMinusT = q - t;
						baseMinusT = base - t;
						output.push(
							stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
						);
						q = floor(qMinusT / baseMinusT);
					}

					output.push(stringFromCharCode(digitToBasic(q, 0)));
					bias = adapt(delta, handledCPCountPlusOne, handledCPCount ==
basicLength);
					delta = 0;
					++handledCPCount;
				}
			}

			++delta;
			++n;

		}
		return output.join('');
	}

	/**
	 * Converts a Punycode string representing a domain name or an email
address
	 * to Unicode. Only the Punycoded parts of the input will be converted,
i.e.
	 * it doesn't matter if you call it on a string that has already been
	 * converted to Unicode.
	 * @memberOf punycode
	 * @param {String} input The Punycoded domain name or email address to
	 * convert to Unicode.
	 * @returns {String} The Unicode representation of the given Punycode
	 * string.
	 */
	function toUnicode(input) {
		return mapDomain(input, function(string) {
			return regexPunycode.test(string)
				? decode(string.slice(4).toLowerCase())
				: string;
		});
	}

	/**
	 * Converts a Unicode string representing a domain name or an email
address to
	 * Punycode. Only the non-ASCII parts of the domain name will be
converted,
	 * i.e. it doesn't matter if you call it with a domain that's
already in
	 * ASCII.
	 * @memberOf punycode
	 * @param {String} input The domain name or email address to convert, as a
	 * Unicode string.
	 * @returns {String} The Punycode representation of the given domain name
or
	 * email address.
	 */
	function toASCII(input) {
		return mapDomain(input, function(string) {
			return regexNonASCII.test(string)
				? 'xn--' + encode(string)
				: string;
		});
	}

	/*--------------------------------------------------------------------------*/

	/** Define the public API */
	punycode = {
		/**
		 * A string representing the current Punycode.js version number.
		 * @memberOf punycode
		 * @type String
		 */
		'version': '1.4.1',
		/**
		 * An object of methods to convert from JavaScript's internal
character
		 * representation (UCS-2) to Unicode code points, and back.
		 * @see <https://mathiasbynens.be/notes/javascript-encoding>
		 * @memberOf punycode
		 * @type Object
		 */
		'ucs2': {
			'decode': ucs2decode,
			'encode': ucs2encode
		},
		'decode': decode,
		'encode': encode,
		'toASCII': toASCII,
		'toUnicode': toUnicode
	};

	/** Expose `punycode` */
	// Some AMD build optimizers, like r.js, check for specific condition
patterns
	// like the following:
	if (
		typeof define == 'function' &&
		typeof define.amd == 'object' &&
		define.amd
	) {
		define('punycode', function() {
			return punycode;
		});
	} else if (freeExports && freeModule) {
		if (module.exports == freeExports) {
			// in Node.js, io.js, or RingoJS v0.8.0+
			freeModule.exports = punycode;
		} else {
			// in Narwhal or RingoJS v0.7.0-
			for (key in punycode) {
				punycode.hasOwnProperty(key) && (freeExports[key] =
punycode[key]);
			}
		}
	} else {
		// in Rhino or a web browser
		root.punycode = punycode;
	}

}(this));
PK`n�[��3�js/punycode.jsnu�[���/*!
https://mths.be/punycode v1.4.1 by @mathias - do not update to v2 */
!function(a){function b(a){throw new RangeError(E[a])}function
c(a,b){for(var c=a.length,d=[];c--;)d[c]=b(a[c]);return d}function
d(a,b){var
d=a.split("@"),e="";d.length>1&&(e=d[0]+"@",a=d[1]),a=a.replace(D,".");var
f=a.split("."),g=c(f,b).join(".");return e+g}function
e(a){for(var
b,c,d=[],e=0,f=a.length;f>e;)b=a.charCodeAt(e++),b>=55296&&56319>=b&&f>e?(c=a.charCodeAt(e++),56320==(64512&c)?d.push(((1023&b)<<10)+(1023&c)+65536):(d.push(b),e--)):d.push(b);return
d}function f(a){return c(a,function(a){var b="";return
a>65535&&(a-=65536,b+=H(a>>>10&1023|55296),a=56320|1023&a),b+=H(a)}).join("")}function
g(a){return 10>a-48?a-22:26>a-65?a-65:26>a-97?a-97:t}function
h(a,b){return a+22+75*(26>a)-((0!=b)<<5)}function i(a,b,c){var
d=0;for(a=c?G(a/x):a>>1,a+=G(a/b);a>F*v>>1;d+=t)a=G(a/F);return
G(d+(F+1)*a/(a+w))}function j(a){var
c,d,e,h,j,k,l,m,n,o,p=[],q=a.length,r=0,w=z,x=y;for(d=a.lastIndexOf(A),0>d&&(d=0),e=0;d>e;++e)a.charCodeAt(e)>=128&&b("not-basic"),p.push(a.charCodeAt(e));for(h=d>0?d+1:0;q>h;){for(j=r,k=1,l=t;h>=q&&b("invalid-input"),m=g(a.charCodeAt(h++)),(m>=t||m>G((s-r)/k))&&b("overflow"),r+=m*k,n=x>=l?u:l>=x+v?v:l-x,!(n>m);l+=t)o=t-n,k>G(s/o)&&b("overflow"),k*=o;c=p.length+1,x=i(r-j,c,0==j),G(r/c)>s-w&&b("overflow"),w+=G(r/c),r%=c,p.splice(r++,0,w)}return
f(p)}function k(a){var
c,d,f,g,j,k,l,m,n,o,p,q,r,w,x,B=[];for(a=e(a),q=a.length,c=z,d=0,j=y,k=0;q>k;++k)p=a[k],128>p&&B.push(H(p));for(f=g=B.length,g&&B.push(A);q>f;){for(l=s,k=0;q>k;++k)p=a[k],p>=c&&l>p&&(l=p);for(r=f+1,l-c>G((s-d)/r)&&b("overflow"),d+=(l-c)*r,c=l,k=0;q>k;++k)if(p=a[k],c>p&&++d>s&&b("overflow"),p==c){for(m=d,n=t;o=j>=n?u:n>=j+v?v:n-j,!(o>m);n+=t)x=m-o,w=t-o,B.push(H(h(o+x%w,0))),m=G(x/w);B.push(H(h(m,0))),j=i(d,r,f==g),d=0,++f}++d,++c}return
B.join("")}function l(a){return d(a,function(a){return
B.test(a)?j(a.slice(4).toLowerCase()):a})}function m(a){return
d(a,function(a){return C.test(a)?"xn--"+k(a):a})}var
n="object"==typeof
exports&&exports&&!exports.nodeType&&exports,o="object"==typeof
module&&module&&!module.nodeType&&module,p="object"==typeof
global&&global;(p.global===p||p.window===p||p.self===p)&&(a=p);var
q,r,s=2147483647,t=36,u=1,v=26,w=38,x=700,y=72,z=128,A="-",B=/^xn--/,C=/[^\x20-\x7E]/,D=/[\x2E\u3002\uFF0E\uFF61]/g,E={overflow:"Overflow:
input needs wider integers to
process","not-basic":"Illegal input >= 0x80 (not a
basic code point)","invalid-input":"Invalid
input"},F=t-u,G=Math.floor,H=String.fromCharCode;if(q={version:"1.4.1",ucs2:{decode:e,encode:f},decode:j,encode:k,toASCII:m,toUnicode:l},"function"==typeof
define&&"object"==typeof
define.amd&&define.amd)define("punycode",function(){return
q});else if(n&&o)if(module.exports==n)o.exports=q;else for(r in
q)q.hasOwnProperty(r)&&(n[r]=q[r]);else
a.punycode=q}(this);PK`n�[�t'�C�Cjs/repeatable-uncompressed.jsnu�[���/**
 * @package		Joomla.JavaScript
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * Options:
 * 		see defaults $.JRepeatable.defaults,
 * Options can be set through "data" atribute of the JRepeatable
container (see example markup)
 *
 * Events:
 * 		$('input.form-field-repeatable')
 * 		.on('weready', function(e){
 * 			// fires when JRepeatable initialized
 * 		})
 * 		.on('prepare-template', function(e, template){
 * 			// fires when row template initialized
 * 		})
 * 		.on('prepare-modal', function(e, modal){
 * 			// fires when modal container initialized
 * 		})
 * 		.on('row-add', function(e, row){
 * 			// fires when new row added
 * 		})
 * 		.on('row-remove', function(e, row){
 * 			// fires before row removing
 * 		})
 * 		.on('value-update', function(e, value){
 * 			// fires before when value in hidden input was updated
 * 		});
 *
 * Dependancies: jQuery, Bootsrap.modal
 *
 * Example fields initial markup:
 *
 * <div id="jform_somename_container">
 *	<div id="jform_somename_modal" class="modal
hide">
 * 		<table>
 * 			<thead>
 * 				<tr>
 * 					<th>Field label 1</th>
 * 					<th>Field label 2</th>
 * 					<th><a href="#" class="add">Add
new</a></th>
 * 				</tr>
 * 			</thead>
 * 			<tbody>
 * 				<tr>
 * 					<td><input type="text" name="field1"
/></td>
 * 					<td><input type="text" name="field2"
/></td>
 * 					<td>
 * 						<a href="#" class="add">Add new
after</a>
 * 						<a href="#"
class="remove">Remove</a>
 * 					</td>
 * 				</tr>
 * 			</tbody>
 * 		</table>
 * 		<a href="#"
class="close-modal">Close</a>
 * 	</div>
 * </div>
 * <button id="jform_somename_button" >Open
modal</button>
 * <input type="hidden" name="jform[somename]"
id="jform_somename" value=""
 * 		class="form-field-repeatable"
 * 		data-container="#jform_somename_container"
 * 		data-modal-element="#jform_somename_modal"
 * 		data-repeatable-element="table tbody tr"
 * 		data-bt-add="a.add" data-bt-remove="a.remove"
 * 		data-bt-modal-open="#jform_somename_button"
 * 		data-bt-modal-close="a.close-modal"
 * 		data-maximum="3" data-input="#jform_somename"
 * 		/>
 *
 * data-repeatable-element="table tbody tr" - means that
<tr> inside <tbody> will be repeatable
 */

;(function($){
	"use strict";

    $.JRepeatable = function(input, options){
        // To avoid scope issues,
        var self = this;

        //direct call
        if(!self || self === window){
        	return new $.JRepeatable(input, options);
        }

        self.$input = $(input);

        // check if alredy exist
        if(self.$input.data("JRepeatable")){
        	return self;
        }

        // Add a reverse reference to the DOM object
        self.$input.data("JRepeatable", self);

        // method initialize
        self.init = function(){
        	// merge options
            self.options = $.extend({}, $.JRepeatable.defaults, options);

            self.$container = $(self.options.container);
            // Move out form the Form container
            // for prevent sending to server
            $('body').append(self.$container);

            // container where the rows is live
            self.$rowsContainer =
self.$container.find(self.options.repeatableElement).parent();

            // prepare modal window
            self.prepareModal();

            // container for storing info about inputs
            self.inputs = [];
            self.values = {};

            // prepare a row template, and find available field names
            self.prepareTemplate();

            // check the values and keep it as object
            var val = self.$input.val();
            if(val){
            	// value can be not valid JSON
            	try {
            		self.values = JSON.parse(val);
				} catch (e) {
					if(e instanceof SyntaxError){
						// guess there a single quote problem
						try {
							val = val.replace(/'/g,
'"').replace(/\\"/g, "\'");// ho ho ho
		            		self.values = JSON.parse(val);
						} catch (e) {
							// nop
							if(window.console){
    							console.log(e);
    						}
						}
					} else if(window.console){
						console.log(e);
					}
				}
            }

            // so init the form depend from values that we have
            self.buildRows();

            // bind open the modal
            $(document).on('click', self.options.btModalOpen,
function (e) {
            	e.preventDefault();
            	self.$modalWindow.modal('show');
            });
            // bind close the modal
            self.$modalWindow.on('click',
self.options.btModalClose, function (e) {
            	e.preventDefault();
            	self.$modalWindow.modal('hide');
            	// rollback
            	self.buildRows();
            });

            // bind save the modaldata
            self.$modalWindow.on('click',
self.options.btModalSaveData, function (e) {
            	e.preventDefault();
            	self.$modalWindow.modal('hide');
            	self.refreshValue();
            });

            // bind add button
            self.$container.on('click', self.options.btAdd,
function (e) {
            	e.preventDefault();
            	var after = $(this).parents(self.options.repeatableElement);
            	if(!after.length){
            		after = null;
            	}
            	self.addRow(after);
            });
            // bind remove button
            self.$container.on('click', self.options.btRemove,
function (e) {
            	e.preventDefault();
            	var row = $(this).parents(self.options.repeatableElement);
            	self.removeRow(row);
            });

            // tell all that we a ready
            self.$input.trigger('weready');
        };

        // prepare a template that we will use for repeating
        self.prepareTemplate = function(){
        	//find available
        	var $rows = self.$container.find(self.options.repeatableElement);
        	var $row = $($rows.get(0));
        	// clear scripts that can be attached to the fields
        	try {
        		self.clearScripts($row);
			} catch (e) {
				if(window.console){
					console.log(e);
				}
			}

        	var inputs = $row.find('*[name]');
        	//keep the name and type for each
        	for(var i = 0, l = inputs.length; i < l; i++){
        		var name = $(inputs[i]).attr('name');
        		// check if alredy exist, for radio case
        		if(self.values[name]){
        			continue;
        		}
        		self.inputs.push({
        			name: name,
        			type: $(inputs[i]).attr('type') ||
inputs[i].tagName.toLowerCase()
        		});
        		// initialize values
        		self.values[name] = [];
        	}

        	// keep template
        	self.template = $row.prop('outerHTML');
        	// remove
        	$rows.remove();

        	// tell all that the template ready
            self.$input.trigger('prepare-template',
self.template);
        };

        // prepare modal window
        self.prepareModal = function(){
        	var modalEl = $(self.options.modalElement);

        	// fix modal style
        	modalEl.css({
        		position: 'absolute',
        		width: 'auto',
        		'max-width': '100%'
        	});

        	modalEl.on('shown', function () {
        		self.resizeModal();
        	});
        	$(window).resize(function() {
        		self.resizeModal();
        	});

        	// init bootstrap modal
        	self.$modalWindow = modalEl.modal({show: false, backdrop:
'static'});

        	// tell all that the modal are ready
            self.$input.trigger('prepare-modal',
self.$modalWindow);
        };

        //resize and count position for the modal popup
        self.resizeModal = function (){
        	if(!self.$modalWindow.is(':visible')){
        		// do nothing with hidden
        		return;
        	}
        	var docHalfWidth = $(document).width() / 2,
      	 	 	modalHalfWidth = self.$modalWindow.width() / 2,
      	 	 	rowsHalfWidth = self.$rowsContainer.width() / 2,
      	 	 	marginLeft = modalHalfWidth >= docHalfWidth ? 0 :
-modalHalfWidth,
      	 	 	left = marginLeft ? '50%' : 0,
      	 	 	top = $(document).scrollTop() + $(window).height() * 0.2;//20%
from top of visible win

        	self.$modalWindow.css({
       	    	 top: top,
       	    	 left: left,
       	         'margin-left': marginLeft,
       	         overflow: rowsHalfWidth > modalHalfWidth ?
'auto' : 'visible'
       	    });

        };

        // build rows
        self.buildRows = function(){
        	// clean up any old
        	var $oldRows = self.$rowsContainer.children();
        	if($oldRows.length){
        		self.removeRow($oldRows);
        	}

	        // go through values and add a new copy
	        // but make sure that at least one will be added
	        var count = self.values[Object.keys(self.values)[0]].length || 1,
            	row = null;
            for(var i = 0; i < count; i++){
            	row = self.addRow(row, i);
            }
        };

        // add new row
        self.addRow = function(after, valueKey){
        	// count how much we already have
        	var count =
self.$container.find(self.options.repeatableElement).length;
        	if(count >= self.options.maximum){
        		return null;
        	}

        	// make new from template
        	var row = $.parseHTML(self.template);

        	//add to container
        	if(after){
        		$(after).after(row);
        	} else {
        		self.$rowsContainer.append(row);
        	}

        	var $row = $(row);
        	// fix names and id`s
        	self.fixUniqueAttributes($row, count + 1);
        	// set values
        	if(valueKey !== null && valueKey !== undefined){
            	for(var i = 0, l = self.inputs.length; i < l; i++){
            		var name  = self.inputs[i].name,
            			type  = self.inputs[i].type,
            			value = null;
            		if(self.values[name]){
            			value = self.values[name][valueKey];
            		}
            		// skip undefined
            		if(value === null || value === undefined){
            			continue;
            		}

            		if(type === 'radio'){
           
			$row.find('*[name*="'+name+'"][value="'
+ value + '"]').attr('checked',
'checked');
            		}else if(type === 'checkbox'){
            			// check if there a multiple
            			if(value.length){
            				for(var v = 0, vl = value.length; v < vl; v++){
           
					$row.find('*[name*="'+name+'"][value="'
+ value[v] + '"]').attr('checked',
'checked');
            				}
            			} else {
           
				$row.find('*[name*="'+name+'"][value="'
+ value + '"]').attr('checked',
'checked');
            			}

            		} else {
           
			$row.find('*[name*="'+name+'"]').val(value);
            		}
            	}
        	}

        	// try find out with related scripts,
        	// tricky thing, so be careful
        	try {
        		self.fixScripts($row);
			} catch (e) {
				if(window.console){
					console.log(e);
				}
			}

			// tell all about new row
            self.$input.trigger('row-add', $row);

        	return $row;
        };

        // remove row from container
        self.removeRow = function(row){
        	// tell all about row removing
            self.$input.trigger('row-remove', row);

        	$(row).remove();
        };

        //fix names ind id`s for field that in $row
        self.fixUniqueAttributes = function($row, count){
        	//all elements that have a "id" attribute
        	var haveIds = $row.find('*[id]');
        	self.increaseAttrName(haveIds, 'id', count);
        	// all labels that have a "for" attribute
        	var haveFor = $row.find('label[for]');
        	self.increaseAttrName(haveFor, 'for', count);
        	// all inputs that have a "name" attribute
        	var haveName = $row.find('*[name]');
        	self.increaseAttrName(haveName, 'name', count);
        };

        // increase attribute name like: attribute_value + '-' +
count
        self.increaseAttrName = function (elements, attr, count){
        	for(var i = 0, l = elements.length; i < l; i++){
        		var $el =  $(elements[i]);
        		var oldValue = $el.attr(attr);
        		// set new
        		$el.attr(attr, count + '-' + oldValue);
        	}
        };

        // refresh value in the main input
        self.refreshValue = function(){
        	var $rows = self.$container.find(self.options.repeatableElement);
        	// reset existing
        	self.values = {};
        	// go through available input names
            for(var i = 0, l = self.inputs.length; i < l; i++){
            	var name = self.inputs[i].name,
            		type = self.inputs[i].type;
            	// init new
            	self.values[name] = [];
            	// find all inputs and take their values
            	for(var r = 0, rl = $rows.length; r < rl; r++){
            		var $row = $($rows[r]),
            			val  = null;
            		if(type === 'radio'){
            			val =
$row.find('*[name*="'+name+'"]:checked').val();
            		}else if(type === 'checkbox'){
            			var checked =
$row.find('*[name*="'+name+'"]:checked');
            			// test for multiple
            			if(checked.length > 1){
            				val = [];
            				for(var c = 0, cl = checked.length; c < cl; c++){
            					val.push($(checked[c]).val());
            				}
            			} else {
            				// single checkbox
            				val = checked.val();
            			}
            		}else{
            			val =
$row.find('*[name*="'+name+'"]').val();
            		}
            		val = val === null ? '' : val;

            		self.values[name].push(val)
            	}
        	}
        	// put in to the main input
            self.$input.val(JSON.stringify(self.values));

            // tell all about value changed
            self.$input.trigger('value-update', self.values);
        };

        // remove scripts attached to fields
        self.clearScripts = function($row){
        	// destroy chosen if any
        	if($.fn.chosen){
                $row.find('select').each(function(){
					var $el = $(this);
					if ($el.data('chosen')) {
						$el.chosen('destroy');
						$el.addClass('here-was-chosen');
					}
				});
        	}
        	// colorpicker
        	if($.fn.minicolors){
        		$row.find('.minicolors input').each(function(){
        			$(this).minicolors('destroy', $(this));
        		});
        	}
        };

        // method for hack the scripts that can be related
        // to the one of field that in given $row
        self.fixScripts = function($row){

			// Chosen.js
			if ($.fn.chosen) {
				$row.find('select.here-was-chosen').removeClass('here-was-chosen').chosen();
			}

        	//color picker
        	$row.find('.minicolors').each(function() {
        		var $el = $(this);
        		$el.minicolors({
					control: $el.attr('data-control') || 'hue',
					position: $el.attr('data-position') || 'right',
					theme: 'bootstrap'
				});
			});

        	// fix media field
       
	$row.find('a[onclick*="jInsertFieldValue"]').each(function(){
        		var $el = $(this),
        			inputId =
$el.siblings('input[type="text"]').attr('id'),
        			$select = $el.prev(),
        			oldHref = $select.attr('href');
        		// update the clear button
        		$el.attr('onclick',
"jInsertFieldValue('', '" + inputId +
"');return false;");
        		// update select button
        		$select.attr('href',
oldHref.replace(/&fieldid=(.+)&/, '&fieldid=' +
inputId + '&'));
				jMediaRefreshPreview(inputId);
        	});
		
		// fix media field in ISIS Template
		$row.find('.field-media-wrapper').each(function(){
			var $el = $(this);
			$el.fieldMedia();
		});

        	// another modals
        	if(window.SqueezeBox && window.SqueezeBox.assign){
        		SqueezeBox.assign($row.find('a.modal').get(), {parse:
'rel'});
        	}
        };

        // Run initializer
        self.init();
    };

    // defaults
    $.JRepeatable.defaults = {
    	modalElement: "#modal-container", // id of the modal
container
    	btModalOpen: "#open-modal", // id of the button for initiate
the modal window
    	btModalClose: ".close-modal", // button for close the modal
window, and rollback all changes
    	btModalSaveData: ".save-modal-data", // button for close the
modal window, and keep the all changes
    	btAdd: "a.add", //  button selector for "add"
action
    	btRemove: "a.remove",//  button selector for
"remove" action
    	maximum: 10, // maximum repeating
    	repeatableElement: "table tbody tr"
    };

    $.fn.JRepeatable = function(options){
        return this.each(function(){
        	var options = options || {},
        		data = $(this).data();

        	for (var p in data) {
                // check options in the element
                if (data.hasOwnProperty(p)) {
                     options[p] = data[p];
                }
            }
         	new $.JRepeatable(this, options);
        });
    };

    // initialise all available
    // wait when all will be loaded, important for scripts fix
	$(window).on('load', function(){
		$('input.form-field-repeatable').JRepeatable();
	})

})(jQuery);

PK`n�[*���js/repeatable.jsnu�[���!function(e){"use
strict";e.JRepeatable=function(t,n){var a=this;return
a&&a!==window?(a.$input=e(t),a.$input.data("JRepeatable")?a:(a.$input.data("JRepeatable",a),a.init=function(){a.options=e.extend({},e.JRepeatable.defaults,n),a.$container=e(a.options.container),e("body").append(a.$container),a.$rowsContainer=a.$container.find(a.options.repeatableElement).parent(),a.prepareModal(),a.inputs=[],a.values={},a.prepareTemplate();var
t=a.$input.val();if(t)try{a.values=JSON.parse(t)}catch(e){if(e instanceof
SyntaxError)try{t=t.replace(/'/g,'"').replace(/\\"/g,"'"),a.values=JSON.parse(t)}catch(e){window.console&&console.log(e)}else
window.console&&console.log(e)}a.buildRows(),e(document).on("click",a.options.btModalOpen,function(e){e.preventDefault(),a.$modalWindow.modal("show")}),a.$modalWindow.on("click",a.options.btModalClose,function(e){e.preventDefault(),a.$modalWindow.modal("hide"),a.buildRows()}),a.$modalWindow.on("click",a.options.btModalSaveData,function(e){e.preventDefault(),a.$modalWindow.modal("hide"),a.refreshValue()}),a.$container.on("click",a.options.btAdd,function(t){t.preventDefault();var
n=e(this).parents(a.options.repeatableElement);n.length||(n=null),a.addRow(n)}),a.$container.on("click",a.options.btRemove,function(t){t.preventDefault();var
n=e(this).parents(a.options.repeatableElement);a.removeRow(n)}),a.$input.trigger("weready")},a.prepareTemplate=function(){var
t=a.$container.find(a.options.repeatableElement),n=e(t.get(0));try{a.clearScripts(n)}catch(e){window.console&&console.log(e)}for(var
o=n.find("*[name]"),i=0,r=o.length;i<r;i++){var
l=e(o[i]).attr("name");a.values[l]||(a.inputs.push({name:l,type:e(o[i]).attr("type")||o[i].tagName.toLowerCase()}),a.values[l]=[])}a.template=n.prop("outerHTML"),t.remove(),a.$input.trigger("prepare-template",a.template)},a.prepareModal=function(){var
t=e(a.options.modalElement);t.css({position:"absolute",width:"auto","max-width":"100%"}),t.on("shown",function(){a.resizeModal()}),e(window).resize(function(){a.resizeModal()}),a.$modalWindow=t.modal({show:!1,backdrop:"static"}),a.$input.trigger("prepare-modal",a.$modalWindow)},a.resizeModal=function(){if(a.$modalWindow.is(":visible")){var
t=e(document).width()/2,n=a.$modalWindow.width()/2,o=a.$rowsContainer.width()/2,i=n>=t?0:-n,r=i?"50%":0,l=e(document).scrollTop()+.2*e(window).height();a.$modalWindow.css({top:l,left:r,"margin-left":i,overflow:o>n?"auto":"visible"})}},a.buildRows=function(){var
e=a.$rowsContainer.children();e.length&&a.removeRow(e);for(var
t=a.values[Object.keys(a.values)[0]].length||1,n=null,o=0;o<t;o++)n=a.addRow(n,o)},a.addRow=function(t,n){var
o=a.$container.find(a.options.repeatableElement).length;if(o>=a.options.maximum)return
null;var
i=e.parseHTML(a.template);t?e(t).after(i):a.$rowsContainer.append(i);var
r=e(i);if(a.fixUniqueAttributes(r,o+1),null!==n&&void 0!==n)for(var
l=0,d=a.inputs.length;l<d;l++){var
s=a.inputs[l].name,c=a.inputs[l].type,p=null;if(a.values[s]&&(p=a.values[s][n]),null!==p&&void
0!==p)if("radio"===c)r.find('*[name*="'+s+'"][value="'+p+'"]').attr("checked","checked");else
if("checkbox"===c)if(p.length)for(var
u=0,f=p.length;u<f;u++)r.find('*[name*="'+s+'"][value="'+p[u]+'"]').attr("checked","checked");else
r.find('*[name*="'+s+'"][value="'+p+'"]').attr("checked","checked");else
r.find('*[name*="'+s+'"]').val(p)}try{a.fixScripts(r)}catch(e){window.console&&console.log(e)}return
a.$input.trigger("row-add",r),r},a.removeRow=function(t){a.$input.trigger("row-remove",t),e(t).remove()},a.fixUniqueAttributes=function(e,t){var
n=e.find("*[id]");a.increaseAttrName(n,"id",t);var
o=e.find("label[for]");a.increaseAttrName(o,"for",t);var
i=e.find("*[name]");a.increaseAttrName(i,"name",t)},a.increaseAttrName=function(t,n,a){for(var
o=0,i=t.length;o<i;o++){var
r=e(t[o]),l=r.attr(n);r.attr(n,a+"-"+l)}},a.refreshValue=function(){var
t=a.$container.find(a.options.repeatableElement);a.values={};for(var
n=0,o=a.inputs.length;n<o;n++){var
i=a.inputs[n].name,r=a.inputs[n].type;a.values[i]=[];for(var
l=0,d=t.length;l<d;l++){var
s=e(t[l]),c=null;if("radio"===r)c=s.find('*[name*="'+i+'"]:checked').val();else
if("checkbox"===r){var
p=s.find('*[name*="'+i+'"]:checked');if(p.length>1){c=[];for(var
u=0,f=p.length;u<f;u++)c.push(e(p[u]).val())}else c=p.val()}else
c=s.find('*[name*="'+i+'"]').val();c=null===c?"":c,a.values[i].push(c)}}a.$input.val(JSON.stringify(a.values)),a.$input.trigger("value-update",a.values)},a.clearScripts=function(t){e.fn.chosen&&t.find("select").each(function(){e(this).data("chosen")&&e(this).chosen("destroy")}),e.fn.minicolors&&t.find(".minicolors
input").each(function(){e(this).minicolors("destroy",e(this))})},a.fixScripts=function(t){t.find(".minicolors").each(function(){var
t=e(this);t.minicolors({control:t.attr("data-control")||"hue",position:t.attr("data-position")||"right",theme:"bootstrap"})}),t.find('a[onclick*="jInsertFieldValue"]').each(function(){var
t=e(this),n=t.siblings('input[type="text"]').attr("id"),a=t.prev(),o=a.attr("href");t.attr("onclick","jInsertFieldValue('',
'"+n+"');return
false;"),a.attr("href",o.replace(/&fieldid=(.+)&/,"&fieldid="+n+"&")),jMediaRefreshPreview(n)}),t.find(".field-media-wrapper").each(function(){e(this).fieldMedia()}),window.SqueezeBox&&window.SqueezeBox.assign&&SqueezeBox.assign(t.find("a.modal").get(),{parse:"rel"})},void
a.init())):new
e.JRepeatable(t,n)},e.JRepeatable.defaults={modalElement:"#modal-container",btModalOpen:"#open-modal",btModalClose:".close-modal",btModalSaveData:".save-modal-data",btAdd:"a.add",btRemove:"a.remove",maximum:10,repeatableElement:"table
tbody tr"},e.fn.JRepeatable=function(t){return
this.each(function(){var t=t||{},n=e(this).data();for(var a in
n)n.hasOwnProperty(a)&&(t[a]=n[a]);new
e.JRepeatable(this,t)})},e(window).on("load",function(){e("input.form-field-repeatable").JRepeatable()})}(jQuery);PK`n�[�gɚ�js/sendtestmail-uncompressed.jsnu�[���/**
 * @package         Joomla.JavaScript
 * @copyright       Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license         GNU General Public License version 2 or later; see
LICENSE.txt
 */

/**
 * Calls the sending process of the config class
 */
var sendTestMail = function ()
{
	$ = jQuery;

	var email_data = {
		smtpauth  :
$('input[name="jform[smtpauth]"]:checked').val(),
		smtpuser  : $('input[name="jform[smtpuser]"]').val(),
		smtphost  : $('input[name="jform[smtphost]"]').val(),
		smtpsecure:
$('select[name="jform[smtpsecure]"]').val(),
		smtpport  : $('input[name="jform[smtpport]"]').val(),
		mailfrom  : $('input[name="jform[mailfrom]"]').val(),
		fromname  : $('input[name="jform[fromname]"]').val(),
		mailer    : $('select[name="jform[mailer]"]').val(),
		mailonline:
$('input[name="jform[mailonline]"]:checked').val()
	};

	var $smtppass = $('input[name="jform[smtppass]"]');

	if ($smtppass.is(':disabled') === false) {
		email_data.smtppass = $smtppass.val();
	}

	// Remove js messages, if they exist.
	Joomla.removeMessages();

	$.ajax({
		method: "POST",
		url:
document.getElementById('sendtestmail').getAttribute('data-ajaxuri'),
		data: email_data,
		dataType: "json"
	})
	.fail(function (jqXHR, textStatus, error) {
		Joomla.renderMessages(Joomla.ajaxErrorsMessages(jqXHR, textStatus,
error));

		window.scrollTo(0, 0);
	})
	.done(function (response) {
		// Render messages, if any.
		if (typeof response.messages == 'object' &&
response.messages !== null)
		{
			Joomla.renderMessages(response.messages);

			window.scrollTo(0, 0);
		}
	});
};

jQuery(document).ready(function ($)
{
	$('#sendtestmail').click(sendTestMail);
});
PK`n�[��hjs/sendtestmail.jsnu�[���var
sendTestMail=function(){$=jQuery;var
e={smtpauth:$('input[name="jform[smtpauth]"]:checked').val(),smtpuser:$('input[name="jform[smtpuser]"]').val(),smtphost:$('input[name="jform[smtphost]"]').val(),smtpsecure:$('select[name="jform[smtpsecure]"]').val(),smtpport:$('input[name="jform[smtpport]"]').val(),mailfrom:$('input[name="jform[mailfrom]"]').val(),fromname:$('input[name="jform[fromname]"]').val(),mailer:$('select[name="jform[mailer]"]').val(),mailonline:$('input[name="jform[mailonline]"]:checked').val()},a=$('input[name="jform[smtppass]"]');!1===a.is(":disabled")&&(e.smtppass=a.val()),Joomla.removeMessages(),$.ajax({method:"POST",url:document.getElementById("sendtestmail").getAttribute("data-ajaxuri"),data:e,dataType:"json"}).fail(function(e,a,s){Joomla.renderMessages(Joomla.ajaxErrorsMessages(e,a,s)),window.scrollTo(0,0)}).done(function(e){"object"==typeof
e.messages&&null!==e.messages&&(Joomla.renderMessages(e.messages),window.scrollTo(0,0))})};jQuery(document).ready(function(e){e("#sendtestmail").click(sendTestMail)});
PK`n�[f@b$�(�(%js/subform-repeatable-uncompressed.jsnu�[���/**
 * @copyright  Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

;(function($){
	"use strict";
	$.subformRepeatable = function(container, options){
		this.$container = $(container);

		// To avoid scope issues,
		var self = this;

		// check if already exist
		if(this.$container.data("subformRepeatable")){
			return self;
		}

		// Add a reverse reference to the DOM object
		this.$container.data("subformRepeatable", self);

		// merge options
		this.options = $.extend({}, $.subformRepeatable.defaults, options);

		// template for the repeating group
		this.template = '';

		// prepare a row template, and find available field names
		this.prepareTemplate();

		// check rows container
		this.$containerRows = this.options.rowsContainer ?
this.$container.find(this.options.rowsContainer) : this.$container;

		// Keep track of amount of rows, this is important to avoid a name
duplication
		this.lastRowNum =
this.$containerRows.find(this.options.repeatableElement).length;

		// bind add button
		this.$container.on('click', this.options.btAdd, function (e) {
			e.preventDefault();
			var after = $(this).parents(self.options.repeatableElement);
			if(!after.length){
				after = null;
			}
			self.addRow(after);
		});

		// bind remove button
		this.$container.on('click', this.options.btRemove, function (e)
{
			e.preventDefault();
			var $row = $(this).parents(self.options.repeatableElement);
			self.removeRow($row);
		});

		// bind move button
		if(this.options.btMove){
			this.$containerRows.sortable({
				items: this.options.repeatableElement,
				handle: this.options.btMove,
				tolerance: 'pointer'
			});
		}

		// tell all that we a ready
		this.$container.trigger('subform-ready');
	};

	// prepare a template that we will use repeating
	$.subformRepeatable.prototype.prepareTemplate = function(){
		// create from template
		if (this.options.rowTemplateSelector) {
			// Find the template element and get its HTML content, this is our
template.
			var $tmplElement =
this.$container.find(this.options.rowTemplateSelector).last();

			this.template = $.trim($tmplElement.html()) || '';

			// This is IE fix for <template>
			$tmplElement.css('display', 'none'); // Make sure it
not visible
			var map = {'SUBFORMLT': '<',
'SUBFORMGT': '>'};
			this.template = this.template.replace(/(SUBFORMLT)|(SUBFORMGT)/g,
function(match){
				return map[match];
			});
		}
		// create from existing rows
		else {
			//find first available
			var row = this.$container.find(this.options.repeatableElement).get(0),
				$row = $(row).clone();

			// clear scripts that can be attached to the fields
			try {
				this.clearScripts($row);
			} catch (e) {
				if(window.console){
					console.log(e);
				}
			}

			this.template = $row.prop('outerHTML');
		}
	};

	// add new row
	$.subformRepeatable.prototype.addRow = function(after){
		// count how much we already have
		var count =
this.$containerRows.find(this.options.repeatableElement).length;
		if(count >= this.options.maximum){
			return null;
		}

		// make new from template
		var row = $.parseHTML(this.template);

		//add to container
		if(after){
			$(after).after(row);
		} else {
			this.$containerRows.append(row);
		}

		var $row = $(row);
		//add marker that it is new
		$row.attr('data-new', 'true');
		// fix names and id`s, and reset values
		this.fixUniqueAttributes($row, count);

		// try find out with related scripts,
		// tricky thing, so be careful
		try {
			this.fixScripts($row);
		} catch (e) {
			if(window.console){
				console.log(e);
			}
		}

		// tell everyone about the new row
		this.$container.trigger('subform-row-add', $row);
		return $row;
	};

	// remove row
	$.subformRepeatable.prototype.removeRow = function($row){
		// count how much we have
		var count =
this.$containerRows.find(this.options.repeatableElement).length;
		if(count <= this.options.minimum){
			return;
		}

		// tell everyoune about the row will be removed
		this.$container.trigger('subform-row-remove', $row);
		$row.remove();
	};

	// fix names and id`s for fields in $row
	$.subformRepeatable.prototype.fixUniqueAttributes = function(
		$row, // the jQuery object to do fixes in
		_count, // existing count of rows
		_group, // current group name, e.g. 'optionsX'
		_basename, // group base name, without count, e.g. 'options'
		isNested
	) {
		var group = (typeof _group === 'undefined' ?
$row.attr('data-group') : _group),
			basename = (typeof _basename === 'undefined' ?
$row.attr('data-base-name') : _basename),
			count    = (typeof _count === 'undefined' ? 0 : _count),
			countnew = Math.max(this.lastRowNum, count),
			groupnew = basename + countnew;

		$row.attr('data-group', groupnew);

		// Fix inputs that have a "name" attribute
		var haveName = $row.find('[name]'),
			ids = {}; // Collect id for fix checkboxes and radio

		for (var i = 0, l = haveName.length; i < l; i++) {
			var $el     = $(haveName[i]),
				name    = $el.attr('name'),
				id      = name.replace(/(\[\]$)/g, '').replace(/(\]\[)/g,
'__').replace(/\[/g, '_').replace(/\]/g, ''),
// id from name
				nameNew = name.replace('[' + group + '][',
'['+ groupnew +']['), // New name
				idNew   = id.replace(group, groupnew).replace(/\W/g, '_'), //
Count new id
				countMulti = 0, // count for multiple radio/checkboxes
				forOldAttr = id; // Fix "for" in the labels

			if ($el.prop('type') === 'checkbox' &&
name.match(/\[\]$/)) { // <input type="checkbox"
name="name[]"> fix
				// Recount id
				countMulti = ids[id] ? ids[id].length : 0;
				if (!countMulti) {
					// Set the id for fieldset and group label
					$el.closest('fieldset.checkboxes').attr('id',
idNew);
					$row.find('label[for="' + id +
'"]').attr('for', idNew).attr('id',
idNew + '-lbl');
				}
				forOldAttr = forOldAttr + countMulti;
				idNew = idNew + countMulti;
			}
			else if ($el.prop('type') === 'radio') { //
<input type="radio"> fix
				// Recount id
				countMulti = ids[id] ? ids[id].length : 0;
				if (!countMulti) {
					// Set the id for fieldset and group label
					$el.closest('fieldset.radio').attr('id', idNew);
					$row.find('label[for="' + id +
'"]').attr('for', idNew).attr('id',
idNew + '-lbl');
				}
				forOldAttr = forOldAttr + countMulti;
				idNew = idNew + countMulti;
			}

			// Cache already used id
			if (ids[id]) {
				ids[id].push(true);
			} else {
				ids[id] = [true];
			}

			// Replace the name to new one
			$el.attr('name', nameNew);
			// Set new id
			$el.attr('id', idNew);
			// Guess there a label for this input
			$row.find('label[for="' + forOldAttr +
'"]').attr('for', idNew).attr('id',
idNew + '-lbl');
		}

		/**
		 * Recursively replace our basename + old group with basename + new group
		 * inside of nested subform template elements. First we try to find such
		 * template elements, then we iterate through them and do the same
replacements
		 * that we have made here inside of them.
		 */
		var nestedTemplates = $row.find(this.options.rowTemplateSelector);
		// If we found it, iterate over the found ones (might be more than one!)
		for (var j = 0; j < nestedTemplates.length; j++) {
			// Get the nested templates content (as DocumentFragment) and cast it
			// to a jQuery object
			var nestedTemplate = $($(nestedTemplates[j]).prop('content'));
			// Fix the attributes for this nested template.
			this.fixUniqueAttributes(nestedTemplate, count, group, basename, true);
		}

		// Increment a row counter for current instance only
		if (!isNested) {
			this.lastRowNum = countnew + 1;
		}
	};

	// remove scripts attached to fields
	// @TODO: make thing better when something like that will be accepted
https://github.com/joomla/joomla-cms/pull/6357
	$.subformRepeatable.prototype.clearScripts = function($row){
		// destroy chosen if any
		if($.fn.chosen){
			$row.find('select.chzn-done').each(function(){
				var $el = $(this);
				$el.next('.chzn-container').remove();
				$el.show().addClass('fix-chosen');
			});
		}
	};

	// method for hack the scripts that can be related
	// to the one of field that in given $row
	// @TODO Stop using this function. Elements within subforms should
initialize themselves
	$.subformRepeatable.prototype.fixScripts = function($row){
		// fix media field
		$row.find('a[onclick*="jInsertFieldValue"]').each(function(){
				var $el = $(this),
				inputId =
$el.siblings('input[type="text"]').attr('id'),
				$select = $el.prev(),
				oldHref = $select.attr('href');
			// update the clear button
			$el.attr('onclick', "jInsertFieldValue('',
'" + inputId + "');return false;")
			// update select button
			$select.attr('href', oldHref.replace(/&fieldid=(.+)&/,
'&fieldid=' + inputId + '&'));
		});
	};

	// defaults
	$.subformRepeatable.defaults = {
		// button selector for "add" action, must be unique per nested
subform!
		btAdd: ".group-add",
		// button selector for "remove" action, must be unique per
nested subform!
		btRemove: ".group-remove",
		// button selector for "move" action, must be unique per nested
subform!
		btMove: ".group-move",
		// minimum repeating
		minimum: 0,
		// maximum repeating
		maximum: 10,
		// selector for the repeatable element inside the main container,
		// must be unique per nested subform!
		repeatableElement: ".subform-repeatable-group",
		// selector for the row template element with URL-encoded template inside
it,
		// must *NOT* be unique per nested subform!
		rowTemplateSelector:
'template.subform-repeatable-template-section',
		// container for rows, same as main container by default
		rowsContainer: null
	};

	$.fn.subformRepeatable = function(options){
		return this.each(function(){
			var options = options || {},
				data = $(this).data();

			if(data.subformRepeatable){
				// Alredy initialized, nothing to do here
				return;
			}

			for (var p in data) {
				// check options in the element
				if (data.hasOwnProperty(p)) {
					options[p] = data[p];
				}
			}

			var inst = new $.subformRepeatable(this, options);
			$(this).data('subformRepeatable', inst);
		});
	};

	// initialise all available on load and again within any added row
	$(function ($) {
		initSubform();
		$(document).on('subform-row-add', initSubform);

		function initSubform (event, container) {
			$(container ||
document).find('div.subform-repeatable').subformRepeatable();
		}
	});

})(jQuery);
PK`n�[$���VVjs/subform-repeatable.jsnu�[���(function($){"use
strict";$.subformRepeatable=function(container,options){this.$container=$(container);var
self=this;if(this.$container.data("subformRepeatable")){return
self}this.$container.data("subformRepeatable",self);this.options=$.extend({},$.subformRepeatable.defaults,options);this.template="";this.prepareTemplate();this.$containerRows=this.options.rowsContainer?this.$container.find(this.options.rowsContainer):this.$container;this.lastRowNum=this.$containerRows.find(this.options.repeatableElement).length;this.$container.on("click",this.options.btAdd,function(e){e.preventDefault();var
after=$(this).parents(self.options.repeatableElement);if(!after.length){after=null}self.addRow(after)});this.$container.on("click",this.options.btRemove,function(e){e.preventDefault();var
$row=$(this).parents(self.options.repeatableElement);self.removeRow($row)});if(this.options.btMove){this.$containerRows.sortable({items:this.options.repeatableElement,handle:this.options.btMove,tolerance:"pointer"})}this.$container.trigger("subform-ready")};$.subformRepeatable.prototype.prepareTemplate=function(){if(this.options.rowTemplateSelector){var
$tmplElement=this.$container.find(this.options.rowTemplateSelector).last();this.template=$.trim($tmplElement.html())||"";$tmplElement.css("display","none");var
map={SUBFORMLT:"<",SUBFORMGT:">"};this.template=this.template.replace(/(SUBFORMLT)|(SUBFORMGT)/g,function(match){return
map[match]})}else{var
row=this.$container.find(this.options.repeatableElement).get(0),$row=$(row).clone();try{this.clearScripts($row)}catch(e){if(window.console){console.log(e)}}this.template=$row.prop("outerHTML")}};$.subformRepeatable.prototype.addRow=function(after){var
count=this.$containerRows.find(this.options.repeatableElement).length;if(count>=this.options.maximum){return
null}var
row=$.parseHTML(this.template);if(after){$(after).after(row)}else{this.$containerRows.append(row)}var
$row=$(row);$row.attr("data-new","true");this.fixUniqueAttributes($row,count);try{this.fixScripts($row)}catch(e){if(window.console){console.log(e)}}this.$container.trigger("subform-row-add",$row);return
$row};$.subformRepeatable.prototype.removeRow=function($row){var
count=this.$containerRows.find(this.options.repeatableElement).length;if(count<=this.options.minimum){return}this.$container.trigger("subform-row-remove",$row);$row.remove()};$.subformRepeatable.prototype.fixUniqueAttributes=function($row,_count,_group,_basename,isNested){var
group=typeof
_group==="undefined"?$row.attr("data-group"):_group,basename=typeof
_basename==="undefined"?$row.attr("data-base-name"):_basename,count=typeof
_count==="undefined"?0:_count,countnew=Math.max(this.lastRowNum,count),groupnew=basename+countnew;$row.attr("data-group",groupnew);var
haveName=$row.find("[name]"),ids={};for(var
i=0,l=haveName.length;i<l;i++){var
$el=$(haveName[i]),name=$el.attr("name"),id=name.replace(/(\[\]$)/g,"").replace(/(\]\[)/g,"__").replace(/\[/g,"_").replace(/\]/g,""),nameNew=name.replace("["+group+"][","["+groupnew+"]["),idNew=id.replace(group,groupnew).replace(/\W/g,"_"),countMulti=0,forOldAttr=id;if($el.prop("type")==="checkbox"&&name.match(/\[\]$/)){countMulti=ids[id]?ids[id].length:0;if(!countMulti){$el.closest("fieldset.checkboxes").attr("id",idNew);$row.find('label[for="'+id+'"]').attr("for",idNew).attr("id",idNew+"-lbl")}forOldAttr=forOldAttr+countMulti;idNew=idNew+countMulti}else
if($el.prop("type")==="radio"){countMulti=ids[id]?ids[id].length:0;if(!countMulti){$el.closest("fieldset.radio").attr("id",idNew);$row.find('label[for="'+id+'"]').attr("for",idNew).attr("id",idNew+"-lbl")}forOldAttr=forOldAttr+countMulti;idNew=idNew+countMulti}if(ids[id]){ids[id].push(true)}else{ids[id]=[true]}$el.attr("name",nameNew);$el.attr("id",idNew);$row.find('label[for="'+forOldAttr+'"]').attr("for",idNew).attr("id",idNew+"-lbl")}var
nestedTemplates=$row.find(this.options.rowTemplateSelector);for(var
j=0;j<nestedTemplates.length;j++){var
nestedTemplate=$($(nestedTemplates[j]).prop("content"));this.fixUniqueAttributes(nestedTemplate,count,group,basename,true)}if(!isNested){this.lastRowNum=countnew+1}};$.subformRepeatable.prototype.clearScripts=function($row){if($.fn.chosen){$row.find("select.chzn-done").each(function(){var
$el=$(this);$el.next(".chzn-container").remove();$el.show().addClass("fix-chosen")})}};$.subformRepeatable.prototype.fixScripts=function($row){$row.find('a[onclick*="jInsertFieldValue"]').each(function(){var
$el=$(this),inputId=$el.siblings('input[type="text"]').attr("id"),$select=$el.prev(),oldHref=$select.attr("href");$el.attr("onclick","jInsertFieldValue('',
'"+inputId+"');return
false;");$select.attr("href",oldHref.replace(/&fieldid=(.+)&/,"&fieldid="+inputId+"&"))})};$.subformRepeatable.defaults={btAdd:".group-add",btRemove:".group-remove",btMove:".group-move",minimum:0,maximum:10,repeatableElement:".subform-repeatable-group",rowTemplateSelector:"template.subform-repeatable-template-section",rowsContainer:null};$.fn.subformRepeatable=function(options){return
this.each(function(){var
options=options||{},data=$(this).data();if(data.subformRepeatable){return}for(var
p in data){if(data.hasOwnProperty(p)){options[p]=data[p]}}var inst=new
$.subformRepeatable(this,options);$(this).data("subformRepeatable",inst)})};$(function($){initSubform();$(document).on("subform-row-add",initSubform);function
initSubform(event,container){$(container||document).find("div.subform-repeatable").subformRepeatable()}})})(jQuery);
PK`n�[j��.D	D	js/switcher-uncompressed.jsnu�[���/**
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license     GNU General Public License version 2 or later; see
LICENSE.txt
 */

/**
 * Switcher behavior
 *
 * @package     Joomla
 * @since       1.5
 */
var JSwitcher = function(toggler, element, _options) {
    var $, $togglers, $elements, current, options = {
        onShow : function() {
        },
        onHide : function() {
        },
        cookieName : 'switcher',
        togglerSelector : 'a',
        elementSelector : 'div.tab',
        elementPrefix : 'page-'
    },

    initialize = function(toggler, element, _options) {
        $ = jQuery.noConflict();
        $.extend(options, _options);

        $togglers = $(toggler).find(options.togglerSelector);
        $elements = $(element).find(options.elementSelector);

        if (($togglers.length === 0) || ($togglers.length !==
$elements.length)) {
            return;
        }

        hideAll();

        $togglers.each(function() {
            $(this).on('click', function() {
                display($(this).attr('id'));
            });
        })

        var first = document.location.hash.substring(1);
        if (first) {
            display(first);
        } else if ($togglers.length) {
            display($togglers.first().attr('id'));
        }
    },

    display = function(togglerId) {
        var $toggler = $('#' + togglerId), $element =
$('#' + options.elementPrefix + togglerId);

        if ($toggler.length === 0 || $element.length === 0 || togglerId ===
current) {
            return this;
        }

        if (current) {
            hide($('#' + options.elementPrefix + current));
            $('#' + current).removeClass('active');
        }

        show($element);
        $toggler.addClass('active');
        current = togglerId;
        document.location.hash = current;
        $(window).scrollTop(0);
    },

    hide = function(element) {
        options.onShow(element);
        $(element).hide();
    },

    hideAll = function() {
        $elements.hide();
        $togglers.removeClass('active');
    },

    show = function(element) {
        options.onHide(element);
        $(element).show();
    };

    initialize(toggler, element, _options);

    return{
        display: display,
        hide: hide,
        hideAll: hideAll,
        show: show
    };
};
PK`n�[�����js/switcher.jsnu�[���/*        GNU
General Public License version 2 or later; see LICENSE.txt*/var
JSwitcher=function(f,c,l){var
b,k,i,g,m={onShow:function(){},onHide:function(){},cookieName:"switcher",togglerSelector:"a",elementSelector:"div.tab",elementPrefix:"page-"},a=function(p,o,n){b=jQuery.noConflict();b.extend(m,n);k=b(p).find(m.togglerSelector);i=b(o).find(m.elementSelector);if((k.length===0)||(k.length!==i.length)){return}d();k.each(function(){b(this).on("click",function(){h(b(this).attr("id"))})});var
q=document.location.hash.substring(1);if(q){h(q)}else{if(k.length){h(k.first().attr("id"))}}},h=function(o){var
p=b("#"+o),n=b("#"+m.elementPrefix+o);if(p.length===0||n.length===0||o===g){return
this}if(g){e(b("#"+m.elementPrefix+g));b("#"+g).removeClass("active")}j(n);p.addClass("active");g=o;document.location.hash=g;b(window).scrollTop(0)},e=function(n){m.onShow(n);b(n).hide()},d=function(){i.hide();k.removeClass("active")},j=function(n){m.onHide(n);b(n).show()};a(f,c,l);return{display:h,hide:e,hideAll:d,show:j}};PK`n�[m؞1S#S#js/tabs-state-uncompressed.jsnu�[���/**
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license     GNU General Public License version 2 or later; see
LICENSE.txt
 */

/**
 * JavaScript behavior to allow selected tab to be remained after save or
page reload
 * keeping state in sessionStorage with better handling of multiple tab
widgets per page
 * and not saving the state if there is no id in the url (like on the
CREATE page of content)
 */

jQuery(function ($) {

    // Ensure in IE8 we can use xpath
    if (typeof wgxpath.install === "function") {
        wgxpath.install();
    }

    /**
     * Tiny jQuery extension to allow getting of url params
     * @use jQuery.urlParam('param') or
$.urlParam('myRegex|anotherRegex')
     * If no trailing equals sign in name, add one, allows for general
reuse
     */
    $.urlParam = function (name) {
        if (!new RegExp("=$").exec(name)) {
            name = name + '=';
        }
        var results = new RegExp("[\\?&](" + name +
")([^&#]*)").exec(window.location.href);
        return results ? results[1] : null;
    };

    // jQuery extension to get the XPATH of a DOM element
    $.getXpath = function (el) {
        if (typeof el == "string") {
            return document.evaluate(el, document, null, 0, null);
        }
        if (!el || el.nodeType != 1) {
            return "";
        }
        if (el.id) {
            return "//*[@id='" + el.id +
"']";
        }
        var a = [];
        var sames = a.filter.call(el.parentNode.children, function (x) {
            return x.tagName == el.tagName;
        });
        var b = [];
        return $.getXpath(el.parentNode) + "/" +
el.tagName.toLowerCase() + (sames.length > 1 ? "[" +
(b.indexOf.call(sames, el) + 1) + "]" : "");
    };

    // jQuery extension to get the DOM element from an XPATH
    $.findXpath = function (exp, ctxt) {
        var item;
        var coll = [];
        var result = document.evaluate(exp, ctxt || document, null, 5,
null);

        while (item = result.iterateNext()) {
            coll.push(item);
        }

        return $(coll);
    };

    var loadTabs = function () {

        /**
         * Remove an item from an array
         */
        function remove_item(activeTabsHrefs, tabCollection) {
            for (var i = 0; i < activeTabsHrefs.length; i++) {
                if (activeTabsHrefs[i].indexOf(tabCollection) > -1) {
                    activeTabsHrefs.splice(i, 1);
                }
            }

            return activeTabsHrefs;
        }

        /**
         * Generate the sessionStorage key we will use
         * This is the URL minus some cleanup
         */
        function getStorageKey() {
            return
window.location.href.toString().split(window.location.host)[1].replace(/&return=[a-zA-Z0-9%]+/,
"").split('#')[0];
        }

        /**
         * Save this tab to the storage in the form of a pseudo keyed array
         */
        function saveActiveTab(event) {

            // Get a new storage key, normally the full url we are on with
some cleanup
            var storageKey = getStorageKey();

            // get this tabs own href
            var href = $(event.target).attr("href");

            // find the collection of tabs this tab belongs to, and
calcuate the unique xpath to it
            var tabCollection =
$.getXpath($(event.target).closest(".nav-tabs").first().get(0));

            // error handling
            if (!tabCollection || typeof href == "undefined") {
                return;
            }

            // Create a dummy keyed array as js doesnt allow keyed arrays
            var storageValue = tabCollection + "|" + href;

            // Get the current array from the storage
            var activeTabsHrefs =
JSON.parse(sessionStorage.getItem(storageKey));

            // If none start a new array
            if (!activeTabsHrefs) {
                var activeTabsHrefs = [];
            } else {
                // Avoid Duplicates in the storage
                remove_item(activeTabsHrefs, tabCollection);
            }

            // Save clicked tab, with relationship to tabCollection to the
array
            activeTabsHrefs.push(storageValue);

            // Store the selected tabs as an array in sessionStorage
            sessionStorage.setItem(storageKey,
JSON.stringify(activeTabsHrefs));
        }

        // Array with active tabs hrefs
        var activeTabsHrefs =
JSON.parse(sessionStorage.getItem(getStorageKey()));

        // jQuery object with all tabs links
        var alltabs = $("a[data-toggle='tab']");

        // When a tab is clicked, save its state!
        alltabs.on("click", function (e) {
            saveActiveTab(e);
        });

        // Clean default tabs
       
alltabs.parent(".active").removeClass("active");

        // If we cannot find a tab storage for this url, see if we are
coming from a save of a new item
        if (!activeTabsHrefs) {
            var unSavedStateUrl =
getStorageKey().replace(/\&id=[0-9]*|[a-z]\&{1}_id=[0-9]*/,
'');
            activeTabsHrefs =
JSON.parse(sessionStorage.getItem(unSavedStateUrl));
            sessionStorage.removeItem(unSavedStateUrl);
        }

        // we have some tab states to restore, if we see a hash then let
that trump the saved state
        if (activeTabsHrefs !== null && !window.location.hash) {

            // When moving from tab area to a different view
            $.each(activeTabsHrefs, function (index, tabFakexPath) {

                // Click the tab
                var parts = tabFakexPath.split("|");
               
$.findXpath(parts[0]).find("a[data-toggle='tab'][href='"
+ parts[1] + "']").click();

            });

        } else { // clean slate start

            // a list of tabs to click
            var tabsToClick = [];

            // If we are passing a hash then this trumps everything
            if (window.location.hash) {

                // for each set of tabs on the page
                alltabs.parents("ul").each(function (index, ul) {

                    // If no tabs is saved, activate first tab from each
tab set and save it
                    var tabToClick = $(ul).find("a[href='" +
window.location.hash + "']");

                    // If we found some|one
                    if (tabToClick.length) {

                        // if we managed to locate its selector directly
                        if (tabToClick.selector) {

                            // highlight tab of the tabs if the hash
matches
                            tabsToClick.push(tabToClick);
                        } else {

                            // highlight first tab of the tabs
                            tabsToClick.push(tabToClick.first());
                        }

                        var parentPane =
tabToClick.closest('.tab-pane');

                        // bubble up for nested tabs (like permissions tabs
in the permissions pane)
                        if (parentPane) {
                            var id = parentPane.attr('id');
                            if (id) {
                                var parentTabToClick =
$(parentPane).find("a[href='#" + id + "']");
                                if (parentTabToClick) {
                                    tabsToClick.push(parentTabToClick);
                                }
                            }
                        }
                    }

                    // cleanup for another loop
                    parentTabToClick = null;
                    tabToClick = null;
                    parentPane = null;
                    id = null;
                });

                // run in the right order bubbling up
                tabsToClick.reverse();

                // for all queued tabs
                for (var i = 0; i < tabsToClick.length; i++) {

                    // click the tabs, thus storing them
                    jQuery(tabsToClick[i].selector).click();
                }

                // Remove the #hash in the url - with support for older
browsers with no flicker
                var scrollV, scrollH, loc = window.location;
                if ("pushState" in history)
                    history.pushState("", document.title,
loc.pathname + loc.search);
                else {
                    // Prevent scrolling by storing the page's current
scroll offset
                    scrollV = document.body.scrollTop;
                    scrollH = document.body.scrollLeft;
                    loc.hash = "";
                    // Restore the scroll offset, should be flicker free
                    document.body.scrollTop = scrollV;
                    document.body.scrollLeft = scrollH;
                }

            } else {
                alltabs.parents("ul").each(function (index, ul) {
                    // If no tabs is saved, activate first tab from each
tab set and save it
                    $(ul).find("a").first().click();
                });
            }
        }
    };

    setTimeout(loadTabs, 100);
});
PK`n�[µշ

js/tabs-state.jsnu�[���jQuery(function($){if(typeof
wgxpath.install==="function"){wgxpath.install()}$.urlParam=function(a){if(!new
RegExp("=$").exec(a)){a=a+'='}var b=new
RegExp("[\\?&]("+a+")([^&#]*)").exec(window.location.href);return
b?b[1]:null};$.getXpath=function(c){if(typeof c=="string"){return
document.evaluate(c,document,null,0,null)}if(!c||c.nodeType!=1){return""}if(c.id){return"//*[@id='"+c.id+"']"}var
a=[];var d=a.filter.call(c.parentNode.children,function(x){return
x.tagName==c.tagName});var b=[];return
$.getXpath(c.parentNode)+"/"+c.tagName.toLowerCase()+(d.length>1?"["+(b.indexOf.call(d,c)+1)+"]":"")};$.findXpath=function(a,b){var
c;var d=[];var
e=document.evaluate(a,b||document,null,5,null);while(c=e.iterateNext()){d.push(c)}return
$(d)};var m=function(){function remove_item(a,b){for(var
i=0;i<a.length;i++){if(a[i].indexOf(b)>-1){a.splice(i,1)}}return
a}function getStorageKey(){return
window.location.href.toString().split(window.location.host)[1].replace(/&return=[a-zA-Z0-9%]+/,"").split('#')[0]}function
saveActiveTab(a){var b=getStorageKey();var
c=$(a.target).attr("href");var
d=$.getXpath($(a.target).closest(".nav-tabs").first().get(0));if(!d||typeof
c=="undefined"){return}var e=d+"|"+c;var
f=JSON.parse(sessionStorage.getItem(b));if(!f){var
f=[]}else{remove_item(f,d)}f.push(e);sessionStorage.setItem(b,JSON.stringify(f))}var
g=JSON.parse(sessionStorage.getItem(getStorageKey()));var
h=$("a[data-toggle='tab']");h.on("click",function(e){saveActiveTab(e)});h.parent(".active").removeClass("active");if(!g){var
j=getStorageKey().replace(/\&id=[0-9]*|[a-z]\&{1}_id=[0-9]*/,'');g=JSON.parse(sessionStorage.getItem(j));sessionStorage.removeItem(j)}if(g!==null&&!window.location.hash){$.each(g,function(a,b){var
c=b.split("|");$.findXpath(c[0]).find("a[data-toggle='tab'][href='"+c[1]+"']").click()})}else{var
k=[];if(window.location.hash){h.parents("ul").each(function(a,b){var
c=$(b).find("a[href='"+window.location.hash+"']");if(c.length){if(c.selector){k.push(c)}else{k.push(c.first())}var
d=c.closest('.tab-pane');if(d){var
e=d.attr('id');if(e){var
f=$(d).find("a[href='#"+e+"']");if(f){k.push(f)}}}}f=null;c=null;d=null;e=null});k.reverse();for(var
i=0;i<k.length;i++){jQuery(k[i].selector).click()}var
l,scrollH,loc=window.location;if("pushState"in
history)history.pushState("",document.title,loc.pathname+loc.search);else{l=document.body.scrollTop;scrollH=document.body.scrollLeft;loc.hash="";document.body.scrollTop=l;document.body.scrollLeft=scrollH}}else{h.parents("ul").each(function(a,b){$(b).find("a").first().click()})}}};setTimeout(m,100)});PK`n�[楁�	�	
js/tabs.jsnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

Object.append(Browser.Features, {
	localstorage: (function() {
		return ('localStorage' in window) &&
window.localStorage !== null;
	})()
});

/**
 * Tabs behavior
 *
 * @package		Joomla!
 * @subpackage	JavaScript
 * @since		1.5
 */
var JTabs = new Class({
	Implements: [Options, Events],

	options : {
		display: 0,
		useStorage: true,
		onActive: function(title, description) {
			description.setStyle('display', 'block');
			title.addClass('open').removeClass('closed');
		},
		onBackground: function(title, description){
			description.setStyle('display', 'none');
			title.addClass('closed').removeClass('open');
		},
		titleSelector: 'dt',
		descriptionSelector: 'dd'
	},

	initialize: function(dlist, options){
		this.setOptions(options);
		this.dlist = document.id(dlist);
		this.titles = this.dlist.getChildren(this.options.titleSelector);
		this.descriptions =
this.dlist.getChildren(this.options.descriptionSelector);
		this.content = new Element('div').inject(this.dlist,
'after').addClass('current');
		this.storageName = 'jpanetabs_'+this.dlist.id;

		if (this.options.useStorage) {
			if (Browser.Features.localstorage) {
				this.options.display = this.options.display ||
localStorage[this.storageName];
			} else {
				this.options.display = this.options.display ||
Cookie.read(this.storageName);
			}
		}
		if (this.options.display === null || this.options.display === undefined)
{
			this.options.display = 0;
		}
		this.options.display = this.options.display.toInt().limit(0,
this.titles.length-1);

		for (var i = 0, l = this.titles.length; i < l; i++)
		{
			var title = this.titles[i];
			var description = this.descriptions[i];
			title.setStyle('cursor', 'pointer');
			title.addEvent('click', this.display.bind(this, i));
			description.inject(this.content);
		}

		this.display(this.options.display);

		if (this.options.initialize) this.options.initialize.call(this);
	},

	hideAllBut: function(but) {
		for (var i = 0, l = this.titles.length; i < l; i++)
		{
			if (i != but) this.fireEvent('onBackground', [this.titles[i],
this.descriptions[i]]);
		}
	},

	display: function(i) {
		this.hideAllBut(i);
		this.fireEvent('onActive', [this.titles[i],
this.descriptions[i]]);
		if (this.options.useStorage) {
			if (Browser.Features.localstorage) {
				localStorage[this.storageName] = i;
			} else {
				Cookie.write(this.storageName, i);
			}
		}
	}
});
PK`n�[��CXssjs/validate-uncompressed.jsnu�[���/**
 * @copyright	Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * Unobtrusive Form Validation library
 *
 * Inspired by: Chris Campbell <www.particletree.com>
 *
 * @since  1.5
 */
var JFormValidator = function() {
	"use strict";
	var handlers, inputEmail, custom,

 	setHandler = function(name, fn, en) {
 	 	en = (en === '') ? true : en;
 	 	handlers[name] = {
 	 	 	enabled : en,
 	 	 	exec : fn
 	 	};
 	},

 	findLabel = function(id, form){
 	 	var $label, $form = jQuery(form);
 	 	if (!id) {
 	 	 	return false;
 	 	}
 	 	$label = $form.find('#' + id + '-lbl');
 	 	if ($label.length) {
 	 	 	return $label;
 	 	}
 	 	$label = $form.find('label[for="' + id +
'"]');
 	 	if ($label.length) {
 	 	 	return $label;
 	 	}
 	 	return false;
 	},

 	handleResponse = function(state, $el) {
 		// Get a label
 	 	var $label = $el.data('label');
 	 	if ($label === undefined) {
 	 		$label = findLabel($el.attr('id'), $el.get(0).form);
 	 		$el.data('label', $label);
 	 	}

 	 	// Set the element and its label (if exists) invalid state
 	 	if (state === false) {
 	 	 	$el.addClass('invalid').attr('aria-invalid',
'true');
 	 	 	if ($label) {
 	 	 	 	$label.addClass('invalid');
 	 	 	}
 	 	} else {
 	 	 	$el.removeClass('invalid').attr('aria-invalid',
'false');
 	 	 	if ($label) {
 	 	 	 	$label.removeClass('invalid');
 	 	 	}
 	 	}
 	},

 	validate = function(el) {
 	 	var $el = jQuery(el), tagName, handler;
 	 	// Ignore the element if its currently disabled, because are not
submitted for the http-request. For those case return always true.
 	 	if ($el.attr('disabled')) {
 	 	 	handleResponse(true, $el);
 	 	 	return true;
 	 	}
 	 	// If the field is required make sure it has a value
 	 	if ($el.attr('required') ||
$el.hasClass('required')) {
 	 	 	tagName = $el.prop("tagName").toLowerCase();
 	 	 	if (tagName === 'fieldset' &&
($el.hasClass('radio') || $el.hasClass('checkboxes')))
{
 	 	 	 	if (!$el.find('input:checked').length){
 	 	 	 	 	handleResponse(false, $el);
 	 	 	 	 	return false;
 	 	 	 	}
 	 	 	//If element has class placeholder that means it is empty.
 	 	 	} else if (!$el.val() || $el.hasClass('placeholder') ||
($el.attr('type') === 'checkbox' &&
!$el.is(':checked'))) {
 	 	 	 	handleResponse(false, $el);
 	 	 	 	return false;
 	 	 	}
 	 	}
 	 	// Only validate the field if the validate class is set
 	 	handler = ($el.attr('class') &&
$el.attr('class').match(/validate-([a-zA-Z0-9\_\-]+)/)) ?
$el.attr('class').match(/validate-([a-zA-Z0-9\_\-]+)/)[1] :
"";

		// Try HTML5 pattern first then the handlers
	    if ($el.attr('pattern') &&
$el.attr('pattern') != '') {
		if ($el.val().length) {
			var isValid = new
RegExp('^'+$el.attr('pattern')+'$').test($el.val());
			handleResponse(isValid, $el);
			return isValid;
		}
		if ($el.attr('required') || $el.hasClass('required'))
{
			handleResponse(false, $el);
			return false;
		}
		handleResponse(true, $el);
		return true;
	    } else {
		    if (handler === '') {
			    handleResponse(true, $el);
			    return true;
		    }
		    // Check the additional validation types
		    if ((handler) && (handler !== 'none') &&
(handlers[handler]) && $el.val()) {
			    // Execute the validation handler and return result
			    if (handlers[handler].exec($el.val(), $el) !== true) {
				    handleResponse(false, $el);
				    return false;
			    }
		    }
		    // Return validation state
		    handleResponse(true, $el);
		    return true;
	    }
 	},

 	isValid = function(form) {
 		var fields, valid = true, message, error, label, invalid = [], i, l;

 		// Validate form fields
 		fields = jQuery(form).find('input, textarea, select,
fieldset');
 	 	for (i = 0, l = fields.length; i < l; i++) {
 	 		// Ignore Rule/Filters/Assigned field for spead up validation
 	 		// And other fields that has class="novalidate"
 	 		if(jQuery(fields[i]).hasClass('novalidate')) {
 	 			continue;
 	 		}
 	 	 	if (validate(fields[i]) === false) {
 	 	 	 	valid = false;
 	 	 	 	invalid.push(fields[i]);
 	 	 	}
 	 	}

 	 	// Run custom form validators if present
 	 	jQuery.each(custom, function(key, validator) {
 	 	 	if (validator.exec() !== true) {
 	 	 	 	valid = false;
 	 	 	}
 	 	});

 	 	if (!valid && invalid.length > 0) {
 	 	 	message = Joomla.JText._('JLIB_FORM_FIELD_INVALID');
 	 	 	error = {"error": []};
 	 	 	for (i = invalid.length - 1; i >= 0; i--) {
 	 	 		label = jQuery(invalid[i]).data("label");
 	 			if (label) {
 	 	 			error.error.push(message + label.text().replace("*",
""));
                		}
 	 	 	}
 	 	 	Joomla.renderMessages(error);
 	 	}
 	 	return valid;
 	},

 	attachToForm = function(form) {
 	 	var inputFields = [], elements,
 	 		$form = jQuery(form);
 	 	// Iterate through the form object and attach the validate method to
all input fields.
 	 	elements = $form.find('input, textarea, select, fieldset,
button');
 	 	for (var i = 0, l = elements.length; i < l; i++) {
 	 	 	var $el = jQuery(elements[i]), tagName =
$el.prop("tagName").toLowerCase();
 	 	 	// Attach isValid method to submit button
 	 	 	if ((tagName === 'input' || tagName === 'button')
&& ($el.attr('type') === 'submit' ||
$el.attr('type') === 'image')) {
 	 	 	 	if ($el.hasClass('validate')) {
 	 	 	 	 	$el.on('click', function() {
 	 	 	 	 	 	return isValid(form);
 	 	 	 	 	});
 	 	 	 	}
 	 	 	}
 	 	 	// Attach validate method only to fields
 	 	 	else if (tagName !== 'button' && !(tagName ===
'input' && $el.attr('type') ===
'button')) {
 	 	 	 	if ($el.hasClass('required')) {
 	 	 	 	 	$el.attr('aria-required',
'true').attr('required', 'required');
 	 	 	 	}
 	 	 	 	if (tagName !== 'fieldset') {
 	 	 	 	 	$el.on('blur', function() {
 	 	 	 	 	 	return validate(this);
 	 	 	 	 	});
 	 	 	 	 	if ($el.hasClass('validate-email') &&
inputEmail) {
 	 	 	 	 		elements[i].setAttribute('type', 'email');
 	 	 	 	 	}
 	 	 	 	}
 	 	 	 	inputFields.push($el);
 	 	 	}
 	 	}
 	 	$form.data('inputfields', inputFields);
 	},

 	initialize = function() {
 	 	handlers = {};
 	 	custom = custom || {};

 	 	inputEmail = (function() {
 	 	 	var input = document.createElement("input");
 	 	 	input.setAttribute("type", "email");
 	 	 	return input.type !== "text";
 	 	})();
 	 	// Default handlers
 	 	setHandler('username', function(value, element) {
 	 	 	var regex = new
RegExp("[\<|\>|\"|\'|\%|\;|\(|\)|\&]",
"i");
 	 	 	return !regex.test(value);
 	 	});
 	 	setHandler('password', function(value, element) {
 	 	 	var regex = /^\S[\S ]{2,98}\S$/;
 	 	 	return regex.test(value);
 	 	});
 	 	setHandler('numeric', function(value, element) {
 	 		var regex = /^(\d|-)?(\d|,)*\.?\d*$/;
 	 	 	return regex.test(value);
 	 	});
 	 	setHandler('email', function(value, element) {
		    value = punycode.toASCII(value);
 	 	 	var regex =
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
 	 	 	return regex.test(value);
 	 	});
 	 	// Attach to forms with class 'form-validate'
 	 	var forms = jQuery('form.form-validate');
 	 	for (var i = 0, l = forms.length; i < l; i++) {
 	 	 	attachToForm(forms[i]);
 	 	}
 	};

 	// Initialize handlers and attach validation to form
 	initialize();

 	return {
 	 	isValid : isValid,
 	 	validate : validate,
 	 	setHandler : setHandler,
 	 	attachToForm : attachToForm,
 	 	custom: custom
 	};
};

document.formvalidator = null;
jQuery(function() {
	document.formvalidator = new JFormValidator();
});
PK`n�[H�9J??js/validate.jsnu�[���var
JFormValidator=function(){"use strict";function
n(t,e,a){a=""===a||a,s[t]={enabled:a,exec:e}}function i(t,e){var
a,r,n,i,l=e.data("label");void
0===l&&(a=e.attr("id"),r=e.get(0).form,i=jQuery(r),l=!!a&&((n=i.find("#"+a+"-lbl")).length?n:!!(n=i.find('label[for="'+a+'"]')).length&&n),e.data("label",l)),!1===t?(e.addClass("invalid").attr("aria-invalid","true"),l&&l.addClass("invalid")):(e.removeClass("invalid").attr("aria-invalid","false"),l&&l.removeClass("invalid"))}function
o(t){var e,a=jQuery(t);if(a.attr("disabled"))return
i(!0,a),!0;if(a.attr("required")||a.hasClass("required"))if("fieldset"===a.prop("tagName").toLowerCase()&&(a.hasClass("radio")||a.hasClass("checkboxes"))){if(!a.find("input:checked").length)return
i(!1,a),!1}else
if(!a.val()||a.hasClass("placeholder")||"checkbox"===a.attr("type")&&!a.is(":checked"))return
i(!1,a),!1;if(e=a.attr("class")&&a.attr("class").match(/validate-([a-zA-Z0-9\_\-]+)/)?a.attr("class").match(/validate-([a-zA-Z0-9\_\-]+)/)[1]:"",a.attr("pattern")&&""!=a.attr("pattern")){if(a.val().length){var
r=new
RegExp("^"+a.attr("pattern")+"$").test(a.val());return
i(r,a),r}return
a.attr("required")||a.hasClass("required")?(i(!1,a),!1):(i(!0,a),!0)}return""===e?(i(!0,a),!0):e&&"none"!==e&&s[e]&&a.val()&&!0!==s[e].exec(a.val(),a)?(i(!1,a),!1):(i(!0,a),!0)}function
u(t){var e,a,r,n,i,l,s=!0,u=[];for(i=0,l=(e=jQuery(t).find("input,
textarea, select,
fieldset")).length;i<l;i++)jQuery(e[i]).hasClass("novalidate")||!1===o(e[i])&&(s=!1,u.push(e[i]));if(jQuery.each(c,function(t,e){!0!==e.exec()&&(s=!1)}),!s&&0<u.length){for(a=Joomla.JText._("JLIB_FORM_FIELD_INVALID"),r={error:[]},i=u.length-1;0<=i;i--)(n=jQuery(u[i]).data("label"))&&r.error.push(a+n.text().replace("*",""));Joomla.renderMessages(r)}return
s}function l(t){for(var e,a=[],r=jQuery(t),n=0,i=(e=r.find("input,
textarea, select, fieldset, button")).length;n<i;n++){var
l=jQuery(e[n]),s=l.prop("tagName").toLowerCase();"input"!==s&&"button"!==s||"submit"!==l.attr("type")&&"image"!==l.attr("type")?"button"===s||"input"===s&&"button"===l.attr("type")||(l.hasClass("required")&&l.attr("aria-required","true").attr("required","required"),"fieldset"!==s&&(l.on("blur",function(){return
o(this)}),l.hasClass("validate-email")&&d&&e[n].setAttribute("type","email")),a.push(l)):l.hasClass("validate")&&l.on("click",function(){return
u(t)})}r.data("inputfields",a)}var s,d,c;return function(){var
t;s={},c=c||{},(t=document.createElement("input")).setAttribute("type","email"),d="text"!==t.type,n("username",function(t,e){return!new
RegExp("[<|>|\"|'|%|;|(|)|&]","i").test(t)}),n("password",function(t,e){return/^\S[\S
]{2,98}\S$/.test(t)}),n("numeric",function(t,e){return/^(\d|-)?(\d|,)*\.?\d*$/.test(t)}),n("email",function(t,e){t=punycode.toASCII(t);return/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(t)});for(var
e=jQuery("form.form-validate"),a=0,r=e.length;a<r;a++)l(e[a])}(),{isValid:u,validate:o,setHandler:n,attachToForm:l,custom:c}};document.formvalidator=null,jQuery(function(){document.formvalidator=new
JFormValidator});
PKRn�[9�f^��css/adminlist.cssnu�[���PKRn�[̇�;;css/calendar-jos.cssnu�[���PKRn�[XI����!css/fields/calendar-rtl.cssnu�[���PKRn�[q>�I���2css/fields/calendar.cssnu�[���PKRn�[�M��Ccss/frontediting.cssnu�[���PKRn�[|�$���Ecss/jquery.Jcrop.min.cssnu�[���PKRn�[_V�M��
�Zcss/modal.cssnu�[���PKRn�[������fcss/mootree.cssnu�[���PKRn�[6&���	icss/mootree_rtl.cssnu�[���PKRn�[au�
��jcss/system.cssnu�[���PKRn�[�k\kk�oimages/arrow.pngnu�[���PKRn�[vK�[[�pimages/arrow_rtl.pngnu�[���PKRn�[C�t2[[Eqimages/blank.pngnu�[���PKRn�[s)X:PP�qimages/calendar.pngnu�[���PKRn�[Wdt���stimages/checked_out.pngnu�[���PKRn�[����?vimages/edit.pngnu�[���PKTn�[��&ximages/edit_unpublished.pngnu�[���PKUn�[�;��zimages/emailButton.pngnu�[���PKUn�[^p�����{images/icon-16-logout.pngnu�[���PKUn�[�ߤ�99�}images/icon_error.gifnu�[���PKUn�[e�QYY;images/indent.pngnu�[���PKUn�[lh��__�images/indent1.pngnu�[���PKUn�[�h��__v�images/indent2.pngnu�[���PKUn�[x�ԙaa�images/indent3.pngnu�[���PKUn�[�x[[��images/indent4.pngnu�[���PKUn�[�x[[W�images/indent5.pngnu�[���PKUn�[E�ib���images/livemarks-rtl.pngnu�[���PKUn�[�G$����images/livemarks.pngnu�[���PKUn�[VA�\\��images/modal/bg_e.pngnu�[���PKUn�[Hg�%aa&�images/modal/bg_n.pngnu�[���PKUn�[�-vTT̉images/modal/bg_ne.pngnu�[���PKUn�[_��GGf�images/modal/bg_nw.pngnu�[���PKUn�[r���``�images/modal/bg_s.pngnu�[���PKUn�[W��PP��images/modal/bg_se.pngnu�[���PKUn�[@iU...�images/modal/bg_sw.pngnu�[���PKUn�[�{�WW��images/modal/bg_w.pngnu�[���PKUn�[��8>�images/modal/closebox.pngnu�[���PKUn�[���!!��images/modal/spinner.gifnu�[���PKUn�[2Gs%%
�images/mooRainbow/blank.gifnu�[���PKUn�[�+��\\!z�images/mooRainbow/moor_arrows.gifnu�[���PKUn�[�[rCC#'�images/mooRainbow/moor_boverlay.pngnu�[���PKUn�[�zg�PP!��images/mooRainbow/moor_cursor.gifnu�[���PKUn�[L�����!^�images/mooRainbow/moor_slider.pngnu�[���PKVn�[��.���#P�images/mooRainbow/moor_woverlay.pngnu�[���PKXn�[��n4����images/mootree.gifnu�[���PKXn�[9��

��images/mootree_loader.gifnu�[���PKXn�[ч��!�images/new.pngnu�[���PKXn�[�Y�^^u�images/notice-alert.pngnu�[���PKXn�[�g�j���images/notice-download.pngnu�[���PKXn�[�|sFRR*�images/notice-info.pngnu�[���PKXn�[iA�/¹images/notice-note.pngnu�[���PKXn�[�+g_QQ�images/no_indent.pngnu�[���PKXn�[���?����images/pdf_button.pngnu�[���PKXn�[#
����g�images/printButton.pngnu�[���PKXn�[;����images/rating_star.pngnu�[���PKXn�[����images/rating_star_blank.pngnu�[���PKXn�[�8�t����images/sort0.pngnu�[���PKXn�[Q�Kՠ���images/sort1.pngnu�[���PKXn�[��mm��images/sort_asc.pngnu�[���PKXn�[�uhh@�images/sort_desc.pngnu�[���PKXn�[F��gg��images/sort_none.pngnu�[���PKXn�[AW�d����images/tooltip.pngnu�[���PKXn�[�����images/weblink.pngnu�[���PKXn�[L��]]$��js/associations-edit-uncompressed.jsnu�[���PKXn�[%nhGG��js/associations-edit.jsnu�[���PKXn�[
��##!<�js/calendar-setup-uncompressed.jsnu�[���PKXn�[���js/calendar-setup.jsnu�[���PKXn�[1����
js/calendar-uncompressed.jsnu�[���PKXn�[Q
�vvG�js/calendar.jsnu�[���PKYn�[�
��>>�Wjs/caption-uncompressed.jsnu�[���PKYn�[����
]js/caption.jsnu�[���PKZn�[�82��9_js/color-field-adv-init.jsnu�[���PKZn�[u����bjs/color-field-adv-init.min.jsnu�[���PKZn�[`�^
���cjs/color-field-init.jsnu�[���PKZn�[�c8���	ejs/color-field-init.min.jsnu�[���PKZn�[h}�*��	fjs/combobox-uncompressed.jsnu�[���PKZn�[�heM�
�
�js/combobox.jsnu�[���PKZn�[�V�mm)�js/core-uncompressed.jsnu�[���PKZn�[���#h"h"
��js/core.jsnu�[���PKZn�[}��nn
,js/fields/calendar-locales/af.jsnu�[���PKZn�[��A���
�!js/fields/calendar-locales/ar.jsnu�[���PKZn�[X��22
.&js/fields/calendar-locales/bg.jsnu�[���PKZn�[���
�)js/fields/calendar-locales/bn.jsnu�[���PKZn�[I���ss
/js/fields/calendar-locales/bs.jsnu�[���PKZn�[Znijj
�1js/fields/calendar-locales/ca.jsnu�[���PKZn�[��>-}}
�4js/fields/calendar-locales/cs.jsnu�[���PKZn�[�D�^��
]7js/fields/calendar-locales/cy.jsnu�[���PKZn�[w��jj
7:js/fields/calendar-locales/da.jsnu�[���PKZn�[���448�<js/fields/calendar-locales/date/gregorian/date-helper.jsnu�[���PKZn�[��|�<]qjs/fields/calendar-locales/date/gregorian/date-helper.min.jsnu�[���PKZn�[��5N5N5�js/fields/calendar-locales/date/jalali/date-helper.jsnu�[���PKZn�[�Yf$f$9�js/fields/calendar-locales/date/jalali/date-helper.min.jsnu�[���PKZn�[H�zz
N�js/fields/calendar-locales/de.jsnu�[���PKZn�[���(��
�js/fields/calendar-locales/el.jsnu�[���PKZn�[�%�
nn
��js/fields/calendar-locales/en.jsnu�[���PKZn�[[*:�ll
�js/fields/calendar-locales/es.jsnu�[���PKZn�[�R�S��
ojs/fields/calendar-locales/eu.jsnu�[���PKZn�[|I�TT#Ojs/fields/calendar-locales/fa-ir.jsnu�[���PKZn�[���6��
�
js/fields/calendar-locales/fi.jsnu�[���PKZn�[��Z
�
js/fields/calendar-locales/fr.jsnu�[���PK[n�[~��
�js/fields/calendar-locales/ga.jsnu�[���PK[n�[��d��
�js/fields/calendar-locales/hr.jsnu�[���PK[n�[b/��
�js/fields/calendar-locales/hu.jsnu�[���PK[n�[kn�}}
�js/fields/calendar-locales/it.jsnu�[���PK[n�[����
Pjs/fields/calendar-locales/ja.jsnu�[���PK[n�[e��PP
/js/fields/calendar-locales/ka.jsnu�[���PK[n�[���FF
�#js/fields/calendar-locales/kk.jsnu�[���PK\n�[�Sq���
e'js/fields/calendar-locales/ko.jsnu�[���PK\n�[|�|��
<*js/fields/calendar-locales/lt.jsnu�[���PK\n�[R9lr<<
<-js/fields/calendar-locales/mk.jsnu�[���PK\n�[-<��nn
�0js/fields/calendar-locales/nb.jsnu�[���PK\n�[��#�vv
�3js/fields/calendar-locales/nl.jsnu�[���PK\n�[Q�"5��
L6js/fields/calendar-locales/pl.jsnu�[���PK\n�[|I�TT$39js/fields/calendar-locales/prs-af.jsnu�[���PK\n�[6CE���
�<js/fields/calendar-locales/pt.jsnu�[���PK\n�[I`'�;;
�?js/fields/calendar-locales/ru.jsnu�[���PK\n�[칌�
CCjs/fields/calendar-locales/sk.jsnu�[���PK\n�[��Hnn
Fjs/fields/calendar-locales/sl.jsnu�[���PK\n�[�N!�44#�Hjs/fields/calendar-locales/sr-rs.jsnu�[���PK\n�[k>��rr#dLjs/fields/calendar-locales/sr-yu.jsnu�[���PK\n�[�p�\ll
)Ojs/fields/calendar-locales/sv.jsnu�[���PK\n�[��6�ss
�Qjs/fields/calendar-locales/sw.jsnu�[���PK\n�[�Ʊ��
�Tjs/fields/calendar-locales/ta.jsnu�[���PK\n�[�=����
�Xjs/fields/calendar-locales/th.jsnu�[���PK\n�[��Vrmm
2]js/fields/calendar-locales/uk.jsnu�[���PK\n�[z2���#�`js/fields/calendar-locales/zh-CN.jsnu�[���PK\n�[f�=�bb#�cjs/fields/calendar-locales/zh-TW.jsnu�[���PK\n�[���5�5��fjs/fields/calendar.jsnu�[���PK\n�[.��ccjs/fields/calendar.min.jsnu�[���PK\n�[��TTtrjs/frontediting-uncompressed.jsnu�[���PK\n�[;�%��
�
�js/frontediting.jsnu�[���PK\n�[|�++�js/helpsite.jsnu�[���PK\n�[a}����js/highlighter-uncompressed.jsnu�[���PK\n�[�G�44T�js/highlighter.jsnu�[���PK\n�[O/n?5?5
ɯjs/html5fallback-uncompressed.jsnu�[���PK\n�[;s��66X�js/html5fallback.jsnu�[���PK\n�[��&�'�'�js/jquery.Jcrop.jsnu�[���PK\n�[�	����$js/jquery.Jcrop.min.jsnu�[���PK\n�[���j��Ⱥjs/keepalive-uncompressed.jsnu�[���PK\n�[������js/keepalive.jsnu�[���PK\n�[a����js/modal-fields-uncompressed.jsnu�[���PK]n�[��`����js/modal-fields.jsnu�[���PK]n�[�,�4�4��js/modal-uncompressed.jsnu�[���PK]n�[_���'�'�js/modal.jsnu�[���PK]n�[V�A9��UAjs/moduleorder.jsnu�[���PK]n�[7�
MM
pJjs/mootools-core-uncompressed.jsnu�[���PK]n�[��=��G�Gܗ
js/mootools-core.jsnu�[���PK]n�['�/��R�R
��js/mootools-more-uncompressed.jsnu�[���PK]n�[�[����2js/mootools-more.jsnu�[���PK`n�['k���U�U?�js/mootree-uncompressed.jsnu�[���PK`n�[q4x��
&js/mootree.jsnu�[���PK`n�[�-�PP,>js/multiselect-uncompressed.jsnu�[���PK`n�[������Cjs/multiselect.jsnu�[���PK`n�[���H		�Ejs/passwordstrength.jsnu�[���PK`n�[U�k�
�
Ojs/permissions-uncompressed.jsnu�[���PK`n�[��Ȣii]js/permissions.jsnu�[���PK`n�[%-_*_*%�djs/polyfill.classlist-uncompressed.jsnu�[���PK`n�[��g��j�js/polyfill.classlist.jsnu�[���PK`n�[X�Ap4p4!��js/polyfill.event-uncompressed.jsnu�[���PK`n�[KQ��FFi�js/polyfill.event.jsnu�[���PK`n�[��X�~~"��js/polyfill.filter-uncompressed.jsnu�[���PK`n�[	���

�js/polyfill.filter.jsnu�[���PK`n�[�S�DD�js/polyfill.map-uncompressed.jsnu�[���PK`n�[_�>B����js/polyfill.map.jsnu�[���PK`n�[}h[&EuEu!�js/polyfill.xpath-uncompressed.jsnu�[���PK`n�[�a�+ss}tjs/polyfill.xpath.jsnu�[���PK`n�[nC�e��js/progressbar-uncompressed.jsnu�[���PK`n�[5N`$WW3�js/progressbar.jsnu�[���PK`n�[^5��d9d9�js/punycode-uncompressed.jsnu�[���PK`n�[��3�z1js/punycode.jsnu�[���PK`n�[�t'�C�C�<js/repeatable-uncompressed.jsnu�[���PK`n�[*�����js/repeatable.jsnu�[���PK`n�[�gɚ���js/sendtestmail-uncompressed.jsnu�[���PK`n�[��h��js/sendtestmail.jsnu�[���PK`n�[f@b$�(�(%�js/subform-repeatable-uncompressed.jsnu�[���PK`n�[$���VV��js/subform-repeatable.jsnu�[���PK`n�[j��.D	D	y�js/switcher-uncompressed.jsnu�[���PK`n�[������js/switcher.jsnu�[���PK`n�[m؞1S#S#@�js/tabs-state-uncompressed.jsnu�[���PK`n�[µշ

�js/tabs-state.jsnu�[���PK`n�[楁�	�	
%js/tabs.jsnu�[���PK`n�[��CXssY'js/validate-uncompressed.jsnu�[���PK`n�[H�9J??Ejs/validate.jsnu�[���PK��@�Q