The requested content cannot be loaded.
Please try again later.
',\r\n\t\t\t\tcloseBtn : '').html(content).find(current.selector);\r\n\r\n\t\t\t\t\t} else if (isQuery(content)) {\r\n\t\t\t\t\t\tif (!content.data(placeholder)) {\r\n\t\t\t\t\t\t\tcontent.data(placeholder, $('
').insertAfter( content ).hide() );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tcontent = content.show().detach();\r\n\r\n\t\t\t\t\t\tcurrent.wrap.bind('onReset', function () {\r\n\t\t\t\t\t\t\tif ($(this).find(content).length) {\r\n\t\t\t\t\t\t\t\tcontent.hide().replaceAll( content.data(placeholder) ).data(placeholder, false);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'image':\r\n\t\t\t\t\tcontent = current.tpl.image.replace('{href}', href);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'swf':\r\n\t\t\t\t\tcontent = '
';\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (!(isQuery(content) && content.parent().is(current.inner))) {\r\n\t\t\t\tcurrent.inner.append( content );\r\n\t\t\t}\r\n\r\n\t\t\t// Give a chance for helpers or callbacks to update elements\r\n\t\t\tF.trigger('beforeShow');\r\n\r\n\t\t\t// Set scrolling before calculating dimensions\r\n\t\t\tcurrent.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling));\r\n\r\n\t\t\t// Set initial dimensions and start position\r\n\t\t\tF._setDimension();\r\n\r\n\t\t\tF.reposition();\r\n\r\n\t\t\tF.isOpen = false;\r\n\t\t\tF.coming = null;\r\n\r\n\t\t\tF.bindEvents();\r\n\r\n\t\t\tif (!F.isOpened) {\r\n\t\t\t\t$('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove();\r\n\r\n\t\t\t} else if (previous.prevMethod) {\r\n\t\t\t\tF.transitions[ previous.prevMethod ]();\r\n\t\t\t}\r\n\r\n\t\t\tF.transitions[ F.isOpened ? current.nextMethod : current.openMethod ]();\r\n\r\n\t\t\tF._preloadImages();\r\n\t\t},\r\n\r\n\t\t_setDimension: function () {\r\n\t\t\tvar viewport = F.getViewport(),\r\n\t\t\t\tsteps = 0,\r\n\t\t\t\tcanShrink = false,\r\n\t\t\t\tcanExpand = false,\r\n\t\t\t\twrap = F.wrap,\r\n\t\t\t\tskin = F.skin,\r\n\t\t\t\tinner = F.inner,\r\n\t\t\t\tcurrent = F.current,\r\n\t\t\t\twidth = current.width,\r\n\t\t\t\theight = current.height,\r\n\t\t\t\tminWidth = current.minWidth,\r\n\t\t\t\tminHeight = current.minHeight,\r\n\t\t\t\tmaxWidth = current.maxWidth,\r\n\t\t\t\tmaxHeight = current.maxHeight,\r\n\t\t\t\tscrolling = current.scrolling,\r\n\t\t\t\tscrollOut = current.scrollOutside ? current.scrollbarWidth : 0,\r\n\t\t\t\tmargin = current.margin,\r\n\t\t\t\twMargin = getScalar(margin[1] + margin[3]),\r\n\t\t\t\thMargin = getScalar(margin[0] + margin[2]),\r\n\t\t\t\twPadding,\r\n\t\t\t\thPadding,\r\n\t\t\t\twSpace,\r\n\t\t\t\thSpace,\r\n\t\t\t\torigWidth,\r\n\t\t\t\torigHeight,\r\n\t\t\t\torigMaxWidth,\r\n\t\t\t\torigMaxHeight,\r\n\t\t\t\tratio,\r\n\t\t\t\twidth_,\r\n\t\t\t\theight_,\r\n\t\t\t\tmaxWidth_,\r\n\t\t\t\tmaxHeight_,\r\n\t\t\t\tiframe,\r\n\t\t\t\tbody;\r\n\r\n\t\t\t// Reset dimensions so we could re-check actual size\r\n\t\t\twrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp');\r\n\r\n\t\t\twPadding = getScalar(skin.outerWidth(true) - skin.width());\r\n\t\t\thPadding = getScalar(skin.outerHeight(true) - skin.height());\r\n\r\n\t\t\t// Any space between content and viewport (margin, padding, border, title)\r\n\t\t\twSpace = wMargin + wPadding;\r\n\t\t\thSpace = hMargin + hPadding;\r\n\r\n\t\t\torigWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width;\r\n\t\t\torigHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height;\r\n\r\n\t\t\tif (current.type === 'iframe') {\r\n\t\t\t\tiframe = current.content;\r\n\r\n\t\t\t\tif (current.autoHeight && iframe.data('ready') === 1) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tif (iframe[0].contentWindow.document.location) {\r\n\t\t\t\t\t\t\tinner.width( origWidth ).height(9999);\r\n\r\n\t\t\t\t\t\t\tbody = iframe.contents().find('body');\r\n\r\n\t\t\t\t\t\t\tif (scrollOut) {\r\n\t\t\t\t\t\t\t\tbody.css('overflow-x', 'hidden');\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\torigHeight = body.outerHeight(true);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} catch (e) {}\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (current.autoWidth || current.autoHeight) {\r\n\t\t\t\tinner.addClass( 'fancybox-tmp' );\r\n\r\n\t\t\t\t// Set width or height in case we need to calculate only one dimension\r\n\t\t\t\tif (!current.autoWidth) {\r\n\t\t\t\t\tinner.width( origWidth );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!current.autoHeight) {\r\n\t\t\t\t\tinner.height( origHeight );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (current.autoWidth) {\r\n\t\t\t\t\torigWidth = inner.width();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (current.autoHeight) {\r\n\t\t\t\t\torigHeight = inner.height();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tinner.removeClass( 'fancybox-tmp' );\r\n\t\t\t}\r\n\r\n\t\t\twidth = getScalar( origWidth );\r\n\t\t\theight = getScalar( origHeight );\r\n\r\n\t\t\tratio = origWidth / origHeight;\r\n\r\n\t\t\t// Calculations for the content\r\n\t\t\tminWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth);\r\n\t\t\tmaxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth);\r\n\r\n\t\t\tminHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight);\r\n\t\t\tmaxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight);\r\n\r\n\t\t\t// These will be used to determine if wrap can fit in the viewport\r\n\t\t\torigMaxWidth = maxWidth;\r\n\t\t\torigMaxHeight = maxHeight;\r\n\r\n\t\t\tif (current.fitToView) {\r\n\t\t\t\tmaxWidth = Math.min(viewport.w - wSpace, maxWidth);\r\n\t\t\t\tmaxHeight = Math.min(viewport.h - hSpace, maxHeight);\r\n\t\t\t}\r\n\r\n\t\t\tmaxWidth_ = viewport.w - wMargin;\r\n\t\t\tmaxHeight_ = viewport.h - hMargin;\r\n\r\n\t\t\tif (current.aspectRatio) {\r\n\t\t\t\tif (width > maxWidth) {\r\n\t\t\t\t\twidth = maxWidth;\r\n\t\t\t\t\theight = getScalar(width / ratio);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (height > maxHeight) {\r\n\t\t\t\t\theight = maxHeight;\r\n\t\t\t\t\twidth = getScalar(height * ratio);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (width < minWidth) {\r\n\t\t\t\t\twidth = minWidth;\r\n\t\t\t\t\theight = getScalar(width / ratio);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (height < minHeight) {\r\n\t\t\t\t\theight = minHeight;\r\n\t\t\t\t\twidth = getScalar(height * ratio);\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\t\t\t\twidth = Math.max(minWidth, Math.min(width, maxWidth));\r\n\r\n\t\t\t\tif (current.autoHeight && current.type !== 'iframe') {\r\n\t\t\t\t\tinner.width( width );\r\n\r\n\t\t\t\t\theight = inner.height();\r\n\t\t\t\t}\r\n\r\n\t\t\t\theight = Math.max(minHeight, Math.min(height, maxHeight));\r\n\t\t\t}\r\n\r\n\t\t\t// Try to fit inside viewport (including the title)\r\n\t\t\tif (current.fitToView) {\r\n\t\t\t\tinner.width( width ).height( height );\r\n\r\n\t\t\t\twrap.width( width + wPadding );\r\n\r\n\t\t\t\t// Real wrap dimensions\r\n\t\t\t\twidth_ = wrap.width();\r\n\t\t\t\theight_ = wrap.height();\r\n\r\n\t\t\t\tif (current.aspectRatio) {\r\n\t\t\t\t\twhile ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) {\r\n\t\t\t\t\t\tif (steps++ > 19) {\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\theight = Math.max(minHeight, Math.min(maxHeight, height - 10));\r\n\t\t\t\t\t\twidth = getScalar(height * ratio);\r\n\r\n\t\t\t\t\t\tif (width < minWidth) {\r\n\t\t\t\t\t\t\twidth = minWidth;\r\n\t\t\t\t\t\t\theight = getScalar(width / ratio);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (width > maxWidth) {\r\n\t\t\t\t\t\t\twidth = maxWidth;\r\n\t\t\t\t\t\t\theight = getScalar(width / ratio);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tinner.width( width ).height( height );\r\n\r\n\t\t\t\t\t\twrap.width( width + wPadding );\r\n\r\n\t\t\t\t\t\twidth_ = wrap.width();\r\n\t\t\t\t\t\theight_ = wrap.height();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\twidth = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_)));\r\n\t\t\t\t\theight = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_)));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) {\r\n\t\t\t\twidth += scrollOut;\r\n\t\t\t}\r\n\r\n\t\t\tinner.width( width ).height( height );\r\n\r\n\t\t\twrap.width( width + wPadding );\r\n\r\n\t\t\twidth_ = wrap.width();\r\n\t\t\theight_ = wrap.height();\r\n\r\n\t\t\tcanShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight;\r\n\t\t\tcanExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight));\r\n\r\n\t\t\t$.extend(current, {\r\n\t\t\t\tdim : {\r\n\t\t\t\t\twidth\t: getValue( width_ ),\r\n\t\t\t\t\theight\t: getValue( height_ )\r\n\t\t\t\t},\r\n\t\t\t\torigWidth : origWidth,\r\n\t\t\t\torigHeight : origHeight,\r\n\t\t\t\tcanShrink : canShrink,\r\n\t\t\t\tcanExpand : canExpand,\r\n\t\t\t\twPadding : wPadding,\r\n\t\t\t\thPadding : hPadding,\r\n\t\t\t\twrapSpace : height_ - skin.outerHeight(true),\r\n\t\t\t\tskinSpace : skin.height() - height\r\n\t\t\t});\r\n\r\n\t\t\tif (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) {\r\n\t\t\t\tinner.height('auto');\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_getPosition: function (onlyAbsolute) {\r\n\t\t\tvar current = F.current,\r\n\t\t\t\tviewport = F.getViewport(),\r\n\t\t\t\tmargin = current.margin,\r\n\t\t\t\twidth = F.wrap.width() + margin[1] + margin[3],\r\n\t\t\t\theight = F.wrap.height() + margin[0] + margin[2],\r\n\t\t\t\trez = {\r\n\t\t\t\t\tposition: 'absolute',\r\n\t\t\t\t\ttop : margin[0],\r\n\t\t\t\t\tleft : margin[3]\r\n\t\t\t\t};\r\n\r\n\t\t\tif (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) {\r\n\t\t\t\trez.position = 'fixed';\r\n\r\n\t\t\t} else if (!current.locked) {\r\n\t\t\t\trez.top += viewport.y;\r\n\t\t\t\trez.left += viewport.x;\r\n\t\t\t}\r\n\r\n\t\t\trez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio)));\r\n\t\t\trez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * current.leftRatio)));\r\n\r\n\t\t\treturn rez;\r\n\t\t},\r\n\r\n\t\t_afterZoomIn: function () {\r\n\t\t\tvar current = F.current;\r\n\r\n\t\t\tif (!current) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tF.isOpen = F.isOpened = true;\r\n\r\n\t\t\tF.wrap.css('overflow', 'visible').addClass('fancybox-opened');\r\n\r\n\t\t\tF.update();\r\n\r\n\t\t\t// Assign a click event\r\n\t\t\tif ( current.closeClick || (current.nextClick && F.group.length > 1) ) {\r\n\t\t\t\tF.inner.css('cursor', 'pointer').bind('click.fb', function(e) {\r\n\t\t\t\t\tif (!$(e.target).is('a') && !$(e.target).parent().is('a')) {\r\n\t\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\t\tF[ current.closeClick ? 'close' : 'next' ]();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Create a close button\r\n\t\t\tif (current.closeBtn) {\r\n\t\t\t\t$(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) {\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\tF.close();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Create navigation arrows\r\n\t\t\tif (current.arrows && F.group.length > 1) {\r\n\t\t\t\tif (current.loop || current.index > 0) {\r\n\t\t\t\t\t$(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (current.loop || current.index < F.group.length - 1) {\r\n\t\t\t\t\t$(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tF.trigger('afterShow');\r\n\r\n\t\t\t// Stop the slideshow if this is the last item\r\n\t\t\tif (!current.loop && current.index === current.group.length - 1) {\r\n\t\t\t\tF.play( false );\r\n\r\n\t\t\t} else if (F.opts.autoPlay && !F.player.isActive) {\r\n\t\t\t\tF.opts.autoPlay = false;\r\n\r\n\t\t\t\tF.play();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_afterZoomOut: function ( obj ) {\r\n\t\t\tobj = obj || F.current;\r\n\r\n\t\t\t$('.fancybox-wrap').trigger('onReset').remove();\r\n\r\n\t\t\t$.extend(F, {\r\n\t\t\t\tgroup : {},\r\n\t\t\t\topts : {},\r\n\t\t\t\trouter : false,\r\n\t\t\t\tcurrent : null,\r\n\t\t\t\tisActive : false,\r\n\t\t\t\tisOpened : false,\r\n\t\t\t\tisOpen : false,\r\n\t\t\t\tisClosing : false,\r\n\t\t\t\twrap : null,\r\n\t\t\t\tskin : null,\r\n\t\t\t\touter : null,\r\n\t\t\t\tinner : null\r\n\t\t\t});\r\n\r\n\t\t\tF.trigger('afterClose', obj);\r\n\t\t}\r\n\t});\r\n\r\n\t/*\r\n\t *\tDefault transitions\r\n\t */\r\n\r\n\tF.transitions = {\r\n\t\tgetOrigPosition: function () {\r\n\t\t\tvar current = F.current,\r\n\t\t\t\telement = current.element,\r\n\t\t\t\torig = current.orig,\r\n\t\t\t\tpos = {},\r\n\t\t\t\twidth = 50,\r\n\t\t\t\theight = 50,\r\n\t\t\t\thPadding = current.hPadding,\r\n\t\t\t\twPadding = current.wPadding,\r\n\t\t\t\tviewport = F.getViewport();\r\n\r\n\t\t\tif (!orig && current.isDom && element.is(':visible')) {\r\n\t\t\t\torig = element.find('img:first');\r\n\r\n\t\t\t\tif (!orig.length) {\r\n\t\t\t\t\torig = element;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isQuery(orig)) {\r\n\t\t\t\tpos = orig.offset();\r\n\r\n\t\t\t\tif (orig.is('img')) {\r\n\t\t\t\t\twidth = orig.outerWidth();\r\n\t\t\t\t\theight = orig.outerHeight();\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\t\t\t\tpos.top = viewport.y + (viewport.h - height) * current.topRatio;\r\n\t\t\t\tpos.left = viewport.x + (viewport.w - width) * current.leftRatio;\r\n\t\t\t}\r\n\r\n\t\t\tif (F.wrap.css('position') === 'fixed' || current.locked) {\r\n\t\t\t\tpos.top -= viewport.y;\r\n\t\t\t\tpos.left -= viewport.x;\r\n\t\t\t}\r\n\r\n\t\t\tpos = {\r\n\t\t\t\ttop : getValue(pos.top - hPadding * current.topRatio),\r\n\t\t\t\tleft : getValue(pos.left - wPadding * current.leftRatio),\r\n\t\t\t\twidth : getValue(width + wPadding),\r\n\t\t\t\theight : getValue(height + hPadding)\r\n\t\t\t};\r\n\r\n\t\t\treturn pos;\r\n\t\t},\r\n\r\n\t\tstep: function (now, fx) {\r\n\t\t\tvar ratio,\r\n\t\t\t\tpadding,\r\n\t\t\t\tvalue,\r\n\t\t\t\tprop = fx.prop,\r\n\t\t\t\tcurrent = F.current,\r\n\t\t\t\twrapSpace = current.wrapSpace,\r\n\t\t\t\tskinSpace = current.skinSpace;\r\n\r\n\t\t\tif (prop === 'width' || prop === 'height') {\r\n\t\t\t\tratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start);\r\n\r\n\t\t\t\tif (F.isClosing) {\r\n\t\t\t\t\tratio = 1 - ratio;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpadding = prop === 'width' ? current.wPadding : current.hPadding;\r\n\t\t\t\tvalue = now - padding;\r\n\r\n\t\t\t\tF.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) );\r\n\t\t\t\tF.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tzoomIn: function () {\r\n\t\t\tvar current = F.current,\r\n\t\t\t\tstartPos = current.pos,\r\n\t\t\t\teffect = current.openEffect,\r\n\t\t\t\telastic = effect === 'elastic',\r\n\t\t\t\tendPos = $.extend({opacity : 1}, startPos);\r\n\r\n\t\t\t// Remove \"position\" property that breaks older IE\r\n\t\t\tdelete endPos.position;\r\n\r\n\t\t\tif (elastic) {\r\n\t\t\t\tstartPos = this.getOrigPosition();\r\n\r\n\t\t\t\tif (current.openOpacity) {\r\n\t\t\t\t\tstartPos.opacity = 0.1;\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (effect === 'fade') {\r\n\t\t\t\tstartPos.opacity = 0.1;\r\n\t\t\t}\r\n\r\n\t\t\tF.wrap.css(startPos).animate(endPos, {\r\n\t\t\t\tduration : effect === 'none' ? 0 : current.openSpeed,\r\n\t\t\t\teasing : current.openEasing,\r\n\t\t\t\tstep : elastic ? this.step : null,\r\n\t\t\t\tcomplete : F._afterZoomIn\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tzoomOut: function () {\r\n\t\t\tvar current = F.current,\r\n\t\t\t\teffect = current.closeEffect,\r\n\t\t\t\telastic = effect === 'elastic',\r\n\t\t\t\tendPos = {opacity : 0.1};\r\n\r\n\t\t\tif (elastic) {\r\n\t\t\t\tendPos = this.getOrigPosition();\r\n\r\n\t\t\t\tif (current.closeOpacity) {\r\n\t\t\t\t\tendPos.opacity = 0.1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tF.wrap.animate(endPos, {\r\n\t\t\t\tduration : effect === 'none' ? 0 : current.closeSpeed,\r\n\t\t\t\teasing : current.closeEasing,\r\n\t\t\t\tstep : elastic ? this.step : null,\r\n\t\t\t\tcomplete : F._afterZoomOut\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tchangeIn: function () {\r\n\t\t\tvar current = F.current,\r\n\t\t\t\teffect = current.nextEffect,\r\n\t\t\t\tstartPos = current.pos,\r\n\t\t\t\tendPos = { opacity : 1 },\r\n\t\t\t\tdirection = F.direction,\r\n\t\t\t\tdistance = 200,\r\n\t\t\t\tfield;\r\n\r\n\t\t\tstartPos.opacity = 0.1;\r\n\r\n\t\t\tif (effect === 'elastic') {\r\n\t\t\t\tfield = direction === 'down' || direction === 'up' ? 'top' : 'left';\r\n\r\n\t\t\t\tif (direction === 'down' || direction === 'right') {\r\n\t\t\t\t\tstartPos[ field ] = getValue(getScalar(startPos[ field ]) - distance);\r\n\t\t\t\t\tendPos[ field ] = '+=' + distance + 'px';\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstartPos[ field ] = getValue(getScalar(startPos[ field ]) + distance);\r\n\t\t\t\t\tendPos[ field ] = '-=' + distance + 'px';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Workaround for http://bugs.jquery.com/ticket/12273\r\n\t\t\tif (effect === 'none') {\r\n\t\t\t\tF._afterZoomIn();\r\n\r\n\t\t\t} else {\r\n\t\t\t\tF.wrap.css(startPos).animate(endPos, {\r\n\t\t\t\t\tduration : current.nextSpeed,\r\n\t\t\t\t\teasing : current.nextEasing,\r\n\t\t\t\t\tcomplete : F._afterZoomIn\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tchangeOut: function () {\r\n\t\t\tvar previous = F.previous,\r\n\t\t\t\teffect = previous.prevEffect,\r\n\t\t\t\tendPos = { opacity : 0.1 },\r\n\t\t\t\tdirection = F.direction,\r\n\t\t\t\tdistance = 200;\r\n\r\n\t\t\tif (effect === 'elastic') {\r\n\t\t\t\tendPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px';\r\n\t\t\t}\r\n\r\n\t\t\tprevious.wrap.animate(endPos, {\r\n\t\t\t\tduration : effect === 'none' ? 0 : previous.prevSpeed,\r\n\t\t\t\teasing : previous.prevEasing,\r\n\t\t\t\tcomplete : function () {\r\n\t\t\t\t\t$(this).trigger('onReset').remove();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\t/*\r\n\t *\tOverlay helper\r\n\t */\r\n\r\n\tF.helpers.overlay = {\r\n\t\tdefaults : {\r\n\t\t\tcloseClick : true, // if true, fancyBox will be closed when user clicks on the overlay\r\n\t\t\tspeedOut : 200, // duration of fadeOut animation\r\n\t\t\tshowEarly : true, // indicates if should be opened immediately or wait until the content is ready\r\n\t\t\tcss : {}, // custom CSS properties\r\n\t\t\tlocked : !isTouch, // if true, the content will be locked into overlay\r\n\t\t\tfixed : true // if false, the overlay CSS position property will not be set to \"fixed\"\r\n\t\t},\r\n\r\n\t\toverlay : null, // current handle\r\n\t\tfixed : false, // indicates if the overlay has position \"fixed\"\r\n\t\tel : $('html'), // element that contains \"the lock\"\r\n\r\n\t\t// Public methods\r\n\t\tcreate : function(opts) {\r\n\t\t\topts = $.extend({}, this.defaults, opts);\r\n\r\n\t\t\tif (this.overlay) {\r\n\t\t\t\tthis.close();\r\n\t\t\t}\r\n\r\n\t\t\tthis.overlay = $('
').appendTo( F.coming ? F.coming.parent : opts.parent );\r\n\t\t\tthis.fixed = false;\r\n\r\n\t\t\tif (opts.fixed && F.defaults.fixed) {\r\n\t\t\t\tthis.overlay.addClass('fancybox-overlay-fixed');\r\n\r\n\t\t\t\tthis.fixed = true;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\topen : function(opts) {\r\n\t\t\tvar that = this;\r\n\r\n\t\t\topts = $.extend({}, this.defaults, opts);\r\n\r\n\t\t\tif (this.overlay) {\r\n\t\t\t\tthis.overlay.unbind('.overlay').width('auto').height('auto');\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis.create(opts);\r\n\t\t\t}\r\n\r\n\t\t\tif (!this.fixed) {\r\n\t\t\t\tW.bind('resize.overlay', $.proxy( this.update, this) );\r\n\r\n\t\t\t\tthis.update();\r\n\t\t\t}\r\n\r\n\t\t\tif (opts.closeClick) {\r\n\t\t\t\tthis.overlay.bind('click.overlay', function(e) {\r\n\t\t\t\t\tif ($(e.target).hasClass('fancybox-overlay')) {\r\n\t\t\t\t\t\tif (F.isActive) {\r\n\t\t\t\t\t\t\tF.close();\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthat.close();\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.overlay.css( opts.css ).show();\r\n\t\t},\r\n\r\n\t\tclose : function() {\r\n\t\t\tvar scrollV, scrollH;\r\n\r\n\t\t\tW.unbind('resize.overlay');\r\n\r\n\t\t\tif (this.el.hasClass('fancybox-lock')) {\r\n\t\t\t\t$('.fancybox-margin').removeClass('fancybox-margin');\r\n\r\n\t\t\t\tscrollV = W.scrollTop();\r\n\t\t\t\tscrollH = W.scrollLeft();\r\n\r\n\t\t\t\tthis.el.removeClass('fancybox-lock');\r\n\r\n\t\t\t\tW.scrollTop( scrollV ).scrollLeft( scrollH );\r\n\t\t\t}\r\n\r\n\t\t\t$('.fancybox-overlay').remove().hide();\r\n\r\n\t\t\t$.extend(this, {\r\n\t\t\t\toverlay : null,\r\n\t\t\t\tfixed : false\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t// Private, callbacks\r\n\r\n\t\tupdate : function () {\r\n\t\t\tvar width = '100%', offsetWidth;\r\n\r\n\t\t\t// Reset width/height so it will not mess\r\n\t\t\tthis.overlay.width(width).height('100%');\r\n\r\n\t\t\t// jQuery does not return reliable result for IE\r\n\t\t\tif (IE) {\r\n\t\t\t\toffsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth);\r\n\r\n\t\t\t\tif (D.width() > offsetWidth) {\r\n\t\t\t\t\twidth = D.width();\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (D.width() > W.width()) {\r\n\t\t\t\twidth = D.width();\r\n\t\t\t}\r\n\r\n\t\t\tthis.overlay.width(width).height(D.height());\r\n\t\t},\r\n\r\n\t\t// This is where we can manipulate DOM, because later it would cause iframes to reload\r\n\t\tonReady : function (opts, obj) {\r\n\t\t\tvar overlay = this.overlay;\r\n\r\n\t\t\t$('.fancybox-overlay').stop(true, true);\r\n\r\n\t\t\tif (!overlay) {\r\n\t\t\t\tthis.create(opts);\r\n\t\t\t}\r\n\r\n\t\t\tif (opts.locked && this.fixed && obj.fixed) {\r\n\t\t\t\tif (!overlay) {\r\n\t\t\t\t\tthis.margin = D.height() > W.height() ? $('html').css('margin-right').replace(\"px\", \"\") : false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobj.locked = this.overlay.append( obj.wrap );\r\n\t\t\t\tobj.fixed = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (opts.showEarly === true) {\r\n\t\t\t\tthis.beforeShow.apply(this, arguments);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tbeforeShow : function(opts, obj) {\r\n\t\t\tvar scrollV, scrollH;\r\n\r\n\t\t\tif (obj.locked) {\r\n\t\t\t\tif (this.margin !== false) {\r\n\t\t\t\t\t$('*').filter(function(){\r\n\t\t\t\t\t\treturn ($(this).css('position') === 'fixed' && !$(this).hasClass(\"fancybox-overlay\") && !$(this).hasClass(\"fancybox-wrap\") );\r\n\t\t\t\t\t}).addClass('fancybox-margin');\r\n\r\n\t\t\t\t\tthis.el.addClass('fancybox-margin');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tscrollV = W.scrollTop();\r\n\t\t\t\tscrollH = W.scrollLeft();\r\n\r\n\t\t\t\tthis.el.addClass('fancybox-lock');\r\n\r\n\t\t\t\tW.scrollTop( scrollV ).scrollLeft( scrollH );\r\n\t\t\t}\r\n\r\n\t\t\tthis.open(opts);\r\n\t\t},\r\n\r\n\t\tonUpdate : function() {\r\n\t\t\tif (!this.fixed) {\r\n\t\t\t\tthis.update();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tafterClose: function (opts) {\r\n\t\t\t// Remove overlay if exists and fancyBox is not opening\r\n\t\t\t// (e.g., it is not being open using afterClose callback)\r\n\t\t\t//if (this.overlay && !F.isActive) {\r\n\t\t\tif (this.overlay && !F.coming) {\r\n\t\t\t\tthis.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this ));\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/*\r\n\t *\tTitle helper\r\n\t */\r\n\r\n\tF.helpers.title = {\r\n\t\tdefaults : {\r\n\t\t\ttype : 'float', // 'float', 'inside', 'outside' or 'over',\r\n\t\t\tposition : 'bottom' // 'top' or 'bottom'\r\n\t\t},\r\n\r\n\t\tbeforeShow: function (opts) {\r\n\t\t\tvar current = F.current,\r\n\t\t\t\ttext = current.title,\r\n\t\t\t\ttype = opts.type,\r\n\t\t\t\ttitle,\r\n\t\t\t\ttarget;\r\n\r\n\t\t\tif ($.isFunction(text)) {\r\n\t\t\t\ttext = text.call(current.element, current);\r\n\t\t\t}\r\n\r\n\t\t\tif (!isString(text) || $.trim(text) === '') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttitle = $('
' + text + '
');\r\n\r\n\t\t\tswitch (type) {\r\n\t\t\t\tcase 'inside':\r\n\t\t\t\t\ttarget = F.skin;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'outside':\r\n\t\t\t\t\ttarget = F.wrap;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'over':\r\n\t\t\t\t\ttarget = F.inner;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault: // 'float'\r\n\t\t\t\t\ttarget = F.skin;\r\n\r\n\t\t\t\t\ttitle.appendTo('body');\r\n\r\n\t\t\t\t\tif (IE) {\r\n\t\t\t\t\t\ttitle.width( title.width() );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttitle.wrapInner('
');\r\n\r\n\t\t\t\t\t//Increase bottom margin so this title will also fit into viewport\r\n\t\t\t\t\tF.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) );\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\ttitle[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target);\r\n\t\t}\r\n\t};\r\n\r\n\t// jQuery plugin initialization\r\n\t$.fn.fancybox = function (options) {\r\n\t\tvar index,\r\n\t\t\tthat = $(this),\r\n\t\t\tselector = this.selector || '',\r\n\t\t\trun = function(e) {\r\n\t\t\t\tvar what = $(this).blur(), idx = index, relType, relVal;\r\n\r\n\t\t\t\tif (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) {\r\n\t\t\t\t\trelType = options.groupAttr || 'data-fancybox-group';\r\n\t\t\t\t\trelVal = what.attr(relType);\r\n\r\n\t\t\t\t\tif (!relVal) {\r\n\t\t\t\t\t\trelType = 'rel';\r\n\t\t\t\t\t\trelVal = what.get(0)[ relType ];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (relVal && relVal !== '' && relVal !== 'nofollow') {\r\n\t\t\t\t\t\twhat = selector.length ? $(selector) : that;\r\n\t\t\t\t\t\twhat = what.filter('[' + relType + '=\"' + relVal + '\"]');\r\n\t\t\t\t\t\tidx = what.index(this);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\toptions.index = idx;\r\n\r\n\t\t\t\t\t// Stop an event from bubbling if everything is fine\r\n\t\t\t\t\tif (F.open(what, options) !== false) {\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\toptions = options || {};\r\n\t\tindex = options.index || 0;\r\n\r\n\t\tif (!selector || options.live === false) {\r\n\t\t\tthat.unbind('click.fb-start').bind('click.fb-start', run);\r\n\r\n\t\t} else {\r\n\t\t\tD.undelegate(selector, 'click.fb-start').delegate(selector + \":not('.fancybox-item, .fancybox-nav')\", 'click.fb-start', run);\r\n\t\t}\r\n\r\n\t\tthis.filter('[data-fancybox-start=1]').trigger('click');\r\n\r\n\t\treturn this;\r\n\t};\r\n\r\n\t// Tests that need a body at doc ready\r\n\tD.ready(function() {\r\n\t\tvar w1, w2;\r\n\r\n\t\tif ( $.scrollbarWidth === undefined ) {\r\n\t\t\t// http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth\r\n\t\t\t$.scrollbarWidth = function() {\r\n\t\t\t\tvar parent = $('
').appendTo('body'),\r\n\t\t\t\t\tchild = parent.children(),\r\n\t\t\t\t\twidth = child.innerWidth() - child.height( 99 ).innerWidth();\r\n\r\n\t\t\t\tparent.remove();\r\n\r\n\t\t\t\treturn width;\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif ( $.support.fixedPosition === undefined ) {\r\n\t\t\t$.support.fixedPosition = (function() {\r\n\t\t\t\tvar elem = $('
').appendTo('body'),\r\n\t\t\t\t\tfixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 );\r\n\r\n\t\t\t\telem.remove();\r\n\r\n\t\t\t\treturn fixed;\r\n\t\t\t}());\r\n\t\t}\r\n\r\n\t\t$.extend(F.defaults, {\r\n\t\t\tscrollbarWidth : $.scrollbarWidth(),\r\n\t\t\tfixed : $.support.fixedPosition,\r\n\t\t\tparent : $('body')\r\n\t\t});\r\n\r\n\t\t//Get real width of page scroll-bar\r\n\t\tw1 = $(window).width();\r\n\r\n\t\tH.addClass('fancybox-lock-test');\r\n\r\n\t\tw2 = $(window).width();\r\n\r\n\t\tH.removeClass('fancybox-lock-test');\r\n\r\n\t\t$(\"\").appendTo(\"head\");\r\n\t});\r\n\r\n}(window, document, jQuery));","/*\r\n * jQuery FlexSlider v2.2.2\r\n * Copyright 2012 WooThemes\r\n * Contributing Author: Tyler Smith\r\n */(function(e){e.flexslider=function(t,n){var r=e(t);r.vars=e.extend({},e.flexslider.defaults,n);var i=r.vars.namespace,s=window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture,o=(\"ontouchstart\"in window||s||window.DocumentTouch&&document instanceof DocumentTouch)&&r.vars.touch,u=\"click touchend MSPointerUp\",a=\"\",f,l=r.vars.direction===\"vertical\",c=r.vars.reverse,h=r.vars.itemWidth>0,p=r.vars.animation===\"fade\",d=r.vars.asNavFor!==\"\",v={},m=!0;e.data(t,\"flexslider\",r);v={init:function(){r.animating=!1;r.currentSlide=parseInt(r.vars.startAt?r.vars.startAt:0,10);isNaN(r.currentSlide)&&(r.currentSlide=0);r.animatingTo=r.currentSlide;r.atEnd=r.currentSlide===0||r.currentSlide===r.last;r.containerSelector=r.vars.selector.substr(0,r.vars.selector.search(\" \"));r.slides=e(r.vars.selector,r);r.container=e(r.containerSelector,r);r.count=r.slides.length;r.syncExists=e(r.vars.sync).length>0;r.vars.animation===\"slide\"&&(r.vars.animation=\"swing\");r.prop=l?\"top\":\"marginLeft\";r.args={};r.manualPause=!1;r.stopped=!1;r.started=!1;r.startTimeout=null;r.transitions=!r.vars.video&&!p&&r.vars.useCSS&&function(){var e=document.createElement(\"div\"),t=[\"perspectiveProperty\",\"WebkitPerspective\",\"MozPerspective\",\"OPerspective\",\"msPerspective\"];for(var n in t)if(e.style[t[n]]!==undefined){r.pfx=t[n].replace(\"Perspective\",\"\").toLowerCase();r.prop=\"-\"+r.pfx+\"-transform\";return!0}return!1}();r.vars.controlsContainer!==\"\"&&(r.controlsContainer=e(r.vars.controlsContainer).length>0&&e(r.vars.controlsContainer));r.vars.manualControls!==\"\"&&(r.manualControls=e(r.vars.manualControls).length>0&&e(r.vars.manualControls));if(r.vars.randomize){r.slides.sort(function(){return Math.round(Math.random())-.5});r.container.empty().append(r.slides)}r.doMath();r.setup(\"init\");r.vars.controlNav&&v.controlNav.setup();r.vars.directionNav&&v.directionNav.setup();r.vars.keyboard&&(e(r.containerSelector).length===1||r.vars.multipleKeyboard)&&e(document).bind(\"keyup\",function(e){var t=e.keyCode;if(!r.animating&&(t===39||t===37)){var n=t===39?r.getTarget(\"next\"):t===37?r.getTarget(\"prev\"):!1;r.flexAnimate(n,r.vars.pauseOnAction)}});r.vars.mousewheel&&r.bind(\"mousewheel\",function(e,t,n,i){e.preventDefault();var s=t<0?r.getTarget(\"next\"):r.getTarget(\"prev\");r.flexAnimate(s,r.vars.pauseOnAction)});r.vars.pausePlay&&v.pausePlay.setup();r.vars.slideshow&&r.vars.pauseInvisible&&v.pauseInvisible.init();if(r.vars.slideshow){r.vars.pauseOnHover&&r.hover(function(){!r.manualPlay&&!r.manualPause&&r.pause()},function(){!r.manualPause&&!r.manualPlay&&!r.stopped&&r.play()});if(!r.vars.pauseInvisible||!v.pauseInvisible.isHidden())r.vars.initDelay>0?r.startTimeout=setTimeout(r.play,r.vars.initDelay):r.play()}d&&v.asNav.setup();o&&r.vars.touch&&v.touch();(!p||p&&r.vars.smoothHeight)&&e(window).bind(\"resize orientationchange focus\",v.resize);r.find(\"img\").attr(\"draggable\",\"false\");setTimeout(function(){r.vars.start(r)},200)},asNav:{setup:function(){r.asNav=!0;r.animatingTo=Math.floor(r.currentSlide/r.move);r.currentItem=r.currentSlide;r.slides.removeClass(i+\"active-slide\").eq(r.currentItem).addClass(i+\"active-slide\");if(!s)r.slides.on(u,function(t){t.preventDefault();var n=e(this),s=n.index(),o=n.offset().left-e(r).scrollLeft();if(o<=0&&n.hasClass(i+\"active-slide\"))r.flexAnimate(r.getTarget(\"prev\"),!0);else if(!e(r.vars.asNavFor).data(\"flexslider\").animating&&!n.hasClass(i+\"active-slide\")){r.direction=r.currentItem
');if(r.pagingCount>1)for(var f=0;f':\"\"+n+\"\";if(\"thumbnails\"===r.vars.controlNav&&!0===r.vars.thumbCaptions){var l=o.attr(\"data-thumbcaption\");\"\"!=l&&undefined!=l&&(s+=''+l+\"\")}r.controlNavScaffold.append(\"\"+s+\"\");n++}r.controlsContainer?e(r.controlsContainer).append(r.controlNavScaffold):r.append(r.controlNavScaffold);v.controlNav.set();v.controlNav.active();r.controlNavScaffold.delegate(\"a, img\",u,function(t){t.preventDefault();if(a===\"\"||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+\"active\")){r.direction=s>r.currentSlide?\"next\":\"prev\";r.flexAnimate(s,r.vars.pauseOnAction)}}a===\"\"&&(a=t.type);v.setToClearWatchedEvent()})},setupManual:function(){r.controlNav=r.manualControls;v.controlNav.active();r.controlNav.bind(u,function(t){t.preventDefault();if(a===\"\"||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+\"active\")){s>r.currentSlide?r.direction=\"next\":r.direction=\"prev\";r.flexAnimate(s,r.vars.pauseOnAction)}}a===\"\"&&(a=t.type);v.setToClearWatchedEvent()})},set:function(){var t=r.vars.controlNav===\"thumbnails\"?\"img\":\"a\";r.controlNav=e(\".\"+i+\"control-nav li \"+t,r.controlsContainer?r.controlsContainer:r)},active:function(){r.controlNav.removeClass(i+\"active\").eq(r.animatingTo).addClass(i+\"active\")},update:function(t,n){r.pagingCount>1&&t===\"add\"?r.controlNavScaffold.append(e(\"\"+r.count+\"\")):r.pagingCount===1?r.controlNavScaffold.find(\"li\").remove():r.controlNav.eq(n).closest(\"li\").remove();v.controlNav.set();r.pagingCount>1&&r.pagingCount!==r.controlNav.length?r.update(n,t):v.controlNav.active()}},directionNav:{setup:function(){var t=e('\");if(r.controlsContainer){e(r.controlsContainer).append(t);r.directionNav=e(\".\"+i+\"direction-nav li a\",r.controlsContainer)}else{r.append(t);r.directionNav=e(\".\"+i+\"direction-nav li a\",r)}v.directionNav.update();r.directionNav.bind(u,function(t){t.preventDefault();var n;if(a===\"\"||a===t.type){n=e(this).hasClass(i+\"next\")?r.getTarget(\"next\"):r.getTarget(\"prev\");r.flexAnimate(n,r.vars.pauseOnAction)}a===\"\"&&(a=t.type);v.setToClearWatchedEvent()})},update:function(){var e=i+\"disabled\";r.pagingCount===1?r.directionNav.addClass(e).attr(\"tabindex\",\"-1\"):r.vars.animationLoop?r.directionNav.removeClass(e).removeAttr(\"tabindex\"):r.animatingTo===0?r.directionNav.removeClass(e).filter(\".\"+i+\"prev\").addClass(e).attr(\"tabindex\",\"-1\"):r.animatingTo===r.last?r.directionNav.removeClass(e).filter(\".\"+i+\"next\").addClass(e).attr(\"tabindex\",\"-1\"):r.directionNav.removeClass(e).removeAttr(\"tabindex\")}},pausePlay:{setup:function(){var t=e('');if(r.controlsContainer){r.controlsContainer.append(t);r.pausePlay=e(\".\"+i+\"pauseplay a\",r.controlsContainer)}else{r.append(t);r.pausePlay=e(\".\"+i+\"pauseplay a\",r)}v.pausePlay.update(r.vars.slideshow?i+\"pause\":i+\"play\");r.pausePlay.bind(u,function(t){t.preventDefault();if(a===\"\"||a===t.type)if(e(this).hasClass(i+\"pause\")){r.manualPause=!0;r.manualPlay=!1;r.pause()}else{r.manualPause=!1;r.manualPlay=!0;r.play()}a===\"\"&&(a=t.type);v.setToClearWatchedEvent()})},update:function(e){e===\"play\"?r.pausePlay.removeClass(i+\"pause\").addClass(i+\"play\").html(r.vars.playText):r.pausePlay.removeClass(i+\"play\").addClass(i+\"pause\").html(r.vars.pauseText)}},touch:function(){var e,n,i,o,u,a,f=!1,d=0,v=0,m=0;if(!s){t.addEventListener(\"touchstart\",g,!1);function g(s){if(r.animating)s.preventDefault();else if(window.navigator.msPointerEnabled||s.touches.length===1){r.pause();o=l?r.h:r.w;a=Number(new Date);d=s.touches[0].pageX;v=s.touches[0].pageY;i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o;e=l?v:d;n=l?d:v;t.addEventListener(\"touchmove\",y,!1);t.addEventListener(\"touchend\",b,!1)}}function y(t){d=t.touches[0].pageX;v=t.touches[0].pageY;u=l?e-v:e-d;f=l?Math.abs(u)s){t.preventDefault();if(!p&&r.transitions){r.vars.animationLoop||(u/=r.currentSlide===0&&u<0||r.currentSlide===r.last&&u>0?Math.abs(u)/o+2:1);r.setProps(i+u,\"setTouch\")}}}function b(s){t.removeEventListener(\"touchmove\",y,!1);if(r.animatingTo===r.currentSlide&&!f&&u!==null){var l=c?-u:u,h=l>0?r.getTarget(\"next\"):r.getTarget(\"prev\");r.canAdvance(h)&&(Number(new Date)-a<550&&Math.abs(l)>50||Math.abs(l)>o/2)?r.flexAnimate(h,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}t.removeEventListener(\"touchend\",b,!1);e=null;n=null;u=null;i=null}}else{t.style.msTouchAction=\"none\";t._gesture=new MSGesture;t._gesture.target=t;t.addEventListener(\"MSPointerDown\",w,!1);t._slider=r;t.addEventListener(\"MSGestureChange\",E,!1);t.addEventListener(\"MSGestureEnd\",S,!1);function w(e){e.stopPropagation();if(r.animating)e.preventDefault();else{r.pause();t._gesture.addPointer(e.pointerId);m=0;o=l?r.h:r.w;a=Number(new Date);i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o}}function E(e){e.stopPropagation();var n=e.target._slider;if(!n)return;var r=-e.translationX,s=-e.translationY;m+=l?s:r;u=m;f=l?Math.abs(m)500){e.preventDefault();if(!p&&n.transitions){n.vars.animationLoop||(u=m/(n.currentSlide===0&&m<0||n.currentSlide===n.last&&m>0?Math.abs(m)/o+2:1));n.setProps(i+u,\"setTouch\")}}}function S(t){t.stopPropagation();var r=t.target._slider;if(!r)return;if(r.animatingTo===r.currentSlide&&!f&&u!==null){var s=c?-u:u,l=s>0?r.getTarget(\"next\"):r.getTarget(\"prev\");r.canAdvance(l)&&(Number(new Date)-a<550&&Math.abs(s)>50||Math.abs(s)>o/2)?r.flexAnimate(l,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}e=null;n=null;u=null;i=null;m=0}}},resize:function(){if(!r.animating&&r.is(\":visible\")){h||r.doMath();if(p)v.smoothHeight();else if(h){r.slides.width(r.computedW);r.update(r.pagingCount);r.setProps()}else if(l){r.viewport.height(r.h);r.setProps(r.h,\"setTotal\")}else{r.vars.smoothHeight&&v.smoothHeight();r.newSlides.width(r.computedW);r.setProps(r.computedW,\"setTotal\")}}},smoothHeight:function(e){if(!l||p){var t=p?r:r.viewport;e?t.animate({height:r.slides.eq(r.animatingTo).height()},e):t.height(r.slides.eq(r.animatingTo).height())}},sync:function(t){var n=e(r.vars.sync).data(\"flexslider\"),i=r.animatingTo;switch(t){case\"animate\":n.flexAnimate(i,r.vars.pauseOnAction,!1,!0);break;case\"play\":!n.playing&&!n.asNav&&n.play();break;case\"pause\":n.pause()}},uniqueID:function(t){t.find(\"[id]\").each(function(){var t=e(this);t.attr(\"id\",t.attr(\"id\")+\"_clone\")});return t},pauseInvisible:{visProp:null,init:function(){var e=[\"webkit\",\"moz\",\"ms\",\"o\"];if(\"hidden\"in document)return\"hidden\";for(var t=0;t0?setTimeout(r.play,r.vars.initDelay):r.play()})}},isHidden:function(){return document[v.pauseInvisible.visProp]||!1}},setToClearWatchedEvent:function(){clearTimeout(f);f=setTimeout(function(){a=\"\"},3e3)}};r.flexAnimate=function(t,n,s,u,a){!r.vars.animationLoop&&t!==r.currentSlide&&(r.direction=t>r.currentSlide?\"next\":\"prev\");d&&r.pagingCount===1&&(r.direction=r.currentItemr.limit&&r.visible!==1?r.limit:b}else r.currentSlide===0&&t===r.count-1&&r.vars.animationLoop&&r.direction!==\"next\"?y=c?(r.count+r.cloneOffset)*m:0:r.currentSlide===r.last&&t===0&&r.vars.animationLoop&&r.direction!==\"prev\"?y=c?0:(r.count+1)*m:y=c?(r.count-1-t+r.cloneOffset)*m:(t+r.cloneOffset)*m;r.setProps(y,\"\",r.vars.animationSpeed);if(r.transitions){if(!r.vars.animationLoop||!r.atEnd){r.animating=!1;r.currentSlide=r.animatingTo}r.container.unbind(\"webkitTransitionEnd transitionend\");r.container.bind(\"webkitTransitionEnd transitionend\",function(){r.wrapup(m)})}else r.container.animate(r.args,r.vars.animationSpeed,r.vars.easing,function(){r.wrapup(m)})}else if(!o){r.slides.eq(r.currentSlide).css({zIndex:1}).animate({opacity:0},r.vars.animationSpeed,r.vars.easing);r.slides.eq(t).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing,r.wrapup)}else{r.slides.eq(r.currentSlide).css({opacity:0,zIndex:1});r.slides.eq(t).css({opacity:1,zIndex:2});r.wrapup(m)}r.vars.smoothHeight&&v.smoothHeight(r.vars.animationSpeed)}};r.wrapup=function(e){!p&&!h&&(r.currentSlide===0&&r.animatingTo===r.last&&r.vars.animationLoop?r.setProps(e,\"jumpEnd\"):r.currentSlide===r.last&&r.animatingTo===0&&r.vars.animationLoop&&r.setProps(e,\"jumpStart\"));r.animating=!1;r.currentSlide=r.animatingTo;r.vars.after(r)};r.animateSlides=function(){!r.animating&&m&&r.flexAnimate(r.getTarget(\"next\"))};r.pause=function(){clearInterval(r.animatedSlides);r.animatedSlides=null;r.playing=!1;r.vars.pausePlay&&v.pausePlay.update(\"play\");r.syncExists&&v.sync(\"pause\")};r.play=function(){r.playing&&clearInterval(r.animatedSlides);r.animatedSlides=r.animatedSlides||setInterval(r.animateSlides,r.vars.slideshowSpeed);r.started=r.playing=!0;r.vars.pausePlay&&v.pausePlay.update(\"pause\");r.syncExists&&v.sync(\"play\")};r.stop=function(){r.pause();r.stopped=!0};r.canAdvance=function(e,t){var n=d?r.pagingCount-1:r.last;return t?!0:d&&r.currentItem===r.count-1&&e===0&&r.direction===\"prev\"?!0:d&&r.currentItem===0&&e===r.pagingCount-1&&r.direction!==\"next\"?!1:e===r.currentSlide&&!d?!1:r.vars.animationLoop?!0:r.atEnd&&r.currentSlide===0&&e===n&&r.direction!==\"next\"?!1:r.atEnd&&r.currentSlide===n&&e===0&&r.direction===\"next\"?!1:!0};r.getTarget=function(e){r.direction=e;return e===\"next\"?r.currentSlide===r.last?0:r.currentSlide+1:r.currentSlide===0?r.last:r.currentSlide-1};r.setProps=function(e,t,n){var i=function(){var n=e?e:(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo,i=function(){if(h)return t===\"setTouch\"?e:c&&r.animatingTo===r.last?0:c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:r.animatingTo===r.last?r.limit:n;switch(t){case\"setTotal\":return c?(r.count-1-r.currentSlide+r.cloneOffset)*e:(r.currentSlide+r.cloneOffset)*e;case\"setTouch\":return c?e:e;case\"jumpEnd\":return c?e:r.count*e;case\"jumpStart\":return c?r.count*e:e;default:return e}}();return i*-1+\"px\"}();if(r.transitions){i=l?\"translate3d(0,\"+i+\",0)\":\"translate3d(\"+i+\",0,0)\";n=n!==undefined?n/1e3+\"s\":\"0s\";r.container.css(\"-\"+r.pfx+\"-transition-duration\",n);r.container.css(\"transition-duration\",n)}r.args[r.prop]=i;(r.transitions||n===undefined)&&r.container.css(r.args);r.container.css(\"transform\",i)};r.setup=function(t){if(!p){var n,s;if(t===\"init\"){r.viewport=e('').css({overflow:\"hidden\",position:\"relative\"}).appendTo(r).append(r.container);r.cloneCount=0;r.cloneOffset=0;if(c){s=e.makeArray(r.slides).reverse();r.slides=e(s);r.container.empty().append(r.slides)}}if(r.vars.animationLoop&&!h){r.cloneCount=2;r.cloneOffset=1;t!==\"init\"&&r.container.find(\".clone\").remove();r.container.append(r.slides.first().clone().addClass(\"clone\").attr(\"aria-hidden\",\"true\")).prepend(r.slides.last().clone().addClass(\"clone\").attr(\"aria-hidden\",\"true\"));v.uniqueID(r.slides.first().clone().addClass(\"clone\")).appendTo(r.container);v.uniqueID(r.slides.last().clone().addClass(\"clone\")).prependTo(r.container)}r.newSlides=e(r.vars.selector,r);n=c?r.count-1-r.currentSlide+r.cloneOffset:r.currentSlide+r.cloneOffset;if(l&&!h){r.container.height((r.count+r.cloneCount)*200+\"%\").css(\"position\",\"absolute\").width(\"100%\");setTimeout(function(){r.newSlides.css({display:\"block\"});r.doMath();r.viewport.height(r.h);r.setProps(n*r.h,\"init\")},t===\"init\"?100:0)}else{r.container.width((r.count+r.cloneCount)*200+\"%\");r.setProps(n*r.computedW,\"init\");setTimeout(function(){r.doMath();r.newSlides.css({width:r.computedW,\"float\":\"left\",display:\"block\"});r.vars.smoothHeight&&v.smoothHeight()},t===\"init\"?100:0)}}else{r.slides.css({width:\"100%\",\"float\":\"left\",marginRight:\"-100%\",position:\"relative\"});t===\"init\"&&(o?r.slides.css({opacity:0,display:\"block\",webkitTransition:\"opacity \"+r.vars.animationSpeed/1e3+\"s ease\",zIndex:1}).eq(r.currentSlide).css({opacity:1,zIndex:2}):r.slides.css({opacity:0,display:\"block\",zIndex:1}).eq(r.currentSlide).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing));r.vars.smoothHeight&&v.smoothHeight()}h||r.slides.removeClass(i+\"active-slide\").eq(r.currentSlide).addClass(i+\"active-slide\");r.vars.init(r)};r.doMath=function(){var e=r.slides.first(),t=r.vars.itemMargin,n=r.vars.minItems,i=r.vars.maxItems;r.w=r.viewport===undefined?r.width():r.viewport.width();r.h=e.height();r.boxPadding=e.outerWidth()-e.width();if(h){r.itemT=r.vars.itemWidth+t;r.minW=n?n*r.itemT:r.w;r.maxW=i?i*r.itemT-t:r.w;r.itemW=r.minW>r.w?(r.w-t*(n-1))/n:r.maxWr.w?r.w:r.vars.itemWidth;r.visible=Math.floor(r.w/r.itemW);r.move=r.vars.move>0&&r.vars.mover.w?r.itemW*(r.count-1)+t*(r.count-1):(r.itemW+t)*r.count-r.w-t}else{r.itemW=r.w;r.pagingCount=r.count;r.last=r.count-1}r.computedW=r.itemW-r.boxPadding};r.update=function(e,t){r.doMath();if(!h){er.controlNav.length)v.controlNav.update(\"add\");else if(t===\"remove\"&&!h||r.pagingCountr.last){r.currentSlide-=1;r.animatingTo-=1}v.controlNav.update(\"remove\",r.last)}r.vars.directionNav&&v.directionNav.update()};r.addSlide=function(t,n){var i=e(t);r.count+=1;r.last=r.count-1;l&&c?n!==undefined?r.slides.eq(r.count-n).after(i):r.container.prepend(i):n!==undefined?r.slides.eq(n).before(i):r.container.append(i);r.update(n,\"add\");r.slides=e(r.vars.selector+\":not(.clone)\",r);r.setup();r.vars.added(r)};r.removeSlide=function(t){var n=isNaN(t)?r.slides.index(e(t)):t;r.count-=1;r.last=r.count-1;isNaN(t)?e(t,r.slides).remove():l&&c?r.slides.eq(r.last).remove():r.slides.eq(t).remove();r.doMath();r.update(n,\"remove\");r.slides=e(r.vars.selector+\":not(.clone)\",r);r.setup();r.vars.removed(r)};v.init()};e(window).blur(function(e){focused=!1}).focus(function(e){focused=!0});e.flexslider.defaults={namespace:\"flex-\",selector:\".slides > li\",animation:\"fade\",easing:\"swing\",direction:\"horizontal\",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7e3,animationSpeed:600,initDelay:0,randomize:!1,thumbCaptions:!1,pauseOnAction:!0,pauseOnHover:!1,pauseInvisible:!0,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:\"Previous\",nextText:\"Next\",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:\"Pause\",playText:\"Play\",controlsContainer:\"\",manualControls:\"\",sync:\"\",asNavFor:\"\",itemWidth:0,itemMargin:0,minItems:1,maxItems:0,move:0,allowOneSlide:!0,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){},init:function(){}};e.fn.flexslider=function(t){t===undefined&&(t={});if(typeof t==\"object\")return this.each(function(){var n=e(this),r=t.selector?t.selector:\".slides > li\",i=n.find(r);if(i.length===1&&t.allowOneSlide===!0||i.length===0){i.fadeIn(400);t.start&&t.start(n)}else n.data(\"flexslider\")===undefined&&new e.flexslider(this,t)});var n=e(this).data(\"flexslider\");switch(t){case\"play\":n.play();break;case\"pause\":n.pause();break;case\"stop\":n.stop();break;case\"next\":n.flexAnimate(n.getTarget(\"next\"),!0);break;case\"prev\":case\"previous\":n.flexAnimate(n.getTarget(\"prev\"),!0);break;default:typeof t==\"number\"&&n.flexAnimate(t,!0)}}})(jQuery);(function(e){e.flexslider=function(t,n){var r=e(t);r.vars=e.extend({},e.flexslider.defaults,n);var i=r.vars.namespace,s=window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture,o=(\"ontouchstart\"in window||s||window.DocumentTouch&&document instanceof DocumentTouch)&&r.vars.touch,u=\"click touchend MSPointerUp\",a=\"\",f,l=r.vars.direction===\"vertical\",c=r.vars.reverse,h=r.vars.itemWidth>0,p=r.vars.animation===\"fade\",d=r.vars.asNavFor!==\"\",v={},m=!0;e.data(t,\"flexslider\",r);v={init:function(){r.animating=!1;r.currentSlide=parseInt(r.vars.startAt?r.vars.startAt:0,10);isNaN(r.currentSlide)&&(r.currentSlide=0);r.animatingTo=r.currentSlide;r.atEnd=r.currentSlide===0||r.currentSlide===r.last;r.containerSelector=r.vars.selector.substr(0,r.vars.selector.search(\" \"));r.slides=e(r.vars.selector,r);r.container=e(r.containerSelector,r);r.count=r.slides.length;r.syncExists=e(r.vars.sync).length>0;r.vars.animation===\"slide\"&&(r.vars.animation=\"swing\");r.prop=l?\"top\":\"marginLeft\";r.args={};r.manualPause=!1;r.stopped=!1;r.started=!1;r.startTimeout=null;r.transitions=!r.vars.video&&!p&&r.vars.useCSS&&function(){var e=document.createElement(\"div\"),t=[\"perspectiveProperty\",\"WebkitPerspective\",\"MozPerspective\",\"OPerspective\",\"msPerspective\"];for(var n in t)if(e.style[t[n]]!==undefined){r.pfx=t[n].replace(\"Perspective\",\"\").toLowerCase();r.prop=\"-\"+r.pfx+\"-transform\";return!0}return!1}();r.vars.controlsContainer!==\"\"&&(r.controlsContainer=e(r.vars.controlsContainer).length>0&&e(r.vars.controlsContainer));r.vars.manualControls!==\"\"&&(r.manualControls=e(r.vars.manualControls).length>0&&e(r.vars.manualControls));if(r.vars.randomize){r.slides.sort(function(){return Math.round(Math.random())-.5});r.container.empty().append(r.slides)}r.doMath();r.setup(\"init\");r.vars.controlNav&&v.controlNav.setup();r.vars.directionNav&&v.directionNav.setup();r.vars.keyboard&&(e(r.containerSelector).length===1||r.vars.multipleKeyboard)&&e(document).bind(\"keyup\",function(e){var t=e.keyCode;if(!r.animating&&(t===39||t===37)){var n=t===39?r.getTarget(\"next\"):t===37?r.getTarget(\"prev\"):!1;r.flexAnimate(n,r.vars.pauseOnAction)}});r.vars.mousewheel&&r.bind(\"mousewheel\",function(e,t,n,i){e.preventDefault();var s=t<0?r.getTarget(\"next\"):r.getTarget(\"prev\");r.flexAnimate(s,r.vars.pauseOnAction)});r.vars.pausePlay&&v.pausePlay.setup();r.vars.slideshow&&r.vars.pauseInvisible&&v.pauseInvisible.init();if(r.vars.slideshow){r.vars.pauseOnHover&&r.hover(function(){!r.manualPlay&&!r.manualPause&&r.pause()},function(){!r.manualPause&&!r.manualPlay&&!r.stopped&&r.play()});if(!r.vars.pauseInvisible||!v.pauseInvisible.isHidden())r.vars.initDelay>0?r.startTimeout=setTimeout(r.play,r.vars.initDelay):r.play()}d&&v.asNav.setup();o&&r.vars.touch&&v.touch();(!p||p&&r.vars.smoothHeight)&&e(window).bind(\"resize orientationchange focus\",v.resize);r.find(\"img\").attr(\"draggable\",\"false\");setTimeout(function(){r.vars.start(r)},200)},asNav:{setup:function(){r.asNav=!0;r.animatingTo=Math.floor(r.currentSlide/r.move);r.currentItem=r.currentSlide;r.slides.removeClass(i+\"active-slide\").eq(r.currentItem).addClass(i+\"active-slide\");if(!s)r.slides.on(u,function(t){t.preventDefault();var n=e(this),s=n.index(),o=n.offset().left-e(r).scrollLeft();if(o<=0&&n.hasClass(i+\"active-slide\"))r.flexAnimate(r.getTarget(\"prev\"),!0);else if(!e(r.vars.asNavFor).data(\"flexslider\").animating&&!n.hasClass(i+\"active-slide\")){r.direction=r.currentItem');if(r.pagingCount>1)for(var f=0;f':\"\"+n+\"\";if(\"thumbnails\"===r.vars.controlNav&&!0===r.vars.thumbCaptions){var l=o.attr(\"data-thumbcaption\");\"\"!=l&&undefined!=l&&(s+=''+l+\"\")}r.controlNavScaffold.append(\"\"+s+\"\");n++}r.controlsContainer?e(r.controlsContainer).append(r.controlNavScaffold):r.append(r.controlNavScaffold);v.controlNav.set();v.controlNav.active();r.controlNavScaffold.delegate(\"a, img\",u,function(t){t.preventDefault();if(a===\"\"||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+\"active\")){r.direction=s>r.currentSlide?\"next\":\"prev\";r.flexAnimate(s,r.vars.pauseOnAction)}}a===\"\"&&(a=t.type);v.setToClearWatchedEvent()})},setupManual:function(){r.controlNav=r.manualControls;v.controlNav.active();r.controlNav.bind(u,function(t){t.preventDefault();if(a===\"\"||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+\"active\")){s>r.currentSlide?r.direction=\"next\":r.direction=\"prev\";r.flexAnimate(s,r.vars.pauseOnAction)}}a===\"\"&&(a=t.type);v.setToClearWatchedEvent()})},set:function(){var t=r.vars.controlNav===\"thumbnails\"?\"img\":\"a\";r.controlNav=e(\".\"+i+\"control-nav li \"+t,r.controlsContainer?r.controlsContainer:r)},active:function(){r.controlNav.removeClass(i+\"active\").eq(r.animatingTo).addClass(i+\"active\")},update:function(t,n){r.pagingCount>1&&t===\"add\"?r.controlNavScaffold.append(e(\"\"+r.count+\"\")):r.pagingCount===1?r.controlNavScaffold.find(\"li\").remove():r.controlNav.eq(n).closest(\"li\").remove();v.controlNav.set();r.pagingCount>1&&r.pagingCount!==r.controlNav.length?r.update(n,t):v.controlNav.active()}},directionNav:{setup:function(){var t=e('\");if(r.controlsContainer){e(r.controlsContainer).append(t);r.directionNav=e(\".\"+i+\"direction-nav li a\",r.controlsContainer)}else{r.append(t);r.directionNav=e(\".\"+i+\"direction-nav li a\",r)}v.directionNav.update();r.directionNav.bind(u,function(t){t.preventDefault();var n;if(a===\"\"||a===t.type){n=e(this).hasClass(i+\"next\")?r.getTarget(\"next\"):r.getTarget(\"prev\");r.flexAnimate(n,r.vars.pauseOnAction)}a===\"\"&&(a=t.type);v.setToClearWatchedEvent()})},update:function(){var e=i+\"disabled\";r.pagingCount===1?r.directionNav.addClass(e).attr(\"tabindex\",\"-1\"):r.vars.animationLoop?r.directionNav.removeClass(e).removeAttr(\"tabindex\"):r.animatingTo===0?r.directionNav.removeClass(e).filter(\".\"+i+\"prev\").addClass(e).attr(\"tabindex\",\"-1\"):r.animatingTo===r.last?r.directionNav.removeClass(e).filter(\".\"+i+\"next\").addClass(e).attr(\"tabindex\",\"-1\"):r.directionNav.removeClass(e).removeAttr(\"tabindex\")}},pausePlay:{setup:function(){var t=e('');if(r.controlsContainer){r.controlsContainer.append(t);r.pausePlay=e(\".\"+i+\"pauseplay a\",r.controlsContainer)}else{r.append(t);r.pausePlay=e(\".\"+i+\"pauseplay a\",r)}v.pausePlay.update(r.vars.slideshow?i+\"pause\":i+\"play\");r.pausePlay.bind(u,function(t){t.preventDefault();if(a===\"\"||a===t.type)if(e(this).hasClass(i+\"pause\")){r.manualPause=!0;r.manualPlay=!1;r.pause()}else{r.manualPause=!1;r.manualPlay=!0;r.play()}a===\"\"&&(a=t.type);v.setToClearWatchedEvent()})},update:function(e){e===\"play\"?r.pausePlay.removeClass(i+\"pause\").addClass(i+\"play\").html(r.vars.playText):r.pausePlay.removeClass(i+\"play\").addClass(i+\"pause\").html(r.vars.pauseText)}},touch:function(){var e,n,i,o,u,a,f=!1,d=0,v=0,m=0;if(!s){t.addEventListener(\"touchstart\",g,!1);function g(s){if(r.animating)s.preventDefault();else if(window.navigator.msPointerEnabled||s.touches.length===1){r.pause();o=l?r.h:r.w;a=Number(new Date);d=s.touches[0].pageX;v=s.touches[0].pageY;i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o;e=l?v:d;n=l?d:v;t.addEventListener(\"touchmove\",y,!1);t.addEventListener(\"touchend\",b,!1)}}function y(t){d=t.touches[0].pageX;v=t.touches[0].pageY;u=l?e-v:e-d;f=l?Math.abs(u)s){t.preventDefault();if(!p&&r.transitions){r.vars.animationLoop||(u/=r.currentSlide===0&&u<0||r.currentSlide===r.last&&u>0?Math.abs(u)/o+2:1);r.setProps(i+u,\"setTouch\")}}}function b(s){t.removeEventListener(\"touchmove\",y,!1);if(r.animatingTo===r.currentSlide&&!f&&u!==null){var l=c?-u:u,h=l>0?r.getTarget(\"next\"):r.getTarget(\"prev\");r.canAdvance(h)&&(Number(new Date)-a<550&&Math.abs(l)>50||Math.abs(l)>o/2)?r.flexAnimate(h,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}t.removeEventListener(\"touchend\",b,!1);e=null;n=null;u=null;i=null}}else{t.style.msTouchAction=\"none\";t._gesture=new MSGesture;t._gesture.target=t;t.addEventListener(\"MSPointerDown\",w,!1);t._slider=r;t.addEventListener(\"MSGestureChange\",E,!1);t.addEventListener(\"MSGestureEnd\",S,!1);function w(e){e.stopPropagation();if(r.animating)e.preventDefault();else{r.pause();t._gesture.addPointer(e.pointerId);m=0;o=l?r.h:r.w;a=Number(new Date);i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o}}function E(e){e.stopPropagation();var n=e.target._slider;if(!n)return;var r=-e.translationX,s=-e.translationY;m+=l?s:r;u=m;f=l?Math.abs(m)500){e.preventDefault();if(!p&&n.transitions){n.vars.animationLoop||(u=m/(n.currentSlide===0&&m<0||n.currentSlide===n.last&&m>0?Math.abs(m)/o+2:1));n.setProps(i+u,\"setTouch\")}}}function S(t){t.stopPropagation();var r=t.target._slider;if(!r)return;if(r.animatingTo===r.currentSlide&&!f&&u!==null){var s=c?-u:u,l=s>0?r.getTarget(\"next\"):r.getTarget(\"prev\");r.canAdvance(l)&&(Number(new Date)-a<550&&Math.abs(s)>50||Math.abs(s)>o/2)?r.flexAnimate(l,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}e=null;n=null;u=null;i=null;m=0}}},resize:function(){if(!r.animating&&r.is(\":visible\")){h||r.doMath();if(p)v.smoothHeight();else if(h){r.slides.width(r.computedW);r.update(r.pagingCount);r.setProps()}else if(l){r.viewport.height(r.h);r.setProps(r.h,\"setTotal\")}else{r.vars.smoothHeight&&v.smoothHeight();r.newSlides.width(r.computedW\r\n);r.setProps(r.computedW,\"setTotal\")}}},smoothHeight:function(e){if(!l||p){var t=p?r:r.viewport;e?t.animate({height:r.slides.eq(r.animatingTo).height()},e):t.height(r.slides.eq(r.animatingTo).height())}},sync:function(t){var n=e(r.vars.sync).data(\"flexslider\"),i=r.animatingTo;switch(t){case\"animate\":n.flexAnimate(i,r.vars.pauseOnAction,!1,!0);break;case\"play\":!n.playing&&!n.asNav&&n.play();break;case\"pause\":n.pause()}},uniqueID:function(t){t.find(\"[id]\").each(function(){var t=e(this);t.attr(\"id\",t.attr(\"id\")+\"_clone\")});return t},pauseInvisible:{visProp:null,init:function(){var e=[\"webkit\",\"moz\",\"ms\",\"o\"];if(\"hidden\"in document)return\"hidden\";for(var t=0;t0?setTimeout(r.play,r.vars.initDelay):r.play()})}},isHidden:function(){return document[v.pauseInvisible.visProp]||!1}},setToClearWatchedEvent:function(){clearTimeout(f);f=setTimeout(function(){a=\"\"},3e3)}};r.flexAnimate=function(t,n,s,u,a){!r.vars.animationLoop&&t!==r.currentSlide&&(r.direction=t>r.currentSlide?\"next\":\"prev\");d&&r.pagingCount===1&&(r.direction=r.currentItemr.limit&&r.visible!==1?r.limit:b}else r.currentSlide===0&&t===r.count-1&&r.vars.animationLoop&&r.direction!==\"next\"?y=c?(r.count+r.cloneOffset)*m:0:r.currentSlide===r.last&&t===0&&r.vars.animationLoop&&r.direction!==\"prev\"?y=c?0:(r.count+1)*m:y=c?(r.count-1-t+r.cloneOffset)*m:(t+r.cloneOffset)*m;r.setProps(y,\"\",r.vars.animationSpeed);if(r.transitions){if(!r.vars.animationLoop||!r.atEnd){r.animating=!1;r.currentSlide=r.animatingTo}r.container.unbind(\"webkitTransitionEnd transitionend\");r.container.bind(\"webkitTransitionEnd transitionend\",function(){r.wrapup(m)})}else r.container.animate(r.args,r.vars.animationSpeed,r.vars.easing,function(){r.wrapup(m)})}else if(!o){r.slides.eq(r.currentSlide).css({zIndex:1}).animate({opacity:0},r.vars.animationSpeed,r.vars.easing);r.slides.eq(t).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing,r.wrapup)}else{r.slides.eq(r.currentSlide).css({opacity:0,zIndex:1});r.slides.eq(t).css({opacity:1,zIndex:2});r.wrapup(m)}r.vars.smoothHeight&&v.smoothHeight(r.vars.animationSpeed)}};r.wrapup=function(e){!p&&!h&&(r.currentSlide===0&&r.animatingTo===r.last&&r.vars.animationLoop?r.setProps(e,\"jumpEnd\"):r.currentSlide===r.last&&r.animatingTo===0&&r.vars.animationLoop&&r.setProps(e,\"jumpStart\"));r.animating=!1;r.currentSlide=r.animatingTo;r.vars.after(r)};r.animateSlides=function(){!r.animating&&m&&r.flexAnimate(r.getTarget(\"next\"))};r.pause=function(){clearInterval(r.animatedSlides);r.animatedSlides=null;r.playing=!1;r.vars.pausePlay&&v.pausePlay.update(\"play\");r.syncExists&&v.sync(\"pause\")};r.play=function(){r.playing&&clearInterval(r.animatedSlides);r.animatedSlides=r.animatedSlides||setInterval(r.animateSlides,r.vars.slideshowSpeed);r.started=r.playing=!0;r.vars.pausePlay&&v.pausePlay.update(\"pause\");r.syncExists&&v.sync(\"play\")};r.stop=function(){r.pause();r.stopped=!0};r.canAdvance=function(e,t){var n=d?r.pagingCount-1:r.last;return t?!0:d&&r.currentItem===r.count-1&&e===0&&r.direction===\"prev\"?!0:d&&r.currentItem===0&&e===r.pagingCount-1&&r.direction!==\"next\"?!1:e===r.currentSlide&&!d?!1:r.vars.animationLoop?!0:r.atEnd&&r.currentSlide===0&&e===n&&r.direction!==\"next\"?!1:r.atEnd&&r.currentSlide===n&&e===0&&r.direction===\"next\"?!1:!0};r.getTarget=function(e){r.direction=e;return e===\"next\"?r.currentSlide===r.last?0:r.currentSlide+1:r.currentSlide===0?r.last:r.currentSlide-1};r.setProps=function(e,t,n){var i=function(){var n=e?e:(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo,i=function(){if(h)return t===\"setTouch\"?e:c&&r.animatingTo===r.last?0:c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:r.animatingTo===r.last?r.limit:n;switch(t){case\"setTotal\":return c?(r.count-1-r.currentSlide+r.cloneOffset)*e:(r.currentSlide+r.cloneOffset)*e;case\"setTouch\":return c?e:e;case\"jumpEnd\":return c?e:r.count*e;case\"jumpStart\":return c?r.count*e:e;default:return e}}();return i*-1+\"px\"}();if(r.transitions){i=l?\"translate3d(0,\"+i+\",0)\":\"translate3d(\"+i+\",0,0)\";n=n!==undefined?n/1e3+\"s\":\"0s\";r.container.css(\"-\"+r.pfx+\"-transition-duration\",n);r.container.css(\"transition-duration\",n)}r.args[r.prop]=i;(r.transitions||n===undefined)&&r.container.css(r.args);r.container.css(\"transform\",i)};r.setup=function(t){if(!p){var n,s;if(t===\"init\"){r.viewport=e('').css({overflow:\"hidden\",position:\"relative\"}).appendTo(r).append(r.container);r.cloneCount=0;r.cloneOffset=0;if(c){s=e.makeArray(r.slides).reverse();r.slides=e(s);r.container.empty().append(r.slides)}}if(r.vars.animationLoop&&!h){r.cloneCount=2;r.cloneOffset=1;t!==\"init\"&&r.container.find(\".clone\").remove();r.container.append(r.slides.first().clone().addClass(\"clone\").attr(\"aria-hidden\",\"true\")).prepend(r.slides.last().clone().addClass(\"clone\").attr(\"aria-hidden\",\"true\"));v.uniqueID(r.slides.first().clone().addClass(\"clone\")).appendTo(r.container);v.uniqueID(r.slides.last().clone().addClass(\"clone\")).prependTo(r.container)}r.newSlides=e(r.vars.selector,r);n=c?r.count-1-r.currentSlide+r.cloneOffset:r.currentSlide+r.cloneOffset;if(l&&!h){r.container.height((r.count+r.cloneCount)*200+\"%\").css(\"position\",\"absolute\").width(\"100%\");setTimeout(function(){r.newSlides.css({display:\"block\"});r.doMath();r.viewport.height(r.h);r.setProps(n*r.h,\"init\")},t===\"init\"?100:0)}else{r.container.width((r.count+r.cloneCount)*200+\"%\");r.setProps(n*r.computedW,\"init\");setTimeout(function(){r.doMath();r.newSlides.css({width:r.computedW,\"float\":\"left\",display:\"block\"});r.vars.smoothHeight&&v.smoothHeight()},t===\"init\"?100:0)}}else{r.slides.css({width:\"100%\",\"float\":\"left\",marginRight:\"-100%\",position:\"relative\"});t===\"init\"&&(o?r.slides.css({opacity:0,display:\"block\",webkitTransition:\"opacity \"+r.vars.animationSpeed/1e3+\"s ease\",zIndex:1}).eq(r.currentSlide).css({opacity:1,zIndex:2}):r.slides.css({opacity:0,display:\"block\",zIndex:1}).eq(r.currentSlide).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing));r.vars.smoothHeight&&v.smoothHeight()}h||r.slides.removeClass(i+\"active-slide\").eq(r.currentSlide).addClass(i+\"active-slide\");r.vars.init(r)};r.doMath=function(){var e=r.slides.first(),t=r.vars.itemMargin,n=r.vars.minItems,i=r.vars.maxItems;r.w=r.viewport===undefined?r.width():r.viewport.width();r.h=e.height();r.boxPadding=e.outerWidth()-e.width();if(h){r.itemT=r.vars.itemWidth+t;r.minW=n?n*r.itemT:r.w;r.maxW=i?i*r.itemT-t:r.w;r.itemW=r.minW>r.w?(r.w-t*(n-1))/n:r.maxWr.w?r.w:r.vars.itemWidth;r.visible=Math.floor(r.w/r.itemW);r.move=r.vars.move>0&&r.vars.mover.w?r.itemW*(r.count-1)+t*(r.count-1):(r.itemW+t)*r.count-r.w-t}else{r.itemW=r.w;r.pagingCount=r.count;r.last=r.count-1}r.computedW=r.itemW-r.boxPadding};r.update=function(e,t){r.doMath();if(!h){er.controlNav.length)v.controlNav.update(\"add\");else if(t===\"remove\"&&!h||r.pagingCountr.last){r.currentSlide-=1;r.animatingTo-=1}v.controlNav.update(\"remove\",r.last)}r.vars.directionNav&&v.directionNav.update()};r.addSlide=function(t,n){var i=e(t);r.count+=1;r.last=r.count-1;l&&c?n!==undefined?r.slides.eq(r.count-n).after(i):r.container.prepend(i):n!==undefined?r.slides.eq(n).before(i):r.container.append(i);r.update(n,\"add\");r.slides=e(r.vars.selector+\":not(.clone)\",r);r.setup();r.vars.added(r)};r.removeSlide=function(t){var n=isNaN(t)?r.slides.index(e(t)):t;r.count-=1;r.last=r.count-1;isNaN(t)?e(t,r.slides).remove():l&&c?r.slides.eq(r.last).remove():r.slides.eq(t).remove();r.doMath();r.update(n,\"remove\");r.slides=e(r.vars.selector+\":not(.clone)\",r);r.setup();r.vars.removed(r)};v.init()};e(window).blur(function(e){focused=!1}).focus(function(e){focused=!0});e.flexslider.defaults={namespace:\"flex-\",selector:\".slides > li\",animation:\"fade\",easing:\"swing\",direction:\"horizontal\",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7e3,animationSpeed:600,initDelay:0,randomize:!1,thumbCaptions:!1,pauseOnAction:!0,pauseOnHover:!1,pauseInvisible:!0,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:\"Previous\",nextText:\"Next\",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:\"Pause\",playText:\"Play\",controlsContainer:\"\",manualControls:\"\",sync:\"\",asNavFor:\"\",itemWidth:0,itemMargin:0,minItems:1,maxItems:0,move:0,allowOneSlide:!0,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){},init:function(){}};e.fn.flexslider=function(t){t===undefined&&(t={});if(typeof t==\"object\")return this.each(function(){var n=e(this),r=t.selector?t.selector:\".slides > li\",i=n.find(r);if(i.length===1&&t.allowOneSlide===!0||i.length===0){i.fadeIn(400);t.start&&t.start(n)}else n.data(\"flexslider\")===undefined&&new e.flexslider(this,t)});var n=e(this).data(\"flexslider\");switch(t){case\"play\":n.play();break;case\"pause\":n.pause();break;case\"stop\":n.stop();break;case\"next\":n.flexAnimate(n.getTarget(\"next\"),!0);break;case\"prev\":case\"previous\":n.flexAnimate(n.getTarget(\"prev\"),!0);break;default:typeof t==\"number\"&&n.flexAnimate(t,!0)}}})(jQuery);\r\n","/**\r\n * jquery.mask.js\r\n * @version: v1.14.0\r\n * @author: Igor Escobar\r\n *\r\n * Created by Igor Escobar on 2012-03-10. Please report any bug at http://blog.igorescobar.com\r\n *\r\n * Copyright (c) 2012 Igor Escobar http://blog.igorescobar.com\r\n *\r\n * The MIT License (http://www.opensource.org/licenses/mit-license.php)\r\n *\r\n * Permission is hereby granted, free of charge, to any person\r\n * obtaining a copy of this software and associated documentation\r\n * files (the \"Software\"), to deal in the Software without\r\n * restriction, including without limitation the rights to use,\r\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the\r\n * Software is furnished to do so, subject to the following\r\n * conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be\r\n * included in all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\n * OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\n/* jshint laxbreak: true */\r\n/* global define, jQuery, Zepto */\r\n\r\n'use strict';\r\n\r\n// UMD (Universal Module Definition) patterns for JavaScript modules that work everywhere.\r\n// https://github.com/umdjs/umd/blob/master/jqueryPluginCommonjs.js\r\n(function (factory) {\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n define(['jquery'], factory);\r\n } else if (typeof exports === 'object') {\r\n module.exports = factory(require('jquery'));\r\n } else {\r\n factory(jQuery || Zepto);\r\n }\r\n\r\n}(function ($) {\r\n\r\n var Mask = function (el, mask, options) {\r\n\r\n var p = {\r\n invalid: [],\r\n getCaret: function () {\r\n try {\r\n var sel,\r\n pos = 0,\r\n ctrl = el.get(0),\r\n dSel = document.selection,\r\n cSelStart = ctrl.selectionStart;\r\n\r\n // IE Support\r\n if (dSel && navigator.appVersion.indexOf('MSIE 10') === -1) {\r\n sel = dSel.createRange();\r\n sel.moveStart('character', -p.val().length);\r\n pos = sel.text.length;\r\n }\r\n // Firefox support\r\n else if (cSelStart || cSelStart === '0') {\r\n pos = cSelStart;\r\n }\r\n\r\n return pos;\r\n } catch (e) {}\r\n },\r\n setCaret: function(pos) {\r\n try {\r\n if (el.is(':focus')) {\r\n var range, ctrl = el.get(0);\r\n\r\n // Firefox, WebKit, etc..\r\n if (ctrl.setSelectionRange) {\r\n ctrl.focus();\r\n ctrl.setSelectionRange(pos, pos);\r\n } else { // IE\r\n range = ctrl.createTextRange();\r\n range.collapse(true);\r\n range.moveEnd('character', pos);\r\n range.moveStart('character', pos);\r\n range.select();\r\n }\r\n }\r\n } catch (e) {}\r\n },\r\n events: function() {\r\n el\r\n .on('keydown.mask', function(e) {\r\n el.data('mask-keycode', e.keyCode || e.which);\r\n })\r\n .on($.jMaskGlobals.useInput ? 'input.mask' : 'keyup.mask', p.behaviour)\r\n .on('paste.mask drop.mask', function() {\r\n setTimeout(function() {\r\n el.keydown().keyup();\r\n }, 100);\r\n })\r\n .on('change.mask', function(){\r\n el.data('changed', true);\r\n })\r\n .on('blur.mask', function(){\r\n if (oldValue !== p.val() && !el.data('changed')) {\r\n el.trigger('change');\r\n }\r\n el.data('changed', false);\r\n })\r\n // it's very important that this callback remains in this position\r\n // otherwhise oldValue it's going to work buggy\r\n .on('blur.mask', function() {\r\n oldValue = p.val();\r\n })\r\n // select all text on focus\r\n .on('focus.mask', function (e) {\r\n if (options.selectOnFocus === true) {\r\n $(e.target).select();\r\n }\r\n })\r\n // clear the value if it not complete the mask\r\n .on('focusout.mask', function() {\r\n if (options.clearIfNotMatch && !regexMask.test(p.val())) {\r\n p.val('');\r\n }\r\n });\r\n },\r\n getRegexMask: function() {\r\n var maskChunks = [], translation, pattern, optional, recursive, oRecursive, r;\r\n\r\n for (var i = 0; i < mask.length; i++) {\r\n translation = jMask.translation[mask.charAt(i)];\r\n\r\n if (translation) {\r\n\r\n pattern = translation.pattern.toString().replace(/.{1}$|^.{1}/g, '');\r\n optional = translation.optional;\r\n recursive = translation.recursive;\r\n\r\n if (recursive) {\r\n maskChunks.push(mask.charAt(i));\r\n oRecursive = {digit: mask.charAt(i), pattern: pattern};\r\n } else {\r\n maskChunks.push(!optional && !recursive ? pattern : (pattern + '?'));\r\n }\r\n\r\n } else {\r\n maskChunks.push(mask.charAt(i).replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'));\r\n }\r\n }\r\n\r\n r = maskChunks.join('');\r\n\r\n if (oRecursive) {\r\n r = r.replace(new RegExp('(' + oRecursive.digit + '(.*' + oRecursive.digit + ')?)'), '($1)?')\r\n .replace(new RegExp(oRecursive.digit, 'g'), oRecursive.pattern);\r\n }\r\n\r\n return new RegExp(r);\r\n },\r\n destroyEvents: function() {\r\n el.off(['input', 'keydown', 'keyup', 'paste', 'drop', 'blur', 'focusout', ''].join('.mask '));\r\n },\r\n val: function(v) {\r\n var isInput = el.is('input'),\r\n method = isInput ? 'val' : 'text',\r\n r;\r\n\r\n if (arguments.length > 0) {\r\n if (el[method]() !== v) {\r\n el[method](v);\r\n }\r\n r = el;\r\n } else {\r\n r = el[method]();\r\n }\r\n\r\n return r;\r\n },\r\n getMCharsBeforeCount: function(index, onCleanVal) {\r\n for (var count = 0, i = 0, maskL = mask.length; i < maskL && i < index; i++) {\r\n if (!jMask.translation[mask.charAt(i)]) {\r\n index = onCleanVal ? index + 1 : index;\r\n count++;\r\n }\r\n }\r\n return count;\r\n },\r\n caretPos: function (originalCaretPos, oldLength, newLength, maskDif) {\r\n var translation = jMask.translation[mask.charAt(Math.min(originalCaretPos - 1, mask.length - 1))];\r\n\r\n return !translation ? p.caretPos(originalCaretPos + 1, oldLength, newLength, maskDif)\r\n : Math.min(originalCaretPos + newLength - oldLength - maskDif, newLength);\r\n },\r\n behaviour: function(e) {\r\n e = e || window.event;\r\n p.invalid = [];\r\n\r\n var keyCode = el.data('mask-keycode');\r\n\r\n if ($.inArray(keyCode, jMask.byPassKeys) === -1) {\r\n var caretPos = p.getCaret(),\r\n currVal = p.val(),\r\n currValL = currVal.length,\r\n newVal = p.getMasked(),\r\n newValL = newVal.length,\r\n maskDif = p.getMCharsBeforeCount(newValL - 1) - p.getMCharsBeforeCount(currValL - 1),\r\n changeCaret = caretPos < currValL;\r\n\r\n p.val(newVal);\r\n\r\n if (changeCaret) {\r\n // Avoid adjusting caret on backspace or delete\r\n if (!(keyCode === 8 || keyCode === 46)) {\r\n caretPos = p.caretPos(caretPos, currValL, newValL, maskDif);\r\n }\r\n p.setCaret(caretPos);\r\n }\r\n\r\n return p.callbacks(e);\r\n }\r\n },\r\n getMasked: function(skipMaskChars, val) {\r\n var buf = [],\r\n value = val === undefined ? p.val() : val + '',\r\n m = 0, maskLen = mask.length,\r\n v = 0, valLen = value.length,\r\n offset = 1, addMethod = 'push',\r\n resetPos = -1,\r\n lastMaskChar,\r\n check;\r\n\r\n if (options.reverse) {\r\n addMethod = 'unshift';\r\n offset = -1;\r\n lastMaskChar = 0;\r\n m = maskLen - 1;\r\n v = valLen - 1;\r\n check = function () {\r\n return m > -1 && v > -1;\r\n };\r\n } else {\r\n lastMaskChar = maskLen - 1;\r\n check = function () {\r\n return m < maskLen && v < valLen;\r\n };\r\n }\r\n\r\n while (check()) {\r\n var maskDigit = mask.charAt(m),\r\n valDigit = value.charAt(v),\r\n translation = jMask.translation[maskDigit];\r\n\r\n if (translation) {\r\n if (valDigit.match(translation.pattern)) {\r\n buf[addMethod](valDigit);\r\n if (translation.recursive) {\r\n if (resetPos === -1) {\r\n resetPos = m;\r\n } else if (m === lastMaskChar) {\r\n m = resetPos - offset;\r\n }\r\n\r\n if (lastMaskChar === resetPos) {\r\n m -= offset;\r\n }\r\n }\r\n m += offset;\r\n } else if (translation.optional) {\r\n m += offset;\r\n v -= offset;\r\n } else if (translation.fallback) {\r\n buf[addMethod](translation.fallback);\r\n m += offset;\r\n v -= offset;\r\n } else {\r\n p.invalid.push({p: v, v: valDigit, e: translation.pattern});\r\n }\r\n v += offset;\r\n } else {\r\n if (!skipMaskChars) {\r\n buf[addMethod](maskDigit);\r\n }\r\n\r\n if (valDigit === maskDigit) {\r\n v += offset;\r\n }\r\n\r\n m += offset;\r\n }\r\n }\r\n\r\n var lastMaskCharDigit = mask.charAt(lastMaskChar);\r\n if (maskLen === valLen + 1 && !jMask.translation[lastMaskCharDigit]) {\r\n buf.push(lastMaskCharDigit);\r\n }\r\n\r\n return buf.join('');\r\n },\r\n callbacks: function (e) {\r\n var val = p.val(),\r\n changed = val !== oldValue,\r\n defaultArgs = [val, e, el, options],\r\n callback = function(name, criteria, args) {\r\n if (typeof options[name] === 'function' && criteria) {\r\n options[name].apply(this, args);\r\n }\r\n };\r\n\r\n callback('onChange', changed === true, defaultArgs);\r\n callback('onKeyPress', changed === true, defaultArgs);\r\n callback('onComplete', val.length === mask.length, defaultArgs);\r\n callback('onInvalid', p.invalid.length > 0, [val, e, el, p.invalid, options]);\r\n }\r\n };\r\n\r\n el = $(el);\r\n var jMask = this, oldValue = p.val(), regexMask;\r\n\r\n mask = typeof mask === 'function' ? mask(p.val(), undefined, el, options) : mask;\r\n\r\n\r\n // public methods\r\n jMask.mask = mask;\r\n jMask.options = options;\r\n jMask.remove = function() {\r\n var caret = p.getCaret();\r\n p.destroyEvents();\r\n p.val(jMask.getCleanVal());\r\n p.setCaret(caret - p.getMCharsBeforeCount(caret));\r\n return el;\r\n };\r\n\r\n // get value without mask\r\n jMask.getCleanVal = function() {\r\n return p.getMasked(true);\r\n };\r\n\r\n // get masked value without the value being in the input or element\r\n jMask.getMaskedVal = function(val) {\r\n return p.getMasked(false, val);\r\n };\r\n\r\n jMask.init = function(onlyMask) {\r\n onlyMask = onlyMask || false;\r\n options = options || {};\r\n\r\n jMask.clearIfNotMatch = $.jMaskGlobals.clearIfNotMatch;\r\n jMask.byPassKeys = $.jMaskGlobals.byPassKeys;\r\n jMask.translation = $.extend({}, $.jMaskGlobals.translation, options.translation);\r\n\r\n jMask = $.extend(true, {}, jMask, options);\r\n\r\n regexMask = p.getRegexMask();\r\n\r\n if (onlyMask === false) {\r\n\r\n if (options.placeholder) {\r\n el.attr('placeholder' , options.placeholder);\r\n }\r\n\r\n // this is necessary, otherwise if the user submit the form\r\n // and then press the \"back\" button, the autocomplete will erase\r\n // the data. Works fine on IE9+, FF, Opera, Safari.\r\n if (el.data('mask')) {\r\n el.attr('autocomplete', 'off');\r\n }\r\n\r\n p.destroyEvents();\r\n p.events();\r\n\r\n var caret = p.getCaret();\r\n p.val(p.getMasked());\r\n p.setCaret(caret + p.getMCharsBeforeCount(caret, true));\r\n\r\n } else {\r\n p.events();\r\n p.val(p.getMasked());\r\n }\r\n };\r\n\r\n jMask.init(!el.is('input'));\r\n };\r\n\r\n $.maskWatchers = {};\r\n var HTMLAttributes = function () {\r\n var input = $(this),\r\n options = {},\r\n prefix = 'data-mask-',\r\n mask = input.attr('data-mask');\r\n\r\n if (input.attr(prefix + 'reverse')) {\r\n options.reverse = true;\r\n }\r\n\r\n if (input.attr(prefix + 'clearifnotmatch')) {\r\n options.clearIfNotMatch = true;\r\n }\r\n\r\n if (input.attr(prefix + 'selectonfocus') === 'true') {\r\n options.selectOnFocus = true;\r\n }\r\n\r\n if (notSameMaskObject(input, mask, options)) {\r\n return input.data('mask', new Mask(this, mask, options));\r\n }\r\n },\r\n notSameMaskObject = function(field, mask, options) {\r\n options = options || {};\r\n var maskObject = $(field).data('mask'),\r\n stringify = JSON.stringify,\r\n value = $(field).val() || $(field).text();\r\n try {\r\n if (typeof mask === 'function') {\r\n mask = mask(value);\r\n }\r\n return typeof maskObject !== 'object' || stringify(maskObject.options) !== stringify(options) || maskObject.mask !== mask;\r\n } catch (e) {}\r\n },\r\n eventSupported = function(eventName) {\r\n var el = document.createElement('div'), isSupported;\r\n\r\n eventName = 'on' + eventName;\r\n isSupported = (eventName in el);\r\n\r\n if ( !isSupported ) {\r\n el.setAttribute(eventName, 'return;');\r\n isSupported = typeof el[eventName] === 'function';\r\n }\r\n el = null;\r\n\r\n return isSupported;\r\n };\r\n\r\n $.fn.mask = function(mask, options) {\r\n options = options || {};\r\n var selector = this.selector,\r\n globals = $.jMaskGlobals,\r\n interval = globals.watchInterval,\r\n watchInputs = options.watchInputs || globals.watchInputs,\r\n maskFunction = function() {\r\n if (notSameMaskObject(this, mask, options)) {\r\n return $(this).data('mask', new Mask(this, mask, options));\r\n }\r\n };\r\n\r\n $(this).each(maskFunction);\r\n\r\n if (selector && selector !== '' && watchInputs) {\r\n clearInterval($.maskWatchers[selector]);\r\n $.maskWatchers[selector] = setInterval(function(){\r\n $(document).find(selector).each(maskFunction);\r\n }, interval);\r\n }\r\n return this;\r\n };\r\n\r\n $.fn.masked = function(val) {\r\n return this.data('mask').getMaskedVal(val);\r\n };\r\n\r\n $.fn.unmask = function() {\r\n clearInterval($.maskWatchers[this.selector]);\r\n delete $.maskWatchers[this.selector];\r\n return this.each(function() {\r\n var dataMask = $(this).data('mask');\r\n if (dataMask) {\r\n dataMask.remove().removeData('mask');\r\n }\r\n });\r\n };\r\n\r\n $.fn.cleanVal = function() {\r\n return this.data('mask').getCleanVal();\r\n };\r\n\r\n $.applyDataMask = function(selector) {\r\n selector = selector || $.jMaskGlobals.maskElements;\r\n var $selector = (selector instanceof $) ? selector : $(selector);\r\n $selector.filter($.jMaskGlobals.dataMaskAttr).each(HTMLAttributes);\r\n };\r\n\r\n var globals = {\r\n maskElements: 'input,td,span,div',\r\n dataMaskAttr: '*[data-mask]',\r\n dataMask: true,\r\n watchInterval: 300,\r\n watchInputs: true,\r\n useInput: eventSupported('input'),\r\n watchDataMask: false,\r\n byPassKeys: [9, 16, 17, 18, 36, 37, 38, 39, 40, 91],\r\n translation: {\r\n '0': {pattern: /\\d/},\r\n '9': {pattern: /\\d/, optional: true},\r\n '#': {pattern: /\\d/, recursive: true},\r\n 'A': {pattern: /[a-zA-Z0-9]/},\r\n 'S': {pattern: /[a-zA-Z]/}\r\n }\r\n };\r\n\r\n $.jMaskGlobals = $.jMaskGlobals || {};\r\n globals = $.jMaskGlobals = $.extend(true, {}, globals, $.jMaskGlobals);\r\n\r\n // looking for inputs with data-mask attribute\r\n if (globals.dataMask) {\r\n $.applyDataMask();\r\n }\r\n\r\n setInterval(function() {\r\n if ($.jMaskGlobals.watchDataMask) {\r\n $.applyDataMask();\r\n }\r\n }, globals.watchInterval);\r\n}));\r\n","(function($){\r\n \r\n $.fn.modalBillboard = function(options) {\r\n /*\r\n\t\tvar settings = $.extend({\r\n onResize : function(){},\r\n animate : true,\r\n }, options);\r\n */\r\n\r\n this.each(function(){\r\n\t\t\t\r\n\t\t\t$(this).click(function(e) {\r\n\t\t\t\t\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\t\r\n\t\t\t\tvar myLink = $(this).attr(\"href\");\r\n\t\t\t\t\r\n\t\t\t\tvar scrollOffset = $(window).scrollTop();\r\n\t\t\t\tvar body = $(\"body\");\r\n\r\n\t\t\t \tvar container = $('').appendTo(body);\r\n\t\t\t\tvar container = $('').appendTo(body);\r\n\r\n\t\t\t\t$(\"#modalBillboardWrapper #closeBut, #modalBillboardWrapper\").click(function(e){\r\n\r\n\t\t\t\t\t$(this).hide();\r\n\t\t\t\t\t\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\r\n\t\t\t\t\t$('#modalBillboard').fadeOut(200, function(e) {\r\n\t\t\t\t\t\t$('#modalBillboard, #modalBillboardWrapper').remove();\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t\t\r\n\t\t\t\t}); \r\n\t\t\t\t\r\n\t\t\t\treturn false; \r\n\t\t\t}); \r\n\t\t\t\r\n });\r\n\r\n return this;\r\n };\r\n\r\n})(jQuery);","/*! http://mths.be/placeholder v2.0.7 by @mathias */\r\n;(function(window, document, $) {\r\n\r\n\t// Opera Mini v7 doesn’t support placeholder although its DOM seems to indicate so\r\n\tvar isOperaMini = Object.prototype.toString.call(window.operamini) == '[object OperaMini]';\r\n\tvar isInputSupported = 'placeholder' in document.createElement('input') && !isOperaMini;\r\n\tvar isTextareaSupported = 'placeholder' in document.createElement('textarea') && !isOperaMini;\r\n\tvar prototype = $.fn;\r\n\tvar valHooks = $.valHooks;\r\n\tvar propHooks = $.propHooks;\r\n\tvar hooks;\r\n\tvar placeholder;\r\n\r\n\tif (isInputSupported && isTextareaSupported) {\r\n\r\n\t\tplaceholder = prototype.placeholder = function() {\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\t\tplaceholder.input = placeholder.textarea = true;\r\n\r\n\t} else {\r\n\r\n\t\tplaceholder = prototype.placeholder = function() {\r\n\t\t\tvar $this = this;\r\n\t\t\t$this\r\n\t\t\t\t.filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')\r\n\t\t\t\t.not('.placeholder')\r\n\t\t\t\t.bind({\r\n\t\t\t\t\t'focus.placeholder': clearPlaceholder,\r\n\t\t\t\t\t'blur.placeholder': setPlaceholder\r\n\t\t\t\t})\r\n\t\t\t\t.data('placeholder-enabled', true)\r\n\t\t\t\t.trigger('blur.placeholder');\r\n\t\t\treturn $this;\r\n\t\t};\r\n\r\n\t\tplaceholder.input = isInputSupported;\r\n\t\tplaceholder.textarea = isTextareaSupported;\r\n\r\n\t\thooks = {\r\n\t\t\t'get': function(element) {\r\n\t\t\t\tvar $element = $(element);\r\n\r\n\t\t\t\tvar $passwordInput = $element.data('placeholder-password');\r\n\t\t\t\tif ($passwordInput) {\r\n\t\t\t\t\treturn $passwordInput[0].value;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;\r\n\t\t\t},\r\n\t\t\t'set': function(element, value) {\r\n\t\t\t\tvar $element = $(element);\r\n\r\n\t\t\t\tvar $passwordInput = $element.data('placeholder-password');\r\n\t\t\t\tif ($passwordInput) {\r\n\t\t\t\t\treturn $passwordInput[0].value = value;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!$element.data('placeholder-enabled')) {\r\n\t\t\t\t\treturn element.value = value;\r\n\t\t\t\t}\r\n\t\t\t\tif (value == '') {\r\n\t\t\t\t\telement.value = value;\r\n\t\t\t\t\t// Issue #56: Setting the placeholder causes problems if the element continues to have focus.\r\n\t\t\t\t\tif (element != safeActiveElement()) {\r\n\t\t\t\t\t\t// We can't use `triggerHandler` here because of dummy text/password inputs :(\r\n\t\t\t\t\t\tsetPlaceholder.call(element);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if ($element.hasClass('placeholder')) {\r\n\t\t\t\t\tclearPlaceholder.call(element, true, value) || (element.value = value);\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement.value = value;\r\n\t\t\t\t}\r\n\t\t\t\t// `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363\r\n\t\t\t\treturn $element;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (!isInputSupported) {\r\n\t\t\tvalHooks.input = hooks;\r\n\t\t\tpropHooks.value = hooks;\r\n\t\t}\r\n\t\tif (!isTextareaSupported) {\r\n\t\t\tvalHooks.textarea = hooks;\r\n\t\t\tpropHooks.value = hooks;\r\n\t\t}\r\n\r\n\t\t$(function() {\r\n\t\t\t// Look for forms\r\n\t\t\t$(document).delegate('form', 'submit.placeholder', function() {\r\n\t\t\t\t// Clear the placeholder values so they don't get submitted\r\n\t\t\t\tvar $inputs = $('.placeholder', this).each(clearPlaceholder);\r\n\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t$inputs.each(setPlaceholder);\r\n\t\t\t\t}, 10);\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t// Clear placeholder values upon page reload\r\n\t\t$(window).bind('beforeunload.placeholder', function() {\r\n\t\t\t$('.placeholder').each(function() {\r\n\t\t\t\tthis.value = '';\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tfunction args(elem) {\r\n\t\t// Return an object of element attributes\r\n\t\tvar newAttrs = {};\r\n\t\tvar rinlinejQuery = /^jQuery\\d+$/;\r\n\t\t$.each(elem.attributes, function(i, attr) {\r\n\t\t\tif (attr.specified && !rinlinejQuery.test(attr.name)) {\r\n\t\t\t\tnewAttrs[attr.name] = attr.value;\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn newAttrs;\r\n\t}\r\n\r\n\tfunction clearPlaceholder(event, value) {\r\n\t\tvar input = this;\r\n\t\tvar $input = $(input);\r\n\t\tif (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) {\r\n\t\t\tif ($input.data('placeholder-password')) {\r\n\t\t\t\t$input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));\r\n\t\t\t\t// If `clearPlaceholder` was called from `$.valHooks.input.set`\r\n\t\t\t\tif (event === true) {\r\n\t\t\t\t\treturn $input[0].value = value;\r\n\t\t\t\t}\r\n\t\t\t\t$input.focus();\r\n\t\t\t} else {\r\n\t\t\t\tinput.value = '';\r\n\t\t\t\t$input.removeClass('placeholder');\r\n\t\t\t\tinput == safeActiveElement() && input.select();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setPlaceholder() {\r\n\t\tvar $replacement;\r\n\t\tvar input = this;\r\n\t\tvar $input = $(input);\r\n\t\tvar id = this.id;\r\n\t\tif (input.value == '') {\r\n\t\t\tif (input.type == 'password') {\r\n\t\t\t\tif (!$input.data('placeholder-textinput')) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\t$replacement = $input.clone().attr({ 'type': 'text' });\r\n\t\t\t\t\t} catch(e) {\r\n\t\t\t\t\t\t$replacement = $('').attr($.extend(args(this), { 'type': 'text' }));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$replacement\r\n\t\t\t\t\t\t.removeAttr('name')\r\n\t\t\t\t\t\t.data({\r\n\t\t\t\t\t\t\t'placeholder-password': $input,\r\n\t\t\t\t\t\t\t'placeholder-id': id\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.bind('focus.placeholder', clearPlaceholder);\r\n\t\t\t\t\t$input\r\n\t\t\t\t\t\t.data({\r\n\t\t\t\t\t\t\t'placeholder-textinput': $replacement,\r\n\t\t\t\t\t\t\t'placeholder-id': id\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.before($replacement);\r\n\t\t\t\t}\r\n\t\t\t\t$input = $input.removeAttr('id').hide().prev().attr('id', id).show();\r\n\t\t\t\t// Note: `$input[0] != input` now!\r\n\t\t\t}\r\n\t\t\t$input.addClass('placeholder');\r\n\t\t\t$input[0].value = $input.attr('placeholder');\r\n\t\t} else {\r\n\t\t\t$input.removeClass('placeholder');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction safeActiveElement() {\r\n\t\t// Avoid IE9 `document.activeElement` of death\r\n\t\t// https://github.com/mathiasbynens/jquery-placeholder/pull/99\r\n\t\ttry {\r\n\t\t\treturn document.activeElement;\r\n\t\t} catch (err) {}\r\n\t}\r\n\r\n}(this, document, jQuery));\r\n","// tipsy, facebook style tooltips for jquery\r\n// version 1.0.0a\r\n// (c) 2008-2010 jason frame [jason@onehackoranother.com]\r\n// released under the MIT license\r\n\r\n// Lagt till st�d f�r infoBubble. F�r att s�tta infoBubble toolTip s� ange infoBubble: true i options\r\n(function ($) {\r\n\r\n function Tipsy(element, options) {\r\n this.$element = $(element);\r\n this.options = options;\r\n this.enabled = true;\r\n this.fixTitle();\r\n }\r\n\r\n Tipsy.prototype = {\r\n bubbleSetWidth:\r\n function () {\r\n var $tip = this.tip();\r\n var html_org = $tip.find('.tipsyInfoBubble').html();\r\n var html_calc = '' + html_org + '';\r\n $tip.find('.tipsyInfoBubble').html(html_calc);\r\n var width = $tip.find('.tipsyInfoBubble').find('span:first').width();\r\n if (width<200) width = 200;\r\n $tip.find('.tipsyInfoBubble').width(width);\r\n $tip.find('.tipsyInfoBubble').html(html_org);\r\n $(document.body.lastChild).width(width);\r\n\r\n return width;\r\n },\r\n show: function () {\r\n var title = this.getTitle();\r\n if (title && this.enabled) {\r\n var $tip = this.tip();\r\n\r\n if (this.options.infoBubble) {\r\n $tip.find('.tipsyInfoBubble')[this.options.html ? 'html' : 'text'](title);\r\n }\r\n else {\r\n $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);\r\n }\r\n\r\n $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity\r\n $tip.remove().css({ top: 0, left: 0, visibility: 'hidden', display: 'block' }).appendTo(document.body);\r\n\r\n\r\n if (this.options.infoBubble) {\r\n this.bubbleSetWidth();\r\n }\r\n\r\n var pos = $.extend({}, this.$element.offset(), {\r\n width: this.$element[0].offsetWidth,\r\n height: this.$element[0].offsetHeight\r\n });\r\n\r\n var actualWidth = $tip[0].offsetWidth, actualHeight = $tip[0].offsetHeight;\r\n var gravity = (typeof this.options.gravity == 'function')\r\n ? this.options.gravity.call(this.$element[0])\r\n : this.options.gravity;\r\n\r\n var tp;\r\n switch (gravity.charAt(0)) {\r\n case 'n':\r\n tp = { top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2 };\r\n break;\r\n case 's':\r\n tp = { top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2 };\r\n break;\r\n case 'e':\r\n tp = { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset };\r\n break;\r\n case 'w':\r\n tp = { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset };\r\n break;\r\n }\r\n\r\n if (gravity.length == 2) {\r\n if (gravity.charAt(1) == 'w') {\r\n tp.left = pos.left + pos.width / 2 - 15;\r\n } else {\r\n tp.left = pos.left + pos.width / 2 - actualWidth + 15;\r\n }\r\n }\r\n\r\n $tip.css(tp).addClass('tipsy-' + gravity);\r\n\r\n if (this.options.fade) {\r\n\t\t\t\t\tif ($.browser.msie) {\r\n\t\t\t\t\t\t$tip.stop().show().css({visibility: 'visible' });\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n \t$tip.stop().css({ opacity: 0, display: 'block', visibility: 'visible' }).animate({ opacity: this.options.opacity });\r\n\t\t\t\t\t}\r\n } else {\r\n $tip.css({ visibility: 'visible', opacity: this.options.opacity });\r\n }\r\n }\r\n },\r\n\r\n hide: function () {\r\n if (this.options.fade) {\r\n\t\t\t\tif ($.browser.msie) {\r\n\t\t\t\t\tthis.tip().stop().hide();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.tip().stop().fadeOut(function () { $(this).remove(); });\r\n\t\t\t\t}\r\n } else {\r\n this.tip().remove();\r\n }\r\n },\r\n\r\n fixTitle: function () {\r\n var $e = this.$element;\r\n if ($e.attr('title') || typeof ($e.attr('original-title')) != 'string') {\r\n $e.attr('original-title', $e.attr('title') || '').removeAttr('title');\r\n }\r\n },\r\n\r\n getTitle: function () {\r\n var title, $e = this.$element, o = this.options;\r\n this.fixTitle();\r\n var title, o = this.options;\r\n if (typeof o.title == 'string') {\r\n title = $e.attr(o.title == 'title' ? 'original-title' : o.title);\r\n } else if (typeof o.title == 'function') {\r\n title = o.title.call($e[0]);\r\n }\r\n title = ('' + title).replace(/(^\\s*|\\s*$)/, \"\");\r\n return title || o.fallback;\r\n },\r\n\r\n tip: function () {\r\n if (!this.$tip) {\r\n if (this.options.infoBubble) {\r\n var infoBubbleHtml = '';\r\n this.$tip = $('').html('' + infoBubbleHtml + '
');\r\n }\r\n else {\r\n this.$tip = $('').html(''); \r\n }\r\n }\r\n return this.$tip;\r\n },\r\n\r\n validate: function () {\r\n if (!this.$element[0].parentNode) {\r\n this.hide();\r\n this.$element = null;\r\n this.options = null;\r\n }\r\n },\r\n\r\n enable: function () { this.enabled = true; },\r\n disable: function () { this.enabled = false; },\r\n toggleEnabled: function () { this.enabled = !this.enabled; }\r\n };\r\n\r\n $.fn.tipsy = function (options) {\r\n\r\n if (options === true) {\r\n return this.data('tipsy');\r\n } else if (typeof options == 'string') {\r\n var tipsy = this.data('tipsy');\r\n if (tipsy) tipsy[options]();\r\n return this;\r\n }\r\n\r\n options = $.extend({}, $.fn.tipsy.defaults, options);\r\n\r\n function get(ele) {\r\n var tipsy = $.data(ele, 'tipsy');\r\n if (!tipsy) {\r\n tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));\r\n $.data(ele, 'tipsy', tipsy);\r\n }\r\n return tipsy;\r\n }\r\n\r\n function enter() {\r\n var tipsy = get(this);\r\n tipsy.hoverState = 'in';\r\n if (options.delayIn == 0) {\r\n tipsy.show();\r\n } else {\r\n tipsy.fixTitle();\r\n setTimeout(function () { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);\r\n }\r\n };\r\n\r\n function leave() {\r\n var tipsy = get(this);\r\n tipsy.hoverState = 'out';\r\n if (options.delayOut == 0) {\r\n tipsy.hide();\r\n } else {\r\n setTimeout(function () { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);\r\n }\r\n };\r\n\r\n if (!options.live) this.each(function () { get(this); });\r\n\r\n if (options.trigger != 'manual') {\r\n var binder = options.live ? 'live' : 'bind',\r\n eventIn = options.trigger == 'hover' ? 'mouseenter' : 'focus',\r\n eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';\r\n this[binder](eventIn, enter)[binder](eventOut, leave);\r\n }\r\n\r\n return this;\r\n\r\n };\r\n\r\n $.fn.tipsy.defaults = {\r\n delayIn: 0,\r\n delayOut: 0,\r\n fade: false,\r\n fallback: '',\r\n gravity: 'n',\r\n html: false,\r\n live: false,\r\n offset: 0,\r\n opacity: 0.8,\r\n title: 'title',\r\n trigger: 'hover',\r\n infoBubble: false\r\n };\r\n\r\n // Overwrite this method to provide options on a per-element basis.\r\n // For example, you could store the gravity in a 'tipsy-gravity' attribute:\r\n // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });\r\n // (remember - do not modify 'options' in place!)\r\n $.fn.tipsy.elementOptions = function (ele, options) {\r\n return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;\r\n };\r\n\r\n $.fn.tipsy.autoNS = function () {\r\n return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';\r\n };\r\n\r\n $.fn.tipsy.autoWE = function () {\r\n return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';\r\n };\r\n\r\n})(jQuery);\r\n","/**\r\n * \r\n * Tooltip\r\n * By Pär Karlsson (me@iamacoder.com). Based on http://osvaldas.info/elegant-css-and-jquery-tooltip-responsive-mobile-friendly but made modular.\r\n * \r\n */\r\nvar tooltip = (function() {\r\n\r\n var targets = $('[rel~=tooltip]'),\r\n target = false,\r\n tooltip = false,\r\n title = false;\r\n\r\n // Constuct\r\n function construct() {\r\n targets.bind('click mouseenter', function(e) {\r\n e.preventDefault();\r\n target = $(this);\r\n tip = target.attr('title');\r\n tooltip = $('');\r\n \r\n if (!tip || tip == '')\r\n return false;\r\n \r\n target.attr('title', '');\r\n tooltip.css('opacity', 0)\r\n .html(tip)\r\n .appendTo('body');\r\n\r\n renderTooltip();\r\n bindEventListeners();\r\n });\r\n };\r\n\r\n function renderTooltip() {\r\n\r\n if ($(window).width() < tooltip.outerWidth(false) * 1.5)\r\n tooltip.css('max-width', $(window).width() / 2);\r\n else\r\n tooltip.css('max-width', 340);\r\n \r\n var posX = target.offset().left + (target.outerWidth(false) / 2) - (tooltip.outerWidth(false) / 2),\r\n posY = target.offset().top - tooltip.outerHeight(false) - 20;\r\n\r\n if (posX < 0) {\r\n posX = target.offset().left + target.outerWidth(false) / 2 - 20;\r\n tooltip.addClass('left');\r\n }\r\n else\r\n tooltip.removeClass('left');\r\n\r\n if (posX + tooltip.outerWidth(false) > $(window).width()) {\r\n posX = target.offset().left - tooltip.outerWidth(false) + target.outerWidth(false) / 2 + 20;\r\n tooltip.addClass('right');\r\n }\r\n else\r\n tooltip.removeClass('right');\r\n\r\n if (posY < 0) {\r\n var posY = target.offset().top + target.outerHeight(false);\r\n tooltip.addClass('top');\r\n }\r\n else\r\n tooltip.removeClass('top');\r\n\r\n tooltip.css({ left: posX, top: posY })\r\n .animate({ top: '+=10', opacity: 1 }, 50);\r\n };\r\n\r\n function bindEventListeners() {\r\n $(window).resize(renderTooltip);\r\n target.bind('mouseleave', removeTooltip);\r\n tooltip.bind('click', removeTooltip);\r\n }\r\n\r\n function removeTooltip() {\r\n tooltip.animate({ top: '-=10', opacity: 0 }, 50, function() {\r\n $(this).remove();\r\n });\r\n\r\n target.attr('title', tip);\r\n }\r\n\r\n $(document).ready(function() {\r\n construct();\r\n });\r\n\r\n // Public methods\r\n return {\r\n \r\n }\r\n\r\n}());","if (typeof BOOK == 'undefined') var BOOK = {};\r\n\r\nBOOK.common = BOOK.common || {};\r\n\r\nBOOK.common.setupPasswordStrengthCheck = function (passwordInputSelector) {\r\n var passInput = $(passwordInputSelector);\r\n \r\n passInput.after('');\r\n\r\n if (typeof passInput.on == \"undefined\") {\r\n passInput.bind(\"keypress keyup keydown\", function () {\r\n indicatePassStrength($(this));\r\n });\r\n } else {\r\n passInput.on(\"keypress keyup keydown\", function () {\r\n indicatePassStrength($(this));\r\n });\r\n }\r\n\r\n var attrWeak = passInput.attr(\"data-weak-strength\");\r\n var attrMedium = passInput.attr(\"data-medium-strength\");\r\n var attrStrong = passInput.attr(\"data-strong-strength\");\r\n\r\n var _strengthTextWeak = (attrWeak == null) ? 'SVAGT' : attrWeak;\r\n var _strengthTextMedium = (attrMedium == null) ? 'MEDEL' : attrMedium;\r\n var _strengthTextStrong = (attrStrong == null) ? 'STARKT' : attrStrong;\r\n\r\n //Force update to set the initial state.\r\n indicatePassStrength(passInput);\r\n \r\n function indicatePassStrength(aPassInput) {\r\n var pass = aPassInput.val();\r\n $(\"#PassStrength .PassValue\").text(getPassStrengthText(pass));\r\n $(\"#PassStrength\").attr('class', getPassStrengthClass(pass));\r\n }\r\n \r\n function scorePassword(pass) {\r\n var score = 0;\r\n if (!pass)\r\n return score;\r\n\r\n // award every unique letter until 5 repetitions\r\n var letters = new Object();\r\n for (var i=0; i 80) {\r\n strengthText = _strengthTextStrong;\r\n } else if (score > 40) {\r\n strengthText = _strengthTextMedium;\r\n } else {\r\n strengthText = _strengthTextWeak;\r\n }\r\n\r\n return strengthText;\r\n }\r\n\r\n function getPassStrengthClass(pass) {\r\n var strengthClass;\r\n var score = scorePassword(pass);\r\n if (score == 0) {\r\n strengthClass = 'noPass';\r\n } else if (score > 80) {\r\n strengthClass = 'strongPass';\r\n } else if (score > 40) {\r\n strengthClass = 'goodPass';\r\n } else {\r\n strengthClass = 'weakPass';\r\n }\r\n\r\n return 'passStrengthIndicator ' + strengthClass;\r\n }\r\n \r\n};\r\n ","/* Danish initialisation for the jQuery UI date picker plugin. */\r\n/* Written by Jan Christensen ( deletestuff@gmail.com). */\r\njQuery(function ($) {\r\n $.datepicker.regional['da'] = {\r\n closeText: 'Luk',\r\n prevText: '<Forrige',\r\n nextText: 'Næste>',\r\n currentText: 'Idag',\r\n monthNames: ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni',\r\n 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],\r\n monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',\r\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],\r\n dayNames: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],\r\n dayNamesShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],\r\n dayNamesMin: ['Sø', 'Ma', 'Ti', 'On', 'To', 'Fr', 'Lø'],\r\n weekHeader: 'Uge',\r\n dateFormat: 'yy-mm-dd',\r\n firstDay: 1,\r\n isRTL: false,\r\n showMonthAfterYear: false,\r\n yearSuffix: ''\r\n };\r\n $.datepicker.setDefaults($.datepicker.regional['da']);\r\n});","jQuery(function ($) {\r\n $.datepicker.regional['de'] = {\r\n closeText: 'Schließen',\r\n prevText: '<Zurück',\r\n nextText: 'Vor>',\r\n currentText: 'Heute',\r\n monthNames: [\"Januar\", \"Februar\", \"März\", \"April\", \"Mai\", \"Juni\",\r\n\t\"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\r\n monthNamesShort: [\"Jan\", \"Feb\", \"Mär\", \"Apr\", \"Mai\", \"Jun\",\r\n \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\r\n dayNames: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\r\n dayNamesShort: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\r\n dayNamesMin: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\r\n weekHeader: \"KW\",\r\n dateFormat: \"dd.mm.yy\",\r\n firstDay: 1,\r\n isRTL: false,\r\n showMonthAfterYear: false,\r\n yearSuffix: ''\r\n };\r\n $.datepicker.setDefaults($.datepicker.regional['de']);\r\n});\r\n","/* English/UK initialisation for the jQuery UI date picker plugin. */\r\n/* Written by Stuart. */\r\njQuery(function ($) {\r\n $.datepicker.regional['en-GB'] = {\r\n closeText: 'Done',\r\n prevText: 'Prev',\r\n nextText: 'Next',\r\n currentText: 'Today',\r\n monthNames: ['January', 'February', 'March', 'April', 'May', 'June',\r\n\t\t'July', 'August', 'September', 'October', 'November', 'December'],\r\n monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\r\n\t\t'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\r\n dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\r\n dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r\n dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\r\n weekHeader: 'Wk',\r\n dateFormat: 'yy-mm-dd',\r\n firstDay: 1,\r\n isRTL: false,\r\n showMonthAfterYear: false,\r\n yearSuffix: ''\r\n };\r\n $.datepicker.setDefaults($.datepicker.regional['en-GB']);\r\n});\r\n","/* Norwegian initialisation for the jQuery UI date picker plugin. */\r\n/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */\r\n\r\n/* Copy of the -no variant, since the language used the web application norsk bokmål */\r\njQuery(function ($) {\r\n $.datepicker.regional['no'] = {\r\n closeText: 'Lukk',\r\n prevText: '«Forrige',\r\n nextText: 'Neste»',\r\n currentText: 'I dag',\r\n monthNames: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\r\n monthNamesShort: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'],\r\n dayNamesShort: ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'],\r\n dayNames: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\r\n dayNamesMin: ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'],\r\n weekHeader: 'Uke',\r\n dateFormat: 'yy-mm-dd',\r\n firstDay: 1,\r\n isRTL: false,\r\n showMonthAfterYear: false,\r\n yearSuffix: ''\r\n };\r\n $.datepicker.setDefaults($.datepicker.regional['no']);\r\n});\r\n","/* Norwegian initialisation for the jQuery UI date picker plugin. */\r\n/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */\r\n\r\njQuery(function ($) {\r\n $.datepicker.regional['no'] = {\r\n closeText: 'Lukk',\r\n prevText: '«Forrige',\r\n nextText: 'Neste»',\r\n currentText: 'I dag',\r\n monthNames: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\r\n monthNamesShort: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'],\r\n dayNamesShort: ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'],\r\n dayNames: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\r\n dayNamesMin: ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'],\r\n weekHeader: 'Uke',\r\n dateFormat: 'yy-mm-dd',\r\n firstDay: 1,\r\n isRTL: false,\r\n showMonthAfterYear: false,\r\n yearSuffix: ''\r\n };\r\n $.datepicker.setDefaults($.datepicker.regional['no']);\r\n});\r\n","/* Swedish initialisation for the jQuery UI date picker plugin. */\r\n/* Written by Anders Ekdahl ( anders@nomadiz.se). */\r\njQuery(function($){\r\n $.datepicker.regional['sv'] = {\r\n\t\tcloseText: 'Stäng',\r\n prevText: '«Förra',\r\n\t\tnextText: 'Nästa»',\r\n\t\tcurrentText: 'Idag',\r\n monthNames: ['Januari','Februari','Mars','April','Maj','Juni',\r\n 'Juli','Augusti','September','Oktober','November','December'],\r\n monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',\r\n 'Jul','Aug','Sep','Okt','Nov','Dec'],\r\n\t\tdayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],\r\n\t\tdayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],\r\n\t\tdayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],\r\n\t\tweekHeader: 'V',\r\n dateFormat: 'yy-mm-dd',\r\n\t\tfirstDay: 1,\r\n\t\tisRTL: false,\r\n\t\tshowMonthAfterYear: false,\r\n\t\tyearSuffix: ''};\r\n $.datepicker.setDefaults($.datepicker.regional['sv']);\r\n});\r\n","/*\r\n\r\nUniform v1.7.5\r\nCopyright © 2009 Josh Pyles / Pixelmatrix Design LLC\r\nhttp://pixelmatrixdesign.com\r\n\r\nRequires jQuery 1.4 or newer\r\n\r\nMuch thanks to Thomas Reynolds and Buck Wilson for their help and advice on this\r\n\r\nDisabling text selection is made possible by Mathias Bynens \r\nand his noSelect plugin. \r\n\r\nAlso, thanks to David Kaneda and Eugene Bond for their contributions to the plugin\r\n\r\nLicense:\r\nMIT License - http://www.opensource.org/licenses/mit-license.php\r\n\r\nEnjoy!\r\n\r\n*/\r\n\r\n(function ($) {\r\n $.uniform = {\r\n options: {\r\n selectClass: 'selector',\r\n radioClass: 'radio',\r\n checkboxClass: 'checker',\r\n fileClass: 'uploader',\r\n filenameClass: 'filename',\r\n fileBtnClass: 'action',\r\n fileDefaultText: 'No file selected',\r\n fileBtnText: 'Choose File',\r\n checkedClass: 'checked',\r\n focusClass: 'focus',\r\n disabledClass: 'disabled',\r\n buttonClass: 'button',\r\n activeClass: 'active',\r\n hoverClass: 'hover',\r\n useID: true,\r\n idPrefix: 'uniform',\r\n resetSelector: false,\r\n autoHide: true\r\n },\r\n elements: []\r\n };\r\n\r\n if ($.browser.msie && $.browser.version < 7) {\r\n $.support.selectOpacity = false;\r\n } else {\r\n $.support.selectOpacity = true;\r\n }\r\n\r\n $.fn.uniform = function (options) {\r\n\r\n options = $.extend($.uniform.options, options);\r\n\r\n var el = this;\r\n //code for specifying a reset button\r\n if (options.resetSelector != false) {\r\n $(options.resetSelector).mouseup(function () {\r\n function resetThis() {\r\n $.uniform.update(el);\r\n }\r\n setTimeout(resetThis, 10);\r\n });\r\n }\r\n\r\n function doInput(elem) {\r\n $el = $(elem);\r\n $el.addClass($el.attr(\"type\"));\r\n storeElement(elem);\r\n }\r\n\r\n function doTextarea(elem) {\r\n $(elem).addClass(\"uniform\");\r\n //$(elem).addClass(\"styled-input\");\r\n storeElement(elem);\r\n }\r\n\r\n function doButton(elem) {\r\n var $el = $(elem);\r\n\r\n var divTag = $(\"\"),\r\n spanTag = $(\"
\");\r\n\r\n divTag.addClass(options.buttonClass);\r\n\r\n if (options.useID && $el.attr(\"id\") != \"\") divTag.attr(\"id\", options.idPrefix + \"-\" + $el.attr(\"id\"));\r\n\r\n var btnText;\r\n\r\n if ($el.is(\"a\") || $el.is(\"button\")) {\r\n btnText = $el.text();\r\n } else if ($el.is(\":submit\") || $el.is(\":reset\") || $el.is(\"input[type=button]\")) {\r\n btnText = $el.attr(\"value\");\r\n }\r\n\r\n btnText = btnText == \"\" ? $el.is(\":reset\") ? \"Reset\" : \"Submit\" : btnText;\r\n\r\n spanTag.html(btnText);\r\n\r\n $el.css(\"opacity\", 0);\r\n $el.wrap(divTag);\r\n $el.wrap(spanTag);\r\n\r\n //redefine variables\r\n divTag = $el.closest(\"div\");\r\n spanTag = $el.closest(\"span\");\r\n\r\n if ($el.is(\":disabled\")) divTag.addClass(options.disabledClass);\r\n\r\n divTag.bind({\r\n \"mouseenter.uniform\": function () {\r\n divTag.addClass(options.hoverClass);\r\n },\r\n \"mouseleave.uniform\": function () {\r\n divTag.removeClass(options.hoverClass);\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"mousedown.uniform touchbegin.uniform\": function () {\r\n divTag.addClass(options.activeClass);\r\n },\r\n \"mouseup.uniform touchend.uniform\": function () {\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"click.uniform touchend.uniform\": function (e) {\r\n if ($(e.target).is(\"span\") || $(e.target).is(\"div\")) {\r\n if (elem[0].dispatchEvent) {\r\n var ev = document.createEvent('MouseEvents');\r\n ev.initEvent('click', true, true);\r\n elem[0].dispatchEvent(ev);\r\n } else {\r\n elem[0].click();\r\n }\r\n }\r\n }\r\n });\r\n\r\n elem.bind({\r\n \"focus.uniform\": function () {\r\n divTag.addClass(options.focusClass);\r\n },\r\n \"blur.uniform\": function () {\r\n divTag.removeClass(options.focusClass);\r\n }\r\n });\r\n\r\n $.uniform.noSelect(divTag);\r\n storeElement(elem);\r\n\r\n }\r\n\r\n function doSelect(elem) {\r\n var $el = $(elem);\r\n\r\n if ($el.parent() != undefined && $el.parent().hasClass(\"styled-select\")) {\r\n return;\r\n }\r\n\r\n elem.wrap($(''));\r\n storeElement(elem);\r\n return;\r\n\r\n var divTag = $(''),\r\n spanTag = $('');\r\n\r\n divTag.width($el.width());\r\n spanTag.width($el.width());\r\n $el.width($el.width());\r\n\r\n if (!$el.css(\"display\") == \"none\" && options.autoHide) {\r\n divTag.hide();\r\n }\r\n\r\n divTag.addClass(options.selectClass);\r\n\r\n if (options.useID && elem.attr(\"id\") != \"\") {\r\n divTag.attr(\"id\", options.idPrefix + \"-\" + elem.attr(\"id\"));\r\n }\r\n\r\n var selected = elem.find(\":selected:first\");\r\n\r\n if (selected != null && selected.length == 0) {\r\n selected = elem.find(\"option:first\");\r\n }\r\n spanTag.html(selected.html());\r\n\r\n elem.css('opacity', 0);\r\n elem.wrap(divTag);\r\n elem.before(spanTag);\r\n\r\n //redefine variables\r\n divTag = elem.parent(\"div\");\r\n spanTag = elem.siblings(\"span\");\r\n\r\n elem.bind({\r\n \"change.uniform\": function () {\r\n spanTag.text(elem.find(\":selected\").html());\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"focus.uniform\": function () {\r\n divTag.addClass(options.focusClass);\r\n },\r\n \"blur.uniform\": function () {\r\n divTag.removeClass(options.focusClass);\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"mousedown.uniform touchbegin.uniform\": function () {\r\n divTag.addClass(options.activeClass);\r\n },\r\n \"mouseup.uniform touchend.uniform\": function () {\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"click.uniform touchend.uniform\": function () {\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"mouseenter.uniform\": function () {\r\n divTag.addClass(options.hoverClass);\r\n },\r\n \"mouseleave.uniform\": function () {\r\n divTag.removeClass(options.hoverClass);\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"keyup.uniform\": function () {\r\n spanTag.text(elem.find(\":selected\").html());\r\n }\r\n });\r\n\r\n //handle disabled state\r\n if ($(elem).attr(\"disabled\")) {\r\n //box is checked by default, check our box\r\n divTag.addClass(options.disabledClass);\r\n }\r\n $.uniform.noSelect(spanTag);\r\n\r\n storeElement(elem);\r\n\r\n }\r\n\r\n function doCheckbox(elem) {\r\n var $el = $(elem);\r\n/*\r\n $el.addClass('styled-checkbox');\r\n storeElement(elem);\r\n return;*/\r\n\r\n var divTag = $(''),\r\n spanTag = $('');\r\n\r\n if (!$el.css(\"display\") == \"none\" && options.autoHide) {\r\n divTag.hide();\r\n }\r\n\r\n divTag.addClass(options.checkboxClass);\r\n\r\n //assign the id of the element\r\n if (options.useID && elem.attr(\"id\") != \"\") {\r\n divTag.attr(\"id\", options.idPrefix + \"-\" + elem.attr(\"id\"));\r\n }\r\n\r\n //wrap with the proper elements\r\n $(elem).wrap(divTag);\r\n $(elem).wrap(spanTag);\r\n\r\n //redefine variables\r\n spanTag = elem.parent();\r\n divTag = spanTag.parent();\r\n\r\n //hide normal input and add focus classes\r\n $(elem)\r\n .css(\"opacity\", 0)\r\n .bind({\r\n \"focus.uniform\": function () {\r\n divTag.addClass(options.focusClass);\r\n },\r\n \"blur.uniform\": function () {\r\n divTag.removeClass(options.focusClass);\r\n },\r\n \"click.uniform touchend.uniform\": function () {\r\n if (!$(elem).attr(\"checked\")) {\r\n //box was just unchecked, uncheck span\r\n spanTag.removeClass(options.checkedClass);\r\n } else {\r\n //box was just checked, check span.\r\n spanTag.addClass(options.checkedClass);\r\n }\r\n },\r\n \"mousedown.uniform touchbegin.uniform\": function () {\r\n divTag.addClass(options.activeClass);\r\n },\r\n \"mouseup.uniform touchend.uniform\": function () {\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"mouseenter.uniform\": function () {\r\n divTag.addClass(options.hoverClass);\r\n },\r\n \"mouseleave.uniform\": function () {\r\n divTag.removeClass(options.hoverClass);\r\n divTag.removeClass(options.activeClass);\r\n }\r\n });\r\n\r\n //handle defaults\r\n if ($(elem).attr(\"checked\")) {\r\n //box is checked by default, check our box\r\n spanTag.addClass(options.checkedClass);\r\n }\r\n\r\n //handle disabled state\r\n if ($(elem).attr(\"disabled\")) {\r\n //box is checked by default, check our box\r\n divTag.addClass(options.disabledClass);\r\n }\r\n\r\n storeElement(elem);\r\n }\r\n\r\n function doRadio(elem) {\r\n var $el = $(elem);\r\n\r\n var divTag = $(''),\r\n spanTag = $('');\r\n\r\n if (!$el.css(\"display\") == \"none\" && options.autoHide) {\r\n divTag.hide();\r\n }\r\n\r\n divTag.addClass(options.radioClass);\r\n\r\n if (options.useID && elem.attr(\"id\") != \"\") {\r\n divTag.attr(\"id\", options.idPrefix + \"-\" + elem.attr(\"id\"));\r\n }\r\n\r\n //wrap with the proper elements\r\n $(elem).wrap(divTag);\r\n $(elem).wrap(spanTag);\r\n\r\n //redefine variables\r\n spanTag = elem.parent();\r\n divTag = spanTag.parent();\r\n\r\n //hide normal input and add focus classes\r\n $(elem)\r\n .css(\"opacity\", 0)\r\n .bind({\r\n \"focus.uniform\": function () {\r\n divTag.addClass(options.focusClass);\r\n },\r\n \"blur.uniform\": function () {\r\n divTag.removeClass(options.focusClass);\r\n },\r\n \"click.uniform touchend.uniform\": function () {\r\n if (!$(elem).attr(\"checked\")) {\r\n //box was just unchecked, uncheck span\r\n spanTag.removeClass(options.checkedClass);\r\n } else {\r\n //box was just checked, check span\r\n var classes = options.radioClass.split(\" \")[0];\r\n $(\".\" + classes + \" span.\" + options.checkedClass + \":has([name='\" + $(elem).attr('name') + \"'])\").removeClass(options.checkedClass);\r\n spanTag.addClass(options.checkedClass);\r\n }\r\n },\r\n \"mousedown.uniform touchend.uniform\": function () {\r\n if (!$(elem).is(\":disabled\")) {\r\n divTag.addClass(options.activeClass);\r\n }\r\n },\r\n \"mouseup.uniform touchbegin.uniform\": function () {\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"mouseenter.uniform touchend.uniform\": function () {\r\n divTag.addClass(options.hoverClass);\r\n },\r\n \"mouseleave.uniform\": function () {\r\n divTag.removeClass(options.hoverClass);\r\n divTag.removeClass(options.activeClass);\r\n }\r\n });\r\n\r\n //handle defaults\r\n if ($(elem).attr(\"checked\")) {\r\n //box is checked by default, check span\r\n spanTag.addClass(options.checkedClass);\r\n }\r\n //handle disabled state\r\n if ($(elem).attr(\"disabled\")) {\r\n //box is checked by default, check our box\r\n divTag.addClass(options.disabledClass);\r\n }\r\n\r\n storeElement(elem);\r\n\r\n }\r\n\r\n function doFile(elem) {\r\n //sanitize input\r\n var $el = $(elem);\r\n\r\n var divTag = $(''),\r\n filenameTag = $('' + options.fileDefaultText + ''),\r\n btnTag = $('' + options.fileBtnText + '');\r\n\r\n if (!$el.css(\"display\") == \"none\" && options.autoHide) {\r\n divTag.hide();\r\n }\r\n\r\n divTag.addClass(options.fileClass);\r\n filenameTag.addClass(options.filenameClass);\r\n btnTag.addClass(options.fileBtnClass);\r\n\r\n if (options.useID && $el.attr(\"id\") != \"\") {\r\n divTag.attr(\"id\", options.idPrefix + \"-\" + $el.attr(\"id\"));\r\n }\r\n\r\n //wrap with the proper elements\r\n $el.wrap(divTag);\r\n $el.after(btnTag);\r\n $el.after(filenameTag);\r\n\r\n //redefine variables\r\n divTag = $el.closest(\"div\");\r\n filenameTag = $el.siblings(\".\" + options.filenameClass);\r\n btnTag = $el.siblings(\".\" + options.fileBtnClass);\r\n\r\n //set the size\r\n if (!$el.attr(\"size\")) {\r\n var divWidth = divTag.width();\r\n //$el.css(\"width\", divWidth);\r\n $el.attr(\"size\", divWidth / 10);\r\n }\r\n\r\n //actions\r\n var setFilename = function () {\r\n var filename = $el.val();\r\n if (filename === '') {\r\n filename = options.fileDefaultText;\r\n }\r\n else {\r\n filename = filename.split(/[\\/\\\\]+/);\r\n filename = filename[(filename.length - 1)];\r\n }\r\n filenameTag.text(filename);\r\n };\r\n\r\n // Account for input saved across refreshes\r\n setFilename();\r\n\r\n $el\r\n .css(\"opacity\", 0)\r\n .bind({\r\n \"focus.uniform\": function () {\r\n divTag.addClass(options.focusClass);\r\n },\r\n \"blur.uniform\": function () {\r\n divTag.removeClass(options.focusClass);\r\n },\r\n \"mousedown.uniform\": function () {\r\n if (!$(elem).is(\":disabled\")) {\r\n divTag.addClass(options.activeClass);\r\n }\r\n },\r\n \"mouseup.uniform\": function () {\r\n divTag.removeClass(options.activeClass);\r\n },\r\n \"mouseenter.uniform\": function () {\r\n divTag.addClass(options.hoverClass);\r\n },\r\n \"mouseleave.uniform\": function () {\r\n divTag.removeClass(options.hoverClass);\r\n divTag.removeClass(options.activeClass);\r\n }\r\n });\r\n\r\n // IE7 doesn't fire onChange until blur or second fire.\r\n if ($.browser.msie) {\r\n // IE considers browser chrome blocking I/O, so it\r\n // suspends tiemouts until after the file has been selected.\r\n $el.bind('click.uniform.ie7', function () {\r\n setTimeout(setFilename, 0);\r\n });\r\n } else {\r\n // All other browsers behave properly\r\n $el.bind('change.uniform', setFilename);\r\n }\r\n\r\n //handle defaults\r\n if ($el.attr(\"disabled\")) {\r\n //box is checked by default, check our box\r\n divTag.addClass(options.disabledClass);\r\n }\r\n\r\n $.uniform.noSelect(filenameTag);\r\n $.uniform.noSelect(btnTag);\r\n\r\n storeElement(elem);\r\n\r\n }\r\n\r\n $.uniform.restore = function (elem) {\r\n if (elem == undefined) {\r\n elem = $($.uniform.elements);\r\n }\r\n\r\n $(elem).each(function () {\r\n if ($(this).is(\":checkbox\")) {\r\n //unwrap from span and div\r\n $(this).unwrap().unwrap();\r\n } else if ($(this).is(\"select\")) {\r\n //remove sibling span\r\n $(this).siblings(\"span\").remove();\r\n //unwrap parent div\r\n $(this).unwrap();\r\n } else if ($(this).is(\":radio\")) {\r\n //unwrap from span and div\r\n $(this).unwrap().unwrap();\r\n } else if ($(this).is(\":file\")) {\r\n //remove sibling spans\r\n $(this).siblings(\"span\").remove();\r\n //unwrap parent div\r\n $(this).unwrap();\r\n } else if ($(this).is(\"button, :submit, :reset, a, input[type='button']\")) {\r\n //unwrap from span and div\r\n $(this).unwrap().unwrap();\r\n }\r\n\r\n //unbind events\r\n $(this).unbind(\".uniform\");\r\n\r\n //reset inline style\r\n $(this).css(\"opacity\", \"1\");\r\n\r\n //remove item from list of uniformed elements\r\n var index = $.inArray($(elem), $.uniform.elements);\r\n $.uniform.elements.splice(index, 1);\r\n });\r\n };\r\n\r\n function storeElement(elem) {\r\n //store this element in our global array\r\n elem = $(elem).get();\r\n if (elem.length > 1) {\r\n $.each(elem, function (i, val) {\r\n $.uniform.elements.push(val);\r\n });\r\n } else {\r\n $.uniform.elements.push(elem);\r\n }\r\n }\r\n\r\n //noSelect v1.0\r\n $.uniform.noSelect = function (elem) {\r\n function f() {\r\n return false;\r\n };\r\n $(elem).each(function () {\r\n this.onselectstart = this.ondragstart = f; // Webkit & IE\r\n $(this)\r\n .mousedown(f) // Webkit & Opera\r\n .css({ MozUserSelect: 'none' }); // Firefox\r\n });\r\n };\r\n\r\n $.uniform.update = function (elem) {\r\n if (elem == undefined) {\r\n elem = $($.uniform.elements);\r\n }\r\n //sanitize input\r\n elem = $(elem);\r\n\r\n elem.each(function () {\r\n //do to each item in the selector\r\n //function to reset all classes\r\n var $e = $(this);\r\n\r\n if ($e.is(\"select\")) {\r\n //element is a select\r\n var spanTag = $e.siblings(\"span\");\r\n var divTag = $e.parent(\"div\");\r\n\r\n divTag.removeClass(options.hoverClass + \" \" + options.focusClass + \" \" + options.activeClass);\r\n\r\n //reset current selected text\r\n spanTag.html($e.find(\":selected\").html());\r\n\r\n if ($e.is(\":disabled\")) {\r\n divTag.addClass(options.disabledClass);\r\n } else {\r\n divTag.removeClass(options.disabledClass);\r\n }\r\n\r\n } else if ($e.is(\":checkbox\")) {\r\n //element is a checkbox\r\n var spanTag = $e.closest(\"span\");\r\n var divTag = $e.closest(\"div\");\r\n\r\n divTag.removeClass(options.hoverClass + \" \" + options.focusClass + \" \" + options.activeClass);\r\n spanTag.removeClass(options.checkedClass);\r\n\r\n if ($e.is(\":checked\")) {\r\n spanTag.addClass(options.checkedClass);\r\n }\r\n if ($e.is(\":disabled\")) {\r\n divTag.addClass(options.disabledClass);\r\n } else {\r\n divTag.removeClass(options.disabledClass);\r\n }\r\n\r\n } else if ($e.is(\":radio\")) {\r\n //element is a radio\r\n var spanTag = $e.closest(\"span\");\r\n var divTag = $e.closest(\"div\");\r\n\r\n divTag.removeClass(options.hoverClass + \" \" + options.focusClass + \" \" + options.activeClass);\r\n spanTag.removeClass(options.checkedClass);\r\n\r\n if ($e.is(\":checked\")) {\r\n spanTag.addClass(options.checkedClass);\r\n }\r\n\r\n if ($e.is(\":disabled\")) {\r\n divTag.addClass(options.disabledClass);\r\n } else {\r\n divTag.removeClass(options.disabledClass);\r\n }\r\n } else if ($e.is(\":file\")) {\r\n var divTag = $e.parent(\"div\");\r\n var filenameTag = $e.siblings(options.filenameClass);\r\n btnTag = $e.siblings(options.fileBtnClass);\r\n\r\n divTag.removeClass(options.hoverClass + \" \" + options.focusClass + \" \" + options.activeClass);\r\n\r\n filenameTag.text($e.val());\r\n\r\n if ($e.is(\":disabled\")) {\r\n divTag.addClass(options.disabledClass);\r\n } else {\r\n divTag.removeClass(options.disabledClass);\r\n }\r\n } else if ($e.is(\":submit\") || $e.is(\":reset\") || $e.is(\"button\") || $e.is(\"a\") || elem.is(\"input[type=button]\")) {\r\n var divTag = $e.closest(\"div\");\r\n divTag.removeClass(options.hoverClass + \" \" + options.focusClass + \" \" + options.activeClass);\r\n\r\n if ($e.is(\":disabled\")) {\r\n divTag.addClass(options.disabledClass);\r\n } else {\r\n divTag.removeClass(options.disabledClass);\r\n }\r\n\r\n }\r\n\r\n });\r\n };\r\n\r\n return this.each(function () {\r\n if ($.support.selectOpacity) {\r\n var elem = $(this);\r\n\r\n if (elem.is(\"select\")) {\r\n //element is a select\r\n if (elem.attr(\"multiple\") != true) {\r\n //element is not a multi-select\r\n if (elem.attr(\"size\") == undefined || elem.attr(\"size\") <= 1) {\r\n doSelect(elem);\r\n }\r\n }\r\n } else if (elem.is(\":checkbox\")) {\r\n //element is a checkbox\r\n doCheckbox(elem);\r\n } else if (elem.is(\":radio\")) {\r\n //element is a radio\r\n doRadio(elem);\r\n } else if (elem.is(\":file\")) {\r\n //element is a file upload\r\n doFile(elem);\r\n } else if (elem.is(\":text, :password, input[type='email']\")) {\r\n doInput(elem);\r\n } else if (elem.is(\"textarea\")) {\r\n doTextarea(elem);\r\n } else if (elem.is(\"a\") || elem.is(\":submit\") || elem.is(\":reset\") || elem.is(\"button\") || elem.is(\"input[type=button]\")) {\r\n doButton(elem);\r\n }\r\n\r\n }\r\n });\r\n };\r\n})(jQuery);","/**\r\n * jQuery Validation Plugin 1.8.1\r\n *\r\n * http://bassistance.de/jquery-plugins/jquery-plugin-validation/\r\n * http://docs.jquery.com/Plugins/Validation\r\n *\r\n * Copyright (c) 2006 - 2011 Jörn Zaefferer\r\n *\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl.html\r\n */\r\n\r\n(function($) {\r\n\r\n$.extend($.fn, {\r\n\t// http://docs.jquery.com/Plugins/Validation/validate\r\n\tvalidate: function( options ) {\r\n\r\n\t\t// if nothing is selected, return nothing; can't chain anyway\r\n\t\tif (!this.length) {\r\n\t\t\toptions && options.debug && window.console && console.warn( \"nothing selected, can't validate, returning nothing\" );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// check if a validator for this form was already created\r\n\t\tvar validator = $.data(this[0], 'validator');\r\n\t\tif ( validator ) {\r\n\t\t\treturn validator;\r\n\t\t}\r\n\r\n\t\tvalidator = new $.validator( options, this[0] );\r\n\t\t$.data(this[0], 'validator', validator);\r\n\r\n\t\tif ( validator.settings.onsubmit ) {\r\n\r\n\t\t\t// allow suppresing validation by adding a cancel class to the submit button\r\n\t\t\tthis.find(\"input, button\").filter(\".cancel\").click(function() {\r\n\t\t\t\tvalidator.cancelSubmit = true;\r\n\t\t\t});\r\n\r\n\t\t\t// when a submitHandler is used, capture the submitting button\r\n\t\t\tif (validator.settings.submitHandler) {\r\n\t\t\t\tthis.find(\"input, button\").filter(\":submit\").click(function() {\r\n\t\t\t\t\tvalidator.submitButton = this;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// validate the form on submit\r\n\t\t\tthis.submit( function( event ) {\r\n\t\t\t\tif ( validator.settings.debug )\r\n\t\t\t\t\t// prevent form submit to be able to see console output\r\n\t\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\tfunction handle() {\r\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\r\n\t\t\t\t\t\tif (validator.submitButton) {\r\n\t\t\t\t\t\t\t// insert a hidden input as a replacement for the missing submit button\r\n\t\t\t\t\t\t\tvar hidden = $(\"\").attr(\"name\", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvalidator.settings.submitHandler.call( validator, validator.currentForm );\r\n\t\t\t\t\t\tif (validator.submitButton) {\r\n\t\t\t\t\t\t\t// and clean up afterwards; thanks to no-block-scope, hidden can be referenced\r\n\t\t\t\t\t\t\thidden.remove();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// prevent submit for invalid forms or custom submit handlers\r\n\t\t\t\tif ( validator.cancelSubmit ) {\r\n\t\t\t\t\tvalidator.cancelSubmit = false;\r\n\t\t\t\t\treturn handle();\r\n\t\t\t\t}\r\n\t\t\t\tif ( validator.form() ) {\r\n\t\t\t\t\tif ( validator.pendingRequest ) {\r\n\t\t\t\t\t\tvalidator.formSubmitted = true;\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn handle();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvalidator.focusInvalid();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn validator;\r\n\t},\r\n\t// http://docs.jquery.com/Plugins/Validation/valid\r\n\tvalid: function() {\r\n if ( $(this[0]).is('form')) {\r\n return this.validate().form();\r\n } else {\r\n var valid = true;\r\n var validator = $(this[0].form).validate();\r\n this.each(function() {\r\n\t\t\t\tvalid &= validator.element(this);\r\n });\r\n return valid;\r\n }\r\n },\r\n\t// attributes: space seperated list of attributes to retrieve and remove\r\n\tremoveAttrs: function(attributes) {\r\n\t\tvar result = {},\r\n\t\t\t$element = this;\r\n\t\t$.each(attributes.split(/\\s/), function(index, value) {\r\n\t\t\tresult[value] = $element.attr(value);\r\n\t\t\t$element.removeAttr(value);\r\n\t\t});\r\n\t\treturn result;\r\n\t},\r\n\t// http://docs.jquery.com/Plugins/Validation/rules\r\n\trules: function(command, argument) {\r\n\t\tvar element = this[0];\r\n\r\n\t\tif (command) {\r\n\t\t\tvar settings = $.data(element.form, 'validator').settings;\r\n\t\t\tvar staticRules = settings.rules;\r\n\t\t\tvar existingRules = $.validator.staticRules(element);\r\n\t\t\tswitch(command) {\r\n\t\t\tcase \"add\":\r\n\t\t\t\t$.extend(existingRules, $.validator.normalizeRule(argument));\r\n\t\t\t\tstaticRules[element.name] = existingRules;\r\n\t\t\t\tif (argument.messages)\r\n\t\t\t\t\tsettings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"remove\":\r\n\t\t\t\tif (!argument) {\r\n\t\t\t\t\tdelete staticRules[element.name];\r\n\t\t\t\t\treturn existingRules;\r\n\t\t\t\t}\r\n\t\t\t\tvar filtered = {};\r\n\t\t\t\t$.each(argument.split(/\\s/), function(index, method) {\r\n\t\t\t\t\tfiltered[method] = existingRules[method];\r\n\t\t\t\t\tdelete existingRules[method];\r\n\t\t\t\t});\r\n\t\t\t\treturn filtered;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar data = $.validator.normalizeRules(\r\n\t\t$.extend(\r\n\t\t\t{},\r\n\t\t\t$.validator.metadataRules(element),\r\n\t\t\t$.validator.classRules(element),\r\n\t\t\t$.validator.attributeRules(element),\r\n\t\t\t$.validator.staticRules(element)\r\n\t\t), element);\r\n\r\n\t\t// make sure required is at front\r\n\t\tif (data.required) {\r\n\t\t\tvar param = data.required;\r\n\t\t\tdelete data.required;\r\n\t\t\tdata = $.extend({required: param}, data);\r\n\t\t}\r\n\r\n\t\treturn data;\r\n\t}\r\n});\r\n\r\n// Custom selectors\r\n$.extend($.expr[\":\"], {\r\n\t// http://docs.jquery.com/Plugins/Validation/blank\r\n\tblank: function(a) {return !$.trim(\"\" + a.value);},\r\n\t// http://docs.jquery.com/Plugins/Validation/filled\r\n\tfilled: function(a) {return !!$.trim(\"\" + a.value);},\r\n\t// http://docs.jquery.com/Plugins/Validation/unchecked\r\n\tunchecked: function(a) {return !a.checked;}\r\n});\r\n\r\n// constructor for validator\r\n$.validator = function( options, form ) {\r\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\r\n\tthis.currentForm = form;\r\n\tthis.init();\r\n};\r\n\r\n$.validator.format = function(source, params) {\r\n\tif ( arguments.length == 1 )\r\n\t\treturn function() {\r\n\t\t\tvar args = $.makeArray(arguments);\r\n\t\t\targs.unshift(source);\r\n\t\t\treturn $.validator.format.apply( this, args );\r\n\t\t};\r\n\tif ( arguments.length > 2 && params.constructor != Array ) {\r\n\t\tparams = $.makeArray(arguments).slice(1);\r\n\t}\r\n\tif ( params.constructor != Array ) {\r\n\t\tparams = [ params ];\r\n\t}\r\n\t$.each(params, function(i, n) {\r\n\t\tsource = source.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"g\"), n);\r\n\t});\r\n\treturn source;\r\n};\r\n\r\n$.extend($.validator, {\r\n\r\n\tdefaults: {\r\n\t\tmessages: {},\r\n\t\tgroups: {},\r\n\t\trules: {},\r\n\t\terrorClass: \"error\",\r\n\t\tvalidClass: \"valid\",\r\n\t\terrorElement: \"label\",\r\n\t\tfocusInvalid: true,\r\n\t\terrorContainer: $( [] ),\r\n\t\terrorLabelContainer: $( [] ),\r\n\t\tonsubmit: true,\r\n\t\tignore: [],\r\n\t\tignoreTitle: false,\r\n\t\tonfocusin: function(element) {\r\n\t\t\tthis.lastActive = element;\r\n\r\n\t\t\t// hide error label and remove error class on focus if enabled\r\n\t\t\tif ( this.settings.focusCleanup && !this.blockFocusCleanup ) {\r\n\t\t\t\tthis.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\r\n\t\t\t\tthis.addWrapper(this.errorsFor(element)).hide();\r\n\t\t\t}\r\n\t\t},\r\n\t\tonfocusout: function(element) {\r\n\t\t\tif ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {\r\n\t\t\t\tthis.element(element);\r\n\t\t\t}\r\n\t\t},\r\n\t\tonkeyup: function(element) {\r\n\t\t\tif ( element.name in this.submitted || element == this.lastElement ) {\r\n\t\t\t\tthis.element(element);\r\n\t\t\t}\r\n\t\t},\r\n\t\tonclick: function(element) {\r\n\t\t\t// click on selects, radiobuttons and checkboxes\r\n\t\t\tif ( element.name in this.submitted )\r\n\t\t\t\tthis.element(element);\r\n\t\t\t// or option elements, check parent select in that case\r\n\t\t\telse if (element.parentNode.name in this.submitted)\r\n\t\t\t\tthis.element(element.parentNode);\r\n\t\t},\r\n\t\thighlight: function(element, errorClass, validClass) {\r\n\t\t\tif (element.type === 'radio') {\r\n\t\t\t\tthis.findByName(element.name).addClass(errorClass).removeClass(validClass);\r\n\t\t\t} else {\r\n\t\t\t\t$(element).addClass(errorClass).removeClass(validClass);\r\n\t\t\t}\r\n\t\t},\r\n\t\tunhighlight: function(element, errorClass, validClass) {\r\n\t\t\tif (element.type === 'radio') {\r\n\t\t\t\tthis.findByName(element.name).removeClass(errorClass).addClass(validClass);\r\n\t\t\t} else {\r\n\t\t\t\t$(element).removeClass(errorClass).addClass(validClass);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults\r\n\tsetDefaults: function(settings) {\r\n\t\t$.extend( $.validator.defaults, settings );\r\n\t},\r\n\r\n\tmessages: {\r\n\t\trequired: \"This field is required.\",\r\n\t\tremote: \"Please fix this field.\",\r\n\t\temail: \"Please enter a valid email address.\",\r\n\t\turl: \"Please enter a valid URL.\",\r\n\t\tdate: \"Please enter a valid date.\",\r\n\t\tdateISO: \"Please enter a valid date (ISO).\",\r\n\t\tnumber: \"Please enter a valid number.\",\r\n\t\tdigits: \"Please enter only digits.\",\r\n\t\tcreditcard: \"Please enter a valid credit card number.\",\r\n\t\tequalTo: \"Please enter the same value again.\",\r\n\t\taccept: \"Please enter a value with a valid extension.\",\r\n\t\tmaxlength: $.validator.format(\"Please enter no more than {0} characters.\"),\r\n\t\tminlength: $.validator.format(\"Please enter at least {0} characters.\"),\r\n\t\trangelength: $.validator.format(\"Please enter a value between {0} and {1} characters long.\"),\r\n\t\trange: $.validator.format(\"Please enter a value between {0} and {1}.\"),\r\n\t\tmax: $.validator.format(\"Please enter a value less than or equal to {0}.\"),\r\n\t\tmin: $.validator.format(\"Please enter a value greater than or equal to {0}.\")\r\n\t},\r\n\r\n\tautoCreateRanges: false,\r\n\r\n\tprototype: {\r\n\r\n\t\tinit: function() {\r\n\t\t\tthis.labelContainer = $(this.settings.errorLabelContainer);\r\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);\r\n\t\t\tthis.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );\r\n\t\t\tthis.submitted = {};\r\n\t\t\tthis.valueCache = {};\r\n\t\t\tthis.pendingRequest = 0;\r\n\t\t\tthis.pending = {};\r\n\t\t\tthis.invalid = {};\r\n\t\t\tthis.reset();\r\n\r\n\t\t\tvar groups = (this.groups = {});\r\n\t\t\t$.each(this.settings.groups, function(key, value) {\r\n\t\t\t\t$.each(value.split(/\\s/), function(index, name) {\r\n\t\t\t\t\tgroups[name] = key;\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\tvar rules = this.settings.rules;\r\n\t\t\t$.each(rules, function(key, value) {\r\n\t\t\t\trules[key] = $.validator.normalizeRule(value);\r\n\t\t\t});\r\n\r\n\t\t\tfunction delegate(event) {\r\n\t\t\t\tvar validator = $.data(this[0].form, \"validator\"),\r\n\t\t\t\t\teventType = \"on\" + event.type.replace(/^validate/, \"\");\r\n\t\t\t\tvalidator.settings[eventType] && validator.settings[eventType].call(validator, this[0] );\r\n\t\t\t}\r\n\t\t\t$(this.currentForm)\r\n\t\t\t\t.validateDelegate(\":text, :password, :file, select, textarea\", \"focusin focusout keyup\", delegate)\r\n\t\t\t\t.validateDelegate(\":radio, :checkbox, select, option\", \"click\", delegate);\r\n\r\n\t\t\tif (this.settings.invalidHandler)\r\n\t\t\t\t$(this.currentForm).bind(\"invalid-form.validate\", this.settings.invalidHandler);\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/form\r\n\t\tform: function() {\r\n\t\t\tthis.checkForm();\r\n\t\t\t$.extend(this.submitted, this.errorMap);\r\n\t\t\tthis.invalid = $.extend({}, this.errorMap);\r\n\t\t\tif (!this.valid())\r\n\t\t\t\t$(this.currentForm).triggerHandler(\"invalid-form\", [this]);\r\n\t\t\tthis.showErrors();\r\n\t\t\treturn this.valid();\r\n\t\t},\r\n\r\n\t\tcheckForm: function() {\r\n\t\t\tthis.prepareForm();\r\n\t\t\tfor ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {\r\n\t\t\t\tthis.check( elements[i] );\r\n\t\t\t}\r\n\t\t\treturn this.valid();\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/element\r\n\t\telement: function( element ) {\r\n\t\t\telement = this.clean( element );\r\n\t\t\tthis.lastElement = element;\r\n\t\t\tthis.prepareElement( element );\r\n\t\t\tthis.currentElements = $(element);\r\n\t\t\tvar result = this.check( element );\r\n\t\t\tif ( result ) {\r\n\t\t\t\tdelete this.invalid[element.name];\r\n\t\t\t} else {\r\n\t\t\t\tthis.invalid[element.name] = true;\r\n\t\t\t}\r\n\t\t\tif ( !this.numberOfInvalids() ) {\r\n\t\t\t\t// Hide error containers on last error\r\n\t\t\t\tthis.toHide = this.toHide.add( this.containers );\r\n\t\t\t}\r\n\t\t\tthis.showErrors();\r\n\t\t\treturn result;\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/showErrors\r\n\t\tshowErrors: function(errors) {\r\n\t\t\tif(errors) {\r\n\t\t\t\t// add items to error list and map\r\n\t\t\t\t$.extend( this.errorMap, errors );\r\n\t\t\t\tthis.errorList = [];\r\n\t\t\t\tfor ( var name in errors ) {\r\n\t\t\t\t\tthis.errorList.push({\r\n\t\t\t\t\t\tmessage: errors[name],\r\n\t\t\t\t\t\telement: this.findByName(name)[0]\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\t// remove items from success list\r\n\t\t\t\tthis.successList = $.grep( this.successList, function(element) {\r\n\t\t\t\t\treturn !(element.name in errors);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tthis.settings.showErrors\r\n\t\t\t\t? this.settings.showErrors.call( this, this.errorMap, this.errorList )\r\n\t\t\t\t: this.defaultShowErrors();\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/resetForm\r\n\t\tresetForm: function() {\r\n\t\t\tif ( $.fn.resetForm )\r\n\t\t\t\t$( this.currentForm ).resetForm();\r\n\t\t\tthis.submitted = {};\r\n\t\t\tthis.prepareForm();\r\n\t\t\tthis.hideErrors();\r\n\t\t\tthis.elements().removeClass( this.settings.errorClass );\r\n\t\t},\r\n\r\n\t\tnumberOfInvalids: function() {\r\n\t\t\treturn this.objectLength(this.invalid);\r\n\t\t},\r\n\r\n\t\tobjectLength: function( obj ) {\r\n\t\t\tvar count = 0;\r\n\t\t\tfor ( var i in obj )\r\n\t\t\t\tcount++;\r\n\t\t\treturn count;\r\n\t\t},\r\n\r\n\t\thideErrors: function() {\r\n\t\t\tthis.addWrapper( this.toHide ).hide();\r\n\t\t},\r\n\r\n\t\tvalid: function() {\r\n\t\t\treturn this.size() == 0;\r\n\t\t},\r\n\r\n\t\tsize: function() {\r\n\t\t\treturn this.errorList.length;\r\n\t\t},\r\n\r\n\t\tfocusInvalid: function() {\r\n\t\t\tif( this.settings.focusInvalid ) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar focusedElement = $(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])\r\n\t\t\t\t\t.filter(\":visible\")\r\n\t\t\t\t\t.focus()\r\n\t\t\t\t\t// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\r\n\t\t\t\t\t.trigger(\"focusin\").first();\r\n\t\t\t\t\tif ($('html.touch').length > 0) {\r\n\t\t\t\t\t var offset = focusedElement.offset().top - 100;\r\n\t\t\t\t\t $('html, body').scrollTop(offset);\r\n\t\t\t\t\t}\r\n \r\n\t\t\t\t} catch(e) {\r\n\t\t\t\t\t// ignore IE throwing errors when focusing hidden elements\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tfindLastActive: function() {\r\n\t\t\tvar lastActive = this.lastActive;\r\n\t\t\treturn lastActive && $.grep(this.errorList, function(n) {\r\n\t\t\t\treturn n.element.name == lastActive.name;\r\n\t\t\t}).length == 1 && lastActive;\r\n\t\t},\r\n\r\n\t\telements: function() {\r\n\t\t\tvar validator = this,\r\n\t\t\t\trulesCache = {};\r\n\r\n\t\t\t// select all valid inputs inside the form (no submit or reset buttons)\r\n\t\t\treturn $(this.currentForm)\r\n\t\t\t.find(\"input, select, textarea\")\r\n\t\t\t.not(\":submit, :reset, :image, [disabled]\")\r\n\t\t\t.not( this.settings.ignore )\r\n\t\t\t.filter(function() {\r\n\t\t\t\t!this.name && validator.settings.debug && window.console && console.error( \"%o has no name assigned\", this);\r\n\r\n\t\t\t\t// select only the first element for each name, and only those with rules specified\r\n\t\t\t\tif ( this.name in rulesCache || !validator.objectLength($(this).rules()) )\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\trulesCache[this.name] = true;\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tclean: function( selector ) {\r\n\t\t\treturn $( selector )[0];\r\n\t\t},\r\n\r\n\t\terrors: function() {\r\n\t\t\treturn $( this.settings.errorElement + \".\" + this.settings.errorClass, this.errorContext );\r\n\t\t},\r\n\r\n\t\treset: function() {\r\n\t\t\tthis.successList = [];\r\n\t\t\tthis.errorList = [];\r\n\t\t\tthis.errorMap = {};\r\n\t\t\tthis.toShow = $([]);\r\n\t\t\tthis.toHide = $([]);\r\n\t\t\tthis.currentElements = $([]);\r\n\t\t},\r\n\r\n\t\tprepareForm: function() {\r\n\t\t\tthis.reset();\r\n\t\t\tthis.toHide = this.errors().add( this.containers );\r\n\t\t},\r\n\r\n\t\tprepareElement: function( element ) {\r\n\t\t\tthis.reset();\r\n\t\t\tthis.toHide = this.errorsFor(element);\r\n\t\t},\r\n\r\n\t\tcheck: function( element ) {\r\n\t\t\telement = this.clean( element );\r\n\r\n\t\t\t// if radio/checkbox, validate first element in group instead\r\n\t\t\tif (this.checkable(element)) {\r\n\t\t\t\telement = this.findByName( element.name ).not(this.settings.ignore)[0];\r\n\t\t\t}\r\n\r\n\t\t\tvar rules = $(element).rules();\r\n\t\t\tvar dependencyMismatch = false;\r\n\t\t\tfor (var method in rules ) {\r\n\t\t\t\tvar rule = { method: method, parameters: rules[method] };\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar result = $.validator.methods[method].call( this, element.value.replace(/\\r/g, \"\"), element, rule.parameters );\r\n\r\n\t\t\t\t\t// if a method indicates that the field is optional and therefore valid,\r\n\t\t\t\t\t// don't mark it as valid when there are no other rules\r\n\t\t\t\t\tif ( result == \"dependency-mismatch\" ) {\r\n\t\t\t\t\t\tdependencyMismatch = true;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdependencyMismatch = false;\r\n\r\n\t\t\t\t\tif ( result == \"pending\" ) {\r\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor(element) );\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif( !result ) {\r\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch(e) {\r\n\t\t\t\t\tthis.settings.debug && window.console && console.log(\"exception occured when checking element \" + element.id\r\n\t\t\t\t\t\t + \", check the '\" + rule.method + \"' method\", e);\r\n\t\t\t\t\tthrow e;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dependencyMismatch)\r\n\t\t\t\treturn;\r\n\t\t\tif ( this.objectLength(rules) )\r\n\t\t\t\tthis.successList.push(element);\r\n\t\t\treturn true;\r\n\t\t},\r\n\r\n\t\t// return the custom message for the given element and validation method\r\n\t\t// specified in the element's \"messages\" metadata\r\n\t\tcustomMetaMessage: function(element, method) {\r\n\t\t\tif (!$.metadata)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tvar meta = this.settings.meta\r\n\t\t\t\t? $(element).metadata()[this.settings.meta]\r\n\t\t\t\t: $(element).metadata();\r\n\r\n\t\t\treturn meta && meta.messages && meta.messages[method];\r\n\t\t},\r\n\r\n\t\t// return the custom message for the given element name and validation method\r\n\t\tcustomMessage: function( name, method ) {\r\n\t\t\tvar m = this.settings.messages[name];\r\n\t\t\treturn m && (m.constructor == String\r\n\t\t\t\t? m\r\n\t\t\t\t: m[method]);\r\n\t\t},\r\n\r\n\t\t// return the first defined argument, allowing empty strings\r\n\t\tfindDefined: function() {\r\n\t\t\tfor(var i = 0; i < arguments.length; i++) {\r\n\t\t\t\tif (arguments[i] !== undefined)\r\n\t\t\t\t\treturn arguments[i];\r\n\t\t\t}\r\n\t\t\treturn undefined;\r\n\t\t},\r\n\r\n\t\tdefaultMessage: function( element, method) {\r\n\t\t\treturn this.findDefined(\r\n\t\t\t\tthis.customMessage( element.name, method ),\r\n\t\t\t\tthis.customMetaMessage( element, method ),\r\n\t\t\t\t// title is never undefined, so handle empty string as undefined\r\n\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\r\n\t\t\t\t$.validator.messages[method],\r\n\t\t\t\t\"Warning: No message defined for \" + element.name + \"\"\r\n\t\t\t);\r\n\t\t},\r\n\r\n\t\tformatAndAdd: function( element, rule ) {\r\n\t\t\tvar message = this.defaultMessage( element, rule.method ),\r\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\r\n\t\t\tif ( typeof message == \"function\" ) {\r\n\t\t\t\tmessage = message.call(this, rule.parameters, element);\r\n\t\t\t} else if (theregex.test(message)) {\r\n\t\t\t\tmessage = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);\r\n\t\t\t}\r\n\t\t\tthis.errorList.push({\r\n\t\t\t\tmessage: message,\r\n\t\t\t\telement: element\r\n\t\t\t});\r\n\r\n\t\t\tthis.errorMap[element.name] = message;\r\n\t\t\tthis.submitted[element.name] = message;\r\n\t\t},\r\n\r\n\t\taddWrapper: function(toToggle) {\r\n\t\t\tif ( this.settings.wrapper )\r\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\r\n\t\t\treturn toToggle;\r\n\t\t},\r\n\r\n\t\tdefaultShowErrors: function() {\r\n\t\t\tfor ( var i = 0; this.errorList[i]; i++ ) {\r\n\t\t\t\tvar error = this.errorList[i];\r\n\t\t\t\tthis.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\r\n\t\t\t\tthis.showLabel( error.element, error.message );\r\n\t\t\t}\r\n\t\t\tif( this.errorList.length ) {\r\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\r\n\t\t\t}\r\n\t\t\tif (this.settings.success) {\r\n\t\t\t\tfor ( var i = 0; this.successList[i]; i++ ) {\r\n\t\t\t\t\tthis.showLabel( this.successList[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (this.settings.unhighlight) {\r\n\t\t\t\tfor ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {\r\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\r\n\t\t\tthis.hideErrors();\r\n\t\t\tthis.addWrapper( this.toShow ).show();\r\n\t\t},\r\n\r\n\t\tvalidElements: function() {\r\n\t\t\treturn this.currentElements.not(this.invalidElements());\r\n\t\t},\r\n\r\n\t\tinvalidElements: function() {\r\n\t\t\treturn $(this.errorList).map(function() {\r\n\t\t\t\treturn this.element;\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tshowLabel: function(element, message) {\r\n\t\t\tvar label = this.errorsFor( element );\r\n\t\t\tif ( label.length ) {\r\n\t\t\t\t// refresh error/success class\r\n\t\t\t\tlabel.removeClass().addClass( this.settings.errorClass );\r\n\r\n\t\t\t\t// check if we have a generated label, replace the message then\r\n\t\t\t\tlabel.attr(\"generated\") && label.html(message);\r\n\t\t\t} else {\r\n\t\t\t\t// create label\r\n\t\t\t\tlabel = $(\"<\" + this.settings.errorElement + \"/>\")\r\n\t\t\t\t\t.attr({\"for\": this.idOrName(element), generated: true})\r\n\t\t\t\t\t.addClass(this.settings.errorClass)\r\n\t\t\t\t\t.html(message || \"\");\r\n\t\t\t\tif ( this.settings.wrapper ) {\r\n\t\t\t\t\t// make sure the element is visible, even in IE\r\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\r\n\t\t\t\t\tlabel = label.hide().show().wrap(\"<\" + this.settings.wrapper + \"/>\").parent();\r\n\t\t\t\t}\r\n\t\t\t\tif ( !this.labelContainer.append(label).length )\r\n\t\t\t\t\tthis.settings.errorPlacement\r\n\t\t\t\t\t\t? this.settings.errorPlacement(label, $(element) )\r\n\t\t\t\t\t\t: label.insertAfter(element);\r\n\t\t\t}\r\n\t\t\tif ( !message && this.settings.success ) {\r\n\t\t\t\tlabel.text(\"\");\r\n\t\t\t\ttypeof this.settings.success == \"string\"\r\n\t\t\t\t\t? label.addClass( this.settings.success )\r\n\t\t\t\t\t: this.settings.success( label );\r\n\t\t\t}\r\n\t\t\tthis.toShow = this.toShow.add(label);\r\n\t\t},\r\n\r\n\t\terrorsFor: function(element) {\r\n\t\t\tvar name = this.idOrName(element);\r\n \t\treturn this.errors().filter(function() {\r\n\t\t\t\treturn $(this).attr('for') == name;\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tidOrName: function(element) {\r\n\t\t\treturn this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);\r\n\t\t},\r\n\r\n\t\tcheckable: function( element ) {\r\n\t\t\treturn /radio|checkbox/i.test(element.type);\r\n\t\t},\r\n\r\n\t\tfindByName: function( name ) {\r\n\t\t\t// select by name and filter by form for performance over form.find(\"[name=...]\")\r\n\t\t\tvar form = this.currentForm;\r\n\t\t\treturn $(document.getElementsByName(name)).map(function(index, element) {\r\n\t\t\t\treturn element.form == form && element.name == name && element || null;\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tgetLength: function(value, element) {\r\n\t\t\tswitch( element.nodeName.toLowerCase() ) {\r\n\t\t\tcase 'select':\r\n\t\t\t\treturn $(\"option:selected\", element).length;\r\n\t\t\tcase 'input':\r\n\t\t\t\tif( this.checkable( element) )\r\n\t\t\t\t\treturn this.findByName(element.name).filter(':checked').length;\r\n\t\t\t}\r\n\t\t\treturn value.length;\r\n\t\t},\r\n\r\n\t\tdepend: function(param, element) {\r\n\t\t\treturn this.dependTypes[typeof param]\r\n\t\t\t\t? this.dependTypes[typeof param](param, element)\r\n\t\t\t\t: true;\r\n\t\t},\r\n\r\n\t\tdependTypes: {\r\n\t\t\t\"boolean\": function(param, element) {\r\n\t\t\t\treturn param;\r\n\t\t\t},\r\n\t\t\t\"string\": function(param, element) {\r\n\t\t\t\treturn !!$(param, element.form).length;\r\n\t\t\t},\r\n\t\t\t\"function\": function(param, element) {\r\n\t\t\t\treturn param(element);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\toptional: function(element) {\r\n\t\t\treturn !$.validator.methods.required.call(this, $.trim(element.value), element) && \"dependency-mismatch\";\r\n\t\t},\r\n\r\n\t\tstartRequest: function(element) {\r\n\t\t\tif (!this.pending[element.name]) {\r\n\t\t\t\tthis.pendingRequest++;\r\n\t\t\t\tthis.pending[element.name] = true;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tstopRequest: function(element, valid) {\r\n\t\t\tthis.pendingRequest--;\r\n\t\t\t// sometimes synchronization fails, make sure pendingRequest is never < 0\r\n\t\t\tif (this.pendingRequest < 0)\r\n\t\t\t\tthis.pendingRequest = 0;\r\n\t\t\tdelete this.pending[element.name];\r\n\t\t\tif ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {\r\n\t\t\t\t$(this.currentForm).submit();\r\n\t\t\t\tthis.formSubmitted = false;\r\n\t\t\t} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {\r\n\t\t\t\t$(this.currentForm).triggerHandler(\"invalid-form\", [this]);\r\n\t\t\t\tthis.formSubmitted = false;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tpreviousValue: function(element) {\r\n\t\t\treturn $.data(element, \"previousValue\") || $.data(element, \"previousValue\", {\r\n\t\t\t\told: null,\r\n\t\t\t\tvalid: true,\r\n\t\t\t\tmessage: this.defaultMessage( element, \"remote\" )\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tclassRuleSettings: {\r\n\t\trequired: {required: true},\r\n\t\temail: {email: true},\r\n\t\turl: {url: true},\r\n\t\tdate: {date: true},\r\n\t\tdateISO: {dateISO: true},\r\n\t\tdateDE: {dateDE: true},\r\n\t\tnumber: {number: true},\r\n\t\tnumberDE: {numberDE: true},\r\n\t\tdigits: {digits: true},\r\n\t\tcreditcard: {creditcard: true}\r\n\t},\r\n\r\n\taddClassRules: function(className, rules) {\r\n\t\tclassName.constructor == String ?\r\n\t\t\tthis.classRuleSettings[className] = rules :\r\n\t\t\t$.extend(this.classRuleSettings, className);\r\n\t},\r\n\r\n\tclassRules: function(element) {\r\n\t\tvar rules = {};\r\n\t\tvar classes = $(element).attr('class');\r\n\t\tclasses && $.each(classes.split(' '), function() {\r\n\t\t\tif (this in $.validator.classRuleSettings) {\r\n\t\t\t\t$.extend(rules, $.validator.classRuleSettings[this]);\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn rules;\r\n\t},\r\n\r\n\tattributeRules: function(element) {\r\n\t\tvar rules = {};\r\n\t\tvar $element = $(element);\r\n\r\n\t\tfor (var method in $.validator.methods) {\r\n\t\t\tvar value = $element.attr(method);\r\n\t\t\tif (value) {\r\n\t\t\t\trules[method] = value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs\r\n\t\tif (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {\r\n\t\t\tdelete rules.maxlength;\r\n\t\t}\r\n\r\n\t\treturn rules;\r\n\t},\r\n\r\n\tmetadataRules: function(element) {\r\n\t\tif (!$.metadata) return {};\r\n\r\n\t\tvar meta = $.data(element.form, 'validator').settings.meta;\r\n\t\treturn meta ?\r\n\t\t\t$(element).metadata()[meta] :\r\n\t\t\t$(element).metadata();\r\n\t},\r\n\r\n\tstaticRules: function(element) {\r\n\t\tvar rules = {};\r\n\t\tvar validator = $.data(element.form, 'validator');\r\n\t\tif (validator.settings.rules) {\r\n\t\t\trules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};\r\n\t\t}\r\n\t\treturn rules;\r\n\t},\r\n\r\n\tnormalizeRules: function(rules, element) {\r\n\t\t// handle dependency check\r\n\t\t$.each(rules, function(prop, val) {\r\n\t\t\t// ignore rule when param is explicitly false, eg. required:false\r\n\t\t\tif (val === false) {\r\n\t\t\t\tdelete rules[prop];\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (val.param || val.depends) {\r\n\t\t\t\tvar keepRule = true;\r\n\t\t\t\tswitch (typeof val.depends) {\r\n\t\t\t\t\tcase \"string\":\r\n\t\t\t\t\t\tkeepRule = !!$(val.depends, element.form).length;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"function\":\r\n\t\t\t\t\t\tkeepRule = val.depends.call(element, element);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (keepRule) {\r\n\t\t\t\t\trules[prop] = val.param !== undefined ? val.param : true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdelete rules[prop];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// evaluate parameters\r\n\t\t$.each(rules, function(rule, parameter) {\r\n\t\t\trules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;\r\n\t\t});\r\n\r\n\t\t// clean number parameters\r\n\t\t$.each(['minlength', 'maxlength', 'min', 'max'], function() {\r\n\t\t\tif (rules[this]) {\r\n\t\t\t\trules[this] = Number(rules[this]);\r\n\t\t\t}\r\n\t\t});\r\n\t\t$.each(['rangelength', 'range'], function() {\r\n\t\t\tif (rules[this]) {\r\n\t\t\t\trules[this] = [Number(rules[this][0]), Number(rules[this][1])];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif ($.validator.autoCreateRanges) {\r\n\t\t\t// auto-create ranges\r\n\t\t\tif (rules.min && rules.max) {\r\n\t\t\t\trules.range = [rules.min, rules.max];\r\n\t\t\t\tdelete rules.min;\r\n\t\t\t\tdelete rules.max;\r\n\t\t\t}\r\n\t\t\tif (rules.minlength && rules.maxlength) {\r\n\t\t\t\trules.rangelength = [rules.minlength, rules.maxlength];\r\n\t\t\t\tdelete rules.minlength;\r\n\t\t\t\tdelete rules.maxlength;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// To support custom messages in metadata ignore rule methods titled \"messages\"\r\n\t\tif (rules.messages) {\r\n\t\t\tdelete rules.messages;\r\n\t\t}\r\n\r\n\t\treturn rules;\r\n\t},\r\n\r\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\r\n\tnormalizeRule: function(data) {\r\n\t\tif( typeof data == \"string\" ) {\r\n\t\t\tvar transformed = {};\r\n\t\t\t$.each(data.split(/\\s/), function() {\r\n\t\t\t\ttransformed[this] = true;\r\n\t\t\t});\r\n\t\t\tdata = transformed;\r\n\t\t}\r\n\t\treturn data;\r\n\t},\r\n\r\n\t// http://docs.jquery.com/Plugins/Validation/Validator/addMethod\r\n\taddMethod: function(name, method, message) {\r\n\t\t$.validator.methods[name] = method;\r\n\t\t$.validator.messages[name] = message != undefined ? message : $.validator.messages[name];\r\n\t\tif (method.length < 3) {\r\n\t\t\t$.validator.addClassRules(name, $.validator.normalizeRule(name));\r\n\t\t}\r\n\t},\r\n\r\n\tmethods: {\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/required\r\n\t\trequired: function(value, element, param) {\r\n\t\t\t// check if dependency is met\r\n\t\t\tif ( !this.depend(param, element) )\r\n\t\t\t\treturn \"dependency-mismatch\";\r\n\t\t\tswitch( element.nodeName.toLowerCase() ) {\r\n\t\t\tcase 'select':\r\n\t\t\t\t// could be an array for select-multiple or a string, both are fine this way\r\n\t\t\t\tvar val = $(element).val();\r\n\t\t\t\treturn val && val.length > 0;\r\n\t\t\tcase 'input':\r\n\t\t\t\tif ( this.checkable(element) )\r\n\t\t\t\t\treturn this.getLength(value, element) > 0;\r\n\t\t\tdefault:\r\n\t\t\t\treturn $.trim(value).length > 0;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/remote\r\n\t\tremote: function(value, element, param) {\r\n\t\t\tif ( this.optional(element) )\r\n\t\t\t\treturn \"dependency-mismatch\";\r\n\r\n\t\t\tvar previous = this.previousValue(element);\r\n\t\t\tif (!this.settings.messages[element.name] )\r\n\t\t\t\tthis.settings.messages[element.name] = {};\r\n\t\t\tprevious.originalMessage = this.settings.messages[element.name].remote;\r\n\t\t\tthis.settings.messages[element.name].remote = previous.message;\r\n\r\n\t\t\tparam = typeof param == \"string\" && {url:param} || param;\r\n\r\n\t\t\tif ( this.pending[element.name] ) {\r\n\t\t\t\treturn \"pending\";\r\n\t\t\t}\r\n\t\t\tif ( previous.old === value ) {\r\n\t\t\t\treturn previous.valid;\r\n\t\t\t}\r\n\r\n\t\t\tprevious.old = value;\r\n\t\t\tvar validator = this;\r\n\t\t\tthis.startRequest(element);\r\n\t\t\tvar data = {};\r\n\t\t\tdata[element.name] = value;\r\n\t\t\t$.ajax($.extend(true, {\r\n\t\t\t\turl: param,\r\n\t\t\t\tmode: \"abort\",\r\n\t\t\t\tport: \"validate\" + element.name,\r\n\t\t\t\tdataType: \"json\",\r\n\t\t\t\tdata: data,\r\n\t\t\t\tsuccess: function(response) {\r\n\t\t\t\t\tvalidator.settings.messages[element.name].remote = previous.originalMessage;\r\n\t\t\t\t\tvar valid = response === true;\r\n\t\t\t\t\tif ( valid ) {\r\n\t\t\t\t\t\tvar submitted = validator.formSubmitted;\r\n\t\t\t\t\t\tvalidator.prepareElement(element);\r\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\r\n\t\t\t\t\t\tvalidator.successList.push(element);\r\n\t\t\t\t\t\tvalidator.showErrors();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvar errors = {};\r\n\t\t\t\t\t\tvar message = response || validator.defaultMessage( element, \"remote\" );\r\n\t\t\t\t\t\terrors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;\r\n\t\t\t\t\t\tvalidator.showErrors(errors);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tprevious.valid = valid;\r\n\t\t\t\t\tvalidator.stopRequest(element, valid);\r\n\t\t\t\t}\r\n\t\t\t}, param));\r\n\t\t\treturn \"pending\";\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/minlength\r\n\t\tminlength: function(value, element, param) {\r\n\t\t\treturn this.optional(element) || this.getLength($.trim(value), element) >= param;\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/maxlength\r\n\t\tmaxlength: function(value, element, param) {\r\n\t\t\treturn this.optional(element) || this.getLength($.trim(value), element) <= param;\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/rangelength\r\n\t\trangelength: function(value, element, param) {\r\n\t\t\tvar length = this.getLength($.trim(value), element);\r\n\t\t\treturn this.optional(element) || ( length >= param[0] && length <= param[1] );\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/min\r\n\t\tmin: function( value, element, param ) {\r\n\t\t\treturn this.optional(element) || value >= param;\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/max\r\n\t\tmax: function( value, element, param ) {\r\n\t\t\treturn this.optional(element) || value <= param;\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/range\r\n\t\trange: function( value, element, param ) {\r\n\t\t\treturn this.optional(element) || ( value >= param[0] && value <= param[1] );\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/email\r\n\t\temail: function(value, element) {\r\n\t\t\t// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/\r\n\t\t\treturn 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);\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/url\r\n\t\turl: function(value, element) {\r\n\t\t\t// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/\r\n\t\t\treturn 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);\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/date\r\n\t\tdate: function(value, element) {\r\n\t\t\treturn this.optional(element) || !/Invalid|NaN/.test(new Date(value));\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/dateISO\r\n\t\tdateISO: function(value, element) {\r\n\t\t\treturn this.optional(element) || /^\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}$/.test(value);\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/number\r\n\t\tnumber: function(value, element) {\r\n\t\t\treturn this.optional(element) || /^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)(?:\\.\\d+)?$/.test(value);\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/digits\r\n\t\tdigits: function(value, element) {\r\n\t\t\treturn this.optional(element) || /^\\d+$/.test(value);\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/creditcard\r\n\t\t// based on http://en.wikipedia.org/wiki/Luhn\r\n\t\tcreditcard: function(value, element) {\r\n\t\t\tif ( this.optional(element) )\r\n\t\t\t\treturn \"dependency-mismatch\";\r\n\t\t\t// accept only digits and dashes\r\n\t\t\tif (/[^0-9-]+/.test(value))\r\n\t\t\t\treturn false;\r\n\t\t\tvar nCheck = 0,\r\n\t\t\t\tnDigit = 0,\r\n\t\t\t\tbEven = false;\r\n\r\n\t\t\tvalue = value.replace(/\\D/g, \"\");\r\n\r\n\t\t\tfor (var n = value.length - 1; n >= 0; n--) {\r\n\t\t\t\tvar cDigit = value.charAt(n);\r\n\t\t\t\tvar nDigit = parseInt(cDigit, 10);\r\n\t\t\t\tif (bEven) {\r\n\t\t\t\t\tif ((nDigit *= 2) > 9)\r\n\t\t\t\t\t\tnDigit -= 9;\r\n\t\t\t\t}\r\n\t\t\t\tnCheck += nDigit;\r\n\t\t\t\tbEven = !bEven;\r\n\t\t\t}\r\n\r\n\t\t\treturn (nCheck % 10) == 0;\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/accept\r\n\t\taccept: function(value, element, param) {\r\n\t\t\tparam = typeof param == \"string\" ? param.replace(/,/g, '|') : \"png|jpe?g|gif\";\r\n\t\t\treturn this.optional(element) || value.match(new RegExp(\".(\" + param + \")$\", \"i\"));\r\n\t\t},\r\n\r\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/equalTo\r\n\t\tequalTo: function(value, element, param) {\r\n\t\t\t// bind to the blur event of the target in order to revalidate whenever the target field is updated\r\n\t\t\t// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead\r\n\t\t\tvar target = $(param).unbind(\".validate-equalTo\").bind(\"blur.validate-equalTo\", function() {\r\n\t\t\t\t$(element).valid();\r\n\t\t\t});\r\n\t\t\treturn value == target.val();\r\n\t\t}\r\n\r\n\t}\r\n\r\n});\r\n\r\n// deprecated, use $.validator.format instead\r\n$.format = $.validator.format;\r\n\r\n})(jQuery);\r\n\r\n// ajax mode: abort\r\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\r\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\r\n;(function($) {\r\n\tvar pendingRequests = {};\r\n\t// Use a prefilter if available (1.5+)\r\n\tif ( $.ajaxPrefilter ) {\r\n\t\t$.ajaxPrefilter(function(settings, _, xhr) {\r\n\t\t\tvar port = settings.port;\r\n\t\t\tif (settings.mode == \"abort\") {\r\n\t\t\t\tif ( pendingRequests[port] ) {\r\n\t\t\t\t\tpendingRequests[port].abort();\r\n\t\t\t\t}\r\n\t\t\t\tpendingRequests[port] = xhr;\r\n\t\t\t}\r\n\t\t});\r\n\t} else {\r\n\t\t// Proxy ajax\r\n\t\tvar ajax = $.ajax;\r\n\t\t$.ajax = function(settings) {\r\n\t\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\r\n\t\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\r\n\t\t\tif (mode == \"abort\") {\r\n\t\t\t\tif ( pendingRequests[port] ) {\r\n\t\t\t\t\tpendingRequests[port].abort();\r\n\t\t\t\t}\r\n\t\t\t\treturn (pendingRequests[port] = ajax.apply(this, arguments));\r\n\t\t\t}\r\n\t\t\treturn ajax.apply(this, arguments);\r\n\t\t};\r\n\t}\r\n})(jQuery);\r\n\r\n// provides cross-browser focusin and focusout events\r\n// IE has native support, in other browsers, use event caputuring (neither bubbles)\r\n\r\n// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation\r\n// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target\r\n;(function($) {\r\n\t// only implement if not provided by jQuery core (since 1.4)\r\n\t// TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs\r\n\tif (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {\r\n\t\t$.each({\r\n\t\t\tfocus: 'focusin',\r\n\t\t\tblur: 'focusout'\r\n\t\t}, function( original, fix ){\r\n\t\t\t$.event.special[fix] = {\r\n\t\t\t\tsetup:function() {\r\n\t\t\t\t\tthis.addEventListener( original, handler, true );\r\n\t\t\t\t},\r\n\t\t\t\tteardown:function() {\r\n\t\t\t\t\tthis.removeEventListener( original, handler, true );\r\n\t\t\t\t},\r\n\t\t\t\thandler: function(e) {\r\n\t\t\t\t\targuments[0] = $.event.fix(e);\r\n\t\t\t\t\targuments[0].type = fix;\r\n\t\t\t\t\treturn $.event.handle.apply(this, arguments);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tfunction handler(e) {\r\n\t\t\t\te = $.event.fix(e);\r\n\t\t\t\te.type = fix;\r\n\t\t\t\treturn $.event.handle.call(this, e);\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\t$.extend($.fn, {\r\n\t\tvalidateDelegate: function(delegate, type, handler) {\r\n\t\t\treturn this.bind(type, function(event) {\r\n\t\t\t\tvar target = $(event.target);\r\n\t\t\t\tif (target.is(delegate)) {\r\n\t\t\t\t\treturn handler.apply(target, arguments);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n})(jQuery);\r\n","/// \r\n/// \r\n\r\n/*!\r\n** Unobtrusive validation support library for jQuery and jQuery Validate\r\n** Copyright (C) Microsoft Corporation. All rights reserved.\r\n*/\r\n\r\n/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */\r\n/*global document: false, jQuery: false */\r\n\r\n(function ($) {\r\n var $jQval = $.validator,\r\n adapters,\r\n data_validation = \"unobtrusiveValidation\";\r\n\r\n function setValidationValues(options, ruleName, value) {\r\n options.rules[ruleName] = value;\r\n if (options.message) {\r\n options.messages[ruleName] = options.message;\r\n }\r\n }\r\n\r\n function splitAndTrim(value) {\r\n return value.replace(/^\\s+|\\s+$/g, \"\").split(/\\s*,\\s*/g);\r\n }\r\n\r\n function getModelPrefix(fieldName) {\r\n return fieldName.substr(0, fieldName.lastIndexOf(\".\") + 1);\r\n }\r\n\r\n function appendModelPrefix(value, prefix) {\r\n if (value.indexOf(\"*.\") === 0) {\r\n value = value.replace(\"*.\", prefix);\r\n }\r\n return value;\r\n }\r\n\r\n function onError(error, inputElement) { // 'this' is the form element\r\n var container = $(this).find(\"[data-valmsg-for='\" + inputElement[0].name + \"']\"),\r\n replace = $.parseJSON(container.attr(\"data-valmsg-replace\")) !== false;\r\n\r\n container.removeClass(\"field-validation-valid\").addClass(\"field-validation-error\");\r\n error.data(\"unobtrusiveContainer\", container);\r\n\r\n if (replace) {\r\n container.empty();\r\n error.removeClass(\"input-validation-error\").appendTo(container);\r\n }\r\n else {\r\n error.hide();\r\n }\r\n }\r\n\r\n function onErrors(form, validator) { // 'this' is the form element\r\n var container = $(this).find(\"[data-valmsg-summary=true]\"),\r\n list = container.find(\"ul\");\r\n\r\n if (list && list.length && validator.errorList.length) {\r\n list.empty();\r\n container.addClass(\"validation-summary-errors\").removeClass(\"validation-summary-valid\");\r\n\r\n $.each(validator.errorList, function () {\r\n $(\"\").html(this.message).appendTo(list);\r\n });\r\n }\r\n }\r\n\r\n function onSuccess(error) { // 'this' is the form element\r\n var container = error.data(\"unobtrusiveContainer\"),\r\n replace = $.parseJSON(container.attr(\"data-valmsg-replace\"));\r\n\r\n if (container) {\r\n container.addClass(\"field-validation-valid\").removeClass(\"field-validation-error\");\r\n error.removeData(\"unobtrusiveContainer\");\r\n\r\n if (replace) {\r\n container.empty();\r\n }\r\n }\r\n }\r\n\r\n function validationInfo(form) {\r\n var $form = $(form),\r\n result = $form.data(data_validation);\r\n\r\n if (!result) {\r\n result = {\r\n options: { // options structure passed to jQuery Validate's validate() method\r\n errorClass: \"input-validation-error\",\r\n errorElement: \"span\",\r\n errorPlacement: $.proxy(onError, form),\r\n invalidHandler: $.proxy(onErrors, form),\r\n messages: {},\r\n rules: {},\r\n success: $.proxy(onSuccess, form)\r\n },\r\n attachValidation: function () {\r\n $form.validate(this.options);\r\n },\r\n validate: function () { // a validation function that is called by unobtrusive Ajax\r\n $form.validate();\r\n return $form.valid();\r\n }\r\n };\r\n $form.data(data_validation, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n $jQval.unobtrusive = {\r\n adapters: [],\r\n\r\n parseElement: function (element, skipAttach) {\r\n /// \r\n /// Parses a single HTML element for unobtrusive validation attributes.\r\n /// \r\n /// The HTML element to be parsed.\r\n /// [Optional] true to skip attaching the\r\n /// validation to the form. If parsing just this single element, you should specify true.\r\n /// If parsing several elements, you should specify false, and manually attach the validation\r\n /// to the form when you are finished. The default is false.\r\n var $element = $(element),\r\n form = $element.parents(\"form\")[0],\r\n valInfo, rules, messages;\r\n\r\n if (!form) { // Cannot do client-side validation without a form\r\n return;\r\n }\r\n\r\n valInfo = validationInfo(form);\r\n valInfo.options.rules[element.name] = rules = {};\r\n valInfo.options.messages[element.name] = messages = {};\r\n\r\n $.each(this.adapters, function () {\r\n var prefix = \"data-val-\" + this.name,\r\n message = $element.attr(prefix),\r\n paramValues = {};\r\n\r\n if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)\r\n prefix += \"-\";\r\n\r\n $.each(this.params, function () {\r\n paramValues[this] = $element.attr(prefix + this);\r\n });\r\n\r\n this.adapt({\r\n element: element,\r\n form: form,\r\n message: message,\r\n params: paramValues,\r\n rules: rules,\r\n messages: messages\r\n });\r\n }\r\n });\r\n\r\n jQuery.extend(rules, { \"__dummy__\": true });\r\n\r\n if (!skipAttach) {\r\n valInfo.attachValidation();\r\n }\r\n },\r\n\r\n parse: function (selector) {\r\n /// \r\n /// Parses all the HTML elements in the specified selector. It looks for input elements decorated\r\n /// with the [data-val=true] attribute value and enables validation according to the data-val-*\r\n /// attribute values.\r\n /// \r\n /// Any valid jQuery selector.\r\n $(selector).find(\":input[data-val=true]\").each(function () {\r\n $jQval.unobtrusive.parseElement(this, true);\r\n });\r\n\r\n $(\"form\").each(function () {\r\n var info = validationInfo(this);\r\n if (info) {\r\n info.attachValidation();\r\n }\r\n });\r\n }\r\n };\r\n\r\n adapters = $jQval.unobtrusive.adapters;\r\n\r\n adapters.add = function (adapterName, params, fn) {\r\n /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.\r\n /// The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).\r\n /// [Optional] An array of parameter names (strings) that will\r\n /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and\r\n /// mmmm is the parameter name).\r\n /// The function to call, which adapts the values from the HTML\r\n /// attributes into jQuery Validate rules and/or messages.\r\n /// \r\n if (!fn) { // Called with no params, just a function\r\n fn = params;\r\n params = [];\r\n }\r\n this.push({ name: adapterName, params: params, adapt: fn });\r\n return this;\r\n };\r\n\r\n adapters.addBool = function (adapterName, ruleName) {\r\n /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation rule has no parameter values.\r\n /// The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).\r\n /// [Optional] The name of the jQuery Validate rule. If not provided, the value\r\n /// of adapterName will be used instead.\r\n /// \r\n return this.add(adapterName, function (options) {\r\n setValidationValues(options, ruleName || adapterName, true);\r\n });\r\n };\r\n\r\n adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {\r\n /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and\r\n /// one for min-and-max). The HTML parameters are expected to be named -min and -max.\r\n /// The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).\r\n /// The name of the jQuery Validate rule to be used when you only\r\n /// have a minimum value.\r\n /// The name of the jQuery Validate rule to be used when you only\r\n /// have a maximum value.\r\n /// The name of the jQuery Validate rule to be used when you\r\n /// have both a minimum and maximum value.\r\n /// [Optional] The name of the HTML attribute that\r\n /// contains the minimum value. The default is \"min\".\r\n /// [Optional] The name of the HTML attribute that\r\n /// contains the maximum value. The default is \"max\".\r\n /// \r\n return this.add(adapterName, [minAttribute || \"min\", maxAttribute || \"max\"], function (options) {\r\n var min = options.params.min,\r\n max = options.params.max;\r\n\r\n if (min && max) {\r\n setValidationValues(options, minMaxRuleName, [min, max]);\r\n }\r\n else if (min) {\r\n setValidationValues(options, minRuleName, min);\r\n }\r\n else if (max) {\r\n setValidationValues(options, maxRuleName, max);\r\n }\r\n });\r\n };\r\n\r\n adapters.addSingleVal = function (adapterName, attribute, ruleName) {\r\n /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation rule has a single value.\r\n /// The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).\r\n /// [Optional] The name of the HTML attribute that contains the value.\r\n /// The default is \"val\".\r\n /// [Optional] The name of the jQuery Validate rule. If not provided, the value\r\n /// of adapterName will be used instead.\r\n /// \r\n return this.add(adapterName, [attribute || \"val\"], function (options) {\r\n setValidationValues(options, ruleName || adapterName, options.params[attribute]);\r\n });\r\n };\r\n\r\n $jQval.addMethod(\"__dummy__\", function (value, element, params) {\r\n return true;\r\n });\r\n\r\n $jQval.addMethod(\"regex\", function (value, element, params) {\r\n var match;\r\n if (this.optional(element)) {\r\n return true;\r\n }\r\n\r\n match = new RegExp(params).exec(value);\r\n return (match && (match.index === 0) && (match[0].length === value.length));\r\n });\r\n\r\n adapters.addSingleVal(\"accept\", \"exts\").addSingleVal(\"regex\", \"pattern\");\r\n adapters.addBool(\"creditcard\").addBool(\"date\").addBool(\"digits\").addBool(\"email\").addBool(\"number\").addBool(\"url\");\r\n adapters.addMinMax(\"length\", \"minlength\", \"maxlength\", \"rangelength\").addMinMax(\"range\", \"min\", \"max\", \"range\");\r\n adapters.add(\"equalto\", [\"other\"], function (options) {\r\n var prefix = getModelPrefix(options.element.name),\r\n other = options.params.other,\r\n fullOtherName = appendModelPrefix(other, prefix),\r\n element = $(options.form).find(\":input[name=\" + fullOtherName + \"]\")[0];\r\n\r\n setValidationValues(options, \"equalTo\", element);\r\n });\r\n adapters.add(\"required\", function (options) {\r\n // jQuery Validate equates \"required\" with \"mandatory\" for checkbox elements\r\n if (options.element.tagName.toUpperCase() !== \"INPUT\" || options.element.type.toUpperCase() !== \"CHECKBOX\") {\r\n setValidationValues(options, \"required\", true);\r\n }\r\n });\r\n adapters.add(\"remote\", [\"url\", \"type\", \"additionalfields\"], function (options) {\r\n var value = {\r\n url: options.params.url,\r\n type: options.params.type || \"GET\",\r\n data: {}\r\n },\r\n prefix = getModelPrefix(options.element.name);\r\n\r\n $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {\r\n var paramName = appendModelPrefix(fieldName, prefix);\r\n value.data[paramName] = function () {\r\n return $(options.form).find(\":input[name='\" + paramName + \"']\").val();\r\n };\r\n });\r\n\r\n setValidationValues(options, \"remote\", value);\r\n });\r\n\r\n $(function () {\r\n $jQval.unobtrusive.parse(document);\r\n });\r\n}(jQuery));","$.validator.addMethod('insurancebirthdate', function (value, element, params) {\r\n\r\n var year2,\r\n year4,\r\n birthdate,\r\n now = new Date();\r\n\r\n if (value.length != 6)\r\n return false;\r\n\r\n if (isNaN(value))\r\n return false;\r\n\r\n year2 = parseInt(value.substr(0, 2), 10);\r\n\r\n if (year2 + 2000 > now.getFullYear()) {\r\n year4 = year2 + 1900;\r\n }\r\n else {\r\n year4 = year2 + 2000;\r\n }\r\n\r\n birthdate = new Date(Date.parse(year4.toString() + value.substr(2, 4), \"yyyyMMdd\"));\r\n return (Object.prototype.toString.call(d) !== \"[object Date]\" && !isNaN(birthdate.getTime()));\r\n});","$.validator.addMethod('requiredif',\r\n function (value, element, parameters) {\r\n var id = '#' + parameters['dependentproperty'];\r\n // get the target value (as a string,\r\n // as that's what actual value will be)\r\n var targetvalue = parameters['targetvalue'];\r\n targetvalue = (targetvalue == null ? '' : targetvalue).toString();\r\n\r\n var targetvaluearray = targetvalue.split('|');\r\n\r\n // Lets find the current value of dependent property\r\n\r\n var control = $(id);\r\n var controltype = control.attr('type');\r\n\r\n var actualvalue = control.val();\r\n switch (controltype) {\r\n case 'checkbox':\r\n actualvalue = control.attr('checked') ? \"true\" : \"false\";\r\n break;\r\n\r\n case 'radio':\r\n // Find everyone with same name ..\r\n var radios = $('[name=\"' + control.attr('name') + '\"]');\r\n radios.each(function (i, x) {\r\n x = $(x);\r\n\r\n if (x.attr('checked'))\r\n actualvalue = x.val();\r\n });\r\n\r\n break;\r\n }\r\n\r\n for (var i = 0; i < targetvaluearray.length; i++) {\r\n\r\n // if the condition is true, reuse the existing\r\n // required field validator functionality\r\n if (targetvaluearray[i] === actualvalue) {\r\n return $.validator.methods.required.call(this, value, element, parameters);\r\n\r\n }\r\n }\r\n return true;\r\n }\r\n );\r\n\r\n$.validator.unobtrusive.adapters.add(\r\n 'requiredif',\r\n ['dependentproperty', 'targetvalue'],\r\n function (options) {\r\n options.rules['requiredif'] = {\r\n dependentproperty: options.params['dependentproperty'],\r\n targetvalue: options.params['targetvalue']\r\n };\r\n options.messages['requiredif'] = options.message;\r\n }); \r\n","/**\r\n* validator for \"requiring\" a field if another matches a specific value\r\n*/\r\n\r\n$.validator.addMethod(\"requiredifnot\", function (value, element, params) {\r\n var sourceType = $(element).attr(\"type\");\r\n\r\n if (sourceType == 'radio') {\r\n var r = $('[name=\"' + $(element).attr('name') + '\"]:checked');\r\n if (r != null)\r\n return true;\r\n } else {\r\n if ($(element).val() != '') return true;\r\n }\r\n\r\n var other = $('#' + params.other);\r\n if (other.length === 0) {\r\n other = $(\"input[name='\" + params.other + \"']\");\r\n }\r\n\r\n\r\n var type = other.attr(\"type\");\r\n var otherVal = other.val();\r\n\r\n switch (type) {\r\n case \"checkbox\":\r\n otherVal = other.attr('checked') ? \"true\" : \"false\";\r\n break;\r\n case \"radio\":\r\n // Find everyone with same name ..\r\n var radio = $('[name=\"' + other.attr('name') + '\"]:checked');\r\n otherVal = radio.val();\r\n\r\n break;\r\n }\r\n otherVal = (otherVal == \"False\" || otherVal == \"True\") ? otherVal.toLowerCase() : otherVal;\r\n\r\n var validValues = params.values.split(',');\r\n\r\n var valid = $.inArray(otherVal, validValues) >= 0;\r\n\r\n return valid;\r\n\r\n});\r\n\r\n$.validator.unobtrusive.adapters.add(\"requiredifnot\", [\"other\", \"values\"],\r\nfunction (options) {\r\n options.rules['requiredifnot'] = {\r\n other: options.params.other,\r\n values: options.params.values\r\n };\r\n options.messages['requiredifnot'] = options.message;\r\n});","// enquire.js v1.5.6 - Awesome Media Queries in JavaScript\r\n// Copyright (c) 2013 Nick Williams - http://wicky.nillia.ms/enquire.js\r\n// License: MIT (http://www.opensource.org/licenses/mit-license.php)\r\n\r\nwindow.enquire = function (e) { \"use strict\"; function t(e, t) { var n = 0, r = e.length, i; for (n; n < r; n++) { i = t(e[n], n); if (i === !1) break } } function n(e) { return Object.prototype.toString.apply(e) === \"[object Array]\" } function r(e) { return typeof e == \"function\" } function i(e) { this.initialised = !1, this.options = e, e.deferSetup || this.setup() } function s(e, t) { this.query = e, this.isUnconditional = t, this.handlers = [], this.matched = !1 } function o() { if (!e) throw new Error(\"matchMedia is required\"); var t = new s(\"only all\"); this.queries = {}, this.listening = !1, this.browserIsIncapable = !t.matchMedia() } return i.prototype = { setup: function (e) { this.options.setup && this.options.setup(e), this.initialised = !0 }, on: function (e) { this.initialised || this.setup(e), this.options.match(e) }, off: function (e) { this.options.unmatch && this.options.unmatch(e) }, destroy: function () { this.options.destroy ? this.options.destroy() : this.off() }, equals: function (e) { return this.options === e || this.options.match === e } }, s.prototype = { matchMedia: function () { return e(this.query).matches }, addHandler: function (e, t) { var n = new i(e); this.handlers.push(n), t && this.matched && n.on() }, removeHandler: function (e) { var n = this.handlers; t(n, function (t, r) { if (t.equals(e)) return t.destroy(), !n.splice(r, 1) }) }, assess: function (e) { this.matchMedia() || this.isUnconditional ? this.match(e) : this.unmatch(e) }, match: function (e) { if (this.matched) return; t(this.handlers, function (t) { t.on(e) }), this.matched = !0 }, unmatch: function (e) { if (!this.matched) return; t(this.handlers, function (t) { t.off(e) }), this.matched = !1 } }, o.prototype = { register: function (e, i, o) { var u = this.queries, a = o && this.browserIsIncapable, f = this.listening; return u.hasOwnProperty(e) || (u[e] = new s(e, a), this.listening && u[e].assess()), r(i) && (i = { match: i }), n(i) || (i = [i]), t(i, function (t) { u[e].addHandler(t, f) }), this }, unregister: function (e, n) { var r = this.queries; return r.hasOwnProperty(e) ? (n ? r[e].removeHandler(n) : (t(this.queries[e].handlers, function (e) { e.destroy() }), delete r[e]), this) : this }, fire: function (e) { var t = this.queries, n; for (n in t) t.hasOwnProperty(n) && t[n].assess(e); return this }, listen: function (e) { function n(n) { var r; window.addEventListener(n, function (n) { r && clearTimeout(r), r = setTimeout(function () { t.fire(n) }, e) }, !1) } var t = this; return e = e || 500, this.listening ? this : (window.addEventListener && (n(\"resize\"), n(\"orientationChange\")), t.fire(), this.listening = !0, this) } }, new o } (window.matchMedia);","(function ($) {\r\n\r\n $.fn.bigRadio = function () {\r\n this.find(\".lbl\").each(function () {\r\n $(this).click(function (e) {\r\n var t = $(this).parent();\r\n var s = t.siblings();\r\n s.removeClass('selected').find('input').prop('checked', false);\r\n t.addClass('selected').find('input').prop('checked', true);\r\n\r\n t.find('input').trigger(\"click\");\r\n });\r\n \r\n if ($(this).siblings(\"input\").is(\":checked\"))\r\n $(this).parent().addClass(\"selected\");\r\n\r\n });\r\n\r\n return this;\r\n\r\n };\r\n\r\n}(jQuery));","\r\nBOOK = BOOK || {};\r\nBOOK.common = BOOK.common || {};\r\n\r\nBOOK.common.main = function () {\r\n var _modules;\r\n return {\r\n initModules: function (isMobile) {\r\n // if (isMobile)\r\n // console.log(\"Mobile detected\");\r\n // else\r\n // console.log(\"widescreen detected\");\r\n\r\n /* initalize all modules given (module must have an init function) */\r\n $(_modules).each(function (i, value) {\r\n if (value.init && {}.toString.call(value.init) === '[object Function]') {\r\n value.init(isMobile);\r\n }\r\n });\r\n },\r\n\r\n bindInformationLinks: function () {\r\n var el = $('#openHelpLinkClick').tipsy({ trigger: 'manual', html: true, fade: true, opacity: \"1\", infoBubble: false });\r\n\r\n $(\"#openHelpLinkClick\").on('mouseover', function () {\r\n $(this).tipsy('show');\r\n return false;\r\n });\r\n\r\n $('#openHelpLinkClick').click(function (e) {\r\n e.preventDefault();\r\n if ($('.tipsy').length === 0) {\r\n el.tipsy('show');\r\n } else {\r\n el.tipsy('hide');\r\n }\r\n });\r\n\r\n $('#openHelpLinkClick').mouseleave(function (e) {\r\n el.tipsy('hide');\r\n });\r\n },\r\n\r\n init: function (modules) {\r\n _modules = modules;\r\n\r\n window.isWidescreen = !window.getComputedStyle || window.getComputedStyle(document.body, ':after').getPropertyValue('content') === '\"widescreen\"' || window.getComputedStyle(document.body, ':after').getPropertyValue('content') === 'widescreen';\r\n window.isRetina = window.devicePixelRatio >= 2;\r\n var $this = this;\r\n $.ajaxSetup({\r\n cache: false\r\n });\r\n\r\n $(document).ready(function () {\r\n if (typeof (SkistarSupportForum) != \"undefined\") {\r\n SkistarSupportForum.modalHandler.init();\r\n }\r\n });\r\n\r\n enquire.register(\"only screen and (min-width: 48em)\", {\r\n match: function () {\r\n return $this.initModules(false);\r\n },\r\n unmatch: function () {\r\n return $this.initModules(true);\r\n },\r\n setup: function () {\r\n if (!window.isWidescreen) {\r\n return $this.initModules(true);\r\n }\r\n }\r\n }, true).listen(200);\r\n\r\n $('#booking .fn-popup').fancybox({\r\n margin: 18,\r\n padding: 5,\r\n transitionIn: 'none',\r\n transitionOut: 'none',\r\n closeBtn: true,\r\n type: 'iframe',\r\n afterShow: function () {\r\n setTimeout(function () {\r\n var height = $('.fancybox-inner :first').height();\r\n $('.fancybox-inner :first').height(height + 10);\r\n }, 1);\r\n\r\n },\r\n onUpdate: function () {\r\n setTimeout(function () {\r\n var height = $('.fancybox-inner :first').height();\r\n $('.fancybox-inner :first').height(height + 10);\r\n }, 1);\r\n\r\n }\r\n });\r\n\r\n $('#booking .fn-confirm').on('click', function (e) {\r\n if (!confirm($(this).attr('data-message'))) {\r\n e.preventDefault();\r\n }\r\n });\r\n }\r\n };\r\n\r\n} ();","/**\r\n * booking.common.js\r\n *\r\n */\r\n\r\n// Global BOOK namespace for all JS\r\nif (typeof BOOK == 'undefined') var BOOK = {};\r\n\r\nBOOK.Common = (function ($) {\r\n\r\n // Add fragmentRendered listener for common\r\n $(document).bind(\"fragmentRendered\", function (event) {\r\n jQuery(\"select, input:checkbox, input:radio\", event.target).uniform();\r\n BOOK.Common.handleScrollEvent();\r\n });\r\n\r\n $(document).ready(function () {\r\n if (typeof (SkistarSupportForum) != \"undefined\") {\r\n SkistarSupportForum.modalHandler.init();\r\n }\r\n });\r\n \r\n // MODAL LISTENERS\r\n var modalLinks = $('a.modal');\r\n if (modalLinks.length > 0) {\r\n $('a.modal').nyroModal({ type: 'iframe', autoSizable: false, minWidth: 750, minHeight: 347, forceType: 'iframe' });\r\n\r\n $.nyroModalSettings({\r\n endShowContent: function (elt, settings) {\r\n jQuery('iframe', elt.content).attr('allowtransparency', 'true');\r\n }\r\n });\r\n }\r\n\r\n return {\r\n\r\n subcribeFragmentRendered: function (action) {\r\n $(document).bind(\"fragmentRendered\", function (event) { action(event.target); });\r\n },\r\n\r\n // private method for UTF-8 encoding\r\n utf8Encode: function (string) {\r\n string = string.replace(/\\r\\n/g, \"\\n\");\r\n var utftext = \"\";\r\n\r\n for (var n = 0; n < string.length; n++) {\r\n\r\n var c = string.charCodeAt(n);\r\n\r\n if (c < 128) {\r\n utftext += String.fromCharCode(c);\r\n }\r\n else if ((c > 127) && (c < 2048)) {\r\n utftext += String.fromCharCode((c >> 6) | 192);\r\n utftext += String.fromCharCode((c & 63) | 128);\r\n }\r\n else {\r\n utftext += String.fromCharCode((c >> 12) | 224);\r\n utftext += String.fromCharCode(((c >> 6) & 63) | 128);\r\n utftext += String.fromCharCode((c & 63) | 128);\r\n }\r\n\r\n }\r\n\r\n return utftext;\r\n },\r\n\r\n // private method for UTF-8 decoding\r\n utf8Decode: function (utftext) {\r\n var string = \"\";\r\n var i = 0;\r\n var c = c1 = c2 = 0;\r\n\r\n while (i < utftext.length) {\r\n\r\n c = utftext.charCodeAt(i);\r\n\r\n if (c < 128) {\r\n string += String.fromCharCode(c);\r\n i++;\r\n }\r\n else if ((c > 191) && (c < 224)) {\r\n c2 = utftext.charCodeAt(i + 1);\r\n string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\r\n i += 2;\r\n }\r\n else {\r\n c2 = utftext.charCodeAt(i + 1);\r\n c3 = utftext.charCodeAt(i + 2);\r\n string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n i += 3;\r\n }\r\n\r\n }\r\n\r\n return string;\r\n },\r\n\r\n Test: function (value) {\r\n alert(value);\r\n },\r\n\r\n isInt: function (value) {\r\n if ((parseFloat(value) == parseInt(value)) && !isNaN(value)) {\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n },\r\n\r\n getInputAsNumber: function (value) {\r\n var ret = 0;\r\n if (value != \"\" && value > 0) {\r\n if (BOOK.Common.isInt(value)) {\r\n ret = parseInt(value);\r\n }\r\n }\r\n return ret;\r\n },\r\n\r\n getDestinationFromUrl: function () {\r\n var dest = \"\";\r\n var pathParts = location.pathname.split('/');\r\n if (pathParts.length > 1) {\r\n dest = pathParts[2];\r\n if (dest != \"are\" && dest != \"hemsedal\" && dest != \"salen\" && dest != \"vemdalen\" && dest != \"trysil\")\r\n dest = \"\";\r\n }\r\n return dest;\r\n },\r\n\r\n getLanguageFromUrl: function () {\r\n var lang = \"en\";\r\n var pathParts = location.pathname.split('/');\r\n if (pathParts.length > 0) {\r\n lang = pathParts[1];\r\n }\r\n return lang;\r\n },\r\n\r\n /**\r\n * Creates a Javascript Date object from a string formatted according to:\r\n * \"YYYY-MM-DD HH24:MI\"\r\n */\r\n createDateFromString: function (dateString) {\r\n var month = parseInt(dateString.substring(5, 7)) - 1;\r\n return new Date(\r\n\t dateString.substring(0, 4),\r\n\t month,\r\n\t dateString.substring(8, 10),\r\n\t dateString.substring(11, 13),\r\n\t dateString.substring(14, 16)\r\n\t );\r\n },\r\n\r\n createDateFromWebString: function (dateString) {\r\n var year = dateString.substring(0, 4);\r\n var monthStr = dateString.substring(4, 6);\r\n var month = 0;\r\n if (monthStr.substring(0, 1) == \"0\")\r\n month = parseInt(monthStr.substring(1, 2)) - 1;\r\n else\r\n month = parseInt(monthStr) - 1;\r\n var day = dateString.substring(6, 8);\r\n return new Date(year, month, day);\r\n },\r\n\r\n createWebDateString: function (newDate) {\r\n var intMonth = newDate.getMonth() + 1;\r\n var intDay = newDate.getUTCDate() + 1;\r\n var month = \"\" + intMonth;\r\n var day = \"\" + intDay;\r\n if (intMonth < 10) {\r\n month = \"0\" + intMonth;\r\n }\r\n if (intDay < 10) {\r\n day = \"0\" + intDay;\r\n }\r\n return newDate.getFullYear() + month + day;\r\n },\r\n\r\n createDateString: function (newDate) {\r\n var intMonth = newDate.getMonth() + 1;\r\n var intDay = newDate.getUTCDate() + 1;\r\n var month = \"\" + intMonth;\r\n var day = \"\" + intDay;\r\n if (intMonth < 10) {\r\n month = \"0\" + intMonth;\r\n }\r\n if (intDay < 10) {\r\n day = \"0\" + intDay;\r\n }\r\n var minutes = newDate.getMinutes();\r\n if (minutes < 10) {\r\n minutes = \"0\" + minutes;\r\n }\r\n var hours = newDate.getHours();\r\n if (hours < 10) {\r\n hours = \"0\" + hours;\r\n }\r\n return newDate.getFullYear() + \"-\" + month + \"-\" + day + \" \" + hours + \":\" + minutes;\r\n },\r\n formatPrice: function (amount, decimalSeparator, displayDecimals) {\r\n if (amount == null)\r\n return \"\";\r\n else\r\n return amount.toFixed(displayDecimals).replace('.', decimalSeparator);\r\n },\r\n\r\n /**\r\n * converts a string to uppercase, also manages swedish and norwegian\r\n * chars. not really an optimized function...\r\n * @param s {string} string to uppercase\r\n * @return the new string as uppercase\r\n */\r\n stringToUpper: function (s) {\r\n\r\n if (s == null) {\r\n return s;\r\n }\r\n\r\n // butt-ugly.\r\n var a1 = \"@1\"; // �\r\n var a2 = \"@2\"; // �\r\n var a3 = \"@3\"; // �\r\n var a4 = \"@4\"; // �\r\n var a5 = \"@5\"; // �\r\n var t = s.replace(/�/g, a1).replace(/�/g, a3).replace(/�/g, a2);\r\n t = t.replace(/�/g, a1).replace(/�/g, a2).replace(/�/g, a3);\r\n t = t.replace(/�/g, a4).replace(/�/g, a5);\r\n t = t.toUpperCase();\r\n var res = t.replace(/@1/g, \"�\").replace(/@2/g, \"�\").replace(/@3/g, \"�\");\r\n res = res.replace(/@4/g, \"�\").replace(/@5/g, \"�\");\r\n return res;\r\n },\r\n\r\n /**\r\n * converts a string to lowercase, also manages swedish and norwegian\r\n * chars. not really an optimized function...\r\n * @param s {string} string to lowercase\r\n * @return the new string as lowercase\r\n */\r\n stringToLower: function (s) {\r\n\r\n if (s == null) {\r\n return s;\r\n }\r\n\r\n // butt-ugly.\r\n var a1 = \"@1\"; // �\r\n var a2 = \"@2\"; // �\r\n var a3 = \"@3\"; // �\r\n var a4 = \"@4\"; // �\r\n var a5 = \"@5\"; // �\r\n var t = s.replace(/�/g, a1).replace(/�/g, a3).replace(/�/g, a2);\r\n t = t.replace(/�/g, a1).replace(/�/g, a2).replace(/�/g, a3);\r\n t = t.replace(/�/g, a4).replace(/�/g, a5);\r\n t = t.toLowerCase();\r\n var res = t.replace(/@1/g, \"�\").replace(/@2/g, \"�\").replace(/@3/g, \"�\");\r\n res = res.replace(/@4/g, \"�\").replace(/@5/g, \"�\");\r\n return res;\r\n },\r\n\r\n tableScrollToggle: false,\r\n handleScrollEvent: function (e) {\r\n var billboard = $('#modalBillboardWrapper');\r\n if (billboard.length > 0) {\r\n var scrollOffset = $(window).scrollTop();\r\n if (scrollOffset < billboard.offset().top)\r\n billboard.stop().animate({ top: scrollOffset + \"px\" }); // billboard.css(\"top\", scrollOffset + \"px\");\r\n }\r\n\r\n // Tables with fixed header\r\n var myOffset = jQuery(\".fixedHeader\").offset();\r\n\r\n if (myOffset == null)\r\n return;\r\n\r\n var offset = myOffset.top;\r\n\r\n if (offset == null)\r\n return;\r\n\r\n var offsetHeader = jQuery(\".fixedHeader thead\").offset().top;\r\n var tableHeight = jQuery(\".fixedHeader\").height();\r\n\r\n if ((offset - jQuery(window).scrollTop()) <= 0) {\r\n if (!this.tableScrollToggle) {\r\n this.tableScrollToggle = true;\r\n\r\n jQuery(\".fixedHeader thead\").toggleClass(\"fixed\", true);\r\n }\r\n } else {\r\n if (this.tableScrollToggle) {\r\n jQuery(\".fixedHeader thead\").toggleClass(\"fixed\", false);\r\n tableScrollToggle = false;\r\n }\r\n }\r\n\r\n // TODO: Check for tableScrollToggle\r\n if (offset > offsetHeader | jQuery(window).scrollTop() > (offset + tableHeight)) {\r\n jQuery(\".fixedHeader thead\").toggleClass(\"fixed\", false);\r\n }\r\n }\r\n }\r\n\r\n})(jQuery);\r\n\r\n\r\n(function ($) {\r\n\r\n $.fn.notifyFragmentRendered = function () {\r\n\r\n $(this).trigger(\"fragmentRendered\");\r\n\r\n };\r\n})(jQuery);\r\n\r\n","BOOK.common.toggle = function () {\r\n var initalized = false;\r\n var isMobile;\r\n return {\r\n toggleAccordion: function (selector) {\r\n var elm = selector;\r\n var parent = elm.parent();\r\n var isAlreadyOpen = parent.is(\".expanded\");\r\n\r\n //first close the opened one\r\n var root = elm.closest(\".fn-toggle-accordion\");\r\n root.find(\".fn-accordion-content\").slideUp();\r\n root.find(\".expanded>a\").removeClass(\"booking-icon-arrow-up-small2\").addClass(\"booking-icon-arrow-down-small2\");\r\n root.find(\".expanded\").removeClass(\"expanded\");\r\n if (isAlreadyOpen) {\r\n return false;\r\n }\r\n\r\n //then open a new one\r\n parent.addClass(\"expanded\");\r\n elm.siblings(\".fn-accordion-content\").slideDown();\r\n elm.removeClass(\"booking-icon-arrow-down-small2\").addClass(\"booking-icon-arrow-up-small2\");\r\n return false;\r\n },\r\n\r\n init: function (isMob) {\r\n if (!initalized) {\r\n isMobile = isMob;\r\n $(\".fn-toggle-accordion>li>a,.fn-toggle-accordion>div>a\").click(function (e) { e.preventDefault(); BOOK.common.toggle.toggleAccordion($(this)); });\r\n initalized = true;\r\n }\r\n }\r\n };\r\n} ();","/**\r\n * Translation functionality\r\n *\r\n * Only the core functionality for translating texts is located here, the translations are loaded separately as a JSON-string and\r\n * are exposed to the functions in this script from the variable \"BOOK.Translations\" which will be loaded depending on the \r\n * current language the user has chosen.\r\n *\r\n */\r\n\r\nBOOK.Translations = [];\r\n\r\nBOOK.I18N = (function ($) {\r\n\r\n return {\r\n\r\n initialize: function () {\r\n var self = this;\r\n self.loadTranslations();\r\n return self.translate;\r\n },\r\n\r\n loadTranslations: function () {\r\n var self = this;\r\n var url = \"/\" + BOOK.Common.getLanguageFromUrl() + \"/online-booking/common/i18n/translations\";\r\n\r\n $.getJSON(url, \"\", function (data) {\r\n self.parseTranslations(data);\r\n });\r\n },\r\n\r\n parseTranslations: function (data) {\r\n var count = data.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n var t = data[i];\r\n BOOK.Translations[t.Key] = t.Text;\r\n }\r\n },\r\n\r\n /**\r\n * Translates a key and returns it, will return the \"defaultString\" if\r\n * no translation was found. Can also replace parameters in the string if\r\n * necessary.\r\n * @param key {string} the language-key to translate on the form \"MODULE.KEY\"\r\n * @param defaultString {string} is returned when no translation was found.\r\n * @params an array with parameters to replace in the translated string\r\n * @return translated string\r\n */\r\n translate: function (key, defaultString, params, fnComplete) {\r\n var string = BOOK.I18N.lookup(key);\r\n if (!string) {\r\n BOOK.I18N.translateLive(key, defaultString, function (text) {\r\n var b = text;\r\n fnComplete(BOOK.I18N.replaceParams(text, params));\r\n });\r\n }\r\n else {\r\n fnComplete(BOOK.I18N.replaceParams(string, params));\r\n }\r\n },\r\n\r\n\r\n translateLive: function (key, defaultString, fnComplete) {\r\n var string = defaultString;\r\n var url = \"/\" + BOOK.Common.getLanguageFromUrl() + \"/online-booking/common/i18n/\";\r\n\r\n url += \"translate?key=\" + key + \"&defaultValue=\" + encodeURIComponent(defaultString);\r\n\r\n $.ajax({\r\n url: url,\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n success: function (data) {\r\n if (data.hasOwnProperty(\"Key\")) {\r\n if (data.Key == key && data.Text != \"\") {\r\n string = data.Text;\r\n }\r\n }\r\n fnComplete(unescape(string));\r\n }\r\n });\r\n },\r\n translateMultiple: function (items, fnComplete) {\r\n var result = {};\r\n var request = [];\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n var item = items[i];\r\n\r\n // extract individual values\r\n var key = item.key;\r\n var defaultString = item.defaultString;\r\n var params = typeof item.params != 'undefined' ? item.params : null;\r\n\r\n var translation = BOOK.I18N.lookup(key);\r\n if (translation) {\r\n // already stored in local cache\r\n result[key] = BOOK.I18N.replaceParams(translation);\r\n } else {\r\n // must be translated serverside, add to request\r\n request.push({ Key: key, DefaultValue: defaultString });\r\n\r\n }\r\n\r\n }\r\n\r\n if (request.length > 0) {\r\n BOOK.I18N.translateMultipleLive(request, function (response) {\r\n for (var i = 0; i < response.length; i++) {\r\n var item = response[i];\r\n // update result\r\n result[item.Key] = BOOK.I18N.replaceParams(item.Text);\r\n }\r\n\r\n fnComplete(result);\r\n });\r\n\r\n } else {\r\n // everything already translated locally\r\n fnComplete(result);\r\n }\r\n\r\n\r\n\r\n },\r\n\r\n translateMultipleLive: function (items, fnComplete) {\r\n var url = \"/\" + BOOK.Common.getLanguageFromUrl() + \"/online-booking/common/i18n/\";\r\n url += \"translateMultiple\";\r\n\r\n \r\n $.ajax({\r\n url: url,\r\n data: JSON.stringify(items),\r\n type: 'POST',\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n success: function (data) {\r\n fnComplete(data);\r\n }\r\n });\r\n },\r\n\r\n replaceParams: function (string, params) {\r\n for (var p in params) {\r\n if (params.hasOwnProperty(p)) {\r\n string = string.replace(\"{\" + p + \"}\", params[p]);\r\n }\r\n }\r\n return string;\r\n },\r\n\r\n /**\r\n * Same as \"translate\" but also converts the translated string to uppercase\r\n */\r\n translateConvertToUpper: function (key, defaultString, params) {\r\n var self = this;\r\n var translated = self.translate(key, defaultString, params);\r\n return BOOK.Common.stringToUpper(translated);\r\n },\r\n\r\n /**\r\n * Locates the translation-key in the loaded dictionary of translations.\r\n * @param key {string} the translation key to look for\r\n * @return false if no translation was found\r\n */\r\n lookup: function (key) {\r\n\r\n if (BOOK.Translations.hasOwnProperty(key)) {\r\n return BOOK.Translations[key];\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n})(jQuery);","jQuery(function ($) {\r\n $.fn.nyroModal = function (settings) {\r\n if (!this)\r\n return;\r\n this.each(function () {\r\n\r\n var me = $(this);\r\n var boxWidth = undefined;\r\n if (settings != undefined) {\r\n if (settings.minWidth != undefined) {\r\n boxWidth = settings.minWidth;\r\n }\r\n if (boxWidth == undefined && settings.Width != undefined) {\r\n boxWidth = settings.Width;\r\n }\r\n }\r\n var boxHeight = undefined;\r\n if (settings != undefined) {\r\n if (settings.minHeight != undefined) {\r\n boxHeight = settings.minHeight;\r\n }\r\n if (boxHeight == undefined && settings.Height != undefined) {\r\n boxHeight = settings.Height;\r\n }\r\n }\r\n\r\n\r\n var fancySettings = {\r\n margin: 5,\r\n padding: 5,\r\n transitionIn: 'none',\r\n transitionOut: 'none',\r\n closeBtn: true,\r\n type: 'iframe',\r\n iframe: { scolling: 'no' }\r\n\r\n\r\n\r\n };\r\n\r\n\r\n if (boxWidth != undefined) {\r\n fancySettings.width = boxWidth;\r\n }\r\n if (boxHeight != undefined) {\r\n fancySettings.height = boxHeight;\r\n }\r\n // Använd inte autosize om det är specad längd/bredd\r\n // Får göra så tills vi gått igenom alla grejer som sätter en massa margins och padding i popup-content\r\n if (boxHeight != undefined && boxWidth != undefined) {\r\n fancySettings.autoSize = false;\r\n } else {\r\n fancySettings.autoWidth = true;\r\n }\r\n\r\n if (settings != undefined && settings.href != undefined) {\r\n fancySettings.href = settings.href;\r\n }\r\n if (settings != undefined && settings.content != undefined) {\r\n fancySettings.content = settings.content;\r\n }\r\n if (fancySettings.href != undefined || fancySettings.content != undefined) {\r\n $.fancybox.open(fancySettings);\r\n } else {\r\n $(me).fancybox(\r\n fancySettings\r\n );\r\n\r\n }\r\n });\r\n //alert(settings);\r\n };\r\n});","\r\n\r\n\r\n\r\nBOOK.Filter_Component = (function ($) {\r\n\r\n return {\r\n InitializeSlider: function (defaultValue, minValue, maxValue, sliderElement, minElement, maxElement, stepFunction, changeCallback) {\r\n\r\n var initialMinValue = defaultValue.Min < minValue ? minValue : defaultValue.Min;\r\n var initialMaxValue = defaultValue.Max > maxValue ? maxValue : defaultValue.Max;\r\n\r\n var render = function (min, max) {\r\n var maxVal = \"\" + max;\r\n if (max == maxValue) {\r\n maxVal = maxValue;\r\n sliderElement.find('.ui-rangeSlider-rightLabel .ui-rangeSlider-label-value').html(maxVal);\r\n }\r\n\r\n minElement.html(min);\r\n maxElement.html(maxVal);\r\n };\r\n\r\n var makeDirty = function (min, max, selector) {\r\n sliderElement.toggleClass('dirty', !(min == minValue && max == maxValue));\r\n sliderElement.toggleClass('dirtyMax', !(max == maxValue));\r\n };\r\n\r\n /*\r\n sliderElement.slider({\r\n range: true,\r\n min: minValue,\r\n max: maxValue,\r\n values: [initialMinValue, initialMaxValue],\r\n slide: function (event, ui) {\r\n var min = ui.values[0];\r\n var max = ui.values[1];\r\n\r\n if (typeof (stepFunction) == \"function\") {\r\n min = stepFunction(min);\r\n max = stepFunction(max);\r\n }\r\n\r\n render(min, max);\r\n\r\n },\r\n change: function (event, ui) {\r\n var min = ui.values[0];\r\n var max = ui.values[1];\r\n\r\n if (typeof (stepFunction) == \"function\") {\r\n min = stepFunction(min);\r\n max = stepFunction(max);\r\n }\r\n render(min, max);\r\n\r\n makeDirty(min, max, $(ui.handle).parent());\r\n\r\n changeCallback();\r\n }\r\n });\r\n */\r\n\r\n var maxValueLabel = maxValue;\r\n var rangeSetting = Math.ceil( (maxValue - minValue) / 10 );\r\n if (maxValue > 999) {\r\n var overflow = (\"\" + maxValue).length - 3;\r\n rangeSetting *= (overflow * 0.8);\r\n } \r\n\r\n sliderElement.rangeSlider({\r\n range: {\r\n min: Math.round(rangeSetting)\r\n }, \r\n bounds: {\r\n min: minValue,\r\n max: maxValue\r\n },\r\n arrows: false,\r\n defaultValues: {\r\n min: initialMinValue,\r\n max: initialMaxValue\r\n },\r\n }).bind(\"valuesChanged\", function (e, data) {\r\n \r\n var min = Math.round(data.values.min);\r\n var max = Math.round(data.values.max);\r\n\r\n /*if (typeof (stepFunction) == \"function\") {\r\n min = stepFunction(min);\r\n max = stepFunction(max);\r\n }*/\r\n render(min, max);\r\n\r\n makeDirty(min, max);\r\n changeCallback();\r\n });\r\n\r\n // Lets refresh GUI if needed\r\n // check if initialvalues differ from default config, if so re render stuff\r\n if (initialMinValue != minValue || initialMaxValue != maxValue) {\r\n render(initialMinValue, initialMaxValue);\r\n makeDirty(initialMinValue, initialMaxValue, sliderElement);\r\n }\r\n },\r\n\r\n InitializeCheckBoxMask: function (criteriaLookup, changeCallback) {\r\n\r\n for (var criteria in criteriaLookup) {\r\n var checkbox = $('#' + criteria);\r\n\r\n // assign event\r\n checkbox.click(function (event) {\r\n changeCallback();\r\n });\r\n }\r\n },\r\n\r\n InitializeAllToggledCheckBoxMask: function (allCheckBoxSelector, maskCheckBoxSelector, changeCallback) {\r\n var $allCheckBoxSelector = $(allCheckBoxSelector);\r\n var $maskCheckBoxSelector = $(maskCheckBoxSelector);\r\n\r\n // assign events\r\n $allCheckBoxSelector.click(function (event) {\r\n // check if 'all' is checked\r\n var isAllChecked = $(allCheckBoxSelector).is(':checked');\r\n\r\n // update mask checkboxes\r\n $maskCheckBoxSelector.attr('checked', !isAllChecked);\r\n //$.uniform.update($maskCheckBoxSelector);\r\n\r\n changeCallback();\r\n });\r\n\r\n $maskCheckBoxSelector.click(function (event) {\r\n var isAnyChecked = false;\r\n\r\n $.each($maskCheckBoxSelector, function (index, checkbox) {\r\n var checked = $(checkbox).is(':checked');\r\n\r\n isAnyChecked = isAnyChecked || checked;\r\n\r\n });\r\n\r\n $allCheckBoxSelector.attr('checked', !isAnyChecked);\r\n //$.uniform.update($allCheckBoxSelector);\r\n\r\n changeCallback();\r\n });\r\n\r\n\r\n },\r\n\r\n\r\n InitializeComboBox: function (selector, changeCallback) {\r\n\r\n\r\n $(selector).change(function (event) {\r\n changeCallback(this);\r\n });\r\n },\r\n\r\n InitializeCheckBox: function (selector, changeCallback) {\r\n\r\n // assign event\r\n $(selector).click(function (event) {\r\n changeCallback();\r\n });\r\n\r\n },\r\n\r\n InitializeBookingPeriods: function (periodsSelector, changeCallback) {\r\n\r\n\r\n // assign event\r\n $(periodsSelector).click(function (event) {\r\n changeCallback();\r\n\r\n });\r\n }\r\n\r\n };\r\n})(jQuery);\r\n\r\n\r\nBOOK.Filter_SliderFilter = (function ($) {\r\n\r\n return {\r\n Initialize: function (name, compactName, sliderElement, minValue, maxValue, roundRule, categories) {\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.sliderElement = sliderElement;\r\n this.minValue = minValue;\r\n this.maxValue = maxValue;\r\n this.roundRule = roundRule;\r\n this.categories = categories;\r\n\r\n this.getRange = function (disableRunding) {\r\n // var v = this.sliderElement.slider(\"values\");\r\n\r\n var currentMin = this.sliderElement.rangeSlider(\"min\");\r\n var currentMax = this.sliderElement.rangeSlider(\"max\");\r\n\r\n if (currentMin == this.minValue) {\r\n currentMin = 0;\r\n }\r\n if (currentMax == this.maxValue) {\r\n currentMax = Number.MAX_VALUE;\r\n }\r\n\r\n if (!disableRunding && typeof (roundRule) == \"function\") {\r\n currentMin = roundRule(currentMin);\r\n currentMax = roundRule(currentMax);\r\n }\r\n \r\n return { \"min\": currentMin, \"max\": currentMax };\r\n };\r\n\r\n this.setRange = function (min, max) {\r\n /*sliderElement.val(3);\r\n sliderElement.slider('refresh');\r\n\r\n sliderElement.slider({\r\n values: [min, max]\r\n });*/\r\n sliderElement.rangeSlider(\"min\", min);\r\n sliderElement.rangeSlider(\"max\", max);\r\n };\r\n\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getRange();\r\n };\r\n\r\n this.isDirty = function () {\r\n var range = this.getRange(true);\r\n\r\n return range.min != 0 || range.max != Number.MAX_VALUE;\r\n };\r\n\r\n this.serializeCompact = function (dest) {\r\n var range = this.getRange(true);\r\n var result = {};\r\n\r\n if (range.min != 0)\r\n result['m'] = range.min;\r\n\r\n if (range.max != Number.MAX_VALUE)\r\n result['x'] = range.max;\r\n\r\n if (!isEmpty(result)) {\r\n dest[this.compactName] = result;\r\n }\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var value = source[this.compactName];\r\n\r\n var min = this.minValue;\r\n var max = this.maxValue;\r\n\r\n if (typeof value != 'undefined') {\r\n if (typeof value.m != 'undefined')\r\n min = value.m;\r\n\r\n if (typeof value.x != 'undefined')\r\n max = value.x;\r\n\r\n //this.sliderElement.slider({ values: [min, max] });\r\n sliderElement.rangeSlider(\"min\", min);\r\n sliderElement.rangeSlider(\"max\", max);\r\n }\r\n };\r\n\r\n\r\n }\r\n };\r\n\r\n})(jQuery);\r\n\r\nBOOK.Filter_CheckBoxMaskFilter = (function ($) {\r\n\r\n return {\r\n Initialize: function (name, compactName, defaultValue, criteriaLookup, categories) {\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.defaultValue = defaultValue;\r\n this.criteriaLookup = criteriaLookup;\r\n this.categories = categories;\r\n\r\n this.getSelectedCriterias = function () {\r\n\r\n var selectedCriterias = 0;\r\n for (var criteria in this.criteriaLookup) {\r\n var checkbox = $('#' + criteria);\r\n\r\n if (checkbox.is(':checked')) {\r\n selectedCriterias += this.criteriaLookup[checkbox.attr('id')];\r\n }\r\n }\r\n\r\n return selectedCriterias;\r\n };\r\n\r\n this.setSelectedCriterias = function (value) {\r\n\r\n for (var criteria in this.criteriaLookup) {\r\n var checkbox = $('#' + criteria);\r\n\r\n var mask = criteriaLookup[criteria];\r\n var checked = (value & mask) == mask;\r\n\r\n checkbox.attr('checked', checked);\r\n // $.uniform.update(checkbox);\r\n\r\n }\r\n };\r\n\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getSelectedCriterias();\r\n };\r\n\r\n this.isDirty = function () {\r\n var value = this.getSelectedCriterias();\r\n\r\n return value != this.defaultValue;\r\n };\r\n\r\n this.serializeCompact = function (dest) {\r\n\r\n var value = this.getSelectedCriterias();\r\n\r\n if (value != this.defaultValue) {\r\n dest[this.compactName] = value;\r\n }\r\n\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var value = source[this.compactName];\r\n\r\n if (typeof value != 'undefined') {\r\n this.setSelectedCriterias(value);\r\n }\r\n };\r\n\r\n // finally set default value\r\n this.setSelectedCriterias(defaultValue);\r\n\r\n }\r\n };\r\n\r\n})(jQuery);\r\n\r\nBOOK.Filter_AllToggledCheckBoxFilter = (function ($) {\r\n\r\n return {\r\n\r\n Initialize: function (name, compactName, defaultValue, allCheckBoxSelector, checkBoxSelector, categories) {\r\n var allValue = '0';\r\n\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.defaultValue = String(defaultValue);\r\n this.allCheckBoxSelector = allCheckBoxSelector;\r\n this.maskCheckBoxSelector = checkBoxSelector;\r\n this.categories = categories;\r\n\r\n this.getSelection = function () {\r\n var result = [];\r\n\r\n if ($(allCheckBoxSelector).is(':checked')) {\r\n result.push(allValue);\r\n } else {\r\n $(checkBoxSelector).filter(':checked').each(function (index, checkbox) {\r\n result.push(parseId(checkbox.id));\r\n });\r\n }\r\n\r\n return result;\r\n };\r\n\r\n this.setSelection = function (idArray) {\r\n var inSelection = $.inArray(allValue, idArray) >= 0;\r\n\r\n $(allCheckBoxSelector).attr('checked', inSelection);\r\n //$.uniform.update($(allCheckBoxSelector));\r\n\r\n $(checkBoxSelector).each(function (index, checkbox) {\r\n inSelection = $.inArray(parseId(checkbox.id), idArray) >= 0;\r\n $(checkbox).attr('checked', inSelection);\r\n // $.uniform.update($(checkbox));\r\n });\r\n };\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getSelection();\r\n };\r\n\r\n this.isDirty = function () {\r\n var value = this.getSelection().join(',');\r\n\r\n return value != String(this.defaultValue);\r\n };\r\n\r\n this.serializeCompact = function (dest) {\r\n\r\n var value = this.getSelection().join(',');\r\n\r\n if (value != this.defaultValue) {\r\n dest[this.compactName] = value;\r\n }\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var value = source[this.compactName];\r\n\r\n if (typeof value != 'undefined' && value != '') {\r\n this.setSelection(value.split(','));\r\n }\r\n };\r\n\r\n // Ok, do we have any preselected items ?\r\n var checkedItems = this.getSelection();\r\n if (checkedItems.length > 0) {\r\n // Ok, good then select them\r\n this.setSelection(checkedItems); \r\n }\r\n else {\r\n // Nope, then we set default\r\n this.setSelection([String(defaultValue)]); \r\n }\r\n\r\n }\r\n };\r\n\r\n function parseId(value) {\r\n var tag = value.split('_', 1)[0] + '_';\r\n return value.replace(tag, '');\r\n }\r\n\r\n})(jQuery);\r\n\r\nBOOK.Filter_AllToggledCheckBoxMaskFilter = (function ($) {\r\n\r\n return {\r\n GetMaskFromId: function (id) {\r\n return 1 << parseInt(id.split('_')[1]);\r\n },\r\n\r\n Initialize: function (name, compactName, defaultValue, allCheckBoxSelector, maskCheckBoxSelector, categories) {\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.defaultValue = defaultValue;\r\n this.allCheckBoxSelector = allCheckBoxSelector;\r\n this.maskCheckBoxSelector = maskCheckBoxSelector;\r\n this.categories = categories;\r\n\r\n this.getMask = function () {\r\n var mask = 0;\r\n $(maskCheckBoxSelector).filter(':checked').each(function (index, checkbox) {\r\n mask += BOOK.Filter_AllToggledCheckBoxMaskFilter.GetMaskFromId(checkbox.id);\r\n });\r\n\r\n return mask;\r\n };\r\n\r\n this.setMask = function (value) {\r\n $(allCheckBoxSelector).attr('checked', value == 0);\r\n // $.uniform.update($(allCheckBoxSelector));\r\n\r\n $(maskCheckBoxSelector).each(function (index, checkbox) {\r\n var mask = BOOK.Filter_AllToggledCheckBoxMaskFilter.GetMaskFromId(checkbox.id);\r\n var checked = (mask & value) == mask;\r\n\r\n $(checkbox).attr('checked', checked);\r\n // $.uniform.update($(checkbox));\r\n });\r\n };\r\n\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getMask();\r\n };\r\n\r\n this.isDirty = function () {\r\n var value = this.getMask();\r\n\r\n return value != this.defaultValue;\r\n };\r\n\r\n\r\n this.serializeCompact = function (dest) {\r\n\r\n var value = this.getMask();\r\n\r\n if (value != this.defaultValue) {\r\n dest[this.compactName] = value;\r\n }\r\n\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var value = source[this.compactName];\r\n\r\n if (typeof value != 'undefined') {\r\n this.setMask(value);\r\n }\r\n };\r\n\r\n // finally set default value\r\n this.setMask(defaultValue);\r\n }\r\n };\r\n\r\n})(jQuery);\r\n\r\nBOOK.Filter_PersonQuantityFilter = (function ($) {\r\n\r\n return {\r\n Initialize: function (name, compactName, defaultAdults, defaultYouths, defaultChilds, defaultInfants, adultSelector, youthSelector, childSelector, infantSelector, categories) {\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.defaultAdults = defaultAdults;\r\n this.defaultYouths = defaultYouths;\r\n this.defaultChilds = defaultChilds;\r\n this.defaultInfants = defaultInfants;\r\n\r\n this.adultSelector = adultSelector;\r\n this.youthSelector = youthSelector;\r\n this.childSelector = childSelector;\r\n this.infantSelector = infantSelector;\r\n\r\n this.categories = categories;\r\n\r\n this.getSelectedQuantities = function () {\r\n return {\r\n adults: parseInt($(this.adultSelector).val()),\r\n youths: parseInt($(this.youthSelector).val()),\r\n childs: parseInt($(this.childSelector).val()),\r\n infants: parseInt($(this.infantSelector).val())\r\n };\r\n };\r\n\r\n this.setSelectedQuantities = function (adults, youths, childs, infants) {\r\n if (adults) {\r\n $(this.adultSelector).val(adults);\r\n //$.uniform.update($(this.adultSelector));\r\n }\r\n\r\n if (youths) {\r\n $(this.youthSelector).val(youths);\r\n //$.uniform.update($(this.youthSelector));\r\n }\r\n\r\n\r\n if (childs) {\r\n $(this.childSelector).val(childs);\r\n //$.uniform.update($(this.childSelector));\r\n }\r\n\r\n\r\n if (infants) {\r\n $(this.infantSelector).val(infants);\r\n //$.uniform.update($(this.infantSelector));\r\n }\r\n\r\n };\r\n\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getSelectedQuantities();\r\n };\r\n\r\n this.isDirty = function () {\r\n var value = this.getSelectedQuantities();\r\n\r\n return value.adults != this.defaultAdults ||\r\n value.youths != this.defaultYouths ||\r\n value.childs != this.defaultChilds ||\r\n value.infants != this.defaultInfants;\r\n };\r\n\r\n this.serializeCompact = function (dest) {\r\n var result = {};\r\n var value = this.getSelectedQuantities();\r\n\r\n if (value.adults != this.defaultAdults)\r\n result['a'] = value.adults;\r\n\r\n if (value.youths != this.defaultYouths)\r\n result['y'] = value.youths;\r\n\r\n if (value.childs != this.defaultChilds)\r\n result['c'] = value.childs;\r\n\r\n if (value.infants != this.defaultInfants)\r\n result['i'] = value.infants;\r\n\r\n if (!isEmpty(result))\r\n dest[this.compactName] = result;\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var value = source[this.compactName];\r\n\r\n if (typeof value != 'undefined') {\r\n var adults = typeof value.a != 'undefined' ? value.a.toString() : null;\r\n var youths = typeof value.y != 'undefined' ? value.y.toString() : null;\r\n var childs = typeof value.c != 'undefined' ? value.c.toString() : null;\r\n var infants = typeof value.i != 'undefined' ? value.i.toString() : null;\r\n\r\n this.setSelectedQuantities(adults, youths, childs, infants);\r\n }\r\n };\r\n\r\n // init with default values\r\n this.setSelectedQuantities(this.defaultAdults, this.defaultYouths, this.defaultChilds, this.defaultInfants);\r\n }\r\n };\r\n\r\n})(jQuery);\r\n\r\nBOOK.Filter_DateSpanFilter = (function ($) {\r\n\r\n return {\r\n Initialize: function (name, compactName, defaultFrom, defaultTo, fromSelector, toSelector, categories) {\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.defaultFrom = defaultFrom;\r\n this.defaultTo = defaultTo;\r\n\r\n this.fromSelector = fromSelector;\r\n this.toSelector = toSelector;\r\n\r\n this.categories = categories;\r\n\r\n this.getSelectedDateSpan = function () {\r\n return {\r\n from: $(this.fromSelector).val(),\r\n to: $(this.toSelector).val()\r\n };\r\n };\r\n\r\n this.setSelectedDateSpan = function (from, to) {\r\n if (from) {\r\n $(this.fromSelector).val(from);\r\n //$.uniform.update($(this.fromSelector));\r\n }\r\n\r\n if (to) {\r\n $(this.toSelector).val(to);\r\n //$.uniform.update($(this.toSelector));\r\n }\r\n };\r\n\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getSelectedDateSpan();\r\n };\r\n\r\n this.isDirty = function () {\r\n var value = this.getSelectedDateSpan();\r\n\r\n return value.to != this.defaultTo ||\r\n value.from != this.defaultFrom;\r\n };\r\n\r\n this.serializeCompact = function (dest) {\r\n var result = {};\r\n var value = this.getSelectedDateSpan();\r\n\r\n if (value.from != this.defaultFrom)\r\n result['f'] = value.from;\r\n\r\n if (value.to != this.defaultTo)\r\n result['t'] = value.to;\r\n\r\n if (!isEmpty(result))\r\n dest[this.compactName] = result;\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var value = source[this.compactName];\r\n\r\n if (typeof value != 'undefined') {\r\n var t = typeof value.t != 'undefined' ? value.t.toString() : null;\r\n var f = typeof value.f != 'undefined' ? value.f.toString() : null;\r\n\r\n this.setSelectedDateSpan(f, t);\r\n }\r\n };\r\n\r\n this.setDefaultFrom = function () {\r\n var selected = false;\r\n var opt = null;\r\n\r\n $(this.fromSelector + \" > option\").each(function () {\r\n if (!selected) {\r\n selected = this.value;\r\n opt = $(this);\r\n }\r\n });\r\n if (opt != null)\r\n opt.attr('selected', 'selected');\r\n\r\n this.defaultFrom = selected;\r\n // $.uniform.update($(this.fromSelector));\r\n };\r\n\r\n this.setDefaultTo = function () {\r\n var selected = false;\r\n var opt = null;\r\n\r\n $(this.toSelector + \" > option\").each(function () {\r\n var fromDate = new Date(this.value.split(\"_\")[0]);\r\n var toDate = new Date(this.value.split(\"_\")[1]);\r\n\r\n if (((toDate.getTime() - fromDate.getTime()) / (24 * 60 * 60 * 1000)) >= 28) {\r\n selected = this.value;\r\n opt = $(this);\r\n }\r\n });\r\n if (opt != null)\r\n opt.attr('selected', 'selected');\r\n\r\n this.defaultTo = selected;\r\n //$.uniform.update($(this.toSelector));\r\n };\r\n\r\n // init with default values\r\n if (this.defaultFrom == 0)\r\n this.setDefaultFrom();\r\n\r\n if (this.defaultTo == 0)\r\n this.setDefaultTo();\r\n\r\n var to = this.toSelector;\r\n var from = this.fromSelector;\r\n\r\n $(this.fromSelector).bind('change', function () {\r\n var fromVal = $(from).val();\r\n var toVal = $(to).val();\r\n\r\n var fromDate = new Date(fromVal.split(\"_\")[0]);\r\n var toDate = new Date(toVal.split(\"_\")[1]);\r\n var toOptionsSelector = to + \" > option\";\r\n\r\n if (fromDate > toDate) {\r\n var updated = false;\r\n $(toOptionsSelector).each(function () {\r\n var value = this.value;\r\n\r\n if (!updated) {\r\n if (value == fromVal) {\r\n\r\n $(this).attr('selected', 'selected');\r\n\r\n $(to).val(fromVal);\r\n //$.uniform.update($(to));\r\n \r\n // $(\".lastMinuteSectionHeader\").text($(from).val().split(\"_\")[0] + \" ------------- \" + $(to).val().split(\"_\")[1]);\r\n } else {\r\n $(this).removeAttr('selected');\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n $(this.toSelector).bind('change', function () {\r\n var fromVal = $(from).val();\r\n var toVal = $(to).val();\r\n\r\n var fromDate = new Date(fromVal.split(\"_\")[0]);\r\n var toDate = new Date(toVal.split(\"_\")[1]);\r\n var fromOptionsSelector = from + \" > option\";\r\n\r\n if (fromDate > toDate) {\r\n var updated = false;\r\n $(fromOptionsSelector).each(function () {\r\n var value = this.value;\r\n if (!updated) {\r\n if (value == toVal) {\r\n\r\n $(this).attr('selected', 'selected');\r\n \r\n $(from).val(toVal);\r\n //$.uniform.update($(from));\r\n \r\n // $(\".lastMinuteSectionHeader\").text($(from).val().split(\"_\")[0] + \" -------------- \" + $(to).val().split(\"_\")[1]);\r\n } else {\r\n $(this).removeAttr('selected');\r\n }\r\n }\r\n\r\n });\r\n\r\n }\r\n\r\n\r\n });\r\n\r\n this.setSelectedDateSpan(this.defaultFrom, this.defaultTo);\r\n }\r\n\r\n };\r\n\r\n\r\n})(jQuery);\r\n\r\n\r\nBOOK.Filter_CheckBoxFilter = (function ($) {\r\n\r\n return {\r\n Initialize: function (name, compactName, checkBoxSelector, defaultValue, categories) {\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.checkBoxSelector = checkBoxSelector;\r\n this.defaultValue = defaultValue;\r\n this.categories = categories;\r\n\r\n this.getIsChecked = function () {\r\n return $(this.checkBoxSelector).is(':checked');\r\n };\r\n\r\n this.setIsChecked = function (checked) {\r\n var checkbox = $(this.checkBoxSelector);\r\n checkbox.attr('checked', checked);\r\n //$.uniform.update(checkbox);\r\n };\r\n\r\n this.isDirty = function () {\r\n var value = this.getIsChecked();\r\n return value != this.defaultValue;\r\n };\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getIsChecked();\r\n };\r\n\r\n this.serializeCompact = function (dest) {\r\n var isChecked = this.getIsChecked();\r\n if (isChecked != this.defaultValue) {\r\n dest[this.compactName] = isChecked ? 1 : 0;\r\n }\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var value = source[this.compactName];\r\n this.setIsChecked(typeof value != 'undefined' ? value == 1 : this.defaultValue);\r\n };\r\n\r\n // init with default value\r\n this.setIsChecked(defaultValue);\r\n }\r\n };\r\n\r\n})(jQuery);\r\n\r\nBOOK.Filter_ComboBoxFilter = (function ($) {\r\n\r\n return {\r\n Initialize: function (name, compactName, defaultValue, checkBoxSelector, categories) {\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.defaultValue = defaultValue;\r\n this.checkBoxSelector = checkBoxSelector;\r\n this.categories = categories;\r\n\r\n\r\n this.getSelected = function () {\r\n return $(this.checkBoxSelector).val();\r\n };\r\n\r\n this.setSelected = function (selected) {\r\n var comboBox = $(this.checkBoxSelector);\r\n\r\n comboBox.val(selected);\r\n //$.uniform.update(comboBox);\r\n };\r\n\r\n this.isDirty = function () {\r\n var value = this.getSelected();\r\n\r\n return value != this.defaultValue;\r\n };\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getSelected();\r\n };\r\n\r\n this.serializeCompact = function (dest) {\r\n var value = this.getSelected();\r\n\r\n if (value != this.defaultValue) {\r\n dest[this.compactName] = value;\r\n }\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var value = source[this.compactName];\r\n\r\n if (typeof value != 'undefined') {\r\n this.setSelected(value);\r\n }\r\n };\r\n\r\n // finally set value\r\n this.setSelected(this.defaultValue);\r\n }\r\n };\r\n\r\n})(jQuery);\r\n\r\nBOOK.Filter_BookingPeriodsFilter = (function ($) {\r\n return {\r\n IsPeriodRepresented: function (periods, arrivalDay, departureDay, periodType) {\r\n\r\n for (var i = 0; i < periods.length; i++) {\r\n var item = periods[i];\r\n if (item.ArrivalDay == arrivalDay && item.DepartureDay == departureDay && item.PeriodType == periodType) \r\n return item;\r\n \r\n }\r\n return null;\r\n\r\n },\r\n\r\n Initialize: function (name, compactName, periodsSelector, periodType, categories) {\r\n this.name = name;\r\n this.compactName = compactName;\r\n this.periodsSelector = periodsSelector;\r\n this.periodType = periodType;\r\n this.categories = categories;\r\n\r\n this.getCheckedPeriods = function () {\r\n var self = this;\r\n var selectedPeriods = [];\r\n\r\n $(this.periodsSelector).each(function (index, checkbox) {\r\n var elm = $(checkbox);\r\n\r\n var parts = checkbox.id.split(\"_\");\r\n var arrivalDay = parts[1];\r\n var departureDay = parts[2];\r\n\r\n var item = { ArrivalDay: arrivalDay, DepartureDay: departureDay, PeriodType: self.periodType };\r\n\r\n if (elm.is(':checked')) {\r\n selectedPeriods.push(item);\r\n }\r\n });\r\n\r\n return selectedPeriods;\r\n };\r\n\r\n this.isDirty = function () {\r\n return false;\r\n };\r\n\r\n this.writeToObject = function (dest) {\r\n dest[this.name] = this.getCheckedPeriods();\r\n };\r\n\r\n this.serializeCompact = function (dest) {\r\n\r\n var currentChecked = this.getCheckedPeriods();\r\n var result = [];\r\n\r\n\r\n $.each(currentChecked, function (i, p) {\r\n result.push({ a: p.ArrivalDay, d: p.DepartureDay, p: p.PeriodType });\r\n });\r\n\r\n\r\n // check all peri\r\n if (result.length != 0) {\r\n dest[this.compactName] = result;\r\n }\r\n };\r\n\r\n this.deserializeCompact = function (source) {\r\n var self = this;\r\n var value = source[this.compactName];\r\n\r\n if (typeof value != 'undefined') {\r\n var persistedPeriods = [];\r\n\r\n $.each(value, function (index, period) {\r\n persistedPeriods.push({ ArrivalDay: period.a, DepartureDay: period.d, PeriodType: period.p });\r\n });\r\n\r\n $(this.periodsSelector).each(function (index, checkbox) {\r\n var parts = checkbox.id.split(\"_\");\r\n var arrivalDay = parts[1];\r\n var departureDay = parts[2];\r\n\r\n $(checkbox).attr(\"checked\", BOOK.Filter_BookingPeriodsFilter.IsPeriodRepresented(persistedPeriods, arrivalDay, departureDay, self.periodType) != null);\r\n //$.uniform.update(checkbox);\r\n });\r\n }\r\n };\r\n\r\n }\r\n\r\n\r\n };\r\n\r\n})(jQuery);\r\n\r\n\r\nBOOK.Filter = (function ($) {\r\n\r\n var currentFilters = {};\r\n var cookieName;\r\n\r\n var PREFERRED_ARRDATE = \"#PreferredArrivalDate\";\r\n var PREFERRED_DEPDATE = \"#PreferredDepartureDate\";\r\n var DYNAMIC_ARRDATE = \"#DynamicPeriodArrivalDate\";\r\n var SELECTED_WEEK = \"#SelectedWeekId\";\r\n var PREVIOUS_WEEK = \"#PreviousWeekId\";\r\n var NEXT_WEEK = \"#NextWeekId\";\r\n var WEEK_PREVIOUS = \"#weekPrevious\";\r\n var WEEK_NEXT = \"#weekNext\";\r\n var PERIODS = \".bookingPeriod\";\r\n var ALL_AREAS = \"input.area\";\r\n var ALL_AREA_CHECKBOX = \"#area_0\";\r\n var ACCOMMODATION_TYPE = \"#AccommodationTypeId\";\r\n var CRITERIAS = \".criteria\";\r\n var RATINGS = \".ratingFilter .rating\";\r\n var SUBAREAS = \"#subareas\";\r\n var FREETEXT = \"#freetext\";\r\n var NUM_NIGHTS = \"#dynamicPeriodLength\";\r\n var FILTER_FORM = \"#filterForm\";\r\n\r\n\r\n function ClearFilterState() {\r\n $.cookie(cookieName, null, { path: \"/\" });\r\n }\r\n\r\n return {\r\n\r\n Initialize: function (cookieSuffix, clearFilterSelector) {\r\n cookieName = 'FILTER_' + cookieSuffix;\r\n\r\n if (typeof (clearFilterSelector) == 'undefined') {\r\n // We default to\r\n clearFilterSelector = 'a.clear-searchfilter';\r\n }\r\n\r\n $(clearFilterSelector).click(function (evt) {\r\n ClearFilterState();\r\n });\r\n },\r\n\r\n BindSlider: function (name, compactName, defaultValue, minValue, maxValue, sliderElement, minElement, maxElement, stepFunction, roundRule, changeCallback, categories) {\r\n\r\n // init ui component\r\n BOOK.Filter_Component.InitializeSlider(defaultValue, minValue, maxValue, sliderElement, minElement, maxElement, stepFunction, changeCallback);\r\n\r\n // create filter object \r\n var filterObj = new BOOK.Filter_SliderFilter.Initialize(name, compactName, sliderElement, minValue, maxValue, roundRule, categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n\r\n return filterObj;\r\n\r\n },\r\n\r\n BindCheckBoxMask: function (name, compactName, defaultValue, criteriaLookup, changeCallback, categories) {\r\n\r\n // init ui component\r\n BOOK.Filter_Component.InitializeCheckBoxMask(criteriaLookup, changeCallback);\r\n\r\n // create filter object\r\n var filterObj = new BOOK.Filter_CheckBoxMaskFilter.Initialize(name, compactName, defaultValue, criteriaLookup, categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n\r\n return filterObj;\r\n },\r\n\r\n BindAllToggledCheckBox: function (name, compactName, defaultValue, allCheckBoxSelector, maskCheckBoxSelector, changeCallback, categories) {\r\n // init all ui components\r\n BOOK.Filter_Component.InitializeAllToggledCheckBoxMask(allCheckBoxSelector, maskCheckBoxSelector, changeCallback);\r\n\r\n // create filter object\r\n var filterObj = new BOOK.Filter_AllToggledCheckBoxFilter.Initialize(name, compactName, defaultValue, allCheckBoxSelector, maskCheckBoxSelector, categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n\r\n return filterObj;\r\n },\r\n\r\n BindAllToggledCheckBoxMask: function (name, compactName, defaultValue, allCheckBoxSelector, maskCheckBoxSelector, changeCallback, categories) {\r\n // init all ui components\r\n BOOK.Filter_Component.InitializeAllToggledCheckBoxMask(allCheckBoxSelector, maskCheckBoxSelector, changeCallback);\r\n\r\n // create filter object\r\n var filterObj = new BOOK.Filter_AllToggledCheckBoxMaskFilter.Initialize(name, compactName, defaultValue, allCheckBoxSelector, maskCheckBoxSelector, categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n\r\n return filterObj;\r\n\r\n },\r\n\r\n BindComboBox: function (name, compactName, selector, defaultValue, changeCallback, categories) {\r\n // init all ui components\r\n BOOK.Filter_Component.InitializeComboBox(selector, changeCallback);\r\n\r\n // create filter object\r\n var filterObj = new BOOK.Filter_ComboBoxFilter.Initialize(name, compactName, defaultValue, selector, categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n\r\n return filterObj;\r\n },\r\n\r\n BindPersonQuantities: function (name, compactName, defaultAdults, defaultYouths, defaultChilds, defaultInfants, changeCallback, categories) {\r\n // init all ui components\r\n BOOK.Filter_Component.InitializeComboBox('#adults', changeCallback);\r\n BOOK.Filter_Component.InitializeComboBox('#youths', changeCallback);\r\n BOOK.Filter_Component.InitializeComboBox('#childs', changeCallback);\r\n BOOK.Filter_Component.InitializeComboBox('#infants', changeCallback);\r\n\r\n // create filter object\r\n var filterObj = new BOOK.Filter_PersonQuantityFilter.Initialize(name, compactName, defaultAdults, defaultYouths, defaultChilds, defaultInfants, '#adults', '#youths', '#childs', '#infants', categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n\r\n return filterObj;\r\n },\r\n\r\n BindDateSpan: function (name, compactName, defaultFrom, defaultTo, changeCallback, categories) {\r\n BOOK.Filter_Component.InitializeComboBox('#from', changeCallback);\r\n BOOK.Filter_Component.InitializeComboBox('#to', changeCallback);\r\n\r\n // create filter object\r\n var filterObj = new BOOK.Filter_DateSpanFilter.Initialize(name, compactName, defaultFrom, defaultTo, '#from', '#to', categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n\r\n return filterObj;\r\n },\r\n\r\n BindCheckBox: function (name, compactName, checkBoxSelector, defaultValue, changeCallback, categories) {\r\n // init all ui components\r\n BOOK.Filter_Component.InitializeCheckBox(checkBoxSelector, changeCallback);\r\n\r\n // create filter object\r\n var filterObj = new BOOK.Filter_CheckBoxFilter.Initialize(name, compactName, checkBoxSelector, defaultValue, categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n\r\n return filterObj;\r\n },\r\n\r\n\r\n\r\n BindBookingPeriods: function (name, compactName, periodsSelector, periodType, changeCallback, categories) {\r\n // init all ui components\r\n BOOK.Filter_Component.InitializeBookingPeriods(periodsSelector, changeCallback);\r\n\r\n // create filter object\r\n var filterObj = new BOOK.Filter_BookingPeriodsFilter.Initialize(name, compactName, periodsSelector, periodType, categories);\r\n\r\n // add filter to current filter list\r\n currentFilters[name] = filterObj;\r\n },\r\n\r\n InitializeFilterSelectors: function (selectors) {\r\n PREFERRED_ARRDATE = selectors[\"PREFERRED_ARRDATE\"];\r\n PREFERRED_DEPDATE = selectors[\"PREFERRED_DEPDATE\"];\r\n DYNAMIC_ARRDATE = selectors[\"DYNAMIC_ARRDATE\"];\r\n SELECTED_WEEK = selectors[\"SELECTED_WEEK\"];\r\n PREVIOUS_WEEK = selectors[\"PREVIOUS_WEEK\"];\r\n NEXT_WEEK = selectors[\"NEXT_WEEK\"];\r\n WEEK_PREVIOUS = selectors[\"WEEK_PREVIOUS\"];\r\n WEEK_NEXT = selectors[\"WEEK_NEXT\"];\r\n PERIODS = selectors[\"PERIODS\"];\r\n ALL_AREAS = selectors[\"ALL_AREAS\"];\r\n ALL_AREA_CHECKBOX = selectors[\"ALL_AREA_CHECKBOX\"];\r\n ACCOMMODATION_TYPE = selectors[\"ACCOMMODATION_TYPE\"];\r\n CRITERIAS = selectors[\"CRITERIAS\"];\r\n RATINGS = selectors[\"RATINGS\"];\r\n SUBAREAS = selectors[\"SUBAREAS\"];\r\n FREETEXT = selectors[\"FREETEXT\"];\r\n NUM_NIGHTS = selectors[\"NUM_NIGHTS\"];\r\n FILTER_FORM = selectors[\"FILTER_FORM\"];\r\n },\r\n\r\n InitializeWeekSwitcher: function () {\r\n var self = this;\r\n $(WEEK_PREVIOUS).click(function (event) {\r\n var url = $(this).attr(\"data-page-url\");\r\n if (!!url)\r\n document.location = url;\r\n else \r\n self.UpdateSelectedWeek('previous');\r\n });\r\n $(WEEK_NEXT).click(function (event) {\r\n var url = $(this).attr(\"data-page-url\");\r\n if (!!url)\r\n document.location = url;\r\n else \r\n self.UpdateSelectedWeek('next');\r\n });\r\n },\r\n\r\n UpdateSelectedWeek: function (direction) {\r\n var $preferredArrivalDate,\r\n $preferredDepartureDate,\r\n arrivalDate,\r\n oldArrivalDate,\r\n departureDate,\r\n oldDepartureDate,\r\n selectedWeek,\r\n timeSpan;\r\n\r\n $preferredArrivalDate = $(PREFERRED_ARRDATE);\r\n\r\n if ($preferredArrivalDate.length > 0) {\r\n arrivalDate = new Date();\r\n oldArrivalDate = BOOK.Common.createDateFromWebString($preferredArrivalDate.val());\r\n timeSpan = (24 * 3600 * 7 * 1000);\r\n\r\n if (direction == \"next\") {\r\n arrivalDate.setTime(oldArrivalDate.getTime() + timeSpan);\r\n }\r\n else {\r\n arrivalDate.setTime(oldArrivalDate.getTime() - timeSpan);\r\n }\r\n\r\n $preferredArrivalDate.val(BOOK.Common.createWebDateString(arrivalDate));\r\n\r\n $preferredDepartureDate = $(PREFERRED_DEPDATE);\r\n\r\n if ($preferredDepartureDate.length > 0) {\r\n departureDate = new Date();\r\n oldDepartureDate = BOOK.Common.createDateFromWebString($preferredDepartureDate.val());\r\n\r\n if (direction == \"next\") {\r\n departureDate.setTime(oldDepartureDate.getTime() + timeSpan);\r\n } else {\r\n departureDate.setTime(oldDepartureDate.getTime() - timeSpan);\r\n }\r\n\r\n $preferredDepartureDate.val(BOOK.Common.createWebDateString(departureDate));\r\n }\r\n }\r\n\r\n selectedWeek = (direction == \"previous\") ? $(PREVIOUS_WEEK).val() : $(NEXT_WEEK).val();\r\n $(SELECTED_WEEK).val(selectedWeek);\r\n\r\n if (typeof (_periodtype) != \"undefined\") {\r\n if (_periodType == \"DynamicPeriod\") {\r\n $(DYNAMIC_ARRDATE).val(\"\");\r\n }\r\n }\r\n\r\n $(FILTER_FORM).submit();\r\n },\r\n\r\n GetSearchFilter: function () {\r\n var result = { dirty: {} };\r\n\r\n $.each(currentFilters, function (index, filterObj) {\r\n\r\n filterObj.writeToObject(result);\r\n\r\n if (filterObj.isDirty()) {\r\n var categories = filterObj.categories;\r\n for (var i = 0; i < categories.length; i++) {\r\n result.dirty[categories[i]] = true;\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n return result;\r\n },\r\n\r\n SerializeCompactFormat: function () {\r\n var result = {};\r\n\r\n $.each(currentFilters, function (index, filterObj) {\r\n\r\n filterObj.serializeCompact(result);\r\n\r\n\r\n });\r\n\r\n //alert(JSON.stringify(result));\r\n\r\n return result;\r\n },\r\n\r\n DeserializeCompactFormat: function (source) {\r\n\r\n $.each(currentFilters, function (index, filterObj) {\r\n\r\n filterObj.deserializeCompact(source);\r\n });\r\n\r\n },\r\n\r\n GetFilterStatePermaLinkUrl: function () {\r\n var data = BOOK.Filter.SerializeCompactFormat();\r\n\r\n return $.param.fragment(window.location.href, data, 2);\r\n },\r\n\r\n UpdateFilterStatePermaLinkUrl: function (selector) {\r\n var data = BOOK.Filter.SerializeCompactFormat();\r\n // console.log($(selector));\r\n //make sure we've got the right url.\r\n $(selector).attr(\"href\", window.location.href.split('#')[0]);\r\n\r\n //add fragment-data\r\n $(selector).fragment(data, 2);\r\n },\r\n\r\n PersistFilterState: function () {\r\n var data = BOOK.Filter.SerializeCompactFormat();\r\n var cookieValue = JSON.stringify(data);\r\n\r\n // store in cookie\r\n $.cookie(cookieName, cookieValue, { path: \"/\" });\r\n\r\n },\r\n\r\n ReteriveFilterState: function () {\r\n try {\r\n\r\n // check if hash is present\r\n var hash = $.param.fragment();\r\n var data;\r\n\r\n if (hash == \"\") {\r\n // no hash present, get state from cookie\r\n data = JSON.parse($.cookie(cookieName));\r\n } else {\r\n // hash is present, get state from hash\r\n \r\n data = $.deparam.fragment();\r\n }\r\n\r\n if (data) {\r\n BOOK.Filter.DeserializeCompactFormat(data);\r\n } else {\r\n\r\n }\r\n\r\n }\r\n catch (err) {\r\n // gracefully fail with empty state\r\n // alert(err);\r\n }\r\n }\r\n };\r\n})(jQuery);\r\n\r\n","BOOK.Filter.Expandable = (function ($) {\r\n 'use strict';\r\n return {\r\n\r\n AllToggledCheckBoxSection: function (section, changeCallback, expandLimit) {\r\n\r\n var $section = $(section),\r\n $sectionHeader = $section.find('div.sectionHeader:first'),\r\n $label = $sectionHeader.find('.headerLabel:first'),\r\n $trigger = $sectionHeader.find('a.change:first'),\r\n $sectionBody = $section.find('div.sectionBody:first'),\r\n $allCheckBox = $sectionBody.find('input.selectAll:first'),\r\n $itemCheckBoxes = $sectionBody.find('input.selectSingle');\r\n\r\n if ($itemCheckBoxes.length <= expandLimit) {\r\n $sectionHeader.hide();\r\n $sectionBody.show();\r\n } else {\r\n $sectionHeader.show();\r\n $sectionBody.hide();\r\n\r\n $label.html(getLabel($allCheckBox));\r\n\r\n $trigger.click(function (e) {\r\n $sectionBody.toggle();\r\n });\r\n }\r\n\r\n return {\r\n allSelector: $allCheckBox.selector,\r\n callback: createChangeCallbackFunction($allCheckBox, $itemCheckBoxes, $label, changeCallback),\r\n itemsSelector: $itemCheckBoxes.selector\r\n };\r\n }\r\n };\r\n\r\n function getLabel(element) {\r\n return $(\"label[for='\" + $(element).attr(\"id\") + \"']\").text();\r\n }\r\n\r\n function isChecked(checkBox) {\r\n if (checkBox instanceof jQuery) {\r\n return checkBox.is(\":checked\");\r\n }\r\n else {\r\n return checkBox.checked;\r\n }\r\n }\r\n\r\n function createChangeCallbackFunction($allCheckBox, $itemCheckBoxes, $label, changeCallback) {\r\n\r\n if ($label.is(':hidden')) {\r\n return function () {\r\n changeCallback();\r\n };\r\n } else {\r\n return function () {\r\n var text = '';\r\n\r\n if (isChecked($allCheckBox)) {\r\n text = getLabel($allCheckBox);\r\n } else {\r\n $itemCheckBoxes.each(function (index, checkbox) {\r\n if (isChecked(checkbox)) {\r\n if (text !== '') {\r\n text += ' + ';\r\n }\r\n\r\n text += getLabel(checkbox);\r\n }\r\n });\r\n }\r\n\r\n $label.html(text);\r\n\r\n changeCallback();\r\n };\r\n }\r\n }\r\n\r\n})(jQuery);","BOOK.Deep_Sorter = (function ($) {\r\n\r\n var sorters = {};\r\n\r\n function findSorterByParentSortLevel(parentSortLevel) {\r\n var result = [];\r\n for (var name in sorters) {\r\n\r\n var sorter = sorters[name];\r\n if (sorter.parentSortLevel == parentSortLevel) {\r\n\r\n result.push(sorter);\r\n }\r\n\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function internalSort(data, levelName, sortColumn, direction) {\r\n // lookup sorter\r\n var sorter = sorters[levelName];\r\n if (sorter == undefined)\r\n return; // illigal state\r\n\r\n // lookup value accessor\r\n var valueAccessor = sorter.findColumnValueAccessor(sortColumn);\r\n if (valueAccessor == null)\r\n return;\r\n \r\n data.sort(function (a, b) {\r\n var aValue = valueAccessor(a);\r\n var bValue = valueAccessor(b);\r\n\r\n\r\n // check if value is of type array\r\n if (isArray(aValue) && isArray(bValue)) {\r\n // yes it is, get first or second value depending on sort direction\r\n aValue = direction == 1 ? aValue[0] : aValue[1];\r\n bValue = direction == 1 ? bValue[0] : bValue[1];\r\n }\r\n\r\n // if a and b is equal, fallback on default sort value\r\n if (aValue == bValue && sorter.defaultSortValueAccessor != null) {\r\n aValue = sorter.defaultSortValueAccessor(a);\r\n bValue = sorter.defaultSortValueAccessor(b);\r\n }\r\n\r\n // sort depending on direction\r\n var result = ((aValue < bValue) ? 1 : ((aValue > bValue) ? -1 : 0));\r\n if (direction == 1)\r\n result = -result;\r\n\r\n return result;\r\n });\r\n\r\n // process each child sorter defined\r\n var childSorters = findSorterByParentSortLevel(levelName);\r\n\r\n // process each child sorter\r\n for (var i = 0; i < childSorters.length; i++) {\r\n var childSorter = childSorters[i];\r\n\r\n\r\n // process each item\r\n for (var n = 0; n < data.length; n++) {\r\n var item = data[n];\r\n\r\n var childCollection = item[childSorter.name];\r\n\r\n if (childCollection != null && childCollection != undefined) {\r\n internalSort(childCollection, childSorter.name, sortColumn, direction);\r\n }\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n return {\r\n Initialize: function () {\r\n\r\n },\r\n\r\n\r\n Sort: function (data, sortColumn, direction) {\r\n internalSort(data, 'root', sortColumn, direction);\r\n },\r\n\r\n CreateSortLevel: function (name, parentSortLevel) {\r\n var result = {};\r\n\r\n result.name = name;\r\n result.parentSortLevel = parentSortLevel;\r\n result.columnValueAccessors = [];\r\n result.defaultSortValueAccessor = null;\r\n\r\n result.setDefaultSortValueAccessor = function (getValueFunc) {\r\n result.defaultSortValueAccessor = getValueFunc;\r\n\r\n return result;\r\n };\r\n\r\n result.addColumnValueAccessor = function (columnIndex, getValueFunc) {\r\n result.columnValueAccessors.push({ column: columnIndex, getValues: getValueFunc });\r\n\r\n return result;\r\n };\r\n\r\n result.findColumnValueAccessor = function (columnIndex) {\r\n for (var i = 0; i < result.columnValueAccessors.length; i++) {\r\n var accessor = result.columnValueAccessors[i];\r\n\r\n if (accessor.column == columnIndex)\r\n return accessor.getValues;\r\n }\r\n\r\n return result.defaultSortValueAccessor;\r\n };\r\n\r\n\r\n // register sort level\r\n sorters[name] = result;\r\n\r\n return result;\r\n }\r\n };\r\n\r\n\r\n\r\n\r\n})(jQuery);","BOOK.Sort_Controller = (function ($) {\r\n\r\n var headers;\r\n var currentSortColumn;\r\n var currentSortDirection;\r\n var changeCallback;\r\n\r\n function getSortDirectionClass(sortDirection) {\r\n return sortDirection == 1 ? 'asc' : 'desc';\r\n }\r\n\r\n function sortHeaderClick() {\r\n var column = $(this);\r\n var columnIndex = column.index();\r\n\r\n if (columnIndex == currentSortColumn) {\r\n // remove old sort direction\r\n column.removeClass(getSortDirectionClass(currentSortDirection));\r\n\r\n // change sort direction\r\n currentSortDirection = -currentSortDirection;\r\n\r\n // add new sort direction\r\n column.addClass(getSortDirectionClass(currentSortDirection));\r\n }\r\n else {\r\n // remove previous sort classes\r\n if (currentSortColumn != -1) {\r\n $(':eq(' + currentSortColumn + ')', column.parent()).removeClass(getSortDirectionClass(1)).removeClass(getSortDirectionClass(-1));\r\n }\r\n\r\n currentSortDirection = 1;\r\n currentSortColumn = columnIndex;\r\n\r\n // add new sort direction\r\n column.addClass(getSortDirectionClass(currentSortDirection));\r\n }\r\n\r\n changeCallback();\r\n }\r\n\r\n return {\r\n Initialize: function (headersSelector, sortingChangeCallback) {\r\n headers = $(headersSelector);\r\n currentSortColumn = -1;\r\n currentSortDirection = 0;\r\n changeCallback = sortingChangeCallback;\r\n\r\n // assign event handlers for all columns\r\n headers.click(sortHeaderClick);\r\n },\r\n\r\n GetSortingInformation: function () {\r\n return { column: currentSortColumn, direction: currentSortDirection };\r\n }\r\n };\r\n\r\n})(jQuery);","BOOK.Weekdays = (function ($) {\r\n\r\n var shortWeekDayLabels;\r\n var weekdaylabellength = 3;\r\n\r\n return {\r\n Initialize: function(weekDayLabels) {\r\n shortWeekDayLabels = [];\r\n shortWeekDayLabels[0] = weekDayLabels[0].substr(0, weekdaylabellength);\r\n shortWeekDayLabels[1] = weekDayLabels[1].substr(0, weekdaylabellength);\r\n shortWeekDayLabels[2] = weekDayLabels[2].substr(0, weekdaylabellength);\r\n shortWeekDayLabels[3] = weekDayLabels[3].substr(0, weekdaylabellength);\r\n shortWeekDayLabels[4] = weekDayLabels[4].substr(0, weekdaylabellength);\r\n shortWeekDayLabels[5] = weekDayLabels[5].substr(0, weekdaylabellength);\r\n shortWeekDayLabels[6] = weekDayLabels[6].substr(0, weekdaylabellength);\r\n\r\n },\r\n\r\n getDayOfWeekString: function(d) {\r\n return shortWeekDayLabels[d];\r\n\r\n },\r\n\r\n getPeriodString: function(arrivalDay, departureDay) {\r\n return this.getDayOfWeekString(arrivalDay) + \"-\" + this.getDayOfWeekString(departureDay);\r\n }\r\n };\r\n \r\n})(jQuery);","\r\nBOOK.Pagination = (function ($) {\r\n\r\n var _hitsPerPage;\r\n var _pageChangedCallback;\r\n var _data;\r\n var _currentPage;\r\n var _numberOfPages;\r\n var _paginationTemplate;\r\n var _paginationControl;\r\n\r\n function getStartIndex() {\r\n return _currentPage * _hitsPerPage;\r\n }\r\n\r\n function getEndIndex() {\r\n return Math.min(getStartIndex() + _hitsPerPage, _data.length) - 1;\r\n }\r\n\r\n function renderPagination() {\r\n\r\n _paginationControl.empty();\r\n\r\n _paginationControl.append(\r\n parseTemplate(_paginationTemplate,\r\n {\r\n currentPage: _currentPage + 1,\r\n numPages: _numberOfPages,\r\n startIndex: getStartIndex(),\r\n endIndex: getEndIndex(),\r\n numGroups: _data.length,\r\n setPageFunction: 'BOOK.Pagination.SetPage'\r\n }));\r\n }\r\n\r\n return {\r\n Initialize: function (paginationTemplateSelector, paginationControlSelector, hitsPerPage, pageChangedCallback) {\r\n _hitsPerPage = hitsPerPage;\r\n _pageChangedCallback = pageChangedCallback;\r\n _paginationTemplate = $(paginationTemplateSelector);\r\n _paginationControl = $(paginationControlSelector);\r\n\r\n },\r\n\r\n ResetData: function (data) {\r\n _data = data;\r\n _currentPage = 0;\r\n _numberOfPages = Math.ceil(_data.length / _hitsPerPage);\r\n\r\n renderPagination();\r\n },\r\n\r\n GetCurrentPageData: function () {\r\n var offsetStart = getStartIndex();\r\n var offsetEnd = getEndIndex();\r\n \r\n var result = [];\r\n\r\n for (var i = offsetStart; i <= offsetEnd; i++)\r\n result.push(_data[i]);\r\n\r\n return result;\r\n },\r\n\r\n SetPage: function (page) {\r\n _currentPage = page - 1;\r\n\r\n renderPagination();\r\n _pageChangedCallback();\r\n }\r\n\r\n };\r\n\r\n})(jQuery);"]}