(function(){
var _jQuery = window.jQuery,
_$ = window.$;
var jQuery = window.jQuery = window.$ = function( selector, context ) {
return new jQuery.fn.init( selector, context )};
var quickExpr =/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
isSimple =/^.[^:#\[\.]*$/,
undefined;
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
selector = selector || document;
if ( selector.nodeType ) {
this[0] = selector;
this.length = 1;
return this}
if ( typeof selector == "string" ) {
var match = quickExpr.exec( selector );
if ( match && (match[1] || !context) ) {
if ( match[1] )
selector = jQuery.clean( [ match[1] ], context );
else {
var elem = document.getElementById( match[3] );
if ( elem ){
if ( elem.id != match[3] )
return jQuery().find( selector );
return jQuery( elem )}
selector = []}
} else
return jQuery( context ).find( selector )} else if ( jQuery.isFunction( selector ) )
return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
return this.setArray(jQuery.makeArray(selector))},
jquery: "1.2.6",
size: function() {
return this.length},
length: 0,
get: function( num ) {
return num == undefined ?
jQuery.makeArray( this ) :
this[ num ]},
pushStack: function( elems ) {
var ret = jQuery( elems );
ret.prevObject = this;
return ret},
setArray: function( elems ) {
this.length = 0;
Array.prototype.push.apply( this, elems );
return this},
each: function( callback, args ) {
return jQuery.each( this, callback, args )},
index: function( elem ) {
var ret = -1;
return jQuery.inArray(
elem && elem.jquery ? elem[0] : elem
, this )},
attr: function( name, value, type ) {
var options = name;
if ( name.constructor == String )
if ( value === undefined )
return this[0] && jQuery[ type || "attr" ]( this[0], name );
else {
options = {};
options[ name ] = value}
return this.each(function(i){
for ( name in options )
jQuery.attr(
type ?
this.style :
this,
name, jQuery.prop( this, options[ name ], type, i, name )
)})},
css: function( key, value ) {
if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
value = undefined;
return this.attr( key, value, "curCSS" )},
text: function( text ) {
if ( typeof text != "object" && text != null )
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
var ret = "";
jQuery.each( text || this, function(){
jQuery.each( this.childNodes, function(){
if ( this.nodeType != 8 )
ret += this.nodeType != 1 ?
this.nodeValue :
jQuery.fn.text( [ this ] )})});
return ret},
wrapAll: function( html ) {
if ( this[0] )
jQuery( html, this[0].ownerDocument )
.clone()
.insertBefore( this[0] )
.map(function(){
var elem = this;
while ( elem.firstChild )
elem = elem.firstChild;
return elem})
.append(this);
return this},
wrapInner: function( html ) {
return this.each(function(){
jQuery( this ).contents().wrapAll( html )})},
wrap: function( html ) {
return this.each(function(){
jQuery( this ).wrapAll( html )})},
append: function() {
return this.domManip(arguments, true, false, function(elem){
if (this.nodeType == 1)
this.appendChild( elem )})},
prepend: function() {
return this.domManip(arguments, true, true, function(elem){
if (this.nodeType == 1)
this.insertBefore( elem, this.firstChild )})},
before: function() {
return this.domManip(arguments, false, false, function(elem){
this.parentNode.insertBefore( elem, this )})},
after: function() {
return this.domManip(arguments, false, true, function(elem){
this.parentNode.insertBefore( elem, this.nextSibling )})},
end: function() {
return this.prevObject || jQuery( [] )},
find: function( selector ) {
var elems = jQuery.map(this, function(elem){
return jQuery.find( selector, elem )});
return this.pushStack(/[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
jQuery.unique( elems ) :
elems )},
clone: function( events ) {
var ret = this.map(function(){
if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
var clone = this.cloneNode(true),
container = document.createElement("div");
container.appendChild(clone);
return jQuery.clean([container.innerHTML])[0]} else
return this.cloneNode(true)});
var clone = ret.find("*").andSelf().each(function(){
if ( this[ expando ] != undefined )
this[ expando ] = null});
if ( events === true )
this.find("*").andSelf().each(function(i){
if (this.nodeType == 3)
return;
var events = jQuery.data( this, "events" );
for ( var type in events )
for ( var handler in events[ type ] )
jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data )});
return ret},
filter: function( selector ) {
return this.pushStack(
jQuery.isFunction( selector ) &&
jQuery.grep(this, function(elem, i){
return selector.call( elem, i )}) ||
jQuery.multiFilter( selector, this ) )},
not: function( selector ) {
if ( selector.constructor == String )
if ( isSimple.test( selector ) )
return this.pushStack( jQuery.multiFilter( selector, this, true ) );
else
selector = jQuery.multiFilter( selector, this );
var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
return this.filter(function() {
return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector})},
add: function( selector ) {
return this.pushStack( jQuery.unique( jQuery.merge(
this.get(),
typeof selector == 'string' ?
jQuery( selector ) :
jQuery.makeArray( selector )
)))},
is: function( selector ) {
return !!selector && jQuery.multiFilter( selector, this ).length > 0},
hasClass: function( selector ) {
return this.is( "." + selector )},
val: function( value ) {
if ( value == undefined ) {
if ( this.length ) {
var elem = this[0];
if ( jQuery.nodeName( elem, "select" ) ) {
var index = elem.selectedIndex,
values = [],
options = elem.options,
one = elem.type == "select-one";
if ( index < 0 )
return null;
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
var option = options[ i ];
if ( option.selected ) {
value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
if ( one )
return value;
values.push( value )}
}
return values} else
return (this[0].value || "").replace(/\r/g, "")}
return undefined}
if( value.constructor == Number )
value += '';
return this.each(function(){
if ( this.nodeType != 1 )
return;
if ( value.constructor == Array &&/radio|checkbox/.test( this.type ) )
this.checked = (jQuery.inArray(this.value, value) >= 0 ||
jQuery.inArray(this.name, value) >= 0);
else if ( jQuery.nodeName( this, "select" ) ) {
var values = jQuery.makeArray(value);
jQuery( "option", this ).each(function(){
this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
jQuery.inArray( this.text, values ) >= 0)});
if ( !values.length )
this.selectedIndex = -1} else
this.value = value})},
html: function( value ) {
return value == undefined ?
(this[0] ?
this[0].innerHTML :
null) :
this.empty().append( value )},
replaceWith: function( value ) {
return this.after( value ).remove()},
eq: function( i ) {
return this.slice( i, i + 1 )},
slice: function() {
return this.pushStack( Array.prototype.slice.apply( this, arguments ) )},
map: function( callback ) {
return this.pushStack( jQuery.map(this, function(elem, i){
return callback.call( elem, i, elem )}))},
andSelf: function() {
return this.add( this.prevObject )},
data: function( key, value ){
var parts = key.split(".");
parts[1] = parts[1] ? "." + parts[1] : "";
if ( value === undefined ) {
var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
if ( data === undefined && this.length )
data = jQuery.data( this[0], key );
return data === undefined && parts[1] ?
this.data( parts[0] ) :
data} else
return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
jQuery.data( this, key, value )})},
removeData: function( key ){
return this.each(function(){
jQuery.removeData( this, key )})},
domManip: function( args, table, reverse, callback ) {
var clone = this.length > 1, elems;
return this.each(function(){
if ( !elems ) {
elems = jQuery.clean( args, this.ownerDocument );
if ( reverse )
elems.reverse()}
var obj = this;
if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
var scripts = jQuery( [] );
jQuery.each(elems, function(){
var elem = clone ?
jQuery( this ).clone( true )[0] :
this;
if ( jQuery.nodeName( elem, "script" ) )
scripts = scripts.add( elem );
else {
if ( elem.nodeType == 1 )
scripts = scripts.add( jQuery( "script", elem ).remove() );
callback.call( obj, elem )}
});
scripts.each( evalScript )})}
};
jQuery.fn.init.prototype = jQuery.fn;
function evalScript( i, elem ) {
if ( elem.src )
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});
else
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
if ( elem.parentNode )
elem.parentNode.removeChild( elem )}
function now(){
return +new Date}
jQuery.extend = jQuery.fn.extend = function() {
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
if ( target.constructor == Boolean ) {
deep = target;
target = arguments[1] || {};
i = 2}
if ( typeof target != "object" && typeof target != "function" )
target = {};
if ( length == i ) {
target = this;
--i}
for ( ; i < length; i++ )
if ( (options = arguments[ i ]) != null )
for ( var name in options ) {
var src = target[ name ], copy = options[ name ];
if ( target === copy )
continue;
if ( deep && copy && typeof copy == "object" && !copy.nodeType )
target[ name ] = jQuery.extend( deep, 
src || ( copy.length != null ? [ ] : { } )
, copy );
else if ( copy !== undefined )
target[ name ] = copy}
return target};
var expando = "jQuery" + now(), uuid = 0, windowData = {},
exclude =/z-?index|font-?weight|opacity|zoom|line-?height/i,
defaultView = document.defaultView || {};
jQuery.extend({
noConflict: function( deep ) {
window.$ = _$;
if ( deep )
window.jQuery = _jQuery;
return jQuery},
isFunction: function( fn ) {
return !!fn && typeof fn != "string" && !fn.nodeName &&
fn.constructor != Array &&/^[\s[]?function/.test( fn + "" )},
isXMLDoc: function( elem ) {
return elem.documentElement && !elem.body ||
elem.tagName && elem.ownerDocument && !elem.ownerDocument.body},
globalEval: function( data ) {
data = jQuery.trim( data );
if ( data ) {
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
if ( jQuery.browser.msie )
script.text = data;
else
script.appendChild( document.createTextNode( data ) );
head.insertBefore( script, head.firstChild );
head.removeChild( script )}
},
nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase()},
cache: {},
data: function( elem, name, data ) {
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ];
if ( !id )
id = elem[ expando ] = ++uuid;
if ( name && !jQuery.cache[ id ] )
jQuery.cache[ id ] = {};
if ( data !== undefined )
jQuery.cache[ id ][ name ] = data;
return name ?
jQuery.cache[ id ][ name ] :
id},
removeData: function( elem, name ) {
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ];
if ( name ) {
if ( jQuery.cache[ id ] ) {
delete jQuery.cache[ id ][ name ];
name = "";
for ( name in jQuery.cache[ id ] )
break;
if ( !name )
jQuery.removeData( elem )}
} else {
try {
delete elem[ expando ]} catch(e){
if ( elem.removeAttribute )
elem.removeAttribute( expando )}
delete jQuery.cache[ id ]}
},
each: function( object, callback, args ) {
var name, i = 0, length = object.length;
if ( args ) {
if ( length == undefined ) {
for ( name in object )
if ( callback.apply( object[ name ], args ) === false )
break} else
for ( ; i < length; )
if ( callback.apply( object[ i++ ], args ) === false )
break;
} else {
if ( length == undefined ) {
for ( name in object )
if ( callback.call( object[ name ], name, object[ name ] ) === false )
break} else
for ( var value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
}
return object},
prop: function( elem, value, type, i, name ) {
if ( jQuery.isFunction( value ) )
value = value.call( elem, i );
return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
value + "px" :
value},
className: {
add: function( elem, classNames ) {
jQuery.each((classNames || "").split(/\s+/), function(i, className){
if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
elem.className += (elem.className ? " " : "") + className})},
remove: function( elem, classNames ) {
if (elem.nodeType == 1)
elem.className = classNames != undefined ?
jQuery.grep(elem.className.split(/\s+/), function(className){
return !jQuery.className.has( classNames, className )}).join(" ") :
""},
has: function( elem, className ) {
return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1}
},
swap: function( elem, options, callback ) {
var old = {};
for ( var name in options ) {
old[ name ] = elem.style[ name ];
elem.style[ name ] = options[ name ]}
callback.call( elem );
for ( var name in options )
elem.style[ name ] = old[ name ]},
css: function( elem, name, force ) {
if ( name == "width" || name == "height" ) {
var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
function getWH() {
val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
var padding = 0, border = 0;
jQuery.each( which, function() {
padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0});
val -= Math.round(padding + border)}
if ( jQuery(elem).is(":visible") )
getWH();
else
jQuery.swap( elem, props, getWH );
return Math.max(0, val)}
return jQuery.curCSS( elem, name, force )},
curCSS: function( elem, name, force ) {
var ret, style = elem.style;
function color( elem ) {
if ( !jQuery.browser.safari )
return false;
var ret = defaultView.getComputedStyle( elem, null );
return !ret || ret.getPropertyValue("color") == ""}
if ( name == "opacity" && jQuery.browser.msie ) {
ret = jQuery.attr( style, "opacity" );
return ret == "" ?
"1" :
ret}
if ( jQuery.browser.opera && name == "display" ) {
var save = style.outline;
style.outline = "0 solid black";
style.outline = save}
if ( name.match(/float/i ) )
name = styleFloat;
if ( !force && style && style[ name ] )
ret = style[ name ];
else if ( defaultView.getComputedStyle ) {
if ( name.match(/float/i ) )
name = "float";
name = name.replace(/([A-Z])/g, "-$1" ).toLowerCase();
var computedStyle = defaultView.getComputedStyle( elem, null );
if ( computedStyle && !color( elem ) )
ret = computedStyle.getPropertyValue( name );
else {
var swap = [], stack = [], a = elem, i = 0;
for ( ; a && color(a); a = a.parentNode )
stack.unshift(a);
for ( ; i < stack.length; i++ )
if ( color( stack[ i ] ) ) {
swap[ i ] = stack[ i ].style.display;
stack[ i ].style.display = "block"}
ret = name == "display" && swap[ stack.length - 1 ] != null ?
"none" :
( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
for ( i = 0; i < swap.length; i++ )
if ( swap[ i ] != null )
stack[ i ].style.display = swap[ i ]}
if ( name == "opacity" && ret == "" )
ret = "1"} else if ( elem.currentStyle ) {
var camelCase = name.replace(/\-(\w)/g, function(all, letter){
return letter.toUpperCase()});
ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
if ( !/^\d+(px)?$/i.test( ret ) &&/^\d/.test( ret ) ) {
var left = style.left, rsLeft = elem.runtimeStyle.left;
elem.runtimeStyle.left = elem.currentStyle.left;
style.left = ret || 0;
ret = style.pixelLeft + "px";
style.left = left;
elem.runtimeStyle.left = rsLeft}
}
return ret},
clean: function( elems, context ) {
var ret = [];
context = context || document;
if (typeof context.createElement == 'undefined')
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
jQuery.each(elems, function(i, elem){
if ( !elem )
return;
if ( elem.constructor == Number )
elem += '';
if ( typeof elem == "string" ) {
elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
all :
front + "></" + tag + ">"});
var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
var wrap =
!tags.indexOf("<opt") &&
[ 1, "<select multiple='multiple'>", "</select>" ] ||
!tags.indexOf("<leg") &&
[ 1, "<fieldset>", "</fieldset>" ] ||
tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
[ 1, "<table>", "</table>" ] ||
!tags.indexOf("<tr") &&
[ 2, "<table><tbody>", "</tbody></table>" ] ||
(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
!tags.indexOf("<col") &&
[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
jQuery.browser.msie &&
[ 1, "div<div>", "</div>" ] ||
[ 0, "", "" ];
div.innerHTML = wrap[1] + elem + wrap[2];
while ( wrap[0]-- )
div = div.lastChild;
if ( jQuery.browser.msie ) {
var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
div.firstChild && div.firstChild.childNodes :
wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
div.childNodes :
[];
for ( var j = tbody.length - 1; j >= 0 ; --j )
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
tbody[ j ].parentNode.removeChild( tbody[ j ] );
if (/^\s/.test( elem ) )
div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild )}
elem = jQuery.makeArray( div.childNodes )}
if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
return;
if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
ret.push( elem );
else
ret = jQuery.merge( ret, elem )});
return ret},
attr: function( elem, name, value ) {
if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
return undefined;
var notxml = !jQuery.isXMLDoc( elem ),
set = value !== undefined,
msie = jQuery.browser.msie;
name = notxml && jQuery.props[ name ] || name;
if ( elem.tagName ) {
var special =/href|src|style/.test( name );
if ( name == "selected" && jQuery.browser.safari )
elem.parentNode.selectedIndex;
if ( name in elem && notxml && !special ) {
if ( set ){
if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
throw "type property can't be changed";
elem[ name ] = value}
if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
return elem.getAttributeNode( name ).nodeValue;
return elem[ name ]}
if ( msie && notxml &&  name == "style" )
return jQuery.attr( elem.style, "cssText", value );
if ( set )
elem.setAttribute( name, "" + value );
var attr = msie && notxml && special
? elem.getAttribute( name, 2 )
: elem.getAttribute( name );
return attr === null ? undefined : attr}
if ( msie && name == "opacity" ) {
if ( set ) {
elem.zoom = 1;
elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/, "" ) +
(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")")}
return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
""}
name = name.replace(/-([a-z])/ig, function(all, letter){
return letter.toUpperCase()});
if ( set )
elem[ name ] = value;
return elem[ name ]},
trim: function( text ) {
return (text || "").replace(/^\s+|\s+$/g, "" )},
makeArray: function( array ) {
var ret = [];
if( array != null ){
var i = array.length;
if( i == null || array.split || array.setInterval || array.call )
ret[0] = array;
else
while( i )
ret[--i] = array[i]}
return ret},
inArray: function( elem, array ) {
for ( var i = 0, length = array.length; i < length; i++ )
if ( array[ i ] === elem )
return i;
return -1},
merge: function( first, second ) {
var i = 0, elem, pos = first.length;
if ( jQuery.browser.msie ) {
while ( elem = second[ i++ ] )
if ( elem.nodeType != 8 )
first[ pos++ ] = elem} else
while ( elem = second[ i++ ] )
first[ pos++ ] = elem;
return first},
unique: function( array ) {
var ret = [], done = {};
try {
for ( var i = 0, length = array.length; i < length; i++ ) {
var id = jQuery.data( array[ i ] );
if ( !done[ id ] ) {
done[ id ] = true;
ret.push( array[ i ] )}
}
} catch( e ) {
ret = array}
return ret},
grep: function( elems, callback, inv ) {
var ret = [];
for ( var i = 0, length = elems.length; i < length; i++ )
if ( !inv != !callback( elems[ i ], i ) )
ret.push( elems[ i ] );
return ret},
map: function( elems, callback ) {
var ret = [];
for ( var i = 0, length = elems.length; i < length; i++ ) {
var value = callback( elems[ i ], i );
if ( value != null )
ret[ ret.length ] = value}
return ret.concat.apply( [], ret )}
});
var userAgent = navigator.userAgent.toLowerCase();
jQuery.browser = {
version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
safari:/webkit/.test( userAgent ),
opera:/opera/.test( userAgent ),
msie:/msie/.test( userAgent ) && !/opera/.test( userAgent ),
mozilla:/mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};
var styleFloat = jQuery.browser.msie ?
"styleFloat" :
"cssFloat";
jQuery.extend({
boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
props: {
"for": "htmlFor",
"class": "className",
"float": styleFloat,
cssFloat: styleFloat,
styleFloat: styleFloat,
readonly: "readOnly",
maxlength: "maxLength",
cellspacing: "cellSpacing"
}
});
jQuery.each({
parent: function(elem){return elem.parentNode},
parents: function(elem){return jQuery.dir(elem,"parentNode")},
next: function(elem){return jQuery.nth(elem,2,"nextSibling")},
prev: function(elem){return jQuery.nth(elem,2,"previousSibling")},
nextAll: function(elem){return jQuery.dir(elem,"nextSibling")},
prevAll: function(elem){return jQuery.dir(elem,"previousSibling")},
siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem)},
children: function(elem){return jQuery.sibling(elem.firstChild)},
contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes)}
}, function(name, fn){
jQuery.fn[ name ] = function( selector ) {
var ret = jQuery.map( this, fn );
if ( selector && typeof selector == "string" )
ret = jQuery.multiFilter( selector, ret );
return this.pushStack( jQuery.unique( ret ) )}});
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function(name, original){
jQuery.fn[ name ] = function() {
var args = arguments;
return this.each(function(){
for ( var i = 0, length = args.length; i < length; i++ )
jQuery( args[ i ] )[ original ]( this )})}});
jQuery.each({
removeAttr: function( name ) {
jQuery.attr( this, name, "" );
if (this.nodeType == 1)
this.removeAttribute( name )},
addClass: function( classNames ) {
jQuery.className.add( this, classNames )},
removeClass: function( classNames ) {
jQuery.className.remove( this, classNames )},
toggleClass: function( classNames ) {
jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames )},
remove: function( selector ) {
if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
jQuery( "*", this ).add(this).each(function(){
jQuery.event.remove(this);
jQuery.removeData(this)});
if (this.parentNode)
this.parentNode.removeChild( this )}
},
empty: function() {
jQuery( ">*", this ).remove();
while ( this.firstChild )
this.removeChild( this.firstChild )}
}, function(name, fn){
jQuery.fn[ name ] = function(){
return this.each( fn, arguments )}});
jQuery.each([ "Height", "Width" ], function(i, name){
var type = name.toLowerCase();
jQuery.fn[ type ] = function( size ) {
return this[0] == window ?
jQuery.browser.opera && document.body[ "client" + name ] ||
jQuery.browser.safari && window[ "inner" + name ] ||
document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
this[0] == document ?
Math.max(
Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) :
size == undefined ?
(this.length ? jQuery.css( this[0], type ) : null) :
this.css( type, size.constructor == String ? size : size + "px" )}});
function num(elem, prop) {
return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
"(?:[\\w*_-]|\\\\.)" :
"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
quickChild = new RegExp("^>\\s*(" + chars + "+)"),
quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
quickClass = new RegExp("^([#.]?)(" + chars + "*)");
jQuery.extend({
expr: {
"": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2])},
"#": function(a,i,m){return a.getAttribute("id")==m[2]},
":": {
lt: function(a,i,m){return i<m[3]-0},
gt: function(a,i,m){return i>m[3]-0},
nth: function(a,i,m){return m[3]-0==i},
eq: function(a,i,m){return m[3]-0==i},
first: function(a,i){return i==0},
last: function(a,i,m,r){return i==r.length-1},
even: function(a,i){return i%2==0},
odd: function(a,i){return i%2},
"first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a},
"last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a},
"only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling")},
parent: function(a){return a.firstChild},
empty: function(a){return !a.firstChild},
contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0},
visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"},
hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"},
enabled: function(a){return !a.disabled},
disabled: function(a){return a.disabled},
checked: function(a){return a.checked},
selected: function(a){return a.selected||jQuery.attr(a,"selected")},
text: function(a){return "text"==a.type},
radio: function(a){return "radio"==a.type},
checkbox: function(a){return "checkbox"==a.type},
file: function(a){return "file"==a.type},
password: function(a){return "password"==a.type},
submit: function(a){return "submit"==a.type},
image: function(a){return "image"==a.type},
reset: function(a){return "reset"==a.type},
button: function(a){return "button"==a.type||jQuery.nodeName(a,"button")},
input: function(a){return/input|select|textarea|button/i.test(a.nodeName)},
has: function(a,i,m){return jQuery.find(m[3],a).length},
header: function(a){return/h\d/i.test(a.nodeName)},
animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem}).length}
}
},
parse: [
/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
new RegExp("^([:.#]*)(" + chars + "+)")
],
multiFilter: function( expr, elems, not ) {
var old, cur = [];
while ( expr && expr != old ) {
old = expr;
var f = jQuery.filter( expr, elems, not );
expr = f.t.replace(/^\s*,\s*/, "" );
cur = not ? elems = f.r : jQuery.merge( cur, f.r )}
return cur},
find: function( t, context ) {
if ( typeof t != "string" )
return [ t ];
if ( context && context.nodeType != 1 && context.nodeType != 9)
return [ ];
context = context || document;
var ret = [context], done = [], last, nodeName;
while ( t && last != t ) {
var r = [];
last = t;
t = jQuery.trim(t);
var foundToken = false,
re = quickChild,
m = re.exec(t);
if ( m ) {
nodeName = m[1].toUpperCase();
for ( var i = 0; ret[i]; i++ )
for ( var c = ret[i].firstChild; c; c = c.nextSibling )
if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
r.push( c );
ret = r;
t = t.replace( re, "" );
if ( t.indexOf(" ") == 0 ) continue;
foundToken = true} else {
re =/^([>+~])\s*(\w*)/i;
if ( (m = re.exec(t)) != null ) {
r = [];
var merge = {};
nodeName = m[2].toUpperCase();
m = m[1];
for ( var j = 0, rl = ret.length; j < rl; j++ ) {
var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
for ( ; n; n = n.nextSibling )
if ( n.nodeType == 1 ) {
var id = jQuery.data(n);
if ( m == "~" && merge[id] ) break;
if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
if ( m == "~" ) merge[id] = true;
r.push( n )}
if ( m == "+" ) break}
}
ret = r;
t = jQuery.trim( t.replace( re, "" ) );
foundToken = true}
}
if ( t && !foundToken ) {
if ( !t.indexOf(",") ) {
if ( context == ret[0] ) ret.shift();
done = jQuery.merge( done, ret );
r = ret = [context];
t = " " + t.substr(1,t.length)} else {
var re2 = quickID;
var m = re2.exec(t);
if ( m ) {
m = [ 0, m[2], m[3], m[1] ]} else {
re2 = quickClass;
m = re2.exec(t)}
m[2] = m[2].replace(/\\/g, "");
var elem = ret[ret.length-1];
if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
var oid = elem.getElementById(m[2]);
if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []} else {
for ( var i = 0; ret[i]; i++ ) {
var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
tag = "param";
r = jQuery.merge( r, ret[i].getElementsByTagName( tag ))}
if ( m[1] == "." )
r = jQuery.classFilter( r, m[2] );
if ( m[1] == "#" ) {
var tmp = [];
for ( var i = 0; r[i]; i++ )
if ( r[i].getAttribute("id") == m[2] ) {
tmp = [ r[i] ];
break}
r = tmp}
ret = r}
t = t.replace( re2, "" )}
}
if ( t ) {
var val = jQuery.filter(t,r);
ret = r = val.r;
t = jQuery.trim(val.t)}
}
if ( t )
ret = [];
if ( ret && context == ret[0] )
ret.shift();
done = jQuery.merge( done, ret );
return done},
classFilter: function(r,m,not){
m = " " + m + " ";
var tmp = [];
for ( var i = 0; r[i]; i++ ) {
var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
if ( !not && pass || not && !pass )
tmp.push( r[i] )}
return tmp},
filter: function(t,r,not) {
var last;
while ( t && t != last ) {
last = t;
var p = jQuery.parse, m;
for ( var i = 0; p[i]; i++ ) {
m = p[i].exec( t );
if ( m ) {
t = t.substring( m[0].length );
m[2] = m[2].replace(/\\/g, "");
break}
}
if ( !m )
break;
if ( m[1] == ":" && m[2] == "not" )
r = isSimple.test( m[3] ) ?
jQuery.filter(m[3], r, true).r :
jQuery( r ).not( m[3] );
else if ( m[1] == "." )
r = jQuery.classFilter(r, m[2], not);
else if ( m[1] == "[" ) {
var tmp = [], type = m[3];
for ( var i = 0, rl = r.length; i < rl; i++ ) {
var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
if ( z == null ||/href|src|selected/.test(m[2]) )
z = jQuery.attr(a,m[2]) || '';
if ( (type == "" && !!z ||
type == "=" && z == m[5] ||
type == "!=" && z != m[5] ||
type == "^=" && z && !z.indexOf(m[5]) ||
type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
(type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
tmp.push( a )}
r = tmp;
} else if ( m[1] == ":" && m[2] == "nth-child" ) {
var merge = {}, tmp = [],
test =/(-?)(\d*)n((?:\+|-)?\d*)/.exec(
m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
!/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
for ( var i = 0, rl = r.length; i < rl; i++ ) {
var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
if ( !merge[id] ) {
var c = 1;
for ( var n = parentNode.firstChild; n; n = n.nextSibling )
if ( n.nodeType == 1 )
n.nodeIndex = c++;
merge[id] = true}
var add = false;
if ( first == 0 ) {
if ( node.nodeIndex == last )
add = true} else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
add = true;
if ( add ^ not )
tmp.push( node )}
r = tmp;
} else {
var fn = jQuery.expr[ m[1] ];
if ( typeof fn == "object" )
fn = fn[ m[2] ];
if ( typeof fn == "string" )
fn = eval("false||function(a,i){return " + fn + ";}");
r = jQuery.grep( r, function(elem, i){
return fn(elem, i, m, r)}, not )}
}
return { r: r, t: t }},
dir: function( elem, dir ){
var matched = [],
cur = elem[dir];
while ( cur && cur != document ) {
if ( cur.nodeType == 1 )
matched.push( cur );
cur = cur[dir]}
return matched},
nth: function(cur,result,dir,elem){
result = result || 1;
var num = 0;
for ( ; cur; cur = cur[dir] )
if ( cur.nodeType == 1 && ++num == result )
break;
return cur},
sibling: function( n, elem ) {
var r = [];
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType == 1 && n != elem )
r.push( n )}
return r}
});
jQuery.event = {
add: function(elem, types, handler, data) {
if ( elem.nodeType == 3 || elem.nodeType == 8 )
return;
if ( jQuery.browser.msie && elem.setInterval )
elem = window;
if ( !handler.guid )
handler.guid = this.guid++;
if( data != undefined ) {
var fn = handler;
handler = this.proxy( fn, function() {
return fn.apply(this, arguments)});
handler.data = data}
var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
return jQuery.event.handle.apply(arguments.callee.elem, arguments)});
handle.elem = elem;
jQuery.each(types.split(/\s+/), function(index, type) {
var parts = type.split(".");
type = parts[0];
handler.type = parts[1];
var handlers = events[type];
if (!handlers) {
handlers = events[type] = {};
if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
if (elem.addEventListener)
elem.addEventListener(type, handle, false);
else if (elem.attachEvent)
elem.attachEvent("on" + type, handle)}
}
handlers[handler.guid] = handler;
jQuery.event.global[type] = true});
elem = null},
guid: 1,
global: {},
remove: function(elem, types, handler) {
if ( elem.nodeType == 3 || elem.nodeType == 8 )
return;
var events = jQuery.data(elem, "events"), ret, index;
if ( events ) {
if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
for ( var type in events )
this.remove( elem, type + (types || "") );
else {
if ( types.type ) {
handler = types.handler;
types = types.type}
jQuery.each(types.split(/\s+/), function(index, type){
var parts = type.split(".");
type = parts[0];
if ( events[type] ) {
if ( handler )
delete events[type][handler.guid];
else
for ( handler in events[type] )
if ( !parts[1] || events[type][handler].type == parts[1] )
delete events[type][handler];
for ( ret in events[type] ) break;
if ( !ret ) {
if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
if (elem.removeEventListener)
elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
else if (elem.detachEvent)
elem.detachEvent("on" + type, jQuery.data(elem, "handle"))}
ret = null;
delete events[type]}
}
})}
for ( ret in events ) break;
if ( !ret ) {
var handle = jQuery.data( elem, "handle" );
if ( handle ) handle.elem = null;
jQuery.removeData( elem, "events" );
jQuery.removeData( elem, "handle" )}
}
},
trigger: function(type, data, elem, donative, extra) {
data = jQuery.makeArray(data);
if ( type.indexOf("!") >= 0 ) {
type = type.slice(0, -1);
var exclusive = true}
if ( !elem ) {
if ( this.global[type] )
jQuery("*").add([window, document]).trigger(type, data);
} else {
if ( elem.nodeType == 3 || elem.nodeType == 8 )
return undefined;
var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
event = !data[0] || !data[0].preventDefault;
if ( event ) {
data.unshift({
type: type,
target: elem,
preventDefault: function(){},
stopPropagation: function(){},
timeStamp: now()
});
data[0][expando] = true; 
			}
data[0].type = type;
if ( exclusive )
data[0].exclusive = true;
var handle = jQuery.data(elem, "handle");
if ( handle )
val = handle.apply( elem, data );
if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
val = false;
if ( event )
data.shift();
if ( extra && jQuery.isFunction( extra ) ) {
ret = extra.apply( elem, val == null ? data : data.concat( val ) );
if (ret !== undefined)
val = ret}
if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
this.triggered = true;
try {
elem[ type ]();
} catch (e) {}
}
this.triggered = false}
return val},
handle: function(event) {
var val, ret, namespace, all, handlers;
event = arguments[0] = jQuery.event.fix( event || window.event );
namespace = event.type.split(".");
event.type = namespace[0];
namespace = namespace[1];
all = !namespace && !event.exclusive;
handlers = ( jQuery.data(this, "events") || {} )[event.type];
for ( var j in handlers ) {
var handler = handlers[j];
if ( all || handler.type == namespace ) {
event.handler = handler;
event.data = handler.data;
ret = handler.apply( this, arguments );
if ( val !== false )
val = ret;
if ( ret === false ) {
event.preventDefault();
event.stopPropagation()}
}
}
return val},
fix: function(event) {
if ( event[expando] == true )
return event;
var originalEvent = event;
event = { originalEvent: originalEvent };
var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");
for ( var i=props.length; i; i-- )
event[ props[i] ] = originalEvent[ props[i] ];
event[expando] = true;
event.preventDefault = function() {
if (originalEvent.preventDefault)
originalEvent.preventDefault();
originalEvent.returnValue = false};
event.stopPropagation = function() {
if (originalEvent.stopPropagation)
originalEvent.stopPropagation();
originalEvent.cancelBubble = true};
event.timeStamp = event.timeStamp || now();
if ( !event.target )
event.target = event.srcElement || document; 

if ( event.target.nodeType == 3 )
event.target = event.target.parentNode;
if ( !event.relatedTarget && event.fromElement )
event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
if ( event.pageX == null && event.clientX != null ) {
var doc = document.documentElement, body = document.body;
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0)}
if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
event.which = event.charCode || event.keyCode;
if ( !event.metaKey && event.ctrlKey )
event.metaKey = event.ctrlKey;
if ( !event.which && event.button )
event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
return event},
proxy: function( fn, proxy ){
proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
return proxy},
special: {
ready: {
setup: function() {
bindReady();
return},
teardown: function() { return}
},
mouseenter: {
setup: function() {
if ( jQuery.browser.msie ) return false;
jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
return true},
teardown: function() {
if ( jQuery.browser.msie ) return false;
jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
return true},
handler: function(event) {
if ( withinElement(event, this) ) return true;
event.type = "mouseenter";
return jQuery.event.handle.apply(this, arguments)}
},
mouseleave: {
setup: function() {
if ( jQuery.browser.msie ) return false;
jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
return true},
teardown: function() {
if ( jQuery.browser.msie ) return false;
jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
return true},
handler: function(event) {
if ( withinElement(event, this) ) return true;
event.type = "mouseleave";
return jQuery.event.handle.apply(this, arguments)}
}
}
};
jQuery.fn.extend({
bind: function( type, data, fn ) {
return type == "unload" ? this.one(type, data, fn) : this.each(function(){
jQuery.event.add( this, type, fn || data, fn && data )})},
one: function( type, data, fn ) {
var one = jQuery.event.proxy( fn || data, function(event) {
jQuery(this).unbind(event, one);
return (fn || data).apply( this, arguments )});
return this.each(function(){
jQuery.event.add( this, type, one, fn && data)})},
unbind: function( type, fn ) {
return this.each(function(){
jQuery.event.remove( this, type, fn )})},
trigger: function( type, data, fn ) {
return this.each(function(){
jQuery.event.trigger( type, data, this, true, fn )})},
triggerHandler: function( type, data, fn ) {
return this[0] && jQuery.event.trigger( type, data, this[0], false, fn )},
toggle: function( fn ) {
var args = arguments, i = 1;
while( i < args.length )
jQuery.event.proxy( fn, args[i++] );
return this.click( jQuery.event.proxy( fn, function(event) {
this.lastToggle = ( this.lastToggle || 0 ) % i;
event.preventDefault();
return args[ this.lastToggle++ ].apply( this, arguments ) || false}))},
hover: function(fnOver, fnOut) {
return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut)},
ready: function(fn) {
bindReady();
if ( jQuery.isReady )
fn.call( document, jQuery );
else
jQuery.readyList.push( function() { return fn.call(this, jQuery)} );
return this}
});
jQuery.extend({
isReady: false,
readyList: [],
ready: function() {
if ( !jQuery.isReady ) {
jQuery.isReady = true;
if ( jQuery.readyList ) {
jQuery.each( jQuery.readyList, function(){
this.call( document )});
jQuery.readyList = null}
jQuery(document).triggerHandler("ready")}
}
});
var readyBound = false;
function bindReady(){
if ( readyBound ) return;
readyBound = true;
if ( document.addEventListener && !jQuery.browser.opera)
document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
if ( jQuery.browser.msie && window == top ) (function(){
if (jQuery.isReady) return;
try {
document.documentElement.doScroll("left")} catch( error ) {
setTimeout( arguments.callee, 0 );
return}
jQuery.ready()})();
if ( jQuery.browser.opera )
document.addEventListener( "DOMContentLoaded", function () {
if (jQuery.isReady) return;
for (var i = 0; i < document.styleSheets.length; i++)
if (document.styleSheets[i].disabled) {
setTimeout( arguments.callee, 0 );
return}
jQuery.ready()}, false);
if ( jQuery.browser.safari ) {
var numStyles;
(function(){
if (jQuery.isReady) return;
if ( document.readyState != "loaded" && document.readyState != "complete" ) {
setTimeout( arguments.callee, 0 );
return}
if ( numStyles === undefined )
numStyles = jQuery("style, link[rel=stylesheet]").length;
if ( document.styleSheets.length != numStyles ) {
setTimeout( arguments.callee, 0 );
return}
jQuery.ready()})()}
jQuery.event.add( window, "load", jQuery.ready )}
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
"submit,keydown,keypress,keyup,error").split(","), function(i, name){
jQuery.fn[name] = function(fn){
return fn ? this.bind(name, fn) : this.trigger(name)}});
var withinElement = function(event, elem) {
var parent = event.relatedTarget;
while ( parent && parent != elem ) try { parent = parent.parentNode} catch(error) { parent = elem}
return parent == elem};
jQuery(window).bind("unload", function() {
jQuery("*").add(document).unbind()});
jQuery.fn.extend({
_load: jQuery.fn.load,
load: function( url, params, callback ) {
if ( typeof url != 'string' )
return this._load( url );
var off = url.indexOf(" ");
if ( off >= 0 ) {
var selector = url.slice(off, url.length);
url = url.slice(0, off)}
callback = callback || function(){};
var type = "GET";
if ( params )
if ( jQuery.isFunction( params ) ) {
callback = params;
params = null;
} else {
params = jQuery.param( params );
type = "POST"}
var self = this;
jQuery.ajax({
url: url,
type: type,
dataType: "html",
data: params,
complete: function(res, status){
if ( status == "success" || status == "notmodified" )
self.html( selector ?
jQuery("<div/>")
.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
.find(selector) :
res.responseText );
self.each( callback, [res.responseText, status, res] )}
});
return this},
serialize: function() {
return jQuery.param(this.serializeArray())},
serializeArray: function() {
return this.map(function(){
return jQuery.nodeName(this, "form") ?
jQuery.makeArray(this.elements) : this})
.filter(function(){
return this.name && !this.disabled &&
(this.checked ||/select|textarea/i.test(this.nodeName) ||/text|hidden|password/i.test(this.type))})
.map(function(i, elem){
var val = jQuery(this).val();
return val == null ? null :
val.constructor == Array ?
jQuery.map( val, function(val, i){
return {name: elem.name, value: val}}) :
{name: elem.name, value: val}}).get()}
});
jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
jQuery.fn[o] = function(f){
return this.bind(o, f)}});
var jsc = now();
jQuery.extend({
get: function( url, data, callback, type ) {
if ( jQuery.isFunction( data ) ) {
callback = data;
data = null}
return jQuery.ajax({
type: "GET",
url: url,
data: data,
success: callback,
dataType: type
})},
getScript: function( url, callback ) {
return jQuery.get(url, null, callback, "script")},
getJSON: function( url, data, callback ) {
return jQuery.get(url, data, callback, "json")},
post: function( url, data, callback, type ) {
if ( jQuery.isFunction( data ) ) {
callback = data;
data = {}}
return jQuery.ajax({
type: "POST",
url: url,
data: data,
success: callback,
dataType: type
})},
ajaxSetup: function( settings ) {
jQuery.extend( jQuery.ajaxSettings, settings )},
ajaxSettings: {
url: location.href,
global: true,
type: "GET",
timeout: 0,
contentType: "application/x-www-form-urlencoded",
processData: true,
async: true,
data: null,
username: null,
password: null,
accepts: {
xml: "application/xml, text/xml",
html: "text/html",
script: "text/javascript, application/javascript",
json: "application/json, text/javascript",
text: "text/plain",
_default: "*/*"
}
},
lastModified: {},
ajax: function( s ) {
s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
var jsonp, jsre =/=\?(&|$)/g, status, data,
type = s.type.toUpperCase();
if ( s.data && s.processData && typeof s.data != "string" )
s.data = jQuery.param(s.data);
if ( s.dataType == "jsonp" ) {
if ( type == "GET" ) {
if ( !s.url.match(jsre) )
s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?"} else if ( !s.data || !s.data.match(jsre) )
s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
s.dataType = "json"}
if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
jsonp = "jsonp" + jsc++;
if ( s.data )
s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
s.url = s.url.replace(jsre, "=" + jsonp + "$1");
s.dataType = "script";
window[ jsonp ] = function(tmp){
data = tmp;
success();
complete();
window[ jsonp ] = undefined;
try{ delete window[ jsonp ]} catch(e){}
if ( head )
head.removeChild( script )}}
if ( s.dataType == "script" && s.cache == null )
s.cache = false;
if ( s.cache === false && type == "GET" ) {
var ts = now();
var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "")}
if ( s.data && type == "GET" ) {
s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
s.data = null}
if ( s.global && ! jQuery.active++ )
jQuery.event.trigger( "ajaxStart" );
var remote =/^(?:\w+:)?\/\/([^\/?#]+)/;
if ( s.dataType == "script" && type == "GET"
&& remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = s.url;
if (s.scriptCharset)
script.charset = s.scriptCharset;
if ( !jsonp ) {
var done = false;
script.onload = script.onreadystatechange = function(){
if ( !done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete") ) {
done = true;
success();
complete();
head.removeChild( script )}
}}
head.appendChild(script);
return undefined}
var requestDone = false;
var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
if( s.username )
xhr.open(type, s.url, s.async, s.username, s.password);
else
xhr.open(type, s.url, s.async);
try {
if ( s.data )
xhr.setRequestHeader("Content-Type", s.contentType);
if ( s.ifModified )
xhr.setRequestHeader("If-Modified-Since",
jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
s.accepts[ s.dataType ] + ", */*" :
s.accepts._default )} catch(e){}
if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
s.global && jQuery.active--;
xhr.abort();
return false}
if ( s.global )
jQuery.event.trigger("ajaxSend", [xhr, s]);
var onreadystatechange = function(isTimeout){
if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
requestDone = true;
if (ival) {
clearInterval(ival);
ival = null}
status = isTimeout == "timeout" && "timeout" ||
!jQuery.httpSuccess( xhr ) && "error" ||
s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" ||
"success";
if ( status == "success" ) {
try {
data = jQuery.httpData( xhr, s.dataType, s.dataFilter )} catch(e) {
status = "parsererror"}
}
if ( status == "success" ) {
var modRes;
try {
modRes = xhr.getResponseHeader("Last-Modified")} catch(e) {} 

if ( s.ifModified && modRes )
jQuery.lastModified[s.url] = modRes;
if ( !jsonp )
success()} else
jQuery.handleError(s, xhr, status);
complete();
if ( s.async )
xhr = null}
};
if ( s.async ) {
var ival = setInterval(onreadystatechange, 13);
if ( s.timeout > 0 )
setTimeout(function(){
if ( xhr ) {
xhr.abort();
if( !requestDone )
onreadystatechange( "timeout" )}
}, s.timeout)}
try {
xhr.send(s.data)} catch(e) {
jQuery.handleError(s, xhr, null, e)}
if ( !s.async )
onreadystatechange();
function success(){
if ( s.success )
s.success( data, status );
if ( s.global )
jQuery.event.trigger( "ajaxSuccess", [xhr, s] )}
function complete(){
if ( s.complete )
s.complete(xhr, status);
if ( s.global )
jQuery.event.trigger( "ajaxComplete", [xhr, s] );
if ( s.global && ! --jQuery.active )
jQuery.event.trigger( "ajaxStop" )}
return xhr},
handleError: function( s, xhr, status, e ) {
if ( s.error ) s.error( xhr, status, e );
if ( s.global )
jQuery.event.trigger( "ajaxError", [xhr, s, e] )},
active: 0,
httpSuccess: function( xhr ) {
try {
return !xhr.status && location.protocol == "file:" ||
( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
jQuery.browser.safari && xhr.status == undefined} catch(e){}
return false},
httpNotModified: function( xhr, url ) {
try {
var xhrRes = xhr.getResponseHeader("Last-Modified");
return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
jQuery.browser.safari && xhr.status == undefined} catch(e){}
return false},
httpData: function( xhr, type, filter ) {
var ct = xhr.getResponseHeader("content-type"),
xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
data = xml ? xhr.responseXML : xhr.responseText;
if ( xml && data.documentElement.tagName == "parsererror" )
throw "parsererror";
if( filter )
data = filter( data, type );
if ( type == "script" )
jQuery.globalEval( data );
if ( type == "json" )
data = eval("(" + data + ")");
return data},
param: function( a ) {
var s = [];
if ( a.constructor == Array || a.jquery )
jQuery.each( a, function(){
s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) )});
else
for ( var j in a )
if ( a[j] && a[j].constructor == Array )
jQuery.each( a[j], function(){
s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) )});
else
s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) );
return s.join("&").replace(/%20/g, "+")}
});
jQuery.fn.extend({
show: function(speed,callback){
return speed ?
this.animate({
height: "show", width: "show", opacity: "show"
}, speed, callback) :
this.filter(":hidden").each(function(){
this.style.display = this.oldblock || "";
if ( jQuery.css(this,"display") == "none" ) {
var elem = jQuery("<" + this.tagName + " />").appendTo("body");
this.style.display = elem.css("display");
if (this.style.display == "none")
this.style.display = "block";
elem.remove()}
}).end()},
hide: function(speed,callback){
return speed ?
this.animate({
height: "hide", width: "hide", opacity: "hide"
}, speed, callback) :
this.filter(":visible").each(function(){
this.oldblock = this.oldblock || jQuery.css(this,"display");
this.style.display = "none"}).end()},
_toggle: jQuery.fn.toggle,
toggle: function( fn, fn2 ){
return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
this._toggle.apply( this, arguments ) :
fn ?
this.animate({
height: "toggle", width: "toggle", opacity: "toggle"
}, fn, fn2) :
this.each(function(){
jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]()})},
slideDown: function(speed,callback){
return this.animate({height: "show"}, speed, callback)},
slideUp: function(speed,callback){
return this.animate({height: "hide"}, speed, callback)},
slideToggle: function(speed, callback){
return this.animate({height: "toggle"}, speed, callback)},
fadeIn: function(speed, callback){
return this.animate({opacity: "show"}, speed, callback)},
fadeOut: function(speed, callback){
return this.animate({opacity: "hide"}, speed, callback)},
fadeTo: function(speed,to,callback){
return this.animate({opacity: to}, speed, callback)},
animate: function( prop, speed, easing, callback ) {
var optall = jQuery.speed(speed, easing, callback);
return this[ optall.queue === false ? "each" : "queue" ](function(){
if ( this.nodeType != 1)
return false;
var opt = jQuery.extend({}, optall), p,
hidden = jQuery(this).is(":hidden"), self = this;
for ( p in prop ) {
if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
return opt.complete.call(this);
if ( p == "height" || p == "width" ) {
opt.display = jQuery.css(this, "display");
opt.overflow = this.style.overflow}
}
if ( opt.overflow != null )
this.style.overflow = "hidden";
opt.curAnim = jQuery.extend({}, prop);
jQuery.each( prop, function(name, val){
var e = new jQuery.fx( self, opt, name );
if (/toggle|show|hide/.test(val) )
e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
else {
var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
start = e.cur(true) || 0;
if ( parts ) {
var end = parseFloat(parts[2]),
unit = parts[3] || "px";
if ( unit != "px" ) {
self.style[ name ] = (end || 1) + unit;
start = ((end || 1) / e.cur(true)) * start;
self.style[ name ] = start + unit}
if ( parts[1] )
end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
e.custom( start, end, unit )} else
e.custom( start, val, "" )}
});
return true})},
queue: function(type, fn){
if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
fn = type;
type = "fx"}
if ( !type || (typeof type == "string" && !fn) )
return queue( this[0], type );
return this.each(function(){
if ( fn.constructor == Array )
queue(this, type, fn);
else {
queue(this, type).push( fn );
if ( queue(this, type).length == 1 )
fn.call(this)}
})},
stop: function(clearQueue, gotoEnd){
var timers = jQuery.timers;
if (clearQueue)
this.queue([]);
this.each(function(){
for ( var i = timers.length - 1; i >= 0; i-- )
if ( timers[i].elem == this ) {
if (gotoEnd)
timers[i](true);
timers.splice(i, 1)}
});
if (!gotoEnd)
this.dequeue();
return this}
});
var queue = function( elem, type, array ) {
if ( elem ){
type = type || "fx";
var q = jQuery.data( elem, type + "queue" );
if ( !q || array )
q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) )}
return q};
jQuery.fn.dequeue = function(type){
type = type || "fx";
return this.each(function(){
var q = queue(this, type);
q.shift();
if ( q.length )
q[0].call( this )})};
jQuery.extend({
speed: function(speed, easing, fn) {
var opt = speed && speed.constructor == Object ? speed : {
complete: fn || !fn && easing ||
jQuery.isFunction( speed ) && speed,
duration: speed,
easing: fn && easing || easing && easing.constructor != Function && easing
};
opt.duration = (opt.duration && opt.duration.constructor == Number ?
opt.duration :
jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
opt.old = opt.complete;
opt.complete = function(){
if ( opt.queue !== false )
jQuery(this).dequeue();
if ( jQuery.isFunction( opt.old ) )
opt.old.call( this )};
return opt},
easing: {
linear: function( p, n, firstNum, diff ) {
return firstNum + diff * p},
swing: function( p, n, firstNum, diff ) {
return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum}
},
timers: [],
timerId: null,
fx: function( elem, options, prop ){
this.options = options;
this.elem = elem;
this.prop = prop;
if ( !options.orig )
options.orig = {}}
});
jQuery.fx.prototype = {
update: function(){
if ( this.options.step )
this.options.step.call( this.elem, this.now, this );
(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
if ( this.prop == "height" || this.prop == "width" )
this.elem.style.display = "block"},
cur: function(force){
if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
return this.elem[ this.prop ];
var r = parseFloat(jQuery.css(this.elem, this.prop, force));
return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0},
custom: function(from, to, unit){
this.startTime = now();
this.start = from;
this.end = to;
this.unit = unit || this.unit || "px";
this.now = this.start;
this.pos = this.state = 0;
this.update();
var self = this;
function t(gotoEnd){
return self.step(gotoEnd)}
t.elem = this.elem;
jQuery.timers.push(t);
if ( jQuery.timerId == null ) {
jQuery.timerId = setInterval(function(){
var timers = jQuery.timers;
for ( var i = 0; i < timers.length; i++ )
if ( !timers[i]() )
timers.splice(i--, 1);
if ( !timers.length ) {
clearInterval( jQuery.timerId );
jQuery.timerId = null}
}, 13)}
},
show: function(){
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
this.options.show = true;
this.custom(0, this.cur());
if ( this.prop == "width" || this.prop == "height" )
this.elem.style[this.prop] = "1px";
jQuery(this.elem).show()},
hide: function(){
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
this.options.hide = true;
this.custom(this.cur(), 0)},
step: function(gotoEnd){
var t = now();
if ( gotoEnd || t > this.options.duration + this.startTime ) {
this.now = this.end;
this.pos = this.state = 1;
this.update();
this.options.curAnim[ this.prop ] = true;
var done = true;
for ( var i in this.options.curAnim )
if ( this.options.curAnim[i] !== true )
done = false;
if ( done ) {
if ( this.options.display != null ) {
this.elem.style.overflow = this.options.overflow;
this.elem.style.display = this.options.display;
if ( jQuery.css(this.elem, "display") == "none" )
this.elem.style.display = "block"}
if ( this.options.hide )
this.elem.style.display = "none";
if ( this.options.hide || this.options.show )
for ( var p in this.options.curAnim )
jQuery.attr(this.elem.style, p, this.options.orig[p])}
if ( done )
this.options.complete.call( this.elem );
return false} else {
var n = t - this.startTime;
this.state = n / this.options.duration;
this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
this.now = this.start + ((this.end - this.start) * this.pos);
this.update()}
return true}
};
jQuery.extend( jQuery.fx, {
speeds:{
slow: 600,
fast: 200,
def: 400
},
step: {
scrollLeft: function(fx){
fx.elem.scrollLeft = fx.now},
scrollTop: function(fx){
fx.elem.scrollTop = fx.now},
opacity: function(fx){
jQuery.attr(fx.elem.style, "opacity", fx.now)},
_default: function(fx){
fx.elem.style[ fx.prop ] = fx.now + fx.unit}
}
});
jQuery.fn.offset = function() {
var left = 0, top = 0, elem = this[0], results;
if ( elem ) with ( jQuery.browser ) {
var parent       = elem.parentNode,
offsetChild  = elem,
offsetParent = elem.offsetParent,
doc          = elem.ownerDocument,
safari2      = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
css          = jQuery.curCSS,
fixed        = css(elem, "position") == "fixed";
if ( elem.getBoundingClientRect ) {
var box = elem.getBoundingClientRect();
add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
} else {
add( elem.offsetLeft, elem.offsetTop );
while ( offsetParent ) {
add( offsetParent.offsetLeft, offsetParent.offsetTop );
if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
border( offsetParent );
if ( !fixed && css(offsetParent, "position") == "fixed" )
fixed = true;
offsetChild  =/^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
offsetParent = offsetParent.offsetParent}
while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
if ( !/^inline|table.*$/i.test(css(parent, "display")) )
add( -parent.scrollLeft, -parent.scrollTop );
if ( mozilla && css(parent, "overflow") != "visible" )
border( parent );
parent = parent.parentNode}
if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
(mozilla && css(offsetChild, "position") != "absolute") )
add( -doc.body.offsetLeft, -doc.body.offsetTop );
if ( fixed )
add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop))}
results = { top: top, left: left }}
function border(elem) {
add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) )}
function add(l, t) {
left += parseInt(l, 10) || 0;
top += parseInt(t, 10) || 0}
return results};
jQuery.fn.extend({
position: function() {
var left = 0, top = 0, results;
if ( this[0] ) {
var offsetParent = this.offsetParent(),
offset       = this.offset(),
parentOffset =/^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
offset.top  -= num( this, 'marginTop' );
offset.left -= num( this, 'marginLeft' );
parentOffset.top  += num( offsetParent, 'borderTopWidth' );
parentOffset.left += num( offsetParent, 'borderLeftWidth' );
results = {
top:  offset.top  - parentOffset.top,
left: offset.left - parentOffset.left
}}
return results},
offsetParent: function() {
var offsetParent = this[0].offsetParent;
while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
offsetParent = offsetParent.offsetParent;
return jQuery(offsetParent)}
});
jQuery.each( ['Left', 'Top'], function(i, name) {
var method = 'scroll' + name;
jQuery.fn[ method ] = function(val) {
if (!this[0]) return;
return val != undefined ?
this.each(function() {
this == window || this == document ?
window.scrollTo(
!i ? val : jQuery(window).scrollLeft(),
i ? val : jQuery(window).scrollTop()
) :
this[ method ] = val}) :
this[0] == window || this[0] == document ?
self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
jQuery.boxModel && document.documentElement[ method ] ||
document.body[ method ] :
this[0][ method ]}});
jQuery.each([ "Height", "Width" ], function(i, name){
var tl = i ? "Left"  : "Top",  
		br = i ? "Right" : "Bottom"; 

jQuery.fn["inner" + name] = function(){
return this[ name.toLowerCase() ]() +
num(this, "padding" + tl) +
num(this, "padding" + br)};
jQuery.fn["outer" + name] = function(margin) {
return this["inner" + name]() +
num(this, "border" + tl + "Width") +
num(this, "border" + br + "Width") +
(margin ?
num(this, "margin" + tl) + num(this, "margin" + br) : 0)}})})();
jQuery.extend(jQuery.fn, {
validate: function( options ) {
if (!this.length) {
options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
return}
var validator = jQuery.data(this[0], 'validator');
if ( validator ) {
return validator}
validator = new jQuery.validator( options, this[0] );
jQuery.data(this[0], 'validator', validator); 
if ( validator.settings.onsubmit ) {
this.find("input.cancel:submit").click(function() {
validator.cancelSubmit = true});
this.submit( function( event ) {
if ( validator.settings.debug )
event.preventDefault();
function handle() {
if ( validator.settings.submitHandler ) {
validator.settings.submitHandler.call( validator, validator.currentForm );
return false}
return true}
if ( validator.cancelSubmit ) {
validator.cancelSubmit = false;
return handle()}
if ( validator.form() ) {
if ( validator.pendingRequest ) {
validator.formSubmitted = true;
return false}
return handle()} else {
validator.focusInvalid();
return false}
})}
return validator},
valid: function() {
if ( jQuery(this[0]).is('form')) {
return this.validate().form()} else {
var valid = true;
var validator = jQuery(this[0].form).validate();
this.each(function() {
valid = validator.element(this) && valid});
return valid}
},
rules: function() {
var element = this[0];
var data = jQuery.validator.normalizeRules(
jQuery.extend(
{},
jQuery.validator.metadataRules(element),
jQuery.validator.classRules(element),
jQuery.validator.attributeRules(element),
jQuery.validator.staticRules(element)
), element);
var rules = [];
if (data.required) {
rules.push({method:'required', parameters: data.required});
delete data.required}
jQuery.each(data, function(method, value) {
rules.push({
method: method,
parameters: value
})});
return rules},
push: function( t ) {
return this.setArray( this.add(t).get() )}
});
jQuery.extend(jQuery.expr[":"], {
blank: "!jQuery.trim(a.value)",
filled: "!!jQuery.trim(a.value)",
unchecked: "!a.checked"
});
jQuery.format = function(source, params) {
if ( arguments.length == 1 ) 
return function() {
var args = jQuery.makeArray(arguments);
args.unshift(source);
return jQuery.format.apply( this, args )};
if ( arguments.length > 2 && params.constructor != Array  ) {
params = jQuery.makeArray(arguments).slice(1)}
if ( params.constructor != Array ) {
params = [ params ]}
jQuery.each(params, function(i, n) {
source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n)});
return source};
jQuery.validator = function( options, form ) {
this.settings = jQuery.extend( {}, jQuery.validator.defaults, options );
this.currentForm = form;
this.init()};
jQuery.extend(jQuery.validator, {
defaults: {
messages: {},
errorClass: "error",
errorElement: "label",
focusInvalid: true,
errorContainer: jQuery( [] ),
errorLabelContainer: jQuery( [] ),
onsubmit: true,
ignore: [],
onfocusin: function(element) {
this.lastActive = element;
if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass );
this.errorsFor(element).hide()}
},
onfocusout: function(element) {
if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
this.element(element)}
},
onkeyup: function(element) {
if ( element.name in this.submitted || element == this.lastElement ) {
this.element(element)}
},
onclick: function(element) {
if ( element.name in this.submitted )
this.element(element)},
highlight: function( element, errorClass ) {
jQuery( element ).addClass( errorClass )},
unhighlight: function( element, errorClass ) {
jQuery( element ).removeClass( errorClass )}
},
setDefaults: function(settings) {
jQuery.extend( jQuery.validator.defaults, settings )},
messages: {
required: "This field is required.",
remote: "Please fix this field.",
email: "Please enter a valid email address.",
url: "Please enter a valid URL.",
date: "Please enter a valid date.",
dateISO: "Please enter a valid date (ISO).",
dateDE: "Bitte geben Sie ein g�ltiges Datum ein.",
number: "Please enter a valid number.",
numberDE: "Bitte geben Sie eine Nummer ein.",
digits: "Please enter only digits",
creditcard: "Please enter a valid credit card.",
equalTo: "Please enter the same value again.",
accept: "Please enter a value with a valid extension.",
maxlength: jQuery.format("Please enter no more than {0} characters."),
maxLength: jQuery.format("Please enter no more than {0} characters."),
minlength: jQuery.format("Please enter at least {0} characters."),
minLength: jQuery.format("Please enter at least {0} characters."),
rangelength: jQuery.format("Please enter a value between {0} and {1} characters long."),
rangeLength: jQuery.format("Please enter a value between {0} and {1} characters long."),
rangeValue: jQuery.format("Please enter a value between {0} and {1}."),
range: jQuery.format("Please enter a value between {0} and {1}."),
maxValue: jQuery.format("Please enter a value less than or equal to {0}."),
max: jQuery.format("Please enter a value less than or equal to {0}."),
minValue: jQuery.format("Please enter a value greater than or equal to {0}."),
min: jQuery.format("Please enter a value greater than or equal to {0}.")
},
autoCreateRanges: false,
prototype: {
init: function() {
this.labelContainer = jQuery(this.settings.errorLabelContainer);
this.errorContext = this.labelContainer.length && this.labelContainer || jQuery(this.currentForm);
this.containers = jQuery(this.settings.errorContainer).add( this.settings.errorLabelContainer );
this.submitted = {};
this.valueCache = {};
this.pendingRequest = 0;
this.pending = {};
this.invalid = {};
this.reset();
function delegate(event) {
var validator = jQuery.data(this[0].form, "validator");
validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] )}
jQuery(this.currentForm)
.delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate)
.delegate("click", ":radio, :checkbox", delegate)},
form: function() {
this.prepareForm();
var elements = this.elements();
for ( var i = 0; elements[i]; i++ ) {
this.check( elements[i] )}
jQuery.extend(this.submitted, this.errorMap);
this.invalid = jQuery.extend({}, this.errorMap);
jQuery(this.currentForm).triggerHandler("invalid-form.validate", [this]);
this.showErrors();
return this.valid()},
element: function( element ) {
element = this.clean( element );
this.lastElement = element;
this.prepareElement( element );
var result = this.check( element );
if ( result ) {
delete this.invalid[element.name]} else {
this.invalid[element.name] = true}
if ( !this.numberOfInvalids() ) {
this.toHide.push( this.containers )}
this.showErrors();
return result},
showErrors: function(errors) {
if(errors) {
jQuery.extend( this.errorMap, errors );
this.errorList = [];
for ( var name in errors ) {
this.errorList.push({
message: errors[name],
element: this.findByName(name)[0]
})}
this.successList = jQuery.grep( this.successList, function(element) {
return !(element.name in errors)})}
this.settings.showErrors
? this.settings.showErrors.call( this, this.errorMap, this.errorList )
: this.defaultShowErrors()},
resetForm: function() {
if ( jQuery.fn.resetForm )
jQuery( this.currentForm ).resetForm();
this.prepareForm();
this.hideErrors();
this.elements().removeClass( this.settings.errorClass )},
numberOfInvalids: function() {
var count = 0;
for ( var i in this.invalid )
count++;
return count},
hideErrors: function() {
this.addWrapper( this.toHide ).hide()},
valid: function() {
return this.size() == 0},
size: function() {
return this.errorList.length},
focusInvalid: function() {
if( this.settings.focusInvalid ) {
try {
jQuery(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus()} catch(e) { }
}
},
findLastActive: function() {
var lastActive = this.lastActive;
return lastActive && jQuery.grep(this.errorList, function(n) {
return n.element.name == lastActive.name}).length == 1 && lastActive},
elements: function() {
var validator = this;
var rulesCache = {};
return jQuery([]).add(this.currentForm.elements)
.filter("input, select, textarea")
.not(":submit, :reset, [disabled]")
.not( this.settings.ignore )
.filter(function() {
!this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
if ( this.name in rulesCache || !jQuery(this).rules().length )
return false;
rulesCache[this.name] = true;
return true})},
clean: function( selector ) {
return jQuery( selector )[0]},
errors: function() {
return jQuery( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext )},
reset: function() {
this.successList = [];
this.errorList = [];
this.errorMap = {};
this.toShow = jQuery( [] );
this.toHide = jQuery( [] );
this.formSubmitted = false},
prepareForm: function() {
this.reset();
this.toHide = this.errors().push( this.containers )},
prepareElement: function( element ) {
this.reset();
this.toHide = this.errorsFor( this.clean(element) )},
check: function( element ) {
element = this.clean( element );
this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass );
var rules = jQuery(element).rules();
for( var i = 0; rules[i]; i++) {
var rule = rules[i];
try {
var result = jQuery.validator.methods[rule.method].call( this, jQuery.trim(element.value), element, rule.parameters );
if ( result == "dependency-mismatch" )
return;
if ( result == "pending" ) {
this.toHide = this.toHide.not( this.errorsFor(element) );
return}
if( !result ) {
this.formatAndAdd( element, rule );
return false}
} catch(e) {
this.settings.debug && window.console && console.warn("exception occured when checking element " + element.id
+ ", check the '" + rule.method + "' method");
throw e}
}
if ( rules.length )
this.successList.push(element);
return true},
customMessage: function( name, method ) {
var m = this.settings.messages[name];
return m && (m.constructor == String
? m
: m[method])},
findDefined: function() {
for(var i = 0; i < arguments.length; i++) {
if (arguments[i] !== undefined)
return arguments[i]}
return undefined},
defaultMessage: function( element, method) {
return this.findDefined(
this.customMessage( element.name, method ),
element.title || undefined,
jQuery.validator.messages[method],
"<strong>Warning: No message defined for " + element.name + "</strong>"
)},
formatAndAdd: function( element, rule ) {
var message = this.defaultMessage( element, rule.method );
if ( typeof message == "function" ) 
message = message.call(this, rule.parameters, element);
this.errorList.push({
message: message,
element: element
});
this.errorMap[element.name] = message;
this.submitted[element.name] = message},
addWrapper: function(toToggle) {
if ( this.settings.wrapper )
toToggle.push( toToggle.parents( this.settings.wrapper ) );
return toToggle},
defaultShowErrors: function() {
for ( var i = 0; this.errorList[i]; i++ ) {
var error = this.errorList[i];
this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass );
this.showLabel( error.element, error.message )}
if( this.errorList.length ) {
this.toShow.push( this.containers )}
if (this.settings.success) {
for ( var i = 0; this.successList[i]; i++ ) {
this.showLabel( this.successList[i] )}
}
this.toHide = this.toHide.not( this.toShow );
this.hideErrors();
this.addWrapper( this.toShow ).show()},
showLabel: function(element, message) {
var label = this.errorsFor( element );
if ( label.length ) {
label.removeClass().addClass( this.settings.errorClass );
label.attr("generated") && label.html(message)} else {
label = jQuery("<" + this.settings.errorElement + "/>")
.attr({"for":  this.idOrName(element), generated: true})
.addClass(this.settings.errorClass)
.html(message || "");
if ( this.settings.wrapper ) {
label = label.hide().show().wrap("<" + this.settings.wrapper + ">").parent()}
if ( !this.labelContainer.append(label).length )
this.settings.errorPlacement
? this.settings.errorPlacement(label, jQuery(element) )
: label.insertAfter(element)}
if ( !message && this.settings.success ) {
label.text("");
typeof this.settings.success == "string"
? label.addClass( this.settings.success )
: this.settings.success( label )}
this.toShow.push(label)},
errorsFor: function(element) {
return this.errors().filter("[@for='" + this.idOrName(element) + "']")},
idOrName: function(element) {
return this.checkable(element) ? element.name : element.id || element.name},
rules: function( element ) {
return jQuery(element).rules()},
checkable: function( element ) {
return/radio|checkbox/i.test(element.type)},
findByName: function( name ) {
var form = this.currentForm;
return jQuery(document.getElementsByName(name)).map(function(index, element) {
return element.form == form && element || null;
})},
getLength: function(value, element) {
switch( element.nodeName.toLowerCase() ) {
case 'select':
return jQuery("option:selected", element).length;
case 'input':
if( this.checkable( element) )
return this.findByName(element.name).filter(':checked').length}
return value.length},
depend: function(param, element) {
return this.dependTypes[typeof param]
? this.dependTypes[typeof param](param, element)
: true},
dependTypes: {
"boolean": function(param, element) {
return param},
"string": function(param, element) {
return !!jQuery(param, element.form).length},
"function": function(param, element) {
return param(element)}
},
optional: function(element) {
return !jQuery.validator.methods.required.call(this, jQuery.trim(element.value), element) && "dependency-mismatch"},
startRequest: function(element) {
if (!this.pending[element.name]) {
this.pendingRequest++;
this.pending[element.name] = true}
},
stopRequest: function(element, valid) {
this.pendingRequest--;
if (this.pendingRequest < 0)
this.pendingRequest = 0;
delete this.pending[element.name];
if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
jQuery(this.currentForm).submit()}
},
previousValue: function(element) {
return jQuery.data(element, "previousValue") || jQuery.data(element, "previousValue", previous = {
old: null,
valid: true,
message: this.defaultMessage( element, "remote" )
})}
},
classRuleSettings: {
required: {required: true},
email: {email: true},
url: {url: true},
date: {date: true},
dateISO: {dateISO: true},
dateDE: {dateDE: true},
number: {number: true},
numberDE: {numberDE: true},
digits: {digits: true},
creditcard: {creditcard: true}
},
addClassRules: function(className, rules) {
className.constructor == String ?
this.classRuleSettings[className] = rules :
jQuery.extend(this.classRuleSettings, className)},
classRules: function(element) {
var rules = {};
var classes = jQuery(element).attr('class');
classes && jQuery.each(classes.split(' '), function() {
if (this in jQuery.validator.classRuleSettings) {
jQuery.extend(rules, jQuery.validator.classRuleSettings[this])}
});
return rules},
attributeRules: function(element) {
var rules = {};
var $element = jQuery(element);
for (method in jQuery.validator.methods) {
var value = $element.attr(method);
if (value !== undefined && value !== '') {
rules[method] = value}
}
if (rules.maxlength &&/-1|2147483647|524288/.test(rules.maxlength)) {
delete rules.maxlength;
delete rules.maxLength}
return rules},
metadataRules: function(element) {
if (!jQuery.metadata) return {};
var meta = jQuery.data(element.form, 'validator').settings.meta;
return meta ?
jQuery(element).metadata()[meta] :
jQuery(element).metadata()},
staticRules: function(element) {
var rules = {};
var validator = jQuery.data(element.form, 'validator');
if (validator.settings.rules) {
rules = jQuery.validator.normalizeRule(validator.settings.rules[element.name]) || {}}
return rules},
normalizeRules: function(rules, element) {
jQuery.each({
minLength: 'minlength',
maxLength: 'maxlength',
rangeLength: 'rangelength',
minValue: 'min',
maxValue: 'max',
rangeValue: 'range'
}, function(dep, curr) {
if (rules[dep]) {
rules[curr] = rules[dep];
delete rules[dep]}
});
jQuery.each(rules, function(rule, parameter) {
rules[rule] = jQuery.isFunction(parameter) ? parameter(element) : parameter});
jQuery.each(['minlength', 'maxlength', 'min', 'max'], function() {
if (rules[this]) {
rules[this] = Number(rules[this])}
});
jQuery.each(['rangelength', 'range'], function() {
if (rules[this]) {
rules[this] = [Number(rules[this][0]), Number(rules[this][1])]}
});
if (jQuery.validator.autoCreateRanges) {
if (rules.min && rules.max) {
rules.range = [rules.min, rules.max];
delete rules.min;
delete rules.max}
if (rules.minlength && rules.maxlength) {
rules.rangelength = [rules.minlength, rules.maxlength];
delete rules.minlength;
delete rules.maxlength}
}
return rules},
normalizeRule: function(data) {
if( typeof data == "string" ) {
var transformed = {};
transformed[data] = true;
data = transformed}
return data},
addMethod: function(name, method, message) {
jQuery.validator.methods[name] = method;
jQuery.validator.messages[name] = message;
if (method.length < 3) {
jQuery.validator.addClassRules(name, jQuery.validator.normalizeRule(name))}
},
methods: {
required: function(value, element, param) {
if ( !this.depend(param, element) )
return "dependency-mismatch";
switch( element.nodeName.toLowerCase() ) {
case 'select':
var options = jQuery("option:selected", element);
return options.length > 0 && ( element.type == "select-multiple" || (jQuery.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0);
case 'input':
if ( this.checkable(element) )
return this.getLength(value, element) > 0;
default:
return value.length > 0}
},
remote: function(value, element, param) {
if ( this.optional(element) )
return "dependency-mismatch";
var previous = this.previousValue(element);
if (!this.settings.messages[element.name] )
this.settings.messages[element.name] = {};
this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message;
if ( previous.old !== value ) {
previous.old = value;
var validator = this;
this.startRequest(element);
var data = {};
data[element.name] = value;
jQuery.ajax({
url: param,
mode: "abort",
port: "validate" + element.name,
dataType: "json",
data: data,
success: function(response) {
if ( !response ) {
var errors = {};
errors[element.name] =  response || validator.defaultMessage( element, "remote" );
validator.showErrors(errors)} else {
var submitted = validator.formSubmitted;
validator.prepareElement(element);
validator.formSubmitted = submitted;
validator.successList.push(element);
validator.showErrors()}
previous.valid = response;
validator.stopRequest(element, response)}
});
return "pending"} else if( this.pending[element.name] ) {
return "pending"}
return previous.valid},
minlength: function(value, element, param) {
return this.optional(element) || this.getLength(value, element) >= param},
minLength: function(value, element, param) {
return jQuery.validator.methods.minlength.apply(this, arguments)},
maxlength: function(value, element, param) {
return this.optional(element) || this.getLength(value, element) <= param},
maxLength: function(value, element, param) {
return jQuery.validator.methods.maxlength.apply(this, arguments)},
rangelength: function(value, element, param) {
var length = this.getLength(value, element);
return this.optional(element) || ( length >= param[0] && length <= param[1] )},
rangeLength: function(value, element, param) {
return jQuery.validator.methods.rangelength.apply(this, arguments)},
min: function( value, element, param ) {
return this.optional(element) || value >= param},
minValue: function() {
return jQuery.validator.methods.min.apply(this, arguments)},
max: function( value, element, param ) {
return this.optional(element) || value <= param},
maxValue: function() {
return jQuery.validator.methods.max.apply(this, arguments)},
range: function( value, element, param ) {
return this.optional(element) || ( value >= param[0] && value <= param[1] )},
rangeValue: function() {
return jQuery.validator.methods.range.apply(this, arguments)},
email: function(value, element) {
return this.optional(element) ||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value)},
url: function(value, element) {
return this.optional(element) ||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value)},
date: function(value, element) {
return this.optional(element) || !/Invalid|NaN/.test(new Date(value))},
dateISO: function(value, element) {
return this.optional(element) ||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value)},
dateDE: function(value, element) {
return this.optional(element) ||/^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value)},
number: function(value, element) {
return this.optional(element) ||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value)},
numberDE: function(value, element) {
return this.optional(element) ||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value)},
digits: function(value, element) {
return this.optional(element) ||/^\d+$/.test(value)},
creditcard: function(value, element) {
if ( this.optional(element) )
return "dependency-mismatch";
var nCheck = 0,
nDigit = 0,
bEven = false;
value = value.replace(/\D/g, "");
for (n = value.length - 1; n >= 0; n--) {
var cDigit = value.charAt(n);
var nDigit = parseInt(cDigit, 10);
if (bEven) {
if ((nDigit *= 2) > 9)
nDigit -= 9}
nCheck += nDigit;
bEven = !bEven}
return (nCheck % 10) == 0},
accept: function(value, element, param) {
param = typeof param == "string" ? param : "png|jpe?g|gif";
return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"))},
equalTo: function(value, element, param) {
return value == jQuery(param).val()}
}
});(function($) {
var ajax = $.ajax;
var pendingRequests = {};
$.ajax = function(settings) {
settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
var port = settings.port;
if (settings.mode == "abort") {
if ( pendingRequests[port] ) {
pendingRequests[port].abort()}
return pendingRequests[port] = ajax.apply(this, arguments)}
return ajax.apply(this, arguments)}})(jQuery);(function($) {
$.extend($.event.special, {
focusin: {
setup: function() {
if ($.browser.msie)
return false;
this.addEventListener("focus", $.event.special.focusin.handler, true)},
teardown: function() {
if ($.browser.msie)
return false;
this.removeEventListener("focus", $.event.special.focusin.handler, true)},
handler: function(event) {
var args = Array.prototype.slice.call( arguments, 1 );
args.unshift($.extend($.event.fix(event), { type: "focusin" }));
return $.event.handle.apply(this, args)}
},
focusout: {
setup: function() {
if ($.browser.msie)
return false;
this.addEventListener("blur", $.event.special.focusout.handler, true)},
teardown: function() {
if ($.browser.msie)
return false;
this.removeEventListener("blur", $.event.special.focusout.handler, true)},
handler: function(event) {
var args = Array.prototype.slice.call( arguments, 1 );
args.unshift($.extend($.event.fix(event), { type: "focusout" }));
return $.event.handle.apply(this, args)}
}
});
$.extend($.fn, {
delegate: function(type, delegate, handler) {
return this.bind(type, function(event) {
var target = $(event.target);
if (target.is(delegate)) {
return handler.apply(target, arguments)}
})},
triggerEvent: function(type, target) {
return this.triggerHandler(type, [jQuery.event.fix({ type: type, target: target })])}
})
})(jQuery);
var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x){return(x<0||x>9?"":"0")+x}
function isDate(val,format){var date=getDateFromFormat(val,format);if(date==0){return false}return true}
function compareDates(date1,dateformat1,date2,dateformat2){var d1=getDateFromFormat(date1,dateformat1);var d2=getDateFromFormat(date2,dateformat2);if(d1==0 || d2==0){return -1}else if(d1 > d2){return 1}return 0}
function formatDate(date,format){format=format+"";var result="";var i_format=0;var c="";var token="";var y=date.getYear()+"";var M=date.getMonth()+1;var d=date.getDate();var E=date.getDay();var H=date.getHours();var m=date.getMinutes();var s=date.getSeconds();var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;var value=new Object();if(y.length < 4){y=""+(y-0+1900)}value["y"]=""+y;value["yyyy"]=y;value["yy"]=y.substring(2,4);value["M"]=M;value["MM"]=LZ(M);value["MMM"]=MONTH_NAMES[M-1];value["NNN"]=MONTH_NAMES[M+11];value["d"]=d;value["dd"]=LZ(d);value["E"]=DAY_NAMES[E+7];value["EE"]=DAY_NAMES[E];value["H"]=H;value["HH"]=LZ(H);if(H==0){value["h"]=12}else if(H>12){value["h"]=H-12}else{value["h"]=H}value["hh"]=LZ(value["h"]);if(H>11){value["K"]=H-12}else{value["K"]=H}value["k"]=H+1;value["KK"]=LZ(value["K"]);value["kk"]=LZ(value["k"]);if(H > 11){value["a"]="PM"}else{value["a"]="AM"}value["m"]=m;value["mm"]=LZ(m);value["s"]=s;value["ss"]=LZ(s);while(i_format < format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c) &&(i_format < format.length)){token += format.charAt(i_format++)}if(value[token] != null){result=result + value[token]}else{result=result + token}}return result}
function _isInteger(val){var digits="1234567890";for(var i=0;i < val.length;i++){if(digits.indexOf(val.charAt(i))==-1){return false}}return true}
function _getInt(str,i,minlength,maxlength){for(var x=maxlength;x>=minlength;x--){var token=str.substring(i,i+x);if(token.length < minlength){return null}if(_isInteger(token)){return token}}return null}
function getDateFromFormat(val,format){val=val+"";format=format+"";var i_val=0;var i_format=0;var c="";var token="";var token2="";var x,y;var now=new Date();var year=now.getYear();var month=now.getMonth()+1;var date=1;var hh=now.getHours();var mm=now.getMinutes();var ss=now.getSeconds();var ampm="";while(i_format < format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c) &&(i_format < format.length)){token += format.charAt(i_format++)}if(token=="yyyy" || token=="yy" || token=="y"){if(token=="yyyy"){x=4;y=4}if(token=="yy"){x=2;y=2}if(token=="y"){x=2;y=4}year=_getInt(val,i_val,x,y);if(year==null){return 0}i_val += year.length;if(year.length==2){if(year > 70){year=1900+(year-0)}else{year=2000+(year-0)}}}else if(token=="MMM"||token=="NNN"){month=0;for(var i=0;i<MONTH_NAMES.length;i++){var month_name=MONTH_NAMES[i];if(val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()){if(token=="MMM"||(token=="NNN"&&i>11)){month=i+1;if(month>12){month -= 12}i_val += month_name.length;break}}}if((month < 1)||(month>12)){return 0}}else if(token=="EE"||token=="E"){for(var i=0;i<DAY_NAMES.length;i++){var day_name=DAY_NAMES[i];if(val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()){i_val += day_name.length;break}}}else if(token=="MM"||token=="M"){month=_getInt(val,i_val,token.length,2);if(month==null||(month<1)||(month>12)){return 0}i_val+=month.length}else if(token=="dd"||token=="d"){date=_getInt(val,i_val,token.length,2);if(date==null||(date<1)||(date>31)){return 0}i_val+=date.length}else if(token=="hh"||token=="h"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>12)){return 0}i_val+=hh.length}else if(token=="HH"||token=="H"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>23)){return 0}i_val+=hh.length}else if(token=="KK"||token=="K"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>11)){return 0}i_val+=hh.length}else if(token=="kk"||token=="k"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>24)){return 0}i_val+=hh.length;hh--}else if(token=="mm"||token=="m"){mm=_getInt(val,i_val,token.length,2);if(mm==null||(mm<0)||(mm>59)){return 0}i_val+=mm.length}else if(token=="ss"||token=="s"){ss=_getInt(val,i_val,token.length,2);if(ss==null||(ss<0)||(ss>59)){return 0}i_val+=ss.length}else if(token=="a"){if(val.substring(i_val,i_val+2).toLowerCase()=="am"){ampm="AM"}else if(val.substring(i_val,i_val+2).toLowerCase()=="pm"){ampm="PM"}else{return 0}i_val+=2}else{if(val.substring(i_val,i_val+token.length)!=token){return 0}else{i_val+=token.length}}}if(i_val != val.length){return 0}if(month==2){if( ((year%4==0)&&(year%100 != 0) ) ||(year%400==0) ){if(date > 29){return 0}}else{if(date > 28){return 0}}}if((month==4)||(month==6)||(month==9)||(month==11)){if(date > 30){return 0}}if(hh<12 && ampm=="PM"){hh=hh-0+12}else if(hh>11 && ampm=="AM"){hh-=12}var newdate=new Date(year,month-1,date,hh,mm,ss);return newdate.getTime()}
function parseDate(val){var preferEuro=(arguments.length==2)?arguments[1]:false;generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');var d=null;for(var i=0;i<checkList.length;i++){var l=window[checkList[i]];for(var j=0;j<l.length;j++){d=getDateFromFormat(val,l[j]);if(d!=0){return new Date(d)}}}return null}

(function($) {
function Datepicker() {
this.debug = false; 
	this._nextId = 0; 
	this._inst = []; 
	this._curInst = null; 
	this._disabledInputs = []; 
	this._datepickerShowing = false; 
	this._inDialog = false; 
	this._mainDivId = 'ui-datepicker-div'; 
	this._appendClass = 'ui-datepicker-append'; 
	this._wrapClass = 'ui-datepicker-wrap'; 
	this._triggerClass = 'ui-datepicker-trigger'; 
	this._dialogClass = 'ui-datepicker-dialog'; 
	this._promptClass = 'ui-datepicker-prompt'; 
	this._unselectableClass = 'ui-datepicker-unselectable'; 
	this._currentClass = 'ui-datepicker-current-day'; 
	this.regional = []; 
	this.regional[''] = { 
		clearText: 'Clear', 
		clearStatus: 'Erase the current date', 
		closeText: 'Close', 
		closeStatus: 'Close without change', 
		prevText: '&#x3c;Prev', 
		prevStatus: 'Show the previous month', 
		nextText: 'Next&#x3e;', 
		nextStatus: 'Show the next month', 
		currentText: 'Today', 
		currentStatus: 'Show the current month', 
		monthNames: ['January','February','March','April','May','June',
'July','August','September','October','November','December'], 
		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], 
		monthStatus: 'Show a different month', 
		yearStatus: 'Show a different year', 
		weekHeader: 'Wk', 
		weekStatus: 'Week of the year', 
		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], 
		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], 
		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], 
		dayStatus: 'Set DD as first week day', 
		dateStatus: 'Select DD, M d', 
		dateFormat: 'mm/dd/yy', 
		firstDay: 0, 
		initStatus: 'Select a date', 
		isRTL: false 
	};
this._defaults = { 
		showOn: 'focus', 
			
		showAnim: 'show', 
		defaultDate: null, 
			
		appendText: '', 
		buttonText: '...', 
		buttonImage: '', 
		buttonImageOnly: false, 
		closeAtTop: true, 
			
		mandatory: false, 
		hideIfNoPrevNext: false, 
			
		navigationAsDateFormat: false, 
		changeMonth: true, 
		changeYear: true, 
		yearRange: '-10:+10', 
			
		changeFirstDay: true, 
		highlightWeek: false, 
		showOtherMonths: false, 
		showWeeks: false, 
		calculateWeek: this.iso8601Week, 
			
		shortYearCutoff: '+10', 
			
			
		showStatus: false, 
		statusForDate: this.dateStatus, 
			
		minDate: null, 
		maxDate: null, 
		speed: 'normal', 
		beforeShowDay: null, 
			
			
		beforeShow: null, 
			
		onSelect: null, 
		onChangeMonthYear: null, 
		onClose: null, 
		numberOfMonths: 1, 
		stepMonths: 1, 
		rangeSelect: false, 
		rangeSeparator: ' - ', 
		altField: '', 
		altFormat: '' 
	};
$.extend(this._defaults, this.regional['']);
this._datepickerDiv = $('<div id="' + this._mainDivId + '"></div>')}
$.extend(Datepicker.prototype, {
markerClassName: 'hasDatepicker',
log: function () {
if (this.debug)
console.log.apply('', arguments)},
_register: function(inst) {
var id = this._nextId++;
this._inst[id] = inst;
return id},
_getInst: function(id) {
return this._inst[id] || id},
setDefaults: function(settings) {
extendRemove(this._defaults, settings || {});
return this},
_attachDatepicker: function(target, settings) {
var inlineSettings = null;
for (attrName in this._defaults) {
var attrValue = target.getAttribute('date:' + attrName);
if (attrValue) {
inlineSettings = inlineSettings || {};
try {
inlineSettings[attrName] = eval(attrValue)} catch (err) {
inlineSettings[attrName] = attrValue}
}
}
var nodeName = target.nodeName.toLowerCase();
var instSettings = (inlineSettings ? 
$.extend(settings || {}, inlineSettings) : settings);
if (nodeName == 'input') {
var inst = (inst && !inlineSettings ? inst :
new DatepickerInstance(instSettings, false));
this._connectDatepicker(target, inst)} else if (nodeName == 'div' || nodeName == 'span') {
var inst = new DatepickerInstance(instSettings, true);
this._inlineDatepicker(target, inst)}
},
_destroyDatepicker: function(target) {
var nodeName = target.nodeName.toLowerCase();
var calId = target._calId;
var $target = $(target);
$target.removeAttr('_calId');
if (nodeName == 'input') {
$target.siblings('.' + this._appendClass).replaceWith('').end()
.siblings('.' + this._triggerClass).replaceWith('').end()
.removeClass(this.markerClassName)
.unbind('focus', this._showDatepicker)
.unbind('keydown', this._doKeyDown)
.unbind('keypress', this._doKeyPress);
var wrapper = $target.parents('.' + this._wrapClass);
if (wrapper)
wrapper.siblings('.' + this._appendClass).replaceWith('').end()
.replaceWith(wrapper.html())} else if (nodeName == 'div' || nodeName == 'span')
$target.removeClass(this.markerClassName).empty();
if ($('input[_calId=' + calId + ']').length == 0)
this._inst[calId] = null},
_enableDatepicker: function(target) {
target.disabled = false;
$(target).siblings('button.' + this._triggerClass).each(function() { this.disabled = false}).end()
.siblings('img.' + this._triggerClass).css({opacity: '1.0', cursor: ''});
this._disabledInputs = $.map(this._disabledInputs,
function(value) { return (value == target ? null : value)}); 
	},
_disableDatepicker: function(target) {
target.disabled = true;
$(target).siblings('button.' + this._triggerClass).each(function() { this.disabled = true}).end()
.siblings('img.' + this._triggerClass).css({opacity: '0.5', cursor: 'default'});
this._disabledInputs = $.map($.datepicker._disabledInputs,
function(value) { return (value == target ? null : value)}); 
		this._disabledInputs[$.datepicker._disabledInputs.length] = target},
_isDisabledDatepicker: function(target) {
if (!target)
return false;
for (var i = 0; i < this._disabledInputs.length; i++) {
if (this._disabledInputs[i] == target)
return true}
return false},
_changeDatepicker: function(target, name, value) {
var settings = name || {};
if (typeof name == 'string') {
settings = {};
settings[name] = value}
if (inst = this._getInst(target._calId)) {
extendRemove(inst._settings, settings);
this._updateDatepicker(inst)}
},
_setDateDatepicker: function(target, date, endDate) {
if (inst = this._getInst(target._calId)) {
inst._setDate(date, endDate);
this._updateDatepicker(inst)}
},
_getDateDatepicker: function(target) {
var inst = this._getInst(target._calId);
if (inst)
inst._setDateFromField($(target)); 
return (inst ? inst._getDate() : null)},
_doKeyDown: function(e) {
var inst = $.datepicker._getInst(this._calId);
if ($.datepicker._datepickerShowing)
switch (e.keyCode) {
case 9:  $.datepicker._hideDatepicker(null, '');
break; 
				case 13: $.datepicker._selectDay(inst, inst._selectedMonth, inst._selectedYear,
$('td.ui-datepicker-days-cell-over', inst._datepickerDiv)[0]);
return false; 
						break; 
				case 27: $.datepicker._hideDatepicker(null, inst._get('speed'));
break; 
				case 33: $.datepicker._adjustDate(inst,
(e.ctrlKey ? -1 : -inst._get('stepMonths')), (e.ctrlKey ? 'Y' : 'M'));
break; 
				case 34: $.datepicker._adjustDate(inst,
(e.ctrlKey ? +1 : +inst._get('stepMonths')), (e.ctrlKey ? 'Y' : 'M'));
break; 
				case 35: if (e.ctrlKey) $.datepicker._clearDate(inst);
break; 
				case 36: if (e.ctrlKey) $.datepicker._gotoToday(inst);
break; 
				case 37: if (e.ctrlKey) $.datepicker._adjustDate(inst, -1, 'D');
break; 
				case 38: if (e.ctrlKey) $.datepicker._adjustDate(inst, -7, 'D');
break; 
				case 39: if (e.ctrlKey) $.datepicker._adjustDate(inst, +1, 'D');
break; 
				case 40: if (e.ctrlKey) $.datepicker._adjustDate(inst, +7, 'D');
break; 
			}
else if (e.keyCode == 36 && e.ctrlKey) 
			$.datepicker._showDatepicker(this)},
_doKeyPress: function(e) {
var inst = $.datepicker._getInst(this._calId);
var chars = $.datepicker._possibleChars(inst._get('dateFormat'));
var chr = String.fromCharCode(e.charCode == undefined ? e.keyCode : e.charCode);
return e.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1)},
_connectDatepicker: function(target, inst) {
var input = $(target);
if (input.hasClass(this.markerClassName))
return;
var appendText = inst._get('appendText');
var isRTL = inst._get('isRTL');
if (appendText)
input[isRTL ? 'before' : 'after']('<span class="' + this._appendClass + '">' + appendText + '</span>');
var showOn = inst._get('showOn');
if (showOn == 'focus' || showOn == 'both')
input.focus(this._showDatepicker);
if (showOn == 'button' || showOn == 'both') {
input.wrap('<span class="' + this._wrapClass + '"></span>');
var buttonText = inst._get('buttonText');
var buttonImage = inst._get('buttonImage');
var trigger = $(inst._get('buttonImageOnly') ? 
$('<img/>').addClass(this._triggerClass).attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
$('<button></button>').addClass(this._triggerClass).html(buttonImage != '' ? 
$('<img/>').attr({ src:buttonImage, alt:buttonText, title:buttonText }) : buttonText));
input[isRTL ? 'before' : 'after'](trigger);
trigger.click(function() {
if ($.datepicker._datepickerShowing && $.datepicker._lastInput == target)
$.datepicker._hideDatepicker();
else
$.datepicker._showDatepicker(target)})}
input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress)
.bind("setData.datepicker", function(event, key, value) {
inst._settings[key] = value}).bind("getData.datepicker", function(event, key) {
return inst._get(key)});
input[0]._calId = inst._id},
_inlineDatepicker: function(target, inst) {
var input = $(target);
if (input.hasClass(this.markerClassName))
return;
input.addClass(this.markerClassName).append(inst._datepickerDiv)
.bind("setData.datepicker", function(event, key, value){
inst._settings[key] = value}).bind("getData.datepicker", function(event, key){
return inst._get(key)});
input[0]._calId = inst._id;
this._updateDatepicker(inst)},
_inlineShow: function(inst) {
var numMonths = inst._getNumberOfMonths();
inst._datepickerDiv.width(numMonths[1] * $('.ui-datepicker', inst._datepickerDiv[0]).width())}, 
_dialogDatepicker: function(input, dateText, onSelect, settings, pos) {
var inst = this._dialogInst;
if (!inst) {
inst = this._dialogInst = new DatepickerInstance({}, false);
this._dialogInput = $('<input type="text" size="1" style="position: absolute; top: -100px;"/>');
this._dialogInput.keydown(this._doKeyDown);
$('body').append(this._dialogInput);
this._dialogInput[0]._calId = inst._id}
extendRemove(inst._settings, settings || {});
this._dialogInput.val(dateText);
this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
if (!this._pos) {
var browserWidth = window.innerWidth || document.documentElement.clientWidth ||	document.body.clientWidth;
var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
this._pos =
[(browserWidth/ 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]}
this._dialogInput.css('left', this._pos[0] + 'px').css('top', this._pos[1] + 'px');
inst._settings.onSelect = onSelect;
this._inDialog = true;
this._datepickerDiv.addClass(this._dialogClass);
this._showDatepicker(this._dialogInput[0]);
if ($.blockUI)
$.blockUI(this._datepickerDiv);
return this},
_showDatepicker: function(input) {
input = input.target || input;
if (input.nodeName.toLowerCase() != 'input')
input = $('input', input.parentNode)[0];
if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input)
return;
var inst = $.datepicker._getInst(input._calId);
var beforeShow = inst._get('beforeShow');
extendRemove(inst._settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
$.datepicker._hideDatepicker(null, '');
$.datepicker._lastInput = input;
inst._setDateFromField(input);
if ($.datepicker._inDialog)
input.value = '';
if (!$.datepicker._pos) {
$.datepicker._pos = $.datepicker._findPos(input);
$.datepicker._pos[1] += input.offsetHeight}
var isFixed = false;
$(input).parents().each(function() {
isFixed |= $(this).css('position') == 'fixed';
return !isFixed});
if (isFixed && $.browser.opera) {
$.datepicker._pos[0] -= document.documentElement.scrollLeft;
$.datepicker._pos[1] -= document.documentElement.scrollTop}
var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
$.datepicker._pos = null;
inst._rangeStart = null;
inst._datepickerDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
$.datepicker._updateDatepicker(inst);
inst._datepickerDiv.width(inst._getNumberOfMonths()[1] *
$('.ui-datepicker', inst._datepickerDiv[0])[0].offsetWidth);
offset = $.datepicker._checkOffset(inst, offset, isFixed);
inst._datepickerDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
left: offset.left + 'px', top: offset.top + 'px'});
if (!inst._inline) {
var showAnim = inst._get('showAnim') || 'show';
var speed = inst._get('speed');
var postProcess = function() {
$.datepicker._datepickerShowing = true;
if ($.browser.msie && parseInt($.browser.version) < 7) 
					$('iframe.ui-datepicker-cover').css({width: inst._datepickerDiv.width() + 4,
height: inst._datepickerDiv.height() + 4})};
inst._datepickerDiv[showAnim](speed, postProcess);
if (speed == '')
postProcess();
if (inst._input[0].type != 'hidden')
inst._input[0].focus();
$.datepicker._curInst = inst}
},
_updateDatepicker: function(inst) {
var dims = {width: inst._datepickerDiv.width() + 4,
height: inst._datepickerDiv.height() + 4};
inst._datepickerDiv.empty().append(inst._generateDatepicker()).
find('iframe.ui-datepicker-cover').
css({width: dims.width, height: dims.height});
var numMonths = inst._getNumberOfMonths();
if (numMonths[0] != 1 || numMonths[1] != 1)
inst._datepickerDiv.addClass('ui-datepicker-multi');
else
inst._datepickerDiv.removeClass('ui-datepicker-multi');
if (inst._get('isRTL'))
inst._datepickerDiv.addClass('ui-datepicker-rtl');
else
inst._datepickerDiv.removeClass('ui-datepicker-rtl');
if (inst._input && inst._input[0].type != 'hidden')
$(inst._input[0]).focus()},
_checkOffset: function(inst, offset, isFixed) {
var pos = inst._input ? $.datepicker._findPos(inst._input[0]) : null;
var browserWidth = window.innerWidth || document.documentElement.clientWidth;
var browserHeight = window.innerHeight || document.documentElement.clientHeight;
var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
if ((offset.left + inst._datepickerDiv.width() - scrollX) > browserWidth)
offset.left = Math.max((isFixed ? 0 : scrollX),
pos[0] + (inst._input ? inst._input.width() : 0) - (isFixed ? scrollX : 0) - inst._datepickerDiv.width() -
(isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0));
else
offset.left -= (isFixed ? scrollX : 0);
if ((offset.top + inst._datepickerDiv.height() - scrollY) > browserHeight)
offset.top = Math.max((isFixed ? 0 : scrollY),
pos[1] - (isFixed ? scrollY : 0) - (this._inDialog ? 0 : inst._datepickerDiv.height()) -
(isFixed && $.browser.opera ? document.documentElement.scrollTop : 0));
else
offset.top -= (isFixed ? scrollY : 0);
return offset},
_findPos: function(obj) {
while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
obj = obj.nextSibling}
var position = $(obj).offset();
return [position.left, position.top]},
_hideDatepicker: function(input, speed) {
var inst = this._curInst;
if (!inst)
return;
var rangeSelect = inst._get('rangeSelect');
if (rangeSelect && this._stayOpen)
this._selectDate(inst, inst._formatDate(
inst._currentDay, inst._currentMonth, inst._currentYear));
this._stayOpen = false;
if (this._datepickerShowing) {
speed = (speed != null ? speed : inst._get('speed'));
var showAnim = inst._get('showAnim');
inst._datepickerDiv[(showAnim == 'slideDown' ? 'slideUp' :
(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))](speed, function() {
$.datepicker._tidyDialog(inst)});
if (speed == '')
this._tidyDialog(inst);
var onClose = inst._get('onClose');
if (onClose)
onClose.apply((inst._input ? inst._input[0] : null),
[inst._getDate(), inst]);
this._datepickerShowing = false;
this._lastInput = null;
inst._settings.prompt = null;
if (this._inDialog) {
this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
if ($.blockUI) {
$.unblockUI();
$('body').append(this._datepickerDiv)}
}
this._inDialog = false}
this._curInst = null},
_tidyDialog: function(inst) {
inst._datepickerDiv.removeClass(this._dialogClass).unbind('.ui-datepicker');
$('.' + this._promptClass, inst._datepickerDiv).remove()},
_checkExternalClick: function(event) {
if (!$.datepicker._curInst)
return;
var $target = $(event.target);
if (($target.parents('#' + $.datepicker._mainDivId).length == 0) &&
!$target.hasClass($.datepicker.markerClassName) &&
!$target.hasClass($.datepicker._triggerClass) &&
$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
$.datepicker._hideDatepicker(null, '')},
_adjustDate: function(id, offset, period) {
var inst = this._getInst(id);
inst._adjustDate(offset, period);
this._updateDatepicker(inst)},
_gotoToday: function(id) {
var date = new Date();
var inst = this._getInst(id);
inst._selectedDay = date.getDate();
inst._drawMonth = inst._selectedMonth = date.getMonth();
inst._drawYear = inst._selectedYear = date.getFullYear();
this._adjustDate(inst);
inst._notifyChange()},
_selectMonthYear: function(id, select, period) {
var inst = this._getInst(id);
inst._selectingMonthYear = false;
inst[period == 'M' ? '_drawMonth' : '_drawYear'] =
select.options[select.selectedIndex].value - 0;
this._adjustDate(inst);
inst._notifyChange()},
_clickMonthYear: function(id) {
var inst = this._getInst(id);
if (inst._input && inst._selectingMonthYear && !$.browser.msie)
inst._input[0].focus();
inst._selectingMonthYear = !inst._selectingMonthYear},
_changeFirstDay: function(id, day) {
var inst = this._getInst(id);
inst._settings.firstDay = day;
this._updateDatepicker(inst)},
_selectDay: function(id, month, year, td) {
if ($(td).hasClass(this._unselectableClass))
return;
var inst = this._getInst(id);
var rangeSelect = inst._get('rangeSelect');
if (rangeSelect) {
this._stayOpen = !this._stayOpen;
if (this._stayOpen) {
$('.ui-datepicker td').removeClass(this._currentClass);
$(td).addClass(this._currentClass)} 
}
inst._selectedDay = inst._currentDay = $('a', td).html();
inst._selectedMonth = inst._currentMonth = month;
inst._selectedYear = inst._currentYear = year;
if (this._stayOpen) {
inst._endDay = inst._endMonth = inst._endYear = null}
else if (rangeSelect) {
inst._endDay = inst._currentDay;
inst._endMonth = inst._currentMonth;
inst._endYear = inst._currentYear}
this._selectDate(id, inst._formatDate(
inst._currentDay, inst._currentMonth, inst._currentYear));
if (this._stayOpen) {
inst._rangeStart = new Date(inst._currentYear, inst._currentMonth, inst._currentDay);
this._updateDatepicker(inst)}
else if (rangeSelect) {
inst._selectedDay = inst._currentDay = inst._rangeStart.getDate();
inst._selectedMonth = inst._currentMonth = inst._rangeStart.getMonth();
inst._selectedYear = inst._currentYear = inst._rangeStart.getFullYear();
inst._rangeStart = null;
if (inst._inline)
this._updateDatepicker(inst)}
},
_clearDate: function(id) {
var inst = this._getInst(id);
if (inst._get('mandatory'))
return;
this._stayOpen = false;
inst._endDay = inst._endMonth = inst._endYear = inst._rangeStart = null;
this._selectDate(inst, '')},
_selectDate: function(id, dateStr) {
var inst = this._getInst(id);
dateStr = (dateStr != null ? dateStr : inst._formatDate());
if (inst._get('rangeSelect') && dateStr)
dateStr = (inst._rangeStart ? inst._formatDate(inst._rangeStart) :
dateStr) + inst._get('rangeSeparator') + dateStr;
if (inst._input)
inst._input.val(dateStr);
this._updateAlternate(inst);
var onSelect = inst._get('onSelect');
if (onSelect)
onSelect.apply((inst._input ? inst._input[0] : null), [dateStr, inst]);
else if (inst._input)
inst._input.trigger('change');
if (inst._inline)
this._updateDatepicker(inst);
else if (!this._stayOpen) {
this._hideDatepicker(null, inst._get('speed'));
this._lastInput = inst._input[0];
if (typeof(inst._input[0]) != 'object')
inst._input[0].focus();
this._lastInput = null}
},
_updateAlternate: function(inst) {
var altField = inst._get('altField');
if (altField) {
var altFormat = inst._get('altFormat');
var date = inst._getDate();
dateStr = (isArray(date) ? (!date[0] && !date[1] ? '' :
$.datepicker.formatDate(altFormat, date[0], inst._getFormatConfig()) +
inst._get('rangeSeparator') + $.datepicker.formatDate(
altFormat, date[1] || date[0], inst._getFormatConfig())) :
$.datepicker.formatDate(altFormat, date, inst._getFormatConfig()));
$(altField).each(function() { $(this).val(dateStr)})}
},
noWeekends: function(date) {
var day = date.getDay();
return [(day > 0 && day < 6), '']},
iso8601Week: function(date) {
var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), (date.getTimezoneOffset() / -60));
var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4);
var firstDay = firstMon.getDay() || 7;
firstMon.setDate(firstMon.getDate() + 1 - firstDay);
if (firstDay < 4 && checkDate < firstMon) {
checkDate.setDate(checkDate.getDate() - 3);
return $.datepicker.iso8601Week(checkDate)} else if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) {
firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7;
if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) {
checkDate.setDate(checkDate.getDate() + 3);
return $.datepicker.iso8601Week(checkDate)}
}
return Math.floor(((checkDate - firstMon)/ 86400000) / 7) + 1},
dateStatus: function(date, inst) {
return $.datepicker.formatDate(inst._get('dateStatus'), date, inst._getFormatConfig())},
parseDate: function (format, value, settings) {
if (format == null || value == null)
throw 'Invalid arguments';
value = (typeof value == 'object' ? value.toString() : value + '');
if (value == '')
return null;
var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
var year = -1;
var month = -1;
var day = -1;
var literal = false;
var lookAhead = function(match) {
var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
if (matches)
iFormat++;
return matches};
var getNumber = function(match) {
lookAhead(match);
var size = (match == 'y' ? 4 : 2);
var num = 0;
while (size > 0 && iValue < value.length &&
value.charAt(iValue) >= '0' && value.charAt(iValue) <= '9') {
num = num * 10 + (value.charAt(iValue++) - 0);
size--}
if (size == (match == 'y' ? 4 : 2))
throw 'Missing number at position ' + iValue;
return num};
var getName = function(match, shortNames, longNames) {
var names = (lookAhead(match) ? longNames : shortNames);
var size = 0;
for (var j = 0; j < names.length; j++)
size = Math.max(size, names[j].length);
var name = '';
var iInit = iValue;
while (size > 0 && iValue < value.length) {
name += value.charAt(iValue++);
for (var i = 0; i < names.length; i++)
if (name == names[i])
return i + 1;
size--}
throw 'Unknown name at position ' + iInit};
var checkLiteral = function() {
if (value.charAt(iValue) != format.charAt(iFormat))
throw 'Unexpected literal at position ' + iValue;
iValue++};
var iValue = 0;
for (var iFormat = 0; iFormat < format.length; iFormat++) {
if (literal)
if (format.charAt(iFormat) == "'" && !lookAhead("'"))
literal = false;
else
checkLiteral();
else
switch (format.charAt(iFormat)) {
case 'd':
day = getNumber('d');
break;
case 'D': 
getName('D', dayNamesShort, dayNames);
break;
case 'm': 
month = getNumber('m');
break;
case 'M':
month = getName('M', monthNamesShort, monthNames); 
break;
case 'y':
year = getNumber('y');
break;
case "'":
if (lookAhead("'"))
checkLiteral();
else
literal = true;
break;
default:
checkLiteral()}
}
if (year < 100)
year += new Date().getFullYear() - new Date().getFullYear() % 100 +
(year <= shortYearCutoff ? 0 : -100);
var date = new Date(year, month - 1, day);
if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
throw 'Invalid date';
return date},
formatDate: function (format, date, settings) {
if (!date)
return '';
var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
var lookAhead = function(match) {
var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
if (matches)
iFormat++;
return matches};
var formatNumber = function(match, value) {
return (lookAhead(match) && value < 10 ? '0' : '') + value};
var formatName = function(match, value, shortNames, longNames) {
return (lookAhead(match) ? longNames[value] : shortNames[value])};
var output = '';
var literal = false;
if (date)
for (var iFormat = 0; iFormat < format.length; iFormat++) {
if (literal)
if (format.charAt(iFormat) == "'" && !lookAhead("'"))
literal = false;
else
output += format.charAt(iFormat);
else
switch (format.charAt(iFormat)) {
case 'd':
output += formatNumber('d', date.getDate()); 
break;
case 'D': 
output += formatName('D', date.getDay(), dayNamesShort, dayNames);
break;
case 'm': 
output += formatNumber('m', date.getMonth() + 1); 
break;
case 'M':
output += formatName('M', date.getMonth(), monthNamesShort, monthNames); 
break;
case 'y':
output += (lookAhead('y') ? date.getFullYear() : 
(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
break;
case "'":
if (lookAhead("'"))
output += "'";
else
literal = true;
break;
default:
output += format.charAt(iFormat)}
}
return output},
_possibleChars: function (format) {
var chars = '';
var literal = false;
for (var iFormat = 0; iFormat < format.length; iFormat++)
if (literal)
if (format.charAt(iFormat) == "'" && !lookAhead("'"))
literal = false;
else
chars += format.charAt(iFormat);
else
switch (format.charAt(iFormat)) {
case 'd': case 'm': case 'y':
chars += '0123456789'; 
break;
case 'D': case 'M':
return null;
case "'":
if (lookAhead("'"))
chars += "'";
else
literal = true;
break;
default:
chars += format.charAt(iFormat)}
return chars}
});
function DatepickerInstance(settings, inline) {
this._id = $.datepicker._register(this);
this._selectedDay = 0;
this._selectedMonth = 0;
this._selectedYear = 0;
this._drawMonth = 0;
this._drawYear = 0;
this._input = null;
this._inline = inline;
this._datepickerDiv = (!inline ? $.datepicker._datepickerDiv :
$('<div id="' + $.datepicker._mainDivId + '-' + this._id + '" class="ui-datepicker-inline">'));
this._settings = extendRemove(settings || {});
if (inline)
this._setDate(this._getDefaultDate())}
$.extend(DatepickerInstance.prototype, {
_get: function(name) {
return this._settings[name] !== undefined ? this._settings[name] : $.datepicker._defaults[name]},
_setDateFromField: function(input) {
this._input = $(input);
var dateFormat = this._get('dateFormat');
var dates = this._input ? this._input.val().split(this._get('rangeSeparator')) : null; 
this._endDay = this._endMonth = this._endYear = null;
var date = defaultDate = this._getDefaultDate();
if (dates.length > 0) {
var settings = this._getFormatConfig();
if (dates.length > 1) {
date = $.datepicker.parseDate(dateFormat, dates[1], settings) || defaultDate;
this._endDay = date.getDate();
this._endMonth = date.getMonth();
this._endYear = date.getFullYear()}
try {
date = $.datepicker.parseDate(dateFormat, dates[0], settings) || defaultDate} catch (e) {
$.datepicker.log(e);
date = defaultDate}
}
this._selectedDay = date.getDate();
this._drawMonth = this._selectedMonth = date.getMonth();
this._drawYear = this._selectedYear = date.getFullYear();
this._currentDay = (dates[0] ? date.getDate() : 0);
this._currentMonth = (dates[0] ? date.getMonth() : 0);
this._currentYear = (dates[0] ? date.getFullYear() : 0);
this._adjustDate()},
_getDefaultDate: function() {
var date = this._determineDate('defaultDate', new Date());
var minDate = this._getMinMaxDate('min', true);
var maxDate = this._getMinMaxDate('max');
date = (minDate && date < minDate ? minDate : date);
date = (maxDate && date > maxDate ? maxDate : date);
return date},
_determineDate: function(name, defaultDate) {
var offsetNumeric = function(offset) {
var date = new Date();
date.setDate(date.getDate() + offset);
return date};
var offsetString = function(offset, getDaysInMonth) {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth();
var day = date.getDate();
var pattern =/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
var matches = pattern.exec(offset);
while (matches) {
switch (matches[2] || 'd') {
case 'd' : case 'D' :
day += (matches[1] - 0); break;
case 'w' : case 'W' :
day += (matches[1] * 7); break;
case 'm' : case 'M' :
month += (matches[1] - 0); 
day = Math.min(day, getDaysInMonth(year, month));
break;
case 'y': case 'Y' :
year += (matches[1] - 0);
day = Math.min(day, getDaysInMonth(year, month));
break}
matches = pattern.exec(offset)}
return new Date(year, month, day)};
var date = this._get(name);
return (date == null ? defaultDate :
(typeof date == 'string' ? offsetString(date, this._getDaysInMonth) :
(typeof date == 'number' ? offsetNumeric(date) : date)))},
_setDate: function(date, endDate) {
this._selectedDay = this._currentDay = date.getDate();
this._drawMonth = this._selectedMonth = this._currentMonth = date.getMonth();
this._drawYear = this._selectedYear = this._currentYear = date.getFullYear();
if (this._get('rangeSelect')) {
if (endDate) {
this._endDay = endDate.getDate();
this._endMonth = endDate.getMonth();
this._endYear = endDate.getFullYear()} else {
this._endDay = this._currentDay;
this._endMonth = this._currentMonth;
this._endYear = this._currentYear}
}
this._adjustDate()},
_getDate: function() {
var startDate = (!this._currentYear || (this._input && this._input.val() == '') ? null :
new Date(this._currentYear, this._currentMonth, this._currentDay));
if (this._get('rangeSelect')) {
return [this._rangeStart || startDate, (!this._endYear ? null :
new Date(this._endYear, this._endMonth, this._endDay))]} else
return startDate},
_generateDatepicker: function() {
var today = new Date();
today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); 
		var showStatus = this._get('showStatus');
var isRTL = this._get('isRTL');
var clear = (this._get('mandatory') ? '' :
'<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate(' + this._id + ');"' + 
(showStatus ? this._addStatus(this._get('clearStatus') || '&#xa0;') : '') + '>' +
this._get('clearText') + '</a></div>');
var controls = '<div class="ui-datepicker-control">' + (isRTL ? '' : clear) +
'<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"' +
(showStatus ? this._addStatus(this._get('closeStatus') || '&#xa0;') : '') + '>' +
this._get('closeText') + '</a></div>' + (isRTL ? clear : '')  + '</div>';
var prompt = this._get('prompt');
var closeAtTop = this._get('closeAtTop');
var hideIfNoPrevNext = this._get('hideIfNoPrevNext');
var navigationAsDateFormat = this._get('navigationAsDateFormat');
var numMonths = this._getNumberOfMonths();
var stepMonths = this._get('stepMonths');
var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
var minDate = this._getMinMaxDate('min', true);
var maxDate = this._getMinMaxDate('max');
var drawMonth = this._drawMonth;
var drawYear = this._drawYear;
if (maxDate) {
var maxDraw = new Date(maxDate.getFullYear(),
maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate());
maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
while (new Date(drawYear, drawMonth, 1) > maxDraw) {
drawMonth--;
if (drawMonth < 0) {
drawMonth = 11;
drawYear--}
}
}
var prevText = this._get('prevText');
prevText = (!navigationAsDateFormat ? prevText : $.datepicker.formatDate(
prevText, new Date(drawYear, drawMonth - stepMonths, 1), this._getFormatConfig()));
var prev = '<div class="ui-datepicker-prev">' + (this._canAdjustMonth(-1, drawYear, drawMonth) ? 
'<a onclick="jQuery.datepicker._adjustDate(' + this._id + ', -' + stepMonths + ', \'M\');"' +
(showStatus ? this._addStatus(this._get('prevStatus') || '&#xa0;') : '') + '>' + prevText + '</a>' :
(hideIfNoPrevNext ? '' : '<label>' + prevText + '</label>')) + '</div>';
var nextText = this._get('nextText');
nextText = (!navigationAsDateFormat ? nextText : $.datepicker.formatDate(
nextText, new Date(drawYear, drawMonth + stepMonths, 1), this._getFormatConfig()));
var next = '<div class="ui-datepicker-next">' + (this._canAdjustMonth(+1, drawYear, drawMonth) ?
'<a onclick="jQuery.datepicker._adjustDate(' + this._id + ', +' + stepMonths + ', \'M\');"' +
(showStatus ? this._addStatus(this._get('nextStatus') || '&#xa0;') : '') + '>' + nextText + '</a>' :
(hideIfNoPrevNext ? '' : '<label>' + nextText + '</label>')) + '</div>';
var currentText = this._get('currentText');
currentText = (!navigationAsDateFormat ? currentText: $.datepicker.formatDate(
currentText, today, this._getFormatConfig()));
var html = (prompt ? '<div class="' + $.datepicker._promptClass + '">' + prompt + '</div>' : '') +
(closeAtTop && !this._inline ? controls : '') +
'<div class="ui-datepicker-links">' + (isRTL ? next : prev) +
(this._isInRange(today) ? '<div class="ui-datepicker-current">' +
'<a onclick="jQuery.datepicker._gotoToday(' + this._id + ');"' +
(showStatus ? this._addStatus(this._get('currentStatus') || '&#xa0;') : '') + '>' +
currentText + '</a></div>' : '') + (isRTL ? prev : next) + '</div>';
var showWeeks = this._get('showWeeks');
for (var row = 0; row < numMonths[0]; row++)
for (var col = 0; col < numMonths[1]; col++) {
var selectedDate = new Date(drawYear, drawMonth, this._selectedDay);
html += '<div class="ui-datepicker-one-month' + (col == 0 ? ' ui-datepicker-new-row' : '') + '">' +
this._generateMonthYearHeader(drawMonth, drawYear, minDate, maxDate,
selectedDate, row > 0 || col > 0) + 
					'<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead>' + 
'<tr class="ui-datepicker-title-row">' +
(showWeeks ? '<td>' + this._get('weekHeader') + '</td>' : '');
var firstDay = this._get('firstDay');
var changeFirstDay = this._get('changeFirstDay');
var dayNames = this._get('dayNames');
var dayNamesShort = this._get('dayNamesShort');
var dayNamesMin = this._get('dayNamesMin');
for (var dow = 0; dow < 7; dow++) { 
					var day = (dow + firstDay) % 7;
var status = this._get('dayStatus') || '&#xa0;';
status = (status.indexOf('DD') > -1 ? status.replace(/DD/, dayNames[day]) :
status.replace(/D/, dayNamesShort[day]));
html += '<td' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end-cell"' : '') + '>' +
(!changeFirstDay ? '<span' :
'<a onclick="jQuery.datepicker._changeFirstDay(' + this._id + ', ' + day + ');"') + 
(showStatus ? this._addStatus(status) : '') + ' title="' + dayNames[day] + '">' +
dayNamesMin[day] + (changeFirstDay ? '</a>' : '</span>') + '</td>'}
html += '</tr></thead><tbody>';
var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
if (drawYear == this._selectedYear && drawMonth == this._selectedMonth)
this._selectedDay = Math.min(this._selectedDay, daysInMonth);
var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
var currentDate = (!this._currentDay ? new Date(9999, 9, 9) :
new Date(this._currentYear, this._currentMonth, this._currentDay));
var endDate = this._endDay ? new Date(this._endYear, this._endMonth, this._endDay) : currentDate;
var printDate = new Date(drawYear, drawMonth, 1 - leadDays);
var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth)/ 7)); // calculate the number of rows to generate
var beforeShowDay = this._get('beforeShowDay');
var highlightWeek = this._get('highlightWeek');
var showOtherMonths = this._get('showOtherMonths');
var calculateWeek = this._get('calculateWeek') || $.datepicker.iso8601Week;
var dateStatus = this._get('statusForDate') || $.datepicker.dateStatus;
for (var dRow = 0; dRow < numRows; dRow++) { 
					html += '<tr class="ui-datepicker-days-row">' +
(showWeeks ? '<td class="ui-datepicker-week-col">' + calculateWeek(printDate) + '</td>' : '');
for (var dow = 0; dow < 7; dow++) { 
						var daySettings = (beforeShowDay ?
beforeShowDay.apply((this._input ? this._input[0] : null), [printDate]) : [true, '']);
var otherMonth = (printDate.getMonth() != drawMonth);
var unselectable = otherMonth || !daySettings[0] ||
(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
html += '<td class="ui-datepicker-days-cell' +
((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end-cell' : '') + 
							(otherMonth ? ' ui-datepicker-otherMonth' : '') + 
							(printDate.getTime() == selectedDate.getTime() && drawMonth == this._selectedMonth ?
' ui-datepicker-days-cell-over' : '') + 
							(unselectable ? ' ' + $.datepicker._unselectableClass : '') +  
							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + 
							(printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ?  
							' ' + $.datepicker._currentClass : '') + 
							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + 
							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + 
							(unselectable ? (highlightWeek ? ' onmouseover="jQuery(this).parent().addClass(\'ui-datepicker-week-over\');"' + 
							' onmouseout="jQuery(this).parent().removeClass(\'ui-datepicker-week-over\');"' : '') : 
							' onmouseover="jQuery(this).addClass(\'ui-datepicker-days-cell-over\')' + 
							(highlightWeek ? '.parent().addClass(\'ui-datepicker-week-over\')' : '') + ';' + 
							(!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' +
this._id + '\').html(\'' + (dateStatus.apply((this._input ? this._input[0] : null),
[printDate, this]) || '&#xa0;') +'\');') + '"' +
' onmouseout="jQuery(this).removeClass(\'ui-datepicker-days-cell-over\')' + 
							(highlightWeek ? '.parent().removeClass(\'ui-datepicker-week-over\')' : '') + ';' + 
							(!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' +
this._id + '\').html(\'&#xa0;\');') + '" onclick="jQuery.datepicker._selectDay(' +
this._id + ',' + drawMonth + ',' + drawYear + ', this);"') + '>' + 
							(otherMonth ? (showOtherMonths ? printDate.getDate() : '&#xa0;') : 
							(unselectable ? printDate.getDate() : '<a>' + printDate.getDate() + '</a>')) + '</td>'; 
						printDate.setDate(printDate.getDate() + 1)}
html += '</tr>'}
drawMonth++;
if (drawMonth > 11) {
drawMonth = 0;
drawYear++}
html += '</tbody></table></div>'}
html += (showStatus ? '<div style="clear: both;"></div><div id="ui-datepicker-status-' + this._id + 
'" class="ui-datepicker-status">' + (this._get('initStatus') || '&#xa0;') + '</div>' : '') +
(!closeAtTop && !this._inline ? controls : '') +
'<div style="clear: both;"></div>' + 
($.browser.msie && parseInt($.browser.version) < 7 && !this._inline ? 
'<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>' : '');
return html},
_generateMonthYearHeader: function(drawMonth, drawYear, minDate, maxDate, selectedDate, secondary) {
minDate = (this._rangeStart && minDate && selectedDate < minDate ? selectedDate : minDate);
var showStatus = this._get('showStatus');
var html = '<div class="ui-datepicker-header">';
var monthNames = this._get('monthNames');
if (secondary || !this._get('changeMonth'))
html += monthNames[drawMonth] + '&#xa0;';
else {
var inMinYear = (minDate && minDate.getFullYear() == drawYear);
var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
html += '<select class="ui-datepicker-new-month" ' +
'onchange="jQuery.datepicker._selectMonthYear(' + this._id + ', this, \'M\');" ' +
'onclick="jQuery.datepicker._clickMonthYear(' + this._id + ');"' +
(showStatus ? this._addStatus(this._get('monthStatus') || '&#xa0;') : '') + '>';
for (var month = 0; month < 12; month++) {
if ((!inMinYear || month >= minDate.getMonth()) &&
(!inMaxYear || month <= maxDate.getMonth()))
html += '<option value="' + month + '"' +
(month == drawMonth ? ' selected="selected"' : '') +
'>' + monthNames[month] + '</option>'}
html += '</select>'}
if (secondary || !this._get('changeYear'))
html += drawYear;
else {
var years = this._get('yearRange').split(':');
var year = 0;
var endYear = 0;
if (years.length != 2) {
year = drawYear - 10;
endYear = drawYear + 10} else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') {
year = endYear = new Date().getFullYear();
year += parseInt(years[0], 10);
endYear += parseInt(years[1], 10)} else {
year = parseInt(years[0], 10);
endYear = parseInt(years[1], 10)}
year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
html += '<select class="ui-datepicker-new-year" ' +
'onchange="jQuery.datepicker._selectMonthYear(' + this._id + ', this, \'Y\');" ' +
'onclick="jQuery.datepicker._clickMonthYear(' + this._id + ');"' +
(showStatus ? this._addStatus(this._get('yearStatus') || '&#xa0;') : '') + '>';
for (; year <= endYear; year++) {
html += '<option value="' + year + '"' +
(year == drawYear ? ' selected="selected"' : '') +
'>' + year + '</option>'}
html += '</select>'}
html += '</div>';
return html},
_addStatus: function(text) {
return ' onmouseover="jQuery(\'#ui-datepicker-status-' + this._id + '\').html(\'' + text + '\');" ' +
'onmouseout="jQuery(\'#ui-datepicker-status-' + this._id + '\').html(\'&#xa0;\');"'},
_adjustDate: function(offset, period) {
var year = this._drawYear + (period == 'Y' ? offset : 0);
var month = this._drawMonth + (period == 'M' ? offset : 0);
var day = Math.min(this._selectedDay, this._getDaysInMonth(year, month)) +
(period == 'D' ? offset : 0);
var date = new Date(year, month, day);
var minDate = this._getMinMaxDate('min', true);
var maxDate = this._getMinMaxDate('max');
date = (minDate && date < minDate ? minDate : date);
date = (maxDate && date > maxDate ? maxDate : date);
this._selectedDay = date.getDate();
this._drawMonth = this._selectedMonth = date.getMonth();
this._drawYear = this._selectedYear = date.getFullYear();
if (period == 'M' || period == 'Y')
this._notifyChange()},
_notifyChange: function() {
var onChange = this._get('onChangeMonthYear');
if (onChange)
onChange.apply((this._input ? this._input[0] : null),
[new Date(this._selectedYear, this._selectedMonth, 1), this])},
_getNumberOfMonths: function() {
var numMonths = this._get('numberOfMonths');
return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths))},
_getMinMaxDate: function(minMax, checkRange) {
var date = this._determineDate(minMax + 'Date', null);
if (date) {
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0)}
return (!checkRange || !this._rangeStart ? date :
(!date || this._rangeStart > date ? this._rangeStart : date))},
_getDaysInMonth: function(year, month) {
return 32 - new Date(year, month, 32).getDate()},
_getFirstDayOfMonth: function(year, month) {
return new Date(year, month, 1).getDay()},
_canAdjustMonth: function(offset, curYear, curMonth) {
var numMonths = this._getNumberOfMonths();
var date = new Date(curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1);
if (offset < 0)
date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
return this._isInRange(date)},
_isInRange: function(date) {
var newMinDate = (!this._rangeStart ? null :
new Date(this._selectedYear, this._selectedMonth, this._selectedDay));
newMinDate = (newMinDate && this._rangeStart < newMinDate ? this._rangeStart : newMinDate);
var minDate = newMinDate || this._getMinMaxDate('min');
var maxDate = this._getMinMaxDate('max');
return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate))},
_getFormatConfig: function() {
var shortYearCutoff = this._get('shortYearCutoff');
shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
return {shortYearCutoff: shortYearCutoff,
dayNamesShort: this._get('dayNamesShort'), dayNames: this._get('dayNames'),
monthNamesShort: this._get('monthNamesShort'), monthNames: this._get('monthNames')}},
_formatDate: function(day, month, year) {
if (!day) {
this._currentDay = this._selectedDay;
this._currentMonth = this._selectedMonth;
this._currentYear = this._selectedYear}
var date = (day ? (typeof day == 'object' ? day : new Date(year, month, day)) :
new Date(this._currentYear, this._currentMonth, this._currentDay));
return $.datepicker.formatDate(this._get('dateFormat'), date, this._getFormatConfig())}
});
function extendRemove(target, props) {
$.extend(target, props);
for (var name in props)
if (props[name] == null || props[name] == undefined)
target[name] = props[name];
return target};
function isArray(a) {
return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
(a.constructor && a.constructor.toString().match(/\Array\(\)/))))};
$.fn.datepicker = function(options){
var otherArgs = Array.prototype.slice.call(arguments, 1);
if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate'))
return $.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this[0]].concat(otherArgs));
return this.each(function() {
typeof options == 'string' ?
$.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this].concat(otherArgs)) :
$.datepicker._attachDatepicker(this, options)})};
$.datepicker = new Datepicker();
$(document).ready(function() {
$(document.body).append($.datepicker._datepickerDiv).
mousedown($.datepicker._checkExternalClick)})})(jQuery);
