text: /*! X-editable - v1.3.0 
   * In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
   * http://github.com/vitalets/x-editable
   * Copyright (c) 2012 Vitaliy Potapov; Licensed MIT */
  (function (e) {
  	var t = function (t, n) {
  		this.options = e.extend({}, e.fn.editableform.defaults, n), this.$div = e(t), this.options.scope || (this.options.scope = this), this.initInput()
  	};
  	t.prototype = {constructor: t, initInput: function () {
  		var t, n;
  		if (typeof e.fn.editabletypes[this.options.type] != "function") {
  			e.error("Unknown type: " + this.options.type);
  			return
  		}
  		t = e.fn.editabletypes[this.options.type], n = e.fn.editableutils.sliceObj(this.options, e.fn.editableutils.objectKeys(t.defaults)), this.input = new t(n), this.value = this.input.str2value(this.options.value)
  	}, initTemplate: function () {
  		this.$form = e(e.fn.editableform.template)
  	}, initButtons: function () {
  		this.$form.find(".editable-buttons").append(e.fn.editableform.buttons)
  	}, render: function () {
  		this.$loading = e(e.fn.editableform.loading), this.$div.empty().append(this.$loading), this.showLoading(), this.initTemplate(), this.options.showbuttons ? this.initButtons() : this.$form.find(".editable-buttons").remove(), this.$div.triggerHandler("rendering"), e.when(this.input.render()).then(e.proxy(function () {
  			this.$form.find("div.editable-input").append(this.input.$input), this.options.showbuttons || this.input.autosubmit(), this.input.$clear && this.$form.find("div.editable-input").append(e('<div class="editable-clear">').append(this.input.$clear)), this.$div.append(this.$form), this.$form.find(".editable-cancel").click(e.proxy(this.cancel, this)), this.input.error ? (this.error(this.input.error), this.$form.find(".editable-submit").attr("disabled", !0), this.input.$input.attr("disabled", !0), this.$form.submit(function (e) {
  				e.preventDefault()
  			})) : (this.error(!1), this.input.$input.removeAttr("disabled"), this.$form.find(".editable-submit").removeAttr("disabled"), this.input.value2input(this.value), this.$form.submit(e.proxy(this.submit, this))), this.$div.triggerHandler("rendered"), this.showForm()
  		}, this))
  	}, cancel: function () {
  		this.$div.triggerHandler("cancel")
  	}, showLoading: function () {
  		var e;
  		this.$form ? (this.$loading.width(this.$form.outerWidth()), this.$loading.height(this.$form.outerHeight()), this.$form.hide()) : (e = this.$loading.parent().width(), e && this.$loading.width(e)), this.$loading.show()
  	}, showForm: function (e) {
  		this.$loading.hide(), this.$form.show(), e !== !1 && this.input.activate(), this.$div.triggerHandler("show")
  	}, error: function (t) {
  		var n = this.$form.find(".control-group"), r = this.$form.find(".editable-error-block");
  		t === !1 ? (n.removeClass(e.fn.editableform.errorGroupClass), r.removeClass(e.fn.editableform.errorBlockClass).empty().hide()) : (n.addClass(e.fn.editableform.errorGroupClass), r.addClass(e.fn.editableform.errorBlockClass).text(t).show())
  	}, submit: function (t) {
  		t.stopPropagation(), t.preventDefault();
  		var n, r = this.input.input2value();
  		if (n = this.validate(r)) {
  			this.error(n), this.showForm();
  			return
  		}
  		if (!this.options.savenochange && this.input.value2str(r) == this.input.value2str(this.value)) {
  			this.$div.triggerHandler("nochange");
  			return
  		}
  		e.when(this.save(r)).done(e.proxy(function (e) {
  				var t = typeof this.options.success == "function" ? this.options.success.call(this.options.scope, e, r) : null;
  				if (t === !1) {
  					this.error(!1), this.showForm(!1);
  					return
  				}
  				if (typeof t == "string") {
  					this.error(t), this.showForm();
  					return
  				}
  				t && typeof t == "object" && t.hasOwnProperty("newValue") && (r = t.newValue), this.error(!1), this.value = r, this.$div.triggerHandler("save", {newValue: r, response: e})
  			}, this)).fail(e.proxy(function (e) {
  				this.error(typeof e == "string" ? e : e.responseText || e.statusText || "Unknown error!"), this.showForm()
  			}, this))
  	}, save: function (t) {
  		var n = this.input.value2submit(t);
  		this.options.pk = e.fn.editableutils.tryParseJson(this.options.pk, !0);
  		var r = typeof this.options.pk == "function" ? this.options.pk.call(this.options.scope) : this.options.pk, i = !!(typeof this.options.url == "function" || this.options.url && (this.options.send === "always" || this.options.send === "auto" && r)), s;
  		if (i)return this.showLoading(), s = {name: this.options.name || "", value: n, pk: r}, typeof this.options.params == "function" ? s = this.options.params.call(this.options.scope, s) : (this.options.params = e.fn.editableutils.tryParseJson(this.options.params, !0), e.extend(s, this.options.params)), typeof this.options.url == "function" ? this.options.url.call(this.options.scope, s) : e.ajax(e.extend({url: this.options.url, data: s, type: "POST"}, this.options.ajaxOptions))
  	}, validate: function (e) {
  		e === undefined && (e = this.value);
  		if (typeof this.options.validate == "function")return this.options.validate.call(this.options.scope, e)
  	}, option: function (e, t) {
  		this.options[e] = t, e === "value" && this.setValue(t)
  	}, setValue: function (e, t) {
  		t ? this.value = this.input.str2value(e) : this.value = e
  	}}, e.fn.editableform = function (n) {
  		var r = arguments;
  		return this.each(function () {
  			var i = e(this), s = i.data("editableform"), o = typeof n == "object" && n;
  			s || i.data("editableform", s = new t(this, o)), typeof n == "string" && s[n].apply(s, Array.prototype.slice.call(r, 1))
  		})
  	}, e.fn.editableform.Constructor = t, e.fn.editableform.defaults = {type: "text", url: null, params: null, name: null, pk: null, value: null, send: "auto", validate: null, success: null, ajaxOptions: null, showbuttons: !0, scope: null, savenochange: !1}, e.fn.editableform.template = '<form class="form-inline editableform"><div class="control-group"><div><div class="editable-input"></div><div class="editable-buttons"></div></div><div class="editable-error-block"></div></div></form>', e.fn.editableform.loading = '<div class="editableform-loading"></div>', e.fn.editableform.buttons = '<button type="submit" class="editable-submit">ok</button><button type="button" class="editable-cancel">cancel</button>', e.fn.editableform.errorGroupClass = null, e.fn.editableform.errorBlockClass = "editable-error"
  })(window.jQuery), function (e) {
  	e.fn.editableutils = {inherit: function (e, t) {
  		var n = function () {
  		};
  		n.prototype = t.prototype, e.prototype = new n, e.prototype.constructor = e, e.superclass = t.prototype
  	}, setCursorPosition: function (e, t) {
  		if (e.setSelectionRange)e.setSelectionRange(t, t); else if (e.createTextRange) {
  			var n = e.createTextRange();
  			n.collapse(!0), n.moveEnd("character", t), n.moveStart("character", t), n.select()
  		}
  	}, tryParseJson: function (e, t) {
  		if (typeof e == "string" && e.length && e.match(/^[\{\[].*[\}\]]$/))if (t)try {
  			e = (new Function("return " + e))()
  		} catch (n) {
  		} finally {
  			return e
  		} else e = (new Function("return " + e))();
  		return e
  	}, sliceObj: function (t, n, r) {
  		var i, s, o = {};
  		if (!e.isArray(n) || !n.length)return o;
  		for (var u = 0; u < n.length; u++) {
  			i = n[u], t.hasOwnProperty(i) && (o[i] = t[i]);
  			if (r === !0)continue;
  			s = i.toLowerCase(), t.hasOwnProperty(s) && (o[i] = t[s])
  		}
  		return o
  	}, getConfigData: function (t) {
  		var n = {};
  		return e.each(t.data(), function (e, t) {
  			if (typeof t != "object" || t && typeof t == "object" && t.constructor === Object)n[e] = t
  		}), n
  	}, objectKeys: function (e) {
  		if (Object.keys)return Object.keys(e);
  		if (e !== Object(e))throw new TypeError("Object.keys called on a non-object");
  		var t = [], n;
  		for (n in e)Object.prototype.hasOwnProperty.call(e, n) && t.push(n);
  		return t
  	}, escape: function (t) {
  		return e("<div>").text(t).html()
  	}}
  }(window.jQuery), function (e) {
  	var t = function (e, t) {
  		this.init(e, t)
  	};
  	t.prototype = {containerName: null, innerCss: null, init: function (n, r) {
  		this.$element = e(n), this.options = e.extend({}, e.fn.editableContainer.defaults, e.fn.editableutils.getConfigData(this.$element), r), this.splitOptions(), this.initContainer(), this.$element.on("destroyed", e.proxy(function () {
  			this.destroy()
  		}, this)), e(document).data("editable-handlers-attached") || (e(document).on("keyup.editable", function (t) {
  			t.which === 27 && e(".editable-open").editableContainer("hide")
  		}), e(document).on("click.editable", function (n) {
  			var r = e(n.target);
  			if (r.is(".editable-container") || r.parents(".editable-container").length || r.parents(".ui-datepicker-header").length)return;
  			t.prototype.closeOthers(n.target)
  		}), e(document).data("editable-handlers-attached", !0))
  	}, splitOptions: function () {
  		this.containerOptions = {}, this.formOptions = {};
  		var t = e.fn[this.containerName].defaults;
  		for (var n in this.options)n in t ? this.containerOptions[n] = this.options[n] : this.formOptions[n] = this.options[n]
  	}, initContainer: function () {
  		this.call(this.containerOptions)
  	}, initForm: function () {
  		return this.formOptions.scope = this.$element[0], this.$form = e("<div>").editableform(this.formOptions).on({save: e.proxy(this.save, this), cancel: e.proxy(function () {
  			this.hide("cancel")
  		}, this), nochange: e.proxy(function () {
  			this.hide("nochange")
  		}, this), show: e.proxy(this.setPosition, this), rendering: e.proxy(this.setPosition, this), rendered: e.proxy(function () {
  			this.$element.triggerHandler("shown")
  		}, this)}), this.$form
  	}, tip: function () {
  		return this.container().$tip
  	}, container: function () {
  		return this.$element.data(this.containerName)
  	}, call: function () {
  		this.$element[this.containerName].apply(this.$element, arguments)
  	}, show: function (e) {
  		this.$element.addClass("editable-open"), e !== !1 && this.closeOthers(this.$element[0]), this.innerShow()
  	}, innerShow: function () {
  		this.call("show"), this.tip().addClass("editable-container"), this.initForm(), this.tip().find(this.innerCss).empty().append(this.$form), this.$form.editableform("render")
  	}, hide: function (e) {
  		if (!this.tip() || !this.tip().is(":visible") || !this.$element.hasClass("editable-open"))return;
  		this.$element.removeClass("editable-open"), this.innerHide(), this.$element.triggerHandler("hidden", e)
  	}, innerHide: function () {
  		this.call("hide")
  	}, toggle: function (e) {
  		this.tip && this.tip().is(":visible") ? this.hide() : this.show(e)
  	}, setPosition: function () {
  	}, save: function (e, t) {
  		this.hide("save"), this.$element.triggerHandler("save", t)
  	}, option: function (e, t) {
  		this.options[e] = t, e in this.containerOptions ? (this.containerOptions[e] = t, this.setContainerOption(e, t)) : (this.formOptions[e] = t, this.$form && this.$form.editableform("option", e, t))
  	}, setContainerOption: function (e, t) {
  		this.call("option", e, t)
  	}, destroy: function () {
  		this.call("destroy")
  	}, closeOthers: function (t) {
  		e(".editable-open").each(function (n, r) {
  			if (r === t || e(r).find(t).length)return;
  			var i = e(r), s = i.data("editableContainer");
  			if (!s)return;
  			s.options.onblur === "cancel" ? i.data("editableContainer").hide("onblur") : s.options.onblur === "submit" && i.data("editableContainer").tip().find("form").submit()
  		})
  	}, activate: function () {
  		this.tip && this.tip().is(":visible") && this.$form && this.$form.data("editableform").input.activate()
  	}}, e.fn.editableContainer = function (n) {
  		var r = arguments;
  		return this.each(function () {
  			var i = e(this), s = "editableContainer", o = i.data(s), u = typeof n == "object" && n;
  			o || i.data(s, o = new t(this, u)), typeof n == "string" && o[n].apply(o, Array.prototype.slice.call(r, 1))
  		})
  	}, e.fn.editableContainer.Constructor = t, e.fn.editableContainer.defaults = {value: null, placement: "top", autohide: !0, onblur: "cancel"}, jQuery.event.special.destroyed = {remove: function (e) {
  		e.handler && e.handler()
  	}}
  }(window.jQuery), function (e) {
  	var t = function (t, n) {
  		this.$element = e(t), this.options = e.extend({}, e.fn.editable.defaults, e.fn.editableutils.getConfigData(this.$element), n), this.init()
  	};
  	t.prototype = {constructor: t, init: function () {
  		var t, n = !1, r, i;
  		if (!e.fn.editableContainer) {
  			e.error("You must define $.fn.editableContainer via including corresponding file (e.g. editable-popover.js)");
  			return
  		}
  		this.options.name = this.options.name || this.$element.attr("id");
  		if (typeof e.fn.editabletypes[this.options.type] != "function") {
  			e.error("Unknown type: " + this.options.type);
  			return
  		}
  		t = e.fn.editabletypes[this.options.type], this.typeOptions = e.fn.editableutils.sliceObj(this.options, e.fn.editableutils.objectKeys(t.defaults)), this.input = new t(this.typeOptions), this.options.value === undefined || this.options.value === null ? (this.value = this.input.html2value(e.trim(this.$element.html())), n = !0) : (this.options.value = e.fn.editableutils.tryParseJson(this.options.value, !0), typeof this.options.value == "string" ? this.value = this.input.str2value(this.options.value) : this.value = this.options.value), this.$element.addClass("editable"), this.options.toggle !== "manual" ? (this.$element.addClass("editable-click"), this.$element.on(this.options.toggle + ".editable", e.proxy(function (e) {
  			e.preventDefault();
  			if (this.options.toggle === "mouseenter")this.show(); else {
  				var t = this.options.toggle !== "click";
  				this.toggle(t)
  			}
  		}, this))) : this.$element.attr("tabindex", -1), r = !n && this.value !== null && this.value !== undefined, r &= this.options.autotext === "always" || this.options.autotext === "auto" && !this.$element.text().length, e.when(r ? this.render() : !0).then(e.proxy(function () {
  			this.options.disabled ? this.disable() : this.enable(), this.$element.triggerHandler("init", this)
  		}, this))
  	}, render: function () {
  		if (this.options.display === !1)return;
  		return this.input.options.hasOwnProperty("source") ? this.input.value2html(this.value, this.$element[0], this.options.display) : typeof this.options.display == "function" ? this.options.display.call(this.$element[0], this.value) : this.input.value2html(this.value, this.$element[0])
  	}, enable: function () {
  		this.options.disabled = !1, this.$element.removeClass("editable-disabled"), this.handleEmpty(), this.options.toggle !== "manual" && this.$element.attr("tabindex") === "-1" && this.$element.removeAttr("tabindex")
  	}, disable: function () {
  		this.options.disabled = !0, this.hide(), this.$element.addClass("editable-disabled"), this.handleEmpty(), this.$element.attr("tabindex", -1)
  	}, toggleDisabled: function () {
  		this.options.disabled ? this.enable() : this.disable()
  	}, option: function (t, n) {
  		if (t && typeof t == "object") {
  			e.each(t, e.proxy(function (t, n) {
  				this.option(e.trim(t), n)
  			}, this));
  			return
  		}
  		this.options[t] = n;
  		if (t === "disabled") {
  			n ? this.disable() : this.enable();
  			return
  		}
  		t === "value" && this.setValue(n), this.container && this.container.option(t, n)
  	}, handleEmpty: function () {
  		if (this.options.display === !1)return;
  		var t = "editable-empty";
  		this.options.disabled ? this.$element.hasClass(t) && (this.$element.empty(), this.$element.removeClass(t)) : e.trim(this.$element.text()) === "" ? this.$element.addClass(t).text(this.options.emptytext) : this.$element.removeClass(t)
  	}, show: function (t) {
  		if (this.options.disabled)return;
  		if (!this.container) {
  			var n = e.extend({}, this.options, {value: this.value});
  			this.$element.editableContainer(n), this.$element.on("save.internal", e.proxy(this.save, this)), this.container = this.$element.data("editableContainer")
  		} else if (this.container.tip().is(":visible"))return;
  		this.container.show(t)
  	}, hide: function () {
  		this.container && this.container.hide()
  	}, toggle: function (e) {
  		this.container && this.container.tip().is(":visible") ? this.hide() : this.show(e)
  	}, save: function (e, t) {
  		typeof this.options.url != "function" && this.options.display !== !1 && t.response === undefined && this.input.value2str(this.value) !== this.input.value2str(t.newValue) ? this.$element.addClass("editable-unsaved") : this.$element.removeClass("editable-unsaved"), this.setValue(t.newValue)
  	}, validate: function () {
  		if (typeof this.options.validate == "function")return this.options.validate.call(this, this.value)
  	}, setValue: function (t, n) {
  		n ? this.value = this.input.str2value(t) : this.value = t, this.container && this.container.option("value", this.value), e.when(this.render()).then(e.proxy(function () {
  			this.handleEmpty()
  		}, this))
  	}, activate: function () {
  		this.container && this.container.activate()
  	}}, e.fn.editable = function (n) {
  		var r = {}, i = arguments, s = "editable";
  		switch (n) {
  			case"validate":
  				return this.each(function () {
  					var t = e(this), n = t.data(s), i;
  					n && (i = n.validate()) && (r[n.options.name] = i)
  				}), r;
  			case"getValue":
  				return this.each(function () {
  					var t = e(this), n = t.data(s);
  					n && n.value !== undefined && n.value !== null && (r[n.options.name] = n.input.value2submit(n.value))
  				}), r;
  			case"submit":
  				var o = arguments[1] || {}, u = this, a = this.editable("validate"), f;
  				return e.isEmptyObject(a) ? (f = this.editable("getValue"), o.data && e.extend(f, o.data), e.ajax(e.extend({url: o.url, data: f, type: "POST"}, o.ajaxOptions)).success(function (e) {
  					typeof o.success == "function" && o.success.call(u, e, o)
  				}).error(function () {
  						typeof o.error == "function" && o.error.apply(u, arguments)
  					})) : typeof o.error == "function" && o.error.call(u, a), this
  		}
  		return this.each(function () {
  			var r = e(this), o = r.data(s), u = typeof n == "object" && n;
  			o || r.data(s, o = new t(this, u)), typeof n == "string" && o[n].apply(o, Array.prototype.slice.call(i, 1))
  		})
  	}, e.fn.editable.defaults = {type: "text", disabled: !1, toggle: "click", emptytext: "Empty", autotext: "auto", value: null, display: null}
  }(window.jQuery), function (e) {
  	e.fn.editabletypes = {};
  	var t = function () {
  	};
  	t.prototype = {init: function (t, n, r) {
  		this.type = t, this.options = e.extend({}, r, n), this.$input = null, this.$clear = null, this.error = null
  	}, render: function () {
  		this.$input = e(this.options.tpl), this.options.inputclass && this.$input.addClass(this.options.inputclass), this.options.placeholder && this.$input.attr("placeholder", this.options.placeholder)
  	}, value2html: function (t, n) {
  		e(n).text(t)
  	}, html2value: function (t) {
  		return e("<div>").html(t).text()
  	}, value2str: function (e) {
  		return e
  	}, str2value: function (e) {
  		return e
  	}, value2submit: function (e) {
  		return e
  	}, value2input: function (e) {
  		this.$input.val(e)
  	}, input2value: function () {
  		return this.$input.val()
  	}, activate: function () {
  		this.$input.is(":visible") && this.$input.focus()
  	}, clear: function () {
  		this.$input.val(null)
  	}, escape: function (t) {
  		return e("<div>").text(t).html()
  	}, autosubmit: function () {
  	}}, t.defaults = {tpl: "", inputclass: "input-medium", name: null}, e.extend(e.fn.editabletypes, {abstractinput: t})
  }(window.jQuery), function (e) {
  	var t = function (e) {
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.abstractinput), e.extend(t.prototype, {render: function () {
  		t.superclass.render.call(this);
  		var n = e.Deferred();
  		return this.error = null, this.sourceData = null, this.prependData = null, this.onSourceReady(function () {
  			this.renderList(), n.resolve()
  		}, function () {
  			this.error = this.options.sourceError, n.resolve()
  		}), n.promise()
  	}, html2value: function (e) {
  		return null
  	}, value2html: function (t, n, r) {
  		var i = e.Deferred();
  		return this.onSourceReady(function () {
  			typeof r == "function" ? r.call(n, t, this.sourceData) : this.value2htmlFinal(t, n), i.resolve()
  		}, function () {
  			i.resolve()
  		}), i.promise()
  	}, onSourceReady: function (t, n) {
  		if (e.isArray(this.sourceData)) {
  			t.call(this);
  			return
  		}
  		try {
  			this.options.source = e.fn.editableutils.tryParseJson(this.options.source, !1)
  		} catch (r) {
  			n.call(this);
  			return
  		}
  		if (typeof this.options.source == "string") {
  			if (this.options.sourceCache) {
  				var i = this.options.source + (this.options.name ? "-" + this.options.name : ""), s;
  				e(document).data(i) || e(document).data(i, {}), s = e(document).data(i);
  				if (s.loading === !1 && s.sourceData) {
  					this.sourceData = s.sourceData, t.call(this);
  					return
  				}
  				if (s.loading === !0) {
  					s.callbacks.push(e.proxy(function () {
  						this.sourceData = s.sourceData, t.call(this)
  					}, this)), s.err_callbacks.push(e.proxy(n, this));
  					return
  				}
  				s.loading = !0, s.callbacks = [], s.err_callbacks = []
  			}
  			e.ajax({url: this.options.source, type: "get", cache: !1, data: this.options.name ? {name: this.options.name} : {}, dataType: "json", success: e.proxy(function (r) {
  				s && (s.loading = !1), this.sourceData = this.makeArray(r), e.isArray(this.sourceData) ? (this.doPrepend(), t.call(this), s && (s.sourceData = this.sourceData, e.each(s.callbacks, function () {
  					this.call()
  				}))) : (n.call(this), s && e.each(s.err_callbacks, function () {
  					this.call()
  				}))
  			}, this), error: e.proxy(function () {
  				n.call(this), s && (s.loading = !1, e.each(s.err_callbacks, function () {
  					this.call()
  				}))
  			}, this)})
  		} else this.sourceData = this.makeArray(this.options.source), e.isArray(this.sourceData) ? (this.doPrepend(), t.call(this)) : n.call(this)
  	}, doPrepend: function () {
  		if (this.options.prepend === null || this.options.prepend === undefined)return;
  		e.isArray(this.prependData) || (this.options.prepend = e.fn.editableutils.tryParseJson(this.options.prepend, !0), typeof this.options.prepend == "string" && (this.options.prepend = {"": this.options.prepend}), this.prependData = this.makeArray(this.options.prepend)), e.isArray(this.prependData) && e.isArray(this.sourceData) && (this.sourceData = this.prependData.concat(this.sourceData))
  	}, renderList: function () {
  	}, value2htmlFinal: function (e, t) {
  	}, makeArray: function (t) {
  		var n, r, i = [], s;
  		if (!t || typeof t == "string")return null;
  		if (e.isArray(t)) {
  			s = function (e, t) {
  				r = {value: e, text: t};
  				if (n++ >= 2)return!1
  			};
  			for (var o = 0; o < t.length; o++)typeof t[o] == "object" ? (n = 0, e.each(t[o], s), n === 1 ? i.push(r) : n > 1 && t[o].hasOwnProperty("value") && t[o].hasOwnProperty("text") && i.push(t[o])) : i.push({value: t[o], text: t[o]})
  		} else e.each(t, function (e, t) {
  			i.push({value: e, text: t})
  		});
  		return i
  	}, itemByVal: function (t) {
  		if (e.isArray(this.sourceData))for (var n = 0; n < this.sourceData.length; n++)if (this.sourceData[n].value == t)return this.sourceData[n]
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.abstractinput.defaults, {source: null, prepend: !1, sourceError: "Error when loading list", sourceCache: !0}), e.fn.editabletypes.list = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("text", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.abstractinput), e.extend(t.prototype, {activate: function () {
  		this.$input.is(":visible") && (this.$input.focus(), e.fn.editableutils.setCursorPosition(this.$input.get(0), this.$input.val().length))
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.abstractinput.defaults, {tpl: '<input type="text">', placeholder: null}), e.fn.editabletypes.text = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("textarea", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.abstractinput), e.extend(t.prototype, {render: function () {
  		t.superclass.render.call(this), this.$input.keydown(function (t) {
  			t.ctrlKey && t.which === 13 && e(this).closest("form").submit()
  		})
  	}, value2html: function (t, n) {
  		var r = "", i;
  		if (t) {
  			i = t.split("\n");
  			for (var s = 0; s < i.length; s++)i[s] = e("<div>").text(i[s]).html();
  			r = i.join("<br>")
  		}
  		e(n).html(r)
  	}, html2value: function (t) {
  		if (!t)return"";
  		var n = t.split(/<br\s*\/?>/i);
  		for (var r = 0; r < n.length; r++)n[r] = e("<div>").html(n[r]).text();
  		return n.join("\n")
  	}, activate: function () {
  		this.$input.is(":visible") && (e.fn.editableutils.setCursorPosition(this.$input.get(0), this.$input.val().length), this.$input.focus())
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.abstractinput.defaults, {tpl: "<textarea></textarea>", inputclass: "input-large", placeholder: null}), e.fn.editabletypes.textarea = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("select", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.list), e.extend(t.prototype, {renderList: function () {
  		if (!e.isArray(this.sourceData))return;
  		for (var t = 0; t < this.sourceData.length; t++)this.$input.append(e("<option>", {value: this.sourceData[t].value}).text(this.sourceData[t].text));
  		this.$input.on("keydown.editable", function (t) {
  			t.which === 13 && e(this).closest("form").submit()
  		})
  	}, value2htmlFinal: function (e, n) {
  		var r = "", i = this.itemByVal(e);
  		i && (r = i.text), t.superclass.constructor.superclass.value2html(r, n)
  	}, autosubmit: function () {
  		this.$input.off("keydown.editable").on("change.editable", function () {
  			e(this).closest("form").submit()
  		})
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.list.defaults, {tpl: "<select></select>"}), e.fn.editabletypes.select = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("checklist", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.list), e.extend(t.prototype, {renderList: function () {
  		var t, n;
  		if (!e.isArray(this.sourceData))return;
  		for (var r = 0; r < this.sourceData.length; r++)t = e("<label>").append(e("<input>", {type: "checkbox", value: this.sourceData[r].value, name: this.options.name})).append(e("<span>").text(" " + this.sourceData[r].text)), e("<div>").append(t).appendTo(this.$input)
  	}, value2str: function (t) {
  		return e.isArray(t) ? t.sort().join(e.trim(this.options.separator)) : ""
  	}, str2value: function (t) {
  		var n, r = null;
  		return typeof t == "string" && t.length ? (n = new RegExp("\\s*" + e.trim(this.options.separator) + "\\s*"), r = t.split(n)) : e.isArray(t) && (r = t), r
  	}, value2input: function (t) {
  		var n = this.$input.find('input[type="checkbox"]');
  		n.removeAttr("checked"), e.isArray(t) && t.length && n.each(function (n, r) {
  			var i = e(r);
  			e.each(t, function (e, t) {
  				i.val() == t && i.attr("checked", "checked")
  			})
  		})
  	}, input2value: function () {
  		var t = [];
  		return this.$input.find("input:checked").each(function (n, r) {
  			t.push(e(r).val())
  		}), t
  	}, value2htmlFinal: function (t, n) {
  		var r = [], i = e.grep(this.sourceData, function (n) {
  			return e.grep(t,function (e) {
  				return e == n.value
  			}).length
  		});
  		i.length ? (e.each(i, function (t, n) {
  			r.push(e.fn.editableutils.escape(n.text))
  		}), e(n).html(r.join("<br>"))) : e(n).empty()
  	}, activate: function () {
  		this.$input.find('input[type="checkbox"]').first().focus()
  	}, autosubmit: function () {
  		this.$input.find('input[type="checkbox"]').on("keydown", function (t) {
  			t.which === 13 && e(this).closest("form").submit()
  		})
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.list.defaults, {tpl: "<div></div>", inputclass: "editable-checklist", separator: ","}), e.fn.editabletypes.checklist = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("password", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.text), e.extend(t.prototype, {value2html: function (t, n) {
  		t ? e(n).text("[hidden]") : e(n).empty()
  	}, html2value: function (e) {
  		return null
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.text.defaults, {tpl: '<input type="password">'}), e.fn.editabletypes.password = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("email", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.text), t.defaults = e.extend({}, e.fn.editabletypes.text.defaults, {tpl: '<input type="email">'}), e.fn.editabletypes.email = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("url", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.text), t.defaults = e.extend({}, e.fn.editabletypes.text.defaults, {tpl: '<input type="url">'}), e.fn.editabletypes.url = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("tel", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.text), t.defaults = e.extend({}, e.fn.editabletypes.text.defaults, {tpl: '<input type="tel">'}), e.fn.editabletypes.tel = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("number", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.text), e.extend(t.prototype, {render: function () {
  		t.superclass.render.call(this), this.options.min !== null && this.$input.attr("min", this.options.min), this.options.max !== null && this.$input.attr("max", this.options.max), this.options.step !== null && this.$input.attr("step", this.options.step)
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.text.defaults, {tpl: '<input type="number">', inputclass: "input-mini", min: null, max: null, step: null}), e.fn.editabletypes.number = t
  }(window.jQuery), function (e) {
  	var t = function (e) {
  		this.init("range", e, t.defaults)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.number), e.extend(t.prototype, {render: function () {
  		this.$input = e(this.options.tpl);
  		var t = this.$input.filter("input");
  		this.options.inputclass && t.addClass(this.options.inputclass), this.options.min !== null && t.attr("min", this.options.min), this.options.max !== null && t.attr("max", this.options.max), this.options.step !== null && t.attr("step", this.options.step), t.on("input", function () {
  			e(this).siblings("output").text(e(this).val())
  		})
  	}, activate: function () {
  		this.$input.filter("input").focus()
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.number.defaults, {tpl: '<input type="range"><output style="width: 30px; display: inline-block"></output>', inputclass: "input-medium"}), e.fn.editabletypes.range = t
  }(window.jQuery), function (e) {
  	e.extend(e.fn.editableform.Constructor.prototype, {initTemplate: function () {
  		this.$form = e(e.fn.editableform.template), this.$form.find(".editable-error-block").addClass("help-block")
  	}}), e.fn.editableform.buttons = '<button type="submit" class="btn btn-primary editable-submit"><i class="icon-ok icon-white"></i></button><button type="button" class="btn editable-cancel"><i class="icon-remove"></i></button>', e.fn.editableform.errorGroupClass = "error", e.fn.editableform.errorBlockClass = null
  }(window.jQuery), function (e) {
  	e.extend(e.fn.editableContainer.Constructor.prototype, {containerName: "popover", innerCss: e(e.fn.popover.defaults.template).find("p").length ? ".popover-content p" : ".popover-content", initContainer: function () {
  		e.extend(this.containerOptions, {trigger: "manual", selector: !1, content: " "}), this.call(this.containerOptions)
  	}, setContainerOption: function (e, t) {
  		this.container().options[e] = t
  	}, setPosition: function () {
  		(function () {
  			var e = this.tip(), t, n, r, i, s, o;
  			s = typeof this.options.placement == "function" ? this.options.placement.call(this, e[0], this.$element[0]) : this.options.placement, t = /in/.test(s), e.removeClass("top right bottom left").css({top: 0, left: 0, display: "block"}), n = this.getPosition(t), r = e[0].offsetWidth, i = e[0].offsetHeight;
  			switch (t ? s.split(" ")[1] : s) {
  				case"bottom":
  					o = {top: n.top + n.height, left: n.left + n.width / 2 - r / 2};
  					break;
  				case"top":
  					o = {top: n.top - i, left: n.left + n.width / 2 - r / 2};
  					break;
  				case"left":
  					o = {top: n.top + n.height / 2 - i / 2, left: n.left - r};
  					break;
  				case"right":
  					o = {top: n.top + n.height / 2 - i / 2, left: n.left + n.width}
  			}
  			e.offset(o).addClass(s).addClass("in")
  		}).call(this.container())
  	}})
  }(window.jQuery), function (e) {
  	var t = function (n) {
  		this.init("date", n, t.defaults);
  		var r = e.fn.editableutils.sliceObj(this.options, ["format"]);
  		this.options.datepicker = e.extend({}, t.defaults.datepicker, r, n.datepicker), this.options.viewformat || (this.options.viewformat = this.options.datepicker.format), this.options.datepicker.language = this.options.datepicker.language || "en", this.dpg = e.fn.datepicker.DPGlobal, this.parsedFormat = this.dpg.parseFormat(this.options.datepicker.format), this.parsedViewFormat = this.dpg.parseFormat(this.options.viewformat)
  	};
  	e.fn.editableutils.inherit(t, e.fn.editabletypes.abstractinput), e.extend(t.prototype, {render: function () {
  		t.superclass.render.call(this), this.$input.datepicker(this.options.datepicker), this.options.clear && (this.$clear = e('<a href="#"></a>').html(this.options.clear).click(e.proxy(function (e) {
  			e.preventDefault(), e.stopPropagation(), this.clear()
  		}, this)))
  	}, value2html: function (e, n) {
  		var r = e ? this.dpg.formatDate(e, this.parsedViewFormat, this.options.datepicker.language) : "";
  		t.superclass.value2html(r, n)
  	}, html2value: function (e) {
  		return e ? this.dpg.parseDate(e, this.parsedViewFormat, this.options.datepicker.language) : null
  	}, value2str: function (e) {
  		return e ? this.dpg.formatDate(e, this.parsedFormat, this.options.datepicker.language) : ""
  	}, str2value: function (e) {
  		return e ? this.dpg.parseDate(e, this.parsedFormat, this.options.datepicker.language) : null
  	}, value2submit: function (e) {
  		return this.value2str(e)
  	}, value2input: function (e) {
  		this.$input.datepicker("update", e)
  	}, input2value: function () {
  		return this.$input.data("datepicker").date
  	}, activate: function () {
  	}, clear: function () {
  		this.$input.data("datepicker").date = null, this.$input.find(".active").removeClass("active")
  	}, autosubmit: function () {
  		this.$input.on("changeDate", function (t) {
  			var n = e(this).closest("form");
  			setTimeout(function () {
  				n.submit()
  			}, 200)
  		})
  	}}), t.defaults = e.extend({}, e.fn.editabletypes.abstractinput.defaults, {tpl: "<div></div>", inputclass: "editable-date well", format: "yyyy-mm-dd", viewformat: null, datepicker: {weekStart: 0, startView: 0, autoclose: !1}, clear: "&times; clear"}), e.fn.editabletypes.date = t
  }(window.jQuery), !function (e) {
  	function t() {
  		return new Date(Date.UTC.apply(Date, arguments))
  	}
  
  	function n() {
  		var e = new Date;
  		return t(e.getUTCFullYear(), e.getUTCMonth(), e.getUTCDate())
  	}
  
  	var r = function (t, n) {
  		var r = this;
  		this.element = e(t), this.language = n.language || this.element.data("date-language") || "en", this.language = this.language in i ? this.language : "en", this.format = s.parseFormat(n.format || this.element.data("date-format") || "mm/dd/yyyy"), this.isInline = !1, this.isInput = this.element.is("input"), this.component = this.element.is(".date") ? this.element.find(".add-on") : !1, this.hasInput = this.component && this.element.find("input").length, this.component && this.component.length === 0 && (this.component = !1), this.isInput ? this.element.on({focus: e.proxy(this.show, this), keyup: e.proxy(this.update, this), keydown: e.proxy(this.keydown, this)}) : this.component && this.hasInput ? (this.element.find("input").on({focus: e.proxy(this.show, this), keyup: e.proxy(this.update, this), keydown: e.proxy(this.keydown, this)}), this.component.on("click", e.proxy(this.show, this))) : this.element.is("div") ? this.isInline = !0 : this.element.on("click", e.proxy(this.show, this)), this.picker = e(s.template).appendTo(this.isInline ? this.element : "body").on({click: e.proxy(this.click, this), mousedown: e.proxy(this.mousedown, this)}), this.isInline ? this.picker.addClass("datepicker-inline") : this.picker.addClass("dropdown-menu"), e(document).on("mousedown", function (t) {
  			e(t.target).closest(".datepicker").length == 0 && r.hide()
  		}), this.autoclose = !1, "autoclose"in n ? this.autoclose = n.autoclose : "dateAutoclose"in this.element.data() && (this.autoclose = this.element.data("date-autoclose")), this.keyboardNavigation = !0, "keyboardNavigation"in n ? this.keyboardNavigation = n.keyboardNavigation : "dateKeyboardNavigation"in this.element.data() && (this.keyboardNavigation = this.element.data("date-keyboard-navigation"));
  		switch (n.startView || this.element.data("date-start-view")) {
  			case 2:
  			case"decade":
  				this.viewMode = this.startViewMode = 2;
  				break;
  			case 1:
  			case"year":
  				this.viewMode = this.startViewMode = 1;
  				break;
  			case 0:
  			case"month":
  			default:
  				this.viewMode = this.startViewMode = 0
  		}
  		this.todayBtn = n.todayBtn || this.element.data("date-today-btn") || !1, this.todayHighlight = n.todayHighlight || this.element.data("date-today-highlight") || !1, this.weekStart = (n.weekStart || this.element.data("date-weekstart") || i[this.language].weekStart || 0) % 7, this.weekEnd = (this.weekStart + 6) % 7, this.startDate = -Infinity, this.endDate = Infinity, this.setStartDate(n.startDate || this.element.data("date-startdate")), this.setEndDate(n.endDate || this.element.data("date-enddate")), this.fillDow(), this.fillMonths(), this.update(), this.showMode(), this.isInline && this.show()
  	};
  	r.prototype = {constructor: r, show: function (t) {
  		this.picker.show(), this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(), this.update(), this.place(), e(window).on("resize", e.proxy(this.place, this)), t && (t.stopPropagation(), t.preventDefault()), this.element.trigger({type: "show", date: this.date})
  	}, hide: function (t) {
  		if (this.isInline)return;
  		this.picker.hide(), e(window).off("resize", this.place), this.viewMode = this.startViewMode, this.showMode(), this.isInput || e(document).off("mousedown", this.hide), t && t.currentTarget.value && this.setValue(), this.element.trigger({type: "hide", date: this.date})
  	}, getDate: function () {
  		var e = this.getUTCDate();
  		return new Date(e.getTime() + e.getTimezoneOffset() * 6e4)
  	}, getUTCDate: function () {
  		return this.date
  	}, setDate: function (e) {
  		this.setUTCDate(new Date(e.getTime() - e.getTimezoneOffset() * 6e4))
  	}, setUTCDate: function (e) {
  		this.date = e, this.setValue()
  	}, setValue: function () {
  		var e = this.getFormattedDate();
  		this.isInput ? this.element.prop("value", e) : (this.component && this.element.find("input").prop("value", e), this.element.data("date", e))
  	}, getFormattedDate: function (e) {
  		return e == undefined && (e = this.format), s.formatDate(this.date, e, this.language)
  	}, setStartDate: function (e) {
  		this.startDate = e || -Infinity, this.startDate !== -Infinity && (this.startDate = s.parseDate(this.startDate, this.format, this.language)), this.update(), this.updateNavArrows()
  	}, setEndDate: function (e) {
  		this.endDate = e || Infinity, this.endDate !== Infinity && (this.endDate = s.parseDate(this.endDate, this.format, this.language)), this.update(), this.updateNavArrows()
  	}, place: function () {
  		if (this.isInline)return;
  		var t = parseInt(this.element.parents().filter(function () {
  			return e(this).css("z-index") != "auto"
  		}).first().css("z-index")) + 10, n = this.component ? this.component.offset() : this.element.offset();
  		this.picker.css({top: n.top + this.height, left: n.left, zIndex: t})
  	}, update: function () {
  		var e, t = !1;
  		arguments && arguments.length && (typeof arguments[0] == "string" || arguments[0]instanceof Date) ? (e = arguments[0], t = !0) : e = this.isInput ? this.element.prop("value") : this.element.data("date") || this.element.find("input").prop("value"), this.date = s.parseDate(e, this.format, this.language), t && this.setValue(), this.date < this.startDate ? this.viewDate = new Date(this.startDate) : this.date > this.endDate ? this.viewDate = new Date(this.endDate) : this.viewDate = new Date(this.date), this.fill()
  	}, fillDow: function () {
  		var e = this.weekStart, t = "<tr>";
  		while (e < this.weekStart + 7)t += '<th class="dow">' + i[this.language].daysMin[e++ % 7] + "</th>";
  		t += "</tr>", this.picker.find(".datepicker-days thead").append(t)
  	}, fillMonths: function () {
  		var e = "", t = 0;
  		while (t < 12)e += '<span class="month">' + i[this.language].monthsShort[t++] + "</span>";
  		this.picker.find(".datepicker-months td").html(e)
  	}, fill: function () {
  		var e = new Date(this.viewDate), n = e.getUTCFullYear(), r = e.getUTCMonth(), o = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity, u = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity, a = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity, f = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity, l = this.date && this.date.valueOf(), c = new Date;
  		this.picker.find(".datepicker-days thead th:eq(1)").text(i[this.language].months[r] + " " + n), this.picker.find("tfoot th.today").text(i[this.language].today).toggle(this.todayBtn !== !1), this.updateNavArrows(), this.fillMonths();
  		var h = t(n, r - 1, 28, 0, 0, 0, 0), p = s.getDaysInMonth(h.getUTCFullYear(), h.getUTCMonth());
  		h.setUTCDate(p), h.setUTCDate(p - (h.getUTCDay() - this.weekStart + 7) % 7);
  		var d = new Date(h);
  		d.setUTCDate(d.getUTCDate() + 42), d = d.valueOf();
  		var v = [], m;
  		while (h.valueOf() < d) {
  			h.getUTCDay() == this.weekStart && v.push("<tr>"), m = "";
  			if (h.getUTCFullYear() < n || h.getUTCFullYear() == n && h.getUTCMonth() < r)m += " old"; else if (h.getUTCFullYear() > n || h.getUTCFullYear() == n && h.getUTCMonth() > r)m += " new";
  			this.todayHighlight && h.getUTCFullYear() == c.getFullYear() && h.getUTCMonth() == c.getMonth() && h.getUTCDate() == c.getDate() && (m += " today"), l && h.valueOf() == l && (m += " active");
  			if (h.valueOf() < this.startDate || h.valueOf() > this.endDate)m += " disabled";
  			v.push('<td class="day' + m + '">' + h.getUTCDate() + "</td>"), h.getUTCDay() == this.weekEnd && v.push("</tr>"), h.setUTCDate(h.getUTCDate() + 1)
  		}
  		this.picker.find(".datepicker-days tbody").empty().append(v.join(""));
  		var g = this.date && this.date.getUTCFullYear(), y = this.picker.find(".datepicker-months").find("th:eq(1)").text(n).end().find("span").removeClass("active");
  		g && g == n && y.eq(this.date.getUTCMonth()).addClass("active"), (n < o || n > a) && y.addClass("disabled"), n == o && y.slice(0, u).addClass("disabled"), n == a && y.slice(f + 1).addClass("disabled"), v = "", n = parseInt(n / 10, 10) * 10;
  		var b = this.picker.find(".datepicker-years").find("th:eq(1)").text(n + "-" + (n + 9)).end().find("td");
  		n -= 1;
  		for (var w = -1; w < 11; w++)v += '<span class="year' + (w == -1 || w == 10 ? " old" : "") + (g == n ? " active" : "") + (n < o || n > a ? " disabled" : "") + '">' + n + "</span>", n += 1;
  		b.html(v)
  	}, updateNavArrows: function () {
  		var e = new Date(this.viewDate), t = e.getUTCFullYear(), n = e.getUTCMonth();
  		switch (this.viewMode) {
  			case 0:
  				this.startDate !== -Infinity && t <= this.startDate.getUTCFullYear() && n <= this.startDate.getUTCMonth() ? this.picker.find(".prev").css({visibility: "hidden"}) : this.picker.find(".prev").css({visibility: "visible"}), this.endDate !== Infinity && t >= this.endDate.getUTCFullYear() && n >= this.endDate.getUTCMonth() ? this.picker.find(".next").css({visibility: "hidden"}) : this.picker.find(".next").css({visibility: "visible"});
  				break;
  			case 1:
  			case 2:
  				this.startDate !== -Infinity && t <= this.startDate.getUTCFullYear() ? this.picker.find(".prev").css({visibility: "hidden"}) : this.picker.find(".prev").css({visibility: "visible"}), this.endDate !== Infinity && t >= this.endDate.getUTCFullYear() ? this.picker.find(".next").css({visibility: "hidden"}) : this.picker.find(".next").css({visibility: "visible"})
  		}
  	}, click: function (n) {
  		n.stopPropagation(), n.preventDefault();
  		var r = e(n.target).closest("span, td, th");
  		if (r.length == 1)switch (r[0].nodeName.toLowerCase()) {
  			case"th":
  				switch (r[0].className) {
  					case"switch":
  						this.showMode(1);
  						break;
  					case"prev":
  					case"next":
  						var i = s.modes[this.viewMode].navStep * (r[0].className == "prev" ? -1 : 1);
  						switch (this.viewMode) {
  							case 0:
  								this.viewDate = this.moveMonth(this.viewDate, i);
  								break;
  							case 1:
  							case 2:
  								this.viewDate = this.moveYear(this.viewDate, i)
  						}
  						this.fill();
  						break;
  					case"today":
  						var o = new Date;
  						o = t(o.getFullYear(), o.getMonth(), o.getDate(), 0, 0, 0), this.showMode(-2);
  						var u = this.todayBtn == "linked" ? null : "view";
  						this._setDate(o, u)
  				}
  				break;
  			case"span":
  				if (!r.is(".disabled")) {
  					this.viewDate.setUTCDate(1);
  					if (r.is(".month")) {
  						var a = r.parent().find("span").index(r);
  						this.viewDate.setUTCMonth(a), this.element.trigger({type: "changeMonth", date: this.viewDate})
  					} else {
  						var f = parseInt(r.text(), 10) || 0;
  						this.viewDate.setUTCFullYear(f), this.element.trigger({type: "changeYear", date: this.viewDate})
  					}
  					this.showMode(-1), this.fill()
  				}
  				break;
  			case"td":
  				if (r.is(".day") && !r.is(".disabled")) {
  					var l = parseInt(r.text(), 10) || 1, f = this.viewDate.getUTCFullYear(), a = this.viewDate.getUTCMonth();
  					r.is(".old") ? a == 0 ? (a = 11, f -= 1) : a -= 1 : r.is(".new") && (a == 11 ? (a = 0, f += 1) : a += 1), this._setDate(t(f, a, l, 0, 0, 0, 0))
  				}
  		}
  	}, _setDate: function (e, t) {
  		if (!t || t == "date")this.date = e;
  		if (!t || t == "view")this.viewDate = e;
  		this.fill(), this.setValue(), this.element.trigger({type: "changeDate", date: this.date});
  		var n;
  		this.isInput ? n = this.element : this.component && (n = this.element.find("input")), n && (n.change(), this.autoclose && this.hide())
  	}, moveMonth: function (e, t) {
  		if (!t)return e;
  		var n = new Date(e.valueOf()), r = n.getUTCDate(), i = n.getUTCMonth(), s = Math.abs(t), o, u;
  		t = t > 0 ? 1 : -1;
  		if (s == 1) {
  			u = t == -1 ? function () {
  				return n.getUTCMonth() == i
  			} : function () {
  				return n.getUTCMonth() != o
  			}, o = i + t, n.setUTCMonth(o);
  			if (o < 0 || o > 11)o = (o + 12) % 12
  		} else {
  			for (var a = 0; a < s; a++)n = this.moveMonth(n, t);
  			o = n.getUTCMonth(), n.setUTCDate(r), u = function () {
  				return o != n.getUTCMonth()
  			}
  		}
  		while (u())n.setUTCDate(--r), n.setUTCMonth(o);
  		return n
  	}, moveYear: function (e, t) {
  		return this.moveMonth(e, t * 12)
  	}, dateWithinRange: function (e) {
  		return e >= this.startDate && e <= this.endDate
  	}, keydown: function (e) {
  		if (this.picker.is(":not(:visible)")) {
  			e.keyCode == 27 && this.show();
  			return
  		}
  		var t = !1, n, r, i, s, o;
  		switch (e.keyCode) {
  			case 27:
  				this.hide(), e.preventDefault();
  				break;
  			case 37:
  			case 39:
  				if (!this.keyboardNavigation)break;
  				n = e.keyCode == 37 ? -1 : 1, e.ctrlKey ? (s = this.moveYear(this.date, n), o = this.moveYear(this.viewDate, n)) : e.shiftKey ? (s = this.moveMonth(this.date, n), o = this.moveMonth(this.viewDate, n)) : (s = new Date(this.date), s.setUTCDate(this.date.getUTCDate() + n), o = new Date(this.viewDate), o.setUTCDate(this.viewDate.getUTCDate() + n)), this.dateWithinRange(s) && (this.date = s, this.viewDate = o, this.setValue(), this.update(), e.preventDefault(), t = !0);
  				break;
  			case 38:
  			case 40:
  				if (!this.keyboardNavigation)break;
  				n = e.keyCode == 38 ? -1 : 1, e.ctrlKey ? (s = this.moveYear(this.date, n), o = this.moveYear(this.viewDate, n)) : e.shiftKey ? (s = this.moveMonth(this.date, n), o = this.moveMonth(this.viewDate, n)) : (s = new Date(this.date), s.setUTCDate(this.date.getUTCDate() + n * 7), o = new Date(this.viewDate), o.setUTCDate(this.viewDate.getUTCDate() + n * 7)), this.dateWithinRange(s) && (this.date = s, this.viewDate = o, this.setValue(), this.update(), e.preventDefault(), t = !0);
  				break;
  			case 13:
  				this.hide(), e.preventDefault();
  				break;
  			case 9:
  				this.hide()
  		}
  		if (t) {
  			this.element.trigger({type: "changeDate", date: this.date});
  			var u;
  			this.isInput ? u = this.element : this.component && (u = this.element.find("input")), u && u.change()
  		}
  	}, showMode: function (e) {
  		e && (this.viewMode = Math.max(0, Math.min(2, this.viewMode + e))), this.picker.find(">div").hide().filter(".datepicker-" + s.modes[this.viewMode].clsName).css("display", "block"), this.updateNavArrows()
  	}}, e.fn.datepicker = function (t) {
  		var n = Array.apply(null, arguments);
  		return n.shift(), this.each(function () {
  			var i = e(this), s = i.data("datepicker"), o = typeof t == "object" && t;
  			s || i.data("datepicker", s = new r(this, e.extend({}, e.fn.datepicker.defaults, o))), typeof t == "string" && typeof s[t] == "function" && s[t].apply(s, n)
  		})
  	}, e.fn.datepicker.defaults = {}, e.fn.datepicker.Constructor = r;
  	var i = e.fn.datepicker.dates = {en: {days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], today: "Today"}}, s = {modes: [
  		{clsName: "days", navFnc: "Month", navStep: 1},
  		{clsName: "months", navFnc: "FullYear", navStep: 1},
  		{clsName: "years", navFnc: "FullYear", navStep: 10}
  	], isLeapYear: function (e) {
  		return e % 4 === 0 && e % 100 !== 0 || e % 400 === 0
  	}, getDaysInMonth: function (e, t) {
  		return[31, s.isLeapYear(e) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][t]
  	}, validParts: /dd?|mm?|MM?|yy(?:yy)?/g, nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\r]+/g, parseFormat: function (e) {
  		var t = e.replace(this.validParts, "\0").split("\0"), n = e.match(this.validParts);
  		if (!t || !t.length || !n || n.length == 0)throw new Error("Invalid date format.");
  		return{separators: t, parts: n}
  	}, parseDate: function (n, s, o) {
  		if (n instanceof Date)return n;
  		if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(n)) {
  			var u = /([-+]\d+)([dmwy])/, a = n.match(/([-+]\d+)([dmwy])/g), f, l;
  			n = new Date;
  			for (var c = 0; c < a.length; c++) {
  				f = u.exec(a[c]), l = parseInt(f[1]);
  				switch (f[2]) {
  					case"d":
  						n.setUTCDate(n.getUTCDate() + l);
  						break;
  					case"m":
  						n = r.prototype.moveMonth.call(r.prototype, n, l);
  						break;
  					case"w":
  						n.setUTCDate(n.getUTCDate() + l * 7);
  						break;
  					case"y":
  						n = r.prototype.moveYear.call(r.prototype, n, l)
  				}
  			}
  			return t(n.getUTCFullYear(), n.getUTCMonth(), n.getUTCDate(), 0, 0, 0)
  		}
  		var a = n && n.match(this.nonpunctuation) || [], n = new Date, h = {}, p = ["yyyy", "yy", "M", "MM", "m", "mm", "d", "dd"], d = {yyyy: function (e, t) {
  			return e.setUTCFullYear(t)
  		}, yy: function (e, t) {
  			return e.setUTCFullYear(2e3 + t)
  		}, m: function (e, t) {
  			t -= 1;
  			while (t < 0)t += 12;
  			t %= 12, e.setUTCMonth(t);
  			while (e.getUTCMonth() != t)e.setUTCDate(e.getUTCDate() - 1);
  			return e
  		}, d: function (e, t) {
  			return e.setUTCDate(t)
  		}}, v, m, f;
  		d.M = d.MM = d.mm = d.m, d.dd = d.d, n = t(n.getFullYear(), n.getMonth(), n.getDate(), 0, 0, 0);
  		if (a.length == s.parts.length) {
  			for (var c = 0, g = s.parts.length; c < g; c++) {
  				v = parseInt(a[c], 10), f = s.parts[c];
  				if (isNaN(v))switch (f) {
  					case"MM":
  						m = e(i[o].months).filter(function () {
  							var e = this.slice(0, a[c].length), t = a[c].slice(0, e.length);
  							return e == t
  						}), v = e.inArray(m[0], i[o].months) + 1;
  						break;
  					case"M":
  						m = e(i[o].monthsShort).filter(function () {
  							var e = this.slice(0, a[c].length), t = a[c].slice(0, e.length);
  							return e == t
  						}), v = e.inArray(m[0], i[o].monthsShort) + 1
  				}
  				h[f] = v
  			}
  			for (var c = 0, y; c < p.length; c++)y = p[c], y in h && d[y](n, h[y])
  		}
  		return n
  	}, formatDate: function (t, n, r) {
  		var s = {d: t.getUTCDate(), m: t.getUTCMonth() + 1, M: i[r].monthsShort[t.getUTCMonth()], MM: i[r].months[t.getUTCMonth()], yy: t.getUTCFullYear().toString().substring(2), yyyy: t.getUTCFullYear()};
  		s.dd = (s.d < 10 ? "0" : "") + s.d, s.mm = (s.m < 10 ? "0" : "") + s.m;
  		var t = [], o = e.extend([], n.separators);
  		for (var u = 0, a = n.parts.length; u < a; u++)o.length && t.push(o.shift()), t.push(s[n.parts[u]]);
  		return t.join("")
  	}, headTemplate: '<thead><tr><th class="prev"><i class="icon-arrow-left"/></th><th colspan="5" class="switch"></th><th class="next"><i class="icon-arrow-right"/></th></tr></thead>', contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>', footTemplate: '<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'};
  	s.template = '<div class="datepicker"><div class="datepicker-days"><table class=" table-condensed">' + s.headTemplate + "<tbody></tbody>" + s.footTemplate + "</table>" + "</div>" + '<div class="datepicker-months">' + '<table class="table-condensed">' + s.headTemplate + s.contTemplate + s.footTemplate + "</table>" + "</div>" + '<div class="datepicker-years">' + '<table class="table-condensed">' + s.headTemplate + s.contTemplate + s.footTemplate + "</table>" + "</div>" + "</div>", e.fn.datepicker.DPGlobal = s
  }(window.jQuery);