/*!
 * jQuery UI 1.8.12
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI
 */
(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.12",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
;/*!
 * jQuery UI Widget 1.8.12
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI/Widget
 */
(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
;

/*
 * jQuery UI Mask @VERSION
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Based on the jquery.maskedinput.js plugin by Josh Bush (digitalbush.com)
 *
 * http://docs.jquery.com/UI/Mask
 *
 * Depends:
 *   ui.core.js
 */
(function($) {

var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask";

$.widget("ui.mask", {
	
	_init: function() {

		var options = this.options, self = this;

		$.extend(this, { caret: function(begin, end){ return $.ui.mask.caret(self.element, begin, end); } });

		if(!options.mask || !options.mask.length){ return; } //no mask pattern defined. no point in continuing.
		if(!options.placeholder || !options.placeholder.length){
			options.placeholder = '_'; //in case the user decided to nix a placeholder. 
		}

		this._prepareBuffer();
		this._bindEvents();
		this._checkVal((this.element.val().length && options.allowPartials)); //Perform initial check for existing values
	},

	destroy: function() {
		this.element
			.unbind('.mask')
			.removeData('mask');
	},

	value: function() {
		var input = this.element,
			self = this,
			res = $.map(self.buffer, function(c, i){ return self.tests[i] ? c : null; }).join(''),
			r = new RegExp('\\'+this.options.placeholder, 'gi');
		return res.replace(r, '');
	},
	
	formatted: function(){
		var r = new RegExp('\\'+this.options.placeholder, 'gi'),
			res = this.element.val();
		return res.replace(r, '');
	},
	
	apply: function(){
		this.element.trigger('apply.mask');
	},
	
	_setData: function(key, value) {

		$.widget.prototype._setData.apply(this, arguments);
		var options = this.options;

		switch (key) {
			case 'mask':
				//no mask pattern defined. no point in continuing.
				if(!options.mask || !options.mask.length){ 
					this.element.unbind('.mask')
					break;
				}
			case 'placeholder':
				if(!options.placeholder || !options.placeholder.length){
					options.placeholder = '_'; //in case the user decided to nix a placeholder.
				}
				this.element.val('');
				this._prepareBuffer();
				!this.eventsBound && this._bindEvents();
				break;
		}

	},

	_prepareBuffer: function(){
		
		this._escapeMask();

		var self = this, 
			input = this.element,
			options = this.options,
			mask = options.mask,
			defs = $.ui.mask.definitions,
			tests = [],
			partialPosition = mask.length,
			firstNonMaskPos = null,
			len = mask.length;

		//if we're applying the mask to an element which is not an input, it won't have a val() method. fake one for our purposes.
		if(!input.is(':input')) input.val = input.html;

		$.each(mask.split(""), function(i, c) {
			if (c == '?') {
				len--;
				partialPosition = i;
			}
			else if (defs[c]){
				tests.push(new RegExp(defs[c]));
				if(firstNonMaskPos==null)
					firstNonMaskPos =  tests.length - 1;
			}
			else{
				tests.push(null);
			}
		});

		$.extend(this, {
			buffer: $.map(mask.split(""), function(c, i){
				if (c != '?'){
					return defs[c] ? options.placeholder : c;
				}
			}),
			tests: tests,
			firstNonMaskPos: firstNonMaskPos,
			partialPosition: partialPosition
		});

		this.buffer = $.map(this.buffer, function(c, i){
			if(c == "\t"){
				return self.maskEscaped[i];
			}
			return c;
		});

		this.options.mask = mask = this.maskEscaped;		
	},	

	_bindEvents: function(){
		
		var self = this,
			input = this.element,
			ignore = false,  			//Variable for ignoring control keys
			focusText = input.val();
			
		function keydownEvent(e) {
			e = e || window.event;
			var pos = self.caret(),
				k = e.keyCode,
				keyCode = $.ui.keyCode;
				
			ignore = (k < keyCode.SHIFT || (k > keyCode.SHIFT && k < keyCode.SPACE) || (k > keyCode.SPACE && k < 41));

			//delete selection before proceeding
			if ((pos.begin - pos.end) != 0 && (!ignore || k == keyCode.BACKSPACE || k == keyCode.DELETE))
				self._clearBuffer(pos.begin, pos.end);

			//backspace, delete, and escape get special treatment
			if (k == keyCode.BACKSPACE || k == keyCode.DELETE) {//backspace/delete
				self._shiftL(pos.begin + ((k == keyCode.DELETE || (k == keyCode.BACKSPACE && pos.begin!=pos.end))  ? 0 : -1), Math.abs(pos.begin - pos.end));
				return false;
			}
			else if (k == keyCode.ESCAPE) {//escape
				input.val(focusText);
				self.caret(0, self._checkVal());
				return false;
			}
		};

		function keypressEvent(e) {

			e = e || window.event;
			
			var k = e.charCode || e.keyCode || e.which, 
				keyCode = $.ui.keyCode,
				len = self.options.mask.length;

			if (ignore) {
				ignore = false;
				//Fixes Mac FF bug on backspace
				return (e.keyCode == keyCode.BACKSPACE) ? false : null;
			}
			
			var pos = self.caret();

			if (e.ctrlKey || e.altKey || e.metaKey) {//Ignore
				return true;
			}
			else if ((k >= keyCode.SPACE && k <= 125) || k > 186) {//typeable characters
				var p = self._seekNext(pos.begin - 1);
				if (p < len) {
					var c = String.fromCharCode(k);
					if (self.tests[p] && self.tests[p].test(c)) {
						self._shiftR(p);
						self.buffer[p] = c;
						self._writeBuffer();
						var next = self._seekNext(p);
						self.caret(next);
						self.options.completed && next == len && self.options.completed.call(input);
					}
				}
			}
			return false;
		};

		if (!input.attr("readonly")){
			input
				.bind("focus.mask", function() {
					focusText = input.val();
					var pos = self._checkVal();
					self._writeBuffer();
					setTimeout(function() {
						if (pos == self.options.mask.length)
							self.caret(0, pos);
						else
							self.caret(pos);
					}, 0);
				})
				.bind("blur.mask", function() {
					self._checkVal();
					if (input.val() != focusText)
						input.change();
				})
				.bind('apply.mask', function(){ //changing the value of an input without keyboard input requires re-applying the mask.
					focusText = input.val();
					var pos = self._checkVal();
					self._writeBuffer();					
				})				
				.bind("keydown.mask", keydownEvent)
				.bind("keypress.mask", keypressEvent)
				.bind(pasteEventName, function() {
					setTimeout(function() { self.caret(self._checkVal(true)); }, 0);
				});
			this.eventsBound = true;
		}
	},
	
	_writeBuffer: function(){
		return this.element.val(this.buffer.join('')).val(); 
	},
	
	_clearBuffer: function(start, end){
		var len = this.options.mask.length;
		for (var i = start; i < end && i < len; i++) {
			if (this.tests[i])
				this.buffer[i] = this.options.placeholder;
		}
	},
	
	_seekNext: function(pos){
		var len = this.options.mask.length;
		while (++pos <= len && !this.tests[pos]);
		return pos;
	},
	
	_shiftR: function(pos){
		var len = this.options.mask.length;
		for (var i = pos, c = this.options.placeholder; i < len; i++) {
			if (this.tests[i]) {
				var j = this._seekNext(i);
				var t = this.buffer[i];
				this.buffer[i] = c;
				if (j < len && this.tests[j].test(t)){
					c = t;
				}
				else{
					break;
				}
			}
		}
	},
	
	_shiftL: function(pos, length){

		while (!this.tests[pos] && --pos >= 0);
	
		var originalPos = pos,
			len = this.options.mask.length,
			placeholder = this.options.placeholder;
		
		for(var i = pos; i < len && (i >= 0 || length > 1); i++) {
			if (this.tests[i]) {
				this.buffer[i] = placeholder;
				var j = this._seekNext(i);
				if (j < len && this.tests[i].test(this.buffer[j])) {
					this.buffer[pos] = this.buffer[j];
					this.buffer[j] = placeholder;
					pos++;
					while(!this.tests[pos]) pos++;
				}
			}
		}			
		this._writeBuffer();
		this.caret(Math.max(this.firstNonMaskPos, originalPos));
	},
	
	_checkVal: function(allow){
		//try to place characters where they belong
		var input = this.element,
			test = input.val(),
			len = this.options.mask.length,
			lastMatch = -1;
			
		for (var i = 0, pos = 0; i < len; i++) {
			if (this.tests[i]) {
				this.buffer[i] = this.options.placeholder;
				while (pos++ < test.length) {
					var c = test.charAt(pos - 1);
					if (this.tests[i].test(c)) {
						this.buffer[i] = c;
						lastMatch = i;
						break;
					}
				}
				if (pos > test.length)
					break;
			}
			else if (this.buffer[i] == test[pos] && i != this.partialPosition) {
				pos++;
				lastMatch = i;
			} 
		}
		if (!allow && lastMatch + 1 < this.partialPosition) {
			if(!this.options.allowPartials || !this.value().length){
				input.val("");
				this._clearBuffer(0, len);
			}
			else //if we're allowing partial input/inital values, and the element we're masking isnt an input, then we need to allow the mask to apply.
				if(!input.is(':input')) this._writeBuffer();
				
		}
		else if (allow || lastMatch + 1 >= this.partialPosition) {
			this._writeBuffer();
			if (!allow) input.val(input.val().substring(0, lastMatch + 1));
		}
		return (this.partialPosition ? i : this.firstNonMaskPos);
	},
	
	_escapeMask: function(){
		var mask = this.options.mask,
			literals = [],
			replacements = [];
				
		for(var i = 0; i < mask.length; i++){
			var c, temp = mask[i] || mask.charAt(i);
			if(temp != "\\" || mask[i-1] == "\\"){
				if(mask[i-1] == "\\"){
					c = "\t";
					replacements[literals.length] = temp;
				}
				else{
					c = temp;
				}
				literals[literals.length] = c;
			}
		}
		
		this.options.mask = literals.join('');
		
		for(var i = 0; i < literals.length; i++){
			if(replacements[i] !== undefined){
				literals[i] = replacements[i];
			}
		}
		
		this.maskEscaped = literals.join('');
	}	
	
});

$.extend($.ui.mask, {
	version: "@VERSION",
	getter: "value formatted",
	defaults: {
		mask: '',
		placeholder: '_',
		completed: null,
		allowPartials: false
	},
	definitions: { //Predefined character definitions
		'#': "[\\d]",
		'a': "[A-Za-z]",
		'*': "[A-Za-z0-9]"
	},
	caret: function(element, begin, end) {	//Helper Function for Caret positioning
		var input = element[0];
		if (typeof begin == 'number') {
			end = (typeof end == 'number') ? end : begin;
			if (input.setSelectionRange) {
				input.focus();
				input.setSelectionRange(begin, end);
			} else if (input.createTextRange) {
				var range = input.createTextRange();
				range.collapse(true);
				range.moveEnd('character', end);
				range.moveStart('character', begin);
				range.select();
			}
			return element;
		} else {
			if (input.setSelectionRange) {
				begin = input.selectionStart;
				end = input.selectionEnd;
			}
			else if (document.selection && document.selection.createRange) {
				var range = document.selection.createRange();
				begin = 0 - range.duplicate().moveStart('character', -100000);
				end = begin + range.text.length;
			}
			return { begin: begin, end: end };
		}
	}		
});

})(jQuery);
