MapperTest/Code

//
//JS
/* ===================================================
 * bootstrap-transition.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#transitions
 * ===================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================== */
!function ($) {
 "use strict"; // jshint ;_;
 /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
 * ======================================================= */
 $(function () {
 $.support.transition = (function () {
 var transitionEnd = (function () {
 var el = document.createElement('bootstrap')
 , transEndEventNames = {
 'WebkitTransition' : 'webkitTransitionEnd'
 , 'MozTransition' : 'transitionend'
 , 'OTransition' : 'oTransitionEnd otransitionend'
 , 'transition' : 'transitionend'
 }
 , name
 for (name in transEndEventNames){
 if (el.style[name] !== undefined) {
 return transEndEventNames[name]
 }
 }
 }())
 return transitionEnd && {
 end: transitionEnd
 }
 })()
 })
}(window.jQuery);/* ==========================================================
 * bootstrap-alert.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#alerts
 * ==========================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================== */
!function ($) {
 "use strict"; // jshint ;_;
 /* ALERT CLASS DEFINITION
 * ====================== */
 var dismiss = '[data-dismiss="alert"]'
 , Alert = function (el) {
 $(el).on('click', dismiss, this.close)
 }
 Alert.prototype.close = function (e) {
 var $this = $(this)
 , selector = $this.attr('data-target')
 , $parent
 if (!selector) {
 selector = $this.attr('href')
 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ) //strip for ie7
 }
 $parent = $(selector)
 e && e.preventDefault()
 $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
 $parent.trigger(e = $.Event('close'))
 if (e.isDefaultPrevented()) return
 $parent.removeClass('in')
 function removeElement() {
 $parent
 .trigger('closed')
 .remove()
 }
 $.support.transition && $parent.hasClass('fade') ?
 $parent.on($.support.transition.end, removeElement) :
 removeElement()
 }
 /* ALERT PLUGIN DEFINITION
 * ======================= */
 var old = $.fn.alert
 $.fn.alert = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('alert')
 if (!data) $this.data('alert', (data = new Alert(this)))
 if (typeof option == 'string') data[option].call($this)
 })
 }
 $.fn.alert.Constructor = Alert
 /* ALERT NO CONFLICT
 * ================= */
 $.fn.alert.noConflict = function () {
 $.fn.alert = old
 return this
 }
 /* ALERT DATA-API
 * ============== */
 $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
}(window.jQuery);/* ============================================================
 * bootstrap-button.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#buttons
 * ============================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============================================================ */
!function ($) {
 "use strict"; // jshint ;_;
 /* BUTTON PUBLIC CLASS DEFINITION
 * ============================== */
 var Button = function (element, options) {
 this.$element = $(element)
 this.options = $.extend({}, $.fn.button.defaults, options)
 }
 Button.prototype.setState = function (state) {
 var d = 'disabled'
 , $el = this.$element
 , data = $el.data()
 , val = $el.is('input') ? 'val' : 'html'
 state = state + 'Text'
 data.resetText || $el.data('resetText', $el[val]())
 $el[val](data[state] || this.options[state])
 // push to event loop to allow forms to submit
 setTimeout(function () {
 state == 'loadingText' ?
 $el.addClass(d).attr(d, d) :
 $el.removeClass(d).removeAttr(d)
 }, 0)
 }
 Button.prototype.toggle = function () {
 var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
 $parent && $parent
 .find('.active')
 .removeClass('active')
 this.$element.toggleClass('active')
 }
 /* BUTTON PLUGIN DEFINITION
 * ======================== */
 var old = $.fn.button
 $.fn.button = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('button')
 , options = typeof option == 'object' && option
 if (!data) $this.data('button', (data = new Button(this, options)))
 if (option == 'toggle') data.toggle()
 else if (option) data.setState(option)
 })
 }
 $.fn.button.defaults = {
 loadingText: 'loading...'
 }
 $.fn.button.Constructor = Button
 /* BUTTON NO CONFLICT
 * ================== */
 $.fn.button.noConflict = function () {
 $.fn.button = old
 return this
 }
 /* BUTTON DATA-API
 * =============== */
 $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
 var $btn = $(e.target)
 if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
 $btn.button('toggle')
 })
}(window.jQuery);/* ==========================================================
 * bootstrap-carousel.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#carousel
 * ==========================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================== */
!function ($) {
 "use strict"; // jshint ;_;
 /* CAROUSEL CLASS DEFINITION
 * ========================= */
 var Carousel = function (element, options) {
 this.$element = $(element)
 this.$indicators = this.$element.find('.carousel-indicators')
 this.options = options
 this.options.pause == 'hover' && this.$element
 .on('mouseenter', $.proxy(this.pause, this))
 .on('mouseleave', $.proxy(this.cycle, this))
 }
 Carousel.prototype = {
 cycle: function (e) {
 if (!e) this.paused = false
 if (this.interval) clearInterval(this.interval);
 this.options.interval
 && !this.paused
 && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
 return this
 }
 , getActiveIndex: function () {
 this.$active = this.$element.find('.item.active')
 this.$items = this.$active.parent().children()
 return this.$items.index(this.$active)
 }
 , to: function (pos) {
 var activeIndex = this.getActiveIndex()
 , that = this
 if (pos > (this.$items.length - 1) || pos < 0) return
 if (this.sliding) {
 return this.$element.one('slid', function () {
 that.to(pos)
 })
 }
 if (activeIndex == pos) {
 return this.pause().cycle()
 }
 return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
 }
 , pause: function (e) {
 if (!e) this.paused = true
 if (this.$element.find('.next, .prev').length && $.support.transition.end) {
 this.$element.trigger($.support.transition.end)
 this.cycle(true)
 }
 clearInterval(this.interval)
 this.interval = null
 return this
 }
 , next: function () {
 if (this.sliding) return
 return this.slide('next')
 }
 , prev: function () {
 if (this.sliding) return
 return this.slide('prev')
 }
 , slide: function (type, next) {
 var $active = this.$element.find('.item.active')
 , $next = next || $active[type]()
 , isCycling = this.interval
 , direction = type == 'next' ? 'left' : 'right'
 , fallback = type == 'next' ? 'first' : 'last'
 , that = this
 , e
 this.sliding = true
 isCycling && this.pause()
 $next = $next.length ? $next : this.$element.find('.item')[fallback]()
 e = $.Event('slide', {
 relatedTarget: $next[0]
 , direction: direction
 })
 if ($next.hasClass('active')) return
 if (this.$indicators.length) {
 this.$indicators.find('.active').removeClass('active')
 this.$element.one('slid', function () {
 var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
 $nextIndicator && $nextIndicator.addClass('active')
 })
 }
 if ($.support.transition && this.$element.hasClass('slide')) {
 this.$element.trigger(e)
 if (e.isDefaultPrevented()) return
 $next.addClass(type)
 $next[0].offsetWidth // force reflow
 $active.addClass(direction)
 $next.addClass(direction)
 this.$element.one($.support.transition.end, function () {
 $next.removeClass([type, direction].join(' ')).addClass('active')
 $active.removeClass(['active', direction].join(' '))
 that.sliding = false
 setTimeout(function () { that.$element.trigger('slid') }, 0)
 })
 } else {
 this.$element.trigger(e)
 if (e.isDefaultPrevented()) return
 $active.removeClass('active')
 $next.addClass('active')
 this.sliding = false
 this.$element.trigger('slid')
 }
 isCycling && this.cycle()
 return this
 }
 }
 /* CAROUSEL PLUGIN DEFINITION
 * ========================== */
 var old = $.fn.carousel
 $.fn.carousel = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('carousel')
 , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
 , action = typeof option == 'string' ? option : options.slide
 if (!data) $this.data('carousel', (data = new Carousel(this, options)))
 if (typeof option == 'number') data.to(option)
 else if (action) data[action]()
 else if (options.interval) data.pause().cycle()
 })
 }
 $.fn.carousel.defaults = {
 interval: 5000
 , pause: 'hover'
 }
 $.fn.carousel.Constructor = Carousel
 /* CAROUSEL NO CONFLICT
 * ==================== */
 $.fn.carousel.noConflict = function () {
 $.fn.carousel = old
 return this
 }
 /* CAROUSEL DATA-API
 * ================= */
 $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
 var $this = $(this), href
 , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, )) //strip for ie7
 , options = $.extend({}, $target.data(), $this.data())
 , slideIndex
 $target.carousel(options)
 if (slideIndex = $this.attr('data-slide-to')) {
 $target.data('carousel').pause().to(slideIndex).cycle()
 }
 e.preventDefault()
 })
}(window.jQuery);/* =============================================================
 * bootstrap-collapse.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#collapse
 * =============================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============================================================ */
!function ($) {
 "use strict"; // jshint ;_;
 /* COLLAPSE PUBLIC CLASS DEFINITION
 * ================================ */
 var Collapse = function (element, options) {
 this.$element = $(element)
 this.options = $.extend({}, $.fn.collapse.defaults, options)
 if (this.options.parent) {
 this.$parent = $(this.options.parent)
 }
 this.options.toggle && this.toggle()
 }
 Collapse.prototype = {
 constructor: Collapse
 , dimension: function () {
 var hasWidth = this.$element.hasClass('width')
 return hasWidth ? 'width' : 'height'
 }
 , show: function () {
 var dimension
 , scroll
 , actives
 , hasData
 if (this.transitioning || this.$element.hasClass('in')) return
 dimension = this.dimension()
 scroll = $.camelCase(['scroll', dimension].join('-'))
 actives = this.$parent && this.$parent.find('> .accordion-group > .in')
 if (actives && actives.length) {
 hasData = actives.data('collapse')
 if (hasData && hasData.transitioning) return
 actives.collapse('hide')
 hasData || actives.data('collapse', null)
 }
 this.$element[dimension](0)
 this.transition('addClass', $.Event('show'), 'shown')
 $.support.transition && this.$element[dimension](this.$element[0][scroll])
 }
 , hide: function () {
 var dimension
 if (this.transitioning || !this.$element.hasClass('in')) return
 dimension = this.dimension()
 this.reset(this.$element[dimension]())
 this.transition('removeClass', $.Event('hide'), 'hidden')
 this.$element[dimension](0)
 }
 , reset: function (size) {
 var dimension = this.dimension()
 this.$element
 .removeClass('collapse')
 [dimension](size || 'auto')
 [0].offsetWidth
 this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
 return this
 }
 , transition: function (method, startEvent, completeEvent) {
 var that = this
 , complete = function () {
 if (startEvent.type == 'show') that.reset()
 that.transitioning = 0
 that.$element.trigger(completeEvent)
 }
 this.$element.trigger(startEvent)
 if (startEvent.isDefaultPrevented()) return
 this.transitioning = 1
 this.$element[method]('in')
 $.support.transition && this.$element.hasClass('collapse') ?
 this.$element.one($.support.transition.end, complete) :
 complete()
 }
 , toggle: function () {
 this[this.$element.hasClass('in') ? 'hide' : 'show']()
 }
 }
 /* COLLAPSE PLUGIN DEFINITION
 * ========================== */
 var old = $.fn.collapse
 $.fn.collapse = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('collapse')
 , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
 if (!data) $this.data('collapse', (data = new Collapse(this, options)))
 if (typeof option == 'string') data[option]()
 })
 }
 $.fn.collapse.defaults = {
 toggle: true
 }
 $.fn.collapse.Constructor = Collapse
 /* COLLAPSE NO CONFLICT
 * ==================== */
 $.fn.collapse.noConflict = function () {
 $.fn.collapse = old
 return this
 }
 /* COLLAPSE DATA-API
 * ================= */
 $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
 var $this = $(this), href
 , target = $this.attr('data-target')
 || e.preventDefault()
 || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, ) //strip for ie7
 , option = $(target).data('collapse') ? 'toggle' : $this.data()
 $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
 $(target).collapse(option)
 })
}(window.jQuery);/* ============================================================
 * bootstrap-dropdown.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#dropdowns
 * ============================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============================================================ */
!function ($) {
 "use strict"; // jshint ;_;
 /* DROPDOWN CLASS DEFINITION
 * ========================= */
 var toggle = '[data-toggle=dropdown]'
 , Dropdown = function (element) {
 var $el = $(element).on('click.dropdown.data-api', this.toggle)
 $('html').on('click.dropdown.data-api', function () {
 $el.parent().removeClass('open')
 })
 }
 Dropdown.prototype = {
 constructor: Dropdown
 , toggle: function (e) {
 var $this = $(this)
 , $parent
 , isActive
 if ($this.is('.disabled, :disabled')) return
 $parent = getParent($this)
 isActive = $parent.hasClass('open')
 clearMenus()
 if (!isActive) {
 if ('ontouchstart' in document.documentElement) {
 // if mobile we we use a backdrop because click events don't delegate
 $('').insertBefore($(this)).on('click', clearMenus)
 }
 $parent.toggleClass('open')
 }
 $this.focus()
 return false
 }
 , keydown: function (e) {
 var $this
 , $items
 , $active
 , $parent
 , isActive
 , index
 if (!/(38|40|27)/.test(e.keyCode)) return
 $this = $(this)
 e.preventDefault()
 e.stopPropagation()
 if ($this.is('.disabled, :disabled')) return
 $parent = getParent($this)
 isActive = $parent.hasClass('open')
 if (!isActive || (isActive && e.keyCode == 27)) {
 if (e.which == 27) $parent.find(toggle).focus()
 return $this.click()
 }
 $items = $('[role=menu] li:not(.divider):visible a', $parent)
 if (!$items.length) return
 index = $items.index($items.filter(':focus'))
 if (e.keyCode == 38 && index > 0) index-- // up
 if (e.keyCode == 40 && index < $items.length - 1) index++ // down
 if (!~index) index = 0
 $items
 .eq(index)
 .focus()
 }
 }
 function clearMenus() {
 $('.dropdown-backdrop').remove()
 $(toggle).each(function () {
 getParent($(this)).removeClass('open')
 })
 }
 function getParent($this) {
 var selector = $this.attr('data-target')
 , $parent
 if (!selector) {
 selector = $this.attr('href')
 selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, ) //strip for ie7
 }
 $parent = selector && $(selector)
 if (!$parent || !$parent.length) $parent = $this.parent()
 return $parent
 }
 /* DROPDOWN PLUGIN DEFINITION
 * ========================== */
 var old = $.fn.dropdown
 $.fn.dropdown = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('dropdown')
 if (!data) $this.data('dropdown', (data = new Dropdown(this)))
 if (typeof option == 'string') data[option].call($this)
 })
 }
 $.fn.dropdown.Constructor = Dropdown
 /* DROPDOWN NO CONFLICT
 * ==================== */
 $.fn.dropdown.noConflict = function () {
 $.fn.dropdown = old
 return this
 }
 /* APPLY TO STANDARD DROPDOWN ELEMENTS
 * =================================== */
 $(document)
 .on('click.dropdown.data-api', clearMenus)
 .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
 .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
 .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
}(window.jQuery);
/* =========================================================
 * bootstrap-modal.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#modals
 * =========================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================= */
!function ($) {
 "use strict"; // jshint ;_;
 /* MODAL CLASS DEFINITION
 * ====================== */
 var Modal = function (element, options) {
 this.options = options
 this.$element = $(element)
 .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
 this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
 }
 Modal.prototype = {
 constructor: Modal
 , toggle: function () {
 return this[!this.isShown ? 'show' : 'hide']()
 }
 , show: function () {
 var that = this
 , e = $.Event('show')
 this.$element.trigger(e)
 if (this.isShown || e.isDefaultPrevented()) return
 this.isShown = true
 this.escape()
 this.backdrop(function () {
 var transition = $.support.transition && that.$element.hasClass('fade')
 if (!that.$element.parent().length) {
 that.$element.appendTo(document.body) //don't move modals dom position
 }
 that.$element.show()
 if (transition) {
 that.$element[0].offsetWidth // force reflow
 }
 that.$element
 .addClass('in')
 .attr('aria-hidden', false)
 that.enforceFocus()
 transition ?
 that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
 that.$element.focus().trigger('shown')
 })
 }
 , hide: function (e) {
 e && e.preventDefault()
 var that = this
 e = $.Event('hide')
 this.$element.trigger(e)
 if (!this.isShown || e.isDefaultPrevented()) return
 this.isShown = false
 this.escape()
 $(document).off('focusin.modal')
 this.$element
 .removeClass('in')
 .attr('aria-hidden', true)
 $.support.transition && this.$element.hasClass('fade') ?
 this.hideWithTransition() :
 this.hideModal()
 }
 , enforceFocus: function () {
 var that = this
 $(document).on('focusin.modal', function (e) {
 if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
 that.$element.focus()
 }
 })
 }
 , escape: function () {
 var that = this
 if (this.isShown && this.options.keyboard) {
 this.$element.on('keyup.dismiss.modal', function ( e ) {
 e.which == 27 && that.hide()
 })
 } else if (!this.isShown) {
 this.$element.off('keyup.dismiss.modal')
 }
 }
 , hideWithTransition: function () {
 var that = this
 , timeout = setTimeout(function () {
 that.$element.off($.support.transition.end)
 that.hideModal()
 }, 500)
 this.$element.one($.support.transition.end, function () {
 clearTimeout(timeout)
 that.hideModal()
 })
 }
 , hideModal: function () {
 var that = this
 this.$element.hide()
 this.backdrop(function () {
 that.removeBackdrop()
 that.$element.trigger('hidden')
 })
 }
 , removeBackdrop: function () {
 this.$backdrop && this.$backdrop.remove()
 this.$backdrop = null
 }
 , backdrop: function (callback) {
 var that = this
 , animate = this.$element.hasClass('fade') ? 'fade' : ''
 if (this.isShown && this.options.backdrop) {
 var doAnimate = $.support.transition && animate
 this.$backdrop = $('')
 .appendTo(document.body)
 this.$backdrop.click(
 this.options.backdrop == 'static' ?
 $.proxy(this.$element[0].focus, this.$element[0])
 : $.proxy(this.hide, this)
 )
 if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
 this.$backdrop.addClass('in')
 if (!callback) return
 doAnimate ?
 this.$backdrop.one($.support.transition.end, callback) :
 callback()
 } else if (!this.isShown && this.$backdrop) {
 this.$backdrop.removeClass('in')
 $.support.transition && this.$element.hasClass('fade')?
 this.$backdrop.one($.support.transition.end, callback) :
 callback()
 } else if (callback) {
 callback()
 }
 }
 }
 /* MODAL PLUGIN DEFINITION
 * ======================= */
 var old = $.fn.modal
 $.fn.modal = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('modal')
 , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
 if (!data) $this.data('modal', (data = new Modal(this, options)))
 if (typeof option == 'string') data[option]()
 else if (options.show) data.show()
 })
 }
 $.fn.modal.defaults = {
 backdrop: true
 , keyboard: true
 , show: true
 }
 $.fn.modal.Constructor = Modal
 /* MODAL NO CONFLICT
 * ================= */
 $.fn.modal.noConflict = function () {
 $.fn.modal = old
 return this
 }
 /* MODAL DATA-API
 * ============== */
 $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
 var $this = $(this)
 , href = $this.attr('href')
 , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ))) //strip for ie7
 , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
 e.preventDefault()
 $target
 .modal(option)
 .one('hide', function () {
 $this.focus()
 })
 })
}(window.jQuery);
/* ===========================================================
 * bootstrap-tooltip.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#tooltips
 * Inspired by the original jQuery.tipsy by Jason Frame
 * ===========================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================== */
!function ($) {
 "use strict"; // jshint ;_;
 /* TOOLTIP PUBLIC CLASS DEFINITION
 * =============================== */
 var Tooltip = function (element, options) {
 this.init('tooltip', element, options)
 }
 Tooltip.prototype = {
 constructor: Tooltip
 , init: function (type, element, options) {
 var eventIn
 , eventOut
 , triggers
 , trigger
 , i
 this.type = type
 this.$element = $(element)
 this.options = this.getOptions(options)
 this.enabled = true
 triggers = this.options.trigger.split(' ')
 for (i = triggers.length; i--;) {
 trigger = triggers[i]
 if (trigger == 'click') {
 this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
 } else if (trigger != 'manual') {
 eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
 eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
 this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
 this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
 }
 }
 this.options.selector ?
 (this._options = $.extend({}, this.options, { trigger: 'manual', selector: })) :
 this.fixTitle()
 }
 , getOptions: function (options) {
 options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
 if (options.delay && typeof options.delay == 'number') {
 options.delay = {
 show: options.delay
 , hide: options.delay
 }
 }
 return options
 }
 , enter: function (e) {
 var defaults = $.fn[this.type].defaults
 , options = {}
 , self
 this._options && $.each(this._options, function (key, value) {
 if (defaults[key] != value) options[key] = value
 }, this)
 self = $(e.currentTarget)[this.type](options).data(this.type)
 if (!self.options.delay || !self.options.delay.show) return self.show()
 clearTimeout(this.timeout)
 self.hoverState = 'in'
 this.timeout = setTimeout(function() {
 if (self.hoverState == 'in') self.show()
 }, self.options.delay.show)
 }
 , leave: function (e) {
 var self = $(e.currentTarget)[this.type](this._options).data(this.type)
 if (this.timeout) clearTimeout(this.timeout)
 if (!self.options.delay || !self.options.delay.hide) return self.hide()
 self.hoverState = 'out'
 this.timeout = setTimeout(function() {
 if (self.hoverState == 'out') self.hide()
 }, self.options.delay.hide)
 }
 , show: function () {
 var $tip
 , pos
 , actualWidth
 , actualHeight
 , placement
 , tp
 , e = $.Event('show')
 if (this.hasContent() && this.enabled) {
 this.$element.trigger(e)
 if (e.isDefaultPrevented()) return
 $tip = this.tip()
 this.setContent()
 if (this.options.animation) {
 $tip.addClass('fade')
 }
 placement = typeof this.options.placement == 'function' ?
 this.options.placement.call(this, $tip[0], this.$element[0]) :
 this.options.placement
 $tip
 .detach()
 .css({ top: 0, left: 0, display: 'block' })
 this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
 pos = this.getPosition()
 actualWidth = $tip[0].offsetWidth
 actualHeight = $tip[0].offsetHeight
 switch (placement) {
 case 'bottom':
 tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
 break
 case 'top':
 tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
 break
 case 'left':
 tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
 break
 case 'right':
 tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
 break
 }
 this.applyPlacement(tp, placement)
 this.$element.trigger('shown')
 }
 }
 , applyPlacement: function(offset, placement){
 var $tip = this.tip()
 , width = $tip[0].offsetWidth
 , height = $tip[0].offsetHeight
 , actualWidth
 , actualHeight
 , delta
 , replace
 $tip
 .offset(offset)
 .addClass(placement)
 .addClass('in')
 actualWidth = $tip[0].offsetWidth
 actualHeight = $tip[0].offsetHeight
 if (placement == 'top' && actualHeight != height) {
 offset.top = offset.top + height - actualHeight
 replace = true
 }
 if (placement == 'bottom' || placement == 'top') {
 delta = 0
 if (offset.left < 0){
 delta = offset.left * -2
 offset.left = 0
 $tip.offset(offset)
 actualWidth = $tip[0].offsetWidth
 actualHeight = $tip[0].offsetHeight
 }
 this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
 } else {
 this.replaceArrow(actualHeight - height, actualHeight, 'top')
 }
 if (replace) $tip.offset(offset)
 }
 , replaceArrow: function(delta, dimension, position){
 this
 .arrow()
 .css(position, delta ? (50 * (1 - delta / dimension) + "%") : )
 }
 , setContent: function () {
 var $tip = this.tip()
 , title = this.getTitle()
 $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
 $tip.removeClass('fade in top bottom left right')
 }
 , hide: function () {
 var that = this
 , $tip = this.tip()
 , e = $.Event('hide')
 this.$element.trigger(e)
 if (e.isDefaultPrevented()) return
 $tip.removeClass('in')
 function removeWithAnimation() {
 var timeout = setTimeout(function () {
 $tip.off($.support.transition.end).detach()
 }, 500)
 $tip.one($.support.transition.end, function () {
 clearTimeout(timeout)
 $tip.detach()
 })
 }
 $.support.transition && this.$tip.hasClass('fade') ?
 removeWithAnimation() :
 $tip.detach()
 this.$element.trigger('hidden')
 return this
 }
 , fixTitle: function () {
 var $e = this.$element
 if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
 $e.attr('data-original-title', $e.attr('title') || ).attr('title', )
 }
 }
 , hasContent: function () {
 return this.getTitle()
 }
 , getPosition: function () {
 var el = this.$element[0]
 return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
 width: el.offsetWidth
 , height: el.offsetHeight
 }, this.$element.offset())
 }
 , getTitle: function () {
 var title
 , $e = this.$element
 , o = this.options
 title = $e.attr('data-original-title')
 || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
 return title
 }
 , tip: function () {
 return this.$tip = this.$tip || $(this.options.template)
 }
 , arrow: function(){
 return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
 }
 , validate: function () {
 if (!this.$element[0].parentNode) {
 this.hide()
 this.$element = null
 this.options = null
 }
 }
 , enable: function () {
 this.enabled = true
 }
 , disable: function () {
 this.enabled = false
 }
 , toggleEnabled: function () {
 this.enabled = !this.enabled
 }
 , toggle: function (e) {
 var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
 self.tip().hasClass('in') ? self.hide() : self.show()
 }
 , destroy: function () {
 this.hide().$element.off('.' + this.type).removeData(this.type)
 }
 }
 /* TOOLTIP PLUGIN DEFINITION
 * ========================= */
 var old = $.fn.tooltip
 $.fn.tooltip = function ( option ) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('tooltip')
 , options = typeof option == 'object' && option
 if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
 if (typeof option == 'string') data[option]()
 })
 }
 $.fn.tooltip.Constructor = Tooltip
 $.fn.tooltip.defaults = {
 animation: true
 , placement: 'top'
 , selector: false
 , template: ''
 , trigger: 'hover focus'
 , title: ''
 , delay: 0
 , html: false
 , container: false
 }
 /* TOOLTIP NO CONFLICT
 * =================== */
 $.fn.tooltip.noConflict = function () {
 $.fn.tooltip = old
 return this
 }
}(window.jQuery);
/* ===========================================================
 * bootstrap-popover.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#popovers
 * ===========================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =========================================================== */
!function ($) {
 "use strict"; // jshint ;_;
 /* POPOVER PUBLIC CLASS DEFINITION
 * =============================== */
 var Popover = function (element, options) {
 this.init('popover', element, options)
 }
 /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
 ========================================== */
 Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
 constructor: Popover
 , setContent: function () {
 var $tip = this.tip()
 , title = this.getTitle()
 , content = this.getContent()
 $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
 $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
 $tip.removeClass('fade top bottom left right in')
 }
 , hasContent: function () {
 return this.getTitle() || this.getContent()
 }
 , getContent: function () {
 var content
 , $e = this.$element
 , o = this.options
 content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
 || $e.attr('data-content')
 return content
 }
 , tip: function () {
 if (!this.$tip) {
 this.$tip = $(this.options.template)
 }
 return this.$tip
 }
 , destroy: function () {
 this.hide().$element.off('.' + this.type).removeData(this.type)
 }
 })
 /* POPOVER PLUGIN DEFINITION
 * ======================= */
 var old = $.fn.popover
 $.fn.popover = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('popover')
 , options = typeof option == 'object' && option
 if (!data) $this.data('popover', (data = new Popover(this, options)))
 if (typeof option == 'string') data[option]()
 })
 }
 $.fn.popover.Constructor = Popover
 $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
 placement: 'right'
 , trigger: 'click'
 , content: ''
 , template: ''
 })
 /* POPOVER NO CONFLICT
 * =================== */
 $.fn.popover.noConflict = function () {
 $.fn.popover = old
 return this
 }
}(window.jQuery);
/* =============================================================
 * bootstrap-scrollspy.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#scrollspy
 * =============================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============================================================== */
!function ($) {
 "use strict"; // jshint ;_;
 /* SCROLLSPY CLASS DEFINITION
 * ========================== */
 function ScrollSpy(element, options) {
 var process = $.proxy(this.process, this)
 , $element = $(element).is('body') ? $(window) : $(element)
 , href
 this.options = $.extend({}, $.fn.scrollspy.defaults, options)
 this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
 this.selector = (this.options.target
 || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, )) //strip for ie7
 || ) + ' .nav li > a'
 this.$body = $('body')
 this.refresh()
 this.process()
 }
 ScrollSpy.prototype = {
 constructor: ScrollSpy
 , refresh: function () {
 var self = this
 , $targets
 this.offsets = $([])
 this.targets = $([])
 $targets = this.$body
 .find(this.selector)
 .map(function () {
 var $el = $(this)
 , href = $el.data('target') || $el.attr('href')
 , $href = /^#\w/.test(href) && $(href)
 return ( $href
 && $href.length
 && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
 })
 .sort(function (a, b) { return a[0] - b[0] })
 .each(function () {
 self.offsets.push(this[0])
 self.targets.push(this[1])
 })
 }
 , process: function () {
 var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
 , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
 , maxScroll = scrollHeight - this.$scrollElement.height()
 , offsets = this.offsets
 , targets = this.targets
 , activeTarget = this.activeTarget
 , i
 if (scrollTop >= maxScroll) {
 return activeTarget != (i = targets.last()[0])
 && this.activate ( i )
 }
 for (i = offsets.length; i--;) {
 activeTarget != targets[i]
 && scrollTop >= offsets[i]
 && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
 && this.activate( targets[i] )
 }
 }
 , activate: function (target) {
 var active
 , selector
 this.activeTarget = target
 $(this.selector)
 .parent('.active')
 .removeClass('active')
 selector = this.selector
 + '[data-target="' + target + '"],'
 + this.selector + '[href="' + target + '"]'
 active = $(selector)
 .parent('li')
 .addClass('active')
 if (active.parent('.dropdown-menu').length) {
 active = active.closest('li.dropdown').addClass('active')
 }
 active.trigger('activate')
 }
 }
 /* SCROLLSPY PLUGIN DEFINITION
 * =========================== */
 var old = $.fn.scrollspy
 $.fn.scrollspy = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('scrollspy')
 , options = typeof option == 'object' && option
 if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
 if (typeof option == 'string') data[option]()
 })
 }
 $.fn.scrollspy.Constructor = ScrollSpy
 $.fn.scrollspy.defaults = {
 offset: 10
 }
 /* SCROLLSPY NO CONFLICT
 * ===================== */
 $.fn.scrollspy.noConflict = function () {
 $.fn.scrollspy = old
 return this
 }
 /* SCROLLSPY DATA-API
 * ================== */
 $(window).on('load', function () {
 $('[data-spy="scroll"]').each(function () {
 var $spy = $(this)
 $spy.scrollspy($spy.data())
 })
 })
}(window.jQuery);/* ========================================================
 * bootstrap-tab.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#tabs
 * ========================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ======================================================== */
!function ($) {
 "use strict"; // jshint ;_;
 /* TAB CLASS DEFINITION
 * ==================== */
 var Tab = function (element) {
 this.element = $(element)
 }
 Tab.prototype = {
 constructor: Tab
 , show: function () {
 var $this = this.element
 , $ul = $this.closest('ul:not(.dropdown-menu)')
 , selector = $this.attr('data-target')
 , previous
 , $target
 , e
 if (!selector) {
 selector = $this.attr('href')
 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ) //strip for ie7
 }
 if ( $this.parent('li').hasClass('active') ) return
 previous = $ul.find('.active:last a')[0]
 e = $.Event('show', {
 relatedTarget: previous
 })
 $this.trigger(e)
 if (e.isDefaultPrevented()) return
 $target = $(selector)
 this.activate($this.parent('li'), $ul)
 this.activate($target, $target.parent(), function () {
 $this.trigger({
 type: 'shown'
 , relatedTarget: previous
 })
 })
 }
 , activate: function ( element, container, callback) {
 var $active = container.find('> .active')
 , transition = callback
 && $.support.transition
 && $active.hasClass('fade')
 function next() {
 $active
 .removeClass('active')
 .find('> .dropdown-menu > .active')
 .removeClass('active')
 element.addClass('active')
 if (transition) {
 element[0].offsetWidth // reflow for transition
 element.addClass('in')
 } else {
 element.removeClass('fade')
 }
 if ( element.parent('.dropdown-menu') ) {
 element.closest('li.dropdown').addClass('active')
 }
 callback && callback()
 }
 transition ?
 $active.one($.support.transition.end, next) :
 next()
 $active.removeClass('in')
 }
 }
 /* TAB PLUGIN DEFINITION
 * ===================== */
 var old = $.fn.tab
 $.fn.tab = function ( option ) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('tab')
 if (!data) $this.data('tab', (data = new Tab(this)))
 if (typeof option == 'string') data[option]()
 })
 }
 $.fn.tab.Constructor = Tab
 /* TAB NO CONFLICT
 * =============== */
 $.fn.tab.noConflict = function () {
 $.fn.tab = old
 return this
 }
 /* TAB DATA-API
 * ============ */
 $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
 e.preventDefault()
 $(this).tab('show')
 })
}(window.jQuery);/* =============================================================
 * bootstrap-typeahead.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#typeahead
 * =============================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============================================================ */
!function($){
 "use strict"; // jshint ;_;
 /* TYPEAHEAD PUBLIC CLASS DEFINITION
 * ================================= */
 var Typeahead = function (element, options) {
 this.$element = $(element)
 this.options = $.extend({}, $.fn.typeahead.defaults, options)
 this.matcher = this.options.matcher || this.matcher
 this.sorter = this.options.sorter || this.sorter
 this.highlighter = this.options.highlighter || this.highlighter
 this.updater = this.options.updater || this.updater
 this.source = this.options.source
 this.$menu = $(this.options.menu)
 this.shown = false
 this.listen()
 }
 Typeahead.prototype = {
 constructor: Typeahead
 , select: function () {
 var val = this.$menu.find('.active').attr('data-value')
 this.$element
 .val(this.updater(val))
 .change()
 return this.hide()
 }
 , updater: function (item) {
 return item
 }
 , show: function () {
 var pos = $.extend({}, this.$element.position(), {
 height: this.$element[0].offsetHeight
 })
 this.$menu
 .insertAfter(this.$element)
 .css({
 top: pos.top + pos.height
 , left: pos.left
 })
 .show()
 this.shown = true
 return this
 }
 , hide: function () {
 this.$menu.hide()
 this.shown = false
 return this
 }
 , lookup: function (event) {
 var items
 this.query = this.$element.val()
 if (!this.query || this.query.length < this.options.minLength) {
 return this.shown ? this.hide() : this
 }
 items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
 return items ? this.process(items) : this
 }
 , process: function (items) {
 var that = this
 items = $.grep(items, function (item) {
 return that.matcher(item)
 })
 items = this.sorter(items)
 if (!items.length) {
 return this.shown ? this.hide() : this
 }
 return this.render(items.slice(0, this.options.items)).show()
 }
 , matcher: function (item) {
 return ~item.toLowerCase().indexOf(this.query.toLowerCase())
 }
 , sorter: function (items) {
 var beginswith = []
 , caseSensitive = []
 , caseInsensitive = []
 , item
 while (item = items.shift()) {
 if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
 else if (~item.indexOf(this.query)) caseSensitive.push(item)
 else caseInsensitive.push(item)
 }
 return beginswith.concat(caseSensitive, caseInsensitive)
 }
 , highlighter: function (item) {
 var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
 return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
 return '' + match + ''
 })
 }
 , render: function (items) {
 var that = this
 items = $(items).map(function (i, item) {
 i = $(that.options.item).attr('data-value', item)
 i.find('a').html(that.highlighter(item))
 return i[0]
 })
 items.first().addClass('active')
 this.$menu.html(items)
 return this
 }
 , next: function (event) {
 var active = this.$menu.find('.active').removeClass('active')
 , next = active.next()
 if (!next.length) {
 next = $(this.$menu.find('li')[0])
 }
 next.addClass('active')
 }
 , prev: function (event) {
 var active = this.$menu.find('.active').removeClass('active')
 , prev = active.prev()
 if (!prev.length) {
 prev = this.$menu.find('li').last()
 }
 prev.addClass('active')
 }
 , listen: function () {
 this.$element
 .on('focus', $.proxy(this.focus, this))
 .on('blur', $.proxy(this.blur, this))
 .on('keypress', $.proxy(this.keypress, this))
 .on('keyup', $.proxy(this.keyup, this))
 if (this.eventSupported('keydown')) {
 this.$element.on('keydown', $.proxy(this.keydown, this))
 }
 this.$menu
 .on('click', $.proxy(this.click, this))
 .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
 .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
 }
 , eventSupported: function(eventName) {
 var isSupported = eventName in this.$element
 if (!isSupported) {
 this.$element.setAttribute(eventName, 'return;')
 isSupported = typeof this.$element[eventName] === 'function'
 }
 return isSupported
 }
 , move: function (e) {
 if (!this.shown) return
 switch(e.keyCode) {
 case 9: // tab
 case 13: // enter
 case 27: // escape
 e.preventDefault()
 break
 case 38: // up arrow
 e.preventDefault()
 this.prev()
 break
 case 40: // down arrow
 e.preventDefault()
 this.next()
 break
 }
 e.stopPropagation()
 }
 , keydown: function (e) {
 this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
 this.move(e)
 }
 , keypress: function (e) {
 if (this.suppressKeyPressRepeat) return
 this.move(e)
 }
 , keyup: function (e) {
 switch(e.keyCode) {
 case 40: // down arrow
 case 38: // up arrow
 case 16: // shift
 case 17: // ctrl
 case 18: // alt
 break
 case 9: // tab
 case 13: // enter
 if (!this.shown) return
 this.select()
 break
 case 27: // escape
 if (!this.shown) return
 this.hide()
 break
 default:
 this.lookup()
 }
 e.stopPropagation()
 e.preventDefault()
 }
 , focus: function (e) {
 this.focused = true
 }
 , blur: function (e) {
 this.focused = false
 if (!this.mousedover && this.shown) this.hide()
 }
 , click: function (e) {
 e.stopPropagation()
 e.preventDefault()
 this.select()
 this.$element.focus()
 }
 , mouseenter: function (e) {
 this.mousedover = true
 this.$menu.find('.active').removeClass('active')
 $(e.currentTarget).addClass('active')
 }
 , mouseleave: function (e) {
 this.mousedover = false
 if (!this.focused && this.shown) this.hide()
 }
 }
 /* TYPEAHEAD PLUGIN DEFINITION
 * =========================== */
 var old = $.fn.typeahead
 $.fn.typeahead = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('typeahead')
 , options = typeof option == 'object' && option
 if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
 if (typeof option == 'string') data[option]()
 })
 }
 $.fn.typeahead.defaults = {
 source: []
 , items: 8
 , menu: ''
 , item: '<a href="#"></a>'
 , minLength: 1
 }
 $.fn.typeahead.Constructor = Typeahead
 /* TYPEAHEAD NO CONFLICT
 * =================== */
 $.fn.typeahead.noConflict = function () {
 $.fn.typeahead = old
 return this
 }
 /* TYPEAHEAD DATA-API
 * ================== */
 $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
 var $this = $(this)
 if ($this.data('typeahead')) return
 $this.typeahead($this.data())
 })
}(window.jQuery);
/* ==========================================================
 * bootstrap-affix.js v2.3.2
 * http://getbootstrap.com/2.3.2/javascript.html#affix
 * ==========================================================
 * Copyright 2013 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================== */
!function ($) {
 "use strict"; // jshint ;_;
 /* AFFIX CLASS DEFINITION
 * ====================== */
 var Affix = function (element, options) {
 this.options = $.extend({}, $.fn.affix.defaults, options)
 this.$window = $(window)
 .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
 .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
 this.$element = $(element)
 this.checkPosition()
 }
 Affix.prototype.checkPosition = function () {
 if (!this.$element.is(':visible')) return
 var scrollHeight = $(document).height()
 , scrollTop = this.$window.scrollTop()
 , position = this.$element.offset()
 , offset = this.options.offset
 , offsetBottom = offset.bottom
 , offsetTop = offset.top
 , reset = 'affix affix-top affix-bottom'
 , affix
 if (typeof offset != 'object') offsetBottom = offsetTop = offset
 if (typeof offsetTop == 'function') offsetTop = offset.top()
 if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
 affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
 false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
 'top' : false
 if (this.affixed === affix) return
 this.affixed = affix
 this.unpin = affix == 'bottom' ? position.top - scrollTop : null
 this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ))
 }
 /* AFFIX PLUGIN DEFINITION
 * ======================= */
 var old = $.fn.affix
 $.fn.affix = function (option) {
 return this.each(function () {
 var $this = $(this)
 , data = $this.data('affix')
 , options = typeof option == 'object' && option
 if (!data) $this.data('affix', (data = new Affix(this, options)))
 if (typeof option == 'string') data[option]()
 })
 }
 $.fn.affix.Constructor = Affix
 $.fn.affix.defaults = {
 offset: 0
 }
 /* AFFIX NO CONFLICT
 * ================= */
 $.fn.affix.noConflict = function () {
 $.fn.affix = old
 return this
 }
 /* AFFIX DATA-API
 * ============== */
 $(window).on('load', function () {
 $('[data-spy="affix"]').each(function () {
 var $spy = $(this)
 , data = $spy.data()
 data.offset = data.offset || {}
 data.offsetBottom && (data.offset.bottom = data.offsetBottom)
 data.offsetTop && (data.offset.top = data.offsetTop)
 $spy.affix(data)
 })
 })
}(window.jQuery);
//All images need to have this size:
//high resolution images(png) should be 4x in size
var minimap_images_width = 4096;
var minimap_images_height = 4096;
var minimap_mapper_page = 'http://necronianewworld.wikia.com/wiki/MapperTest';
//var minimap_max_x1 = 131;
//var minimap_min_x = 124;
var minimap_max_x1 = 131;
var minimap_min_x = 124;
var minimap_max_y = 129;
var minimap_min_y = 121;
var radix_decimal = 10;
var floor_level_max = 15;
var floor_level_min = 0;
var floor_level_ground = 7;
var initial_pos_x1 = 127;
var initial_pos_x2 = 128;
var initial_pos_y1 = 124;
var initial_pos_y2 = 128;
var initial_pos_z = 7;
var minimap_fractional_limit = 512;
var minimap_max_fractional = 511;
var minimap_min_fractional = 0;
var minimap_div_width = 768;
var minimap_div_width_half = 384;
var minimap_div_heigth = 576;
var minimap_div_heigth_half = 288;
minimap_images = [];
minimap_images[0] = [
 'http://images2.wikia.nocookie.net/tibia/en/images/9/97/Minimap_Symbols.gif',
 'http://images4.wikia.nocookie.net/tibia/en/images/6/6c/Minimap_Loading.gif'
];
minimap_images[1] = [
 'https://tibiamaps.github.io/tibia-map-data/floor-00-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-01-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-02-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-03-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-04-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-05-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-06-map.png',
 'http://vignette4.wikia.nocookie.net/necronianewworld/images/c/cb/Floor-07-map.png/revision/latest',
 'https://tibiamaps.github.io/tibia-map-data/floor-08-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-09-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-10-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-11-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-12-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-13-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-14-map.png',
 'https://tibiamaps.github.io/tibia-map-data/floor-15-map.png'
];
minimap_images[4] = [
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 'http://vignette1.wikia.nocookie.net/necronianewworld/images/c/c5/Minimap_Floor_7h.png/revision/latest',
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ''
];
if (typeof Image === 'function') {
 // Image constructor supported, we can preload images
 preload_image = function (src) {
 var img = new Image();
 img.src = src;
 return img;
 };
 preload_image_array = function (arr) {
 var len = arr.length;
 while (len--) {
 preload_image(arr[len]);
 }
 };
 mapper_preload_files = function (ele) {
 var files = minimap_images, len = files.length;
 if (ele.checked) {
 while (len--) {
 if (files[len] && typeof files[len] === 'object') {
 preload_image_array(files[len]);
 }
 }
 }
 };
}
minimap_get_coords = function (url, varname) {
 url = decodeURI(url);
 if (typeof varname == 'undefined') {
 varname = 'coords';
 }
 var pars = [];
 var coords = [];
 var urlParams = url.split(varname + '=');
 urlParams.shift();
 urlParams = urlParams.join().split('&')[0];
 if (varname == 'coords') {
 //0x.1x,2y.3y,4z,5zoom,6zoomm,7centermark
 if (urlParams === || (urlParams = urlParams.split(/[,-]/)).length < 3) {
 coords = [initial_pos_x1, initial_pos_x2, initial_pos_y1, initial_pos_y2, initial_pos_z, 1, 1, 1];
 }
 else {
 pars[0] = parseInt(urlParams[0].split('.')[0] || initial_pos_x1, radix_decimal);
 pars[1] = parseInt(urlParams[0].split('.')[1] || initial_pos_x2, radix_decimal);
 pars[2] = parseInt(urlParams[1].split('.')[0] || initial_pos_y1, radix_decimal);
 pars[3] = parseInt(urlParams[1].split('.')[1] || initial_pos_y2, radix_decimal);
 pars[4] = parseInt(urlParams[2] || initial_pos_z, radix_decimal);
 pars[5] = parseFloat(urlParams[3] || 1);
 pars[6] = parseFloat(urlParams[4] || 1);
 pars[7] = parseInt(urlParams[5] || 1, radix_decimal);
 coords[0] = (pars[0] > minimap_max_x1 || pars[0] < minimap_min_x ? initial_pos_x1 : pars[0]);
 coords[1] = (pars[1] > minimap_max_fractional || pars[1] < minimap_min_fractional ? initial_pos_x2 : pars[1]);
 coords[2] = (pars[2] > minimap_max_y || pars[2] < minimap_min_y ? initial_pos_y1 : pars[2]);
 coords[3] = (pars[3] > minimap_max_fractional || pars[3] < minimap_min_fractional ? initial_pos_y2 : pars[3]);
 coords[4] = (pars[4] > floor_level_max || pars[4] < floor_level_min ? initial_pos_z : pars[4]);
 coords[5] = (pars[5] > 8 || pars[5] < 1 ? 1 : pars[5]);
 coords[6] = (pars[6] > 8 || pars[6] < 0 ? 1 : pars[6]);
 coords[7] = (pars[7] > 1 || pars[7] < 0 ? 1 : pars[7]);
 }
 }
 else if (varname.indexOf('mark') === 0) {
 //Default 0x.1x,2y.3y,4z,5icon,6link
 if (urlParams === || (urlParams = urlParams.split(/[,-]/)).length < 3) {
 coords = [initial_pos_x1, initial_pos_x2, initial_pos_y1, initial_pos_y2, initial_pos_z, 1, ];
 }
 else {
 pars[0] = parseInt(urlParams[0].split('.')[0] || initial_pos_x1, radix_decimal);
 pars[1] = parseInt(urlParams[0].split('.')[1] || initial_pos_x2, radix_decimal);
 pars[2] = parseInt(urlParams[1].split('.')[0] || initial_pos_y1, radix_decimal);
 pars[3] = parseInt(urlParams[1].split('.')[1] || initial_pos_y2, radix_decimal);
 pars[4] = parseInt(urlParams[2] || initial_pos_z, radix_decimal);
 pars[5] = parseInt(urlParams[3] || 1, radix_decimal);
 pars[6] = urlParams[4] || ;
 coords[0] = (pars[0] > minimap_max_x1 || pars[0] < minimap_min_x ? initial_pos_x1 : pars[0]);
 coords[1] = (pars[1] > minimap_max_fractional || pars[1] < minimap_min_fractional ? initial_pos_x2 : pars[1]);
 coords[2] = (pars[2] > minimap_max_y || pars[2] < minimap_min_y ? initial_pos_y1 : pars[2]);
 coords[3] = (pars[3] > minimap_max_fractional || pars[3] < minimap_min_fractional ? initial_pos_y2 : pars[3]);
 coords[4] = (pars[4] > floor_level_max || pars[4] < floor_level_min ? initial_pos_z : pars[4]);
 coords[5] = (pars[5] > 22 || pars[5] < 0 ? 1 : pars[5]);
 }
 }
 return coords;
};
minimap_change_src = function () {
 var fresh = (minimap_read_cookie('minimap_fresh') == '1'), len1 = minimap_images.length, len2, currList;
 if (fresh) {
 while (len1--) {
 currList = minimap_images[len1];
 len2 = currList instanceof Array ? currList.length : 0;
 while (len2--) {
 if (currList[len2]) {
 currList[len2] += "?nocache=" + (+new Date());
 }
 }
 }
 }
};
minimap_center_div = function () {
 var aligner = function (ea) {
 if (ea.css('display') == 'block') {
 var tmp = parseInt((($(window).height() - ea[0].offsetHeight) / 2) + $(window).scrollTop(), radix_decimal);
 tmp = (tmp > 0 ? tmp : 10);
 ea.css({
 position: 'absolute',
 top: tmp,
 left: parseInt((($(window).width() - ea.width()) / 2) + $(window).scrollLeft(), radix_decimal)
 });
 $('#minimap_blackout').css({display: 'block'}).height($(document).height());
 }
 };
 aligner($('#minimap_wp'));
};
var minimap_drago = null;
var minimap_dragos = null;
var minimap_dragms = null;
minimap_dragstart = function () {
 $('#minimap_img').mousedown(function (ev) {
 if (!(minimap_drago = $('#minimap_imgdiv')[0])) {
 return;
 }
 minimap_dragms = {x: ev.pageX, y: ev.pageY};
 minimap_dragos = {x: $(minimap_drago).css('left'), y: $(minimap_drago).css('top')};
 return false;
 });
};
$(document).mouseup(function (ev) {
 if (minimap_drago) {
 minimap_map_data[1] += parseInt((minimap_dragms.x - ev.pageX) / minimap_map_data[5], radix_decimal);
 minimap_map_data[3] += parseInt((minimap_dragms.y - ev.pageY) / minimap_map_data[5], radix_decimal);
 minimap_pos();
 }
 minimap_drago = null;
});
$(document).mousemove(function (ev) {
 if (minimap_drago) {
 minimap_drago.style.left = (parseFloat(minimap_dragos.x) - (minimap_dragms.x - ev.pageX)) + 'px';
 minimap_drago.style.top = (parseFloat(minimap_dragos.y) - (minimap_dragms.y - ev.pageY)) + 'px';
 return false;
 }
});
minimap_map_data = [];
minimap_map_sdata = [];
minimap_data_to_url = function (type) {
 //0x.1x,2y.3y,4z,5zoom,6zoomm,7centermark
 //0x.1x,2y.3y,4z,5icon,6link
 var x, ret;
 if (type === 0) {//Direct Link
 ret = minimap_mapper_page + '?coords=';
 ret += minimap_map_data[0] + '.' + minimap_map_data[1] + '-' + minimap_map_data[2] + '.' + minimap_map_data[3] + '-' +
 minimap_map_data[4] + '-' + minimap_map_data[5] + '-' + minimap_map_data[6] + '-' + minimap_map_data[7];
 if ($('#minimap_marks_enabled').is(':checked')) {
 for (x in minimap_map_data) {
 if (minimap_map_data.hasOwnProperty(x) && typeof minimap_map_data[x] == 'object') {
 ret += '&' + x + '=';
 ret += minimap_map_data[x][0] + '.' + minimap_map_data[x][1] + '-' + minimap_map_data[x][2] + '.' + minimap_map_data[x][3] +
 '-' + minimap_map_data[x][4] + '-' + minimap_map_data[x][5] + (minimap_map_data[x][6] ? '-' + minimap_map_data[x][6] : );
 }
 }
 }
 }
 else if (type == 1) {//Template:Minimap
 ret = '{' + '{Minimap';
 ret += '|x=' + minimap_map_data[0] + '.' + minimap_map_data[1] + '|y=' + minimap_map_data[2] + '.' + minimap_map_data[3] + '|z=' +
 minimap_map_data[4] + '|zoom=' + minimap_map_data[5] + '|zoomm=' + minimap_map_data[6] +
 '|width=' + (1 / minimap_map_data[5]) + '|height=' + (1 / minimap_map_data[5]) +
 '|centermark=' + (minimap_map_data[7] ? 'yes' : 0);
 if ($('#minimap_marks_enabled').is(':checked')) {
 for (x in minimap_map_data) {
 if (minimap_map_data.hasOwnProperty(x) && typeof minimap_map_data[x] == 'object') {
 if (minimap_map_data[4] != minimap_map_data[x][4]) {
 continue;
 }
 ret += '|' + x + '=';
 ret += minimap_map_data[x][0] + '.' + minimap_map_data[x][1] + ',' + minimap_map_data[x][2] + '.' + minimap_map_data[x][3] +
 ',' + minimap_map_data[x][5] + ',' + minimap_map_data[x][6];
 }
 }
 }
 ret += '}' + '}';
 }
 else if (type == 2) {//Wiki Link
 ret = document.getElementById('minimap_tcode3').value.replace(/\s|%20/gi, '_');
 ret = '[' + minimap_data_to_url(0).replace(/\s|%20/gi, '_') + (ret === ? : ' ') + ret + ']';
 }
 else if (type == 3) {//x,y,z
 ret = minimap_map_data[0] + '.' + minimap_map_data[1] + ',' + minimap_map_data[2] + '.' + minimap_map_data[3] + ',' +
 minimap_map_data[4];
 }
 else if (type == 4) {//tibiaml map
 ret = 'http://map.tibiaml.com/?p=' +
 ((minimap_map_data[0] * minimap_fractional_limit) + minimap_map_data[1]) + ',' + ((minimap_map_data[2] * minimap_fractional_limit) + minimap_map_data[3]) + ',' +
 minimap_map_data[4] + ':' + (minimap_map_data[5] > 7 ? 8 : (minimap_map_data[5] > 3 ? 7 : (minimap_map_data[5] > 2 ? 6 : 5)));
 }
 return ret;
};
minimap_mapper_list_click = function () {
 if ($('#minimap_loading').css('display') == 'block') {
 return;
 }
 var e = $('#mapper_list :selected').val();
 e = decodeURI(e).split(',');
 $('#mapper_mark_remove').attr('disabled', false);
 minimap_map_data[0] = parseInt(e[0], radix_decimal);
 minimap_map_data[1] = parseInt(e[1], radix_decimal);
 minimap_map_data[2] = parseInt(e[2], radix_decimal);
 minimap_map_data[3] = parseInt(e[3], radix_decimal);
 minimap_map_data[4] = parseInt(e[4], radix_decimal);
 minimap_pos(false);
};
minimap_read_cookie = function (name) {
 var i, c, cl = document.cookie.split(';');
 for (i = 0; i < cl.length; i++) {
 c = $.trim(cl[i]);
 if (c.indexOf(name + '=') === 0) {
 return c.substring(name.length + 1);
 }
 }
 return null;
};
minimap_write_cookie = function (name, val) {
 var date = new Date();
 date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000));
 date = date.toGMTString();
 document.cookie = name + '=' + val + '; expires=' + date + '; path=/';
};
minimap_codes_update = function (reset_list) {
 var tmp;
 tmp = -1 * (minimap_map_data[4] - 7);
 $('#minimap_current_floor').val((tmp < 1 ? : '+') + tmp);
 $('#minimap_current_coords').val(minimap_data_to_url(3));
 if ($('#minimap_tcode1').size()) {
 $('#minimap_tcode1').val(minimap_data_to_url(0));
 $('#minimap_tcode2').val(minimap_data_to_url(1));
 $('#minimap_tcode4').val(minimap_data_to_url(2));
 if (typeof reset_list == 'undefined' || reset_list) {
 var i = 1;
 tmp = ;
 while (minimap_map_data['mark' + i]) {
 tmp += '<option value="' + encodeURI(minimap_map_data['mark' + i].join(',')) + '">' + i + '</option>';
 i++;
 }
 $('#mapper_list').empty().append(tmp);
 }
 }
};
minimap_pos_b = function (action, value) {
 if ($('#minimap_loading').css('display') == 'block') {
 return;
 }
 var x;
 if (action == 'reset') {
 minimap_map_data = [];
 for (x in minimap_map_sdata) {
 if (minimap_map_sdata.hasOwnProperty(x)) {
 minimap_map_data[x] = (typeof minimap_map_sdata[x] == 'object' ? minimap_map_sdata[x].slice(0) : minimap_map_sdata[x]);
 }
 }
 }
 else if (action == 'we') {
 minimap_map_data[1] += value;
 }
 else if (action == 'ns') {
 minimap_map_data[3] += value;
 }
 else if (action == 'zoom') {
 x = minimap_map_data[5] * value;
 if (x > 8 || x < 1) {
 return;
 }
 minimap_map_data[5] = Math.round(x);
 if (minimap_map_data[5] < 1) {
 minimap_map_data[5] = 1;
 }
 while (minimap_map_data[5] != 1 && minimap_map_data[5] != 2 && minimap_map_data[5] != 4 && minimap_map_data[5] != 8) {
 minimap_map_data[5]--;
 }
 }
 else if (action == 'floor') {
 x = minimap_map_data[4] + value;
 if (x > floor_level_max || x < floor_level_min) {
 return;
 }
 minimap_map_data[4] = x;
 }
 minimap_pos();
};
minimap_pos = function (reset_list) {
 $('#minimap_maindiv').css('display', 'none');
 $('#minimap_loading').css('display', 'block');
 //Adjusts values out of range for x and y
 minimap_map_data[0] = minimap_map_data[0] + Math.floor(minimap_map_data[1] / minimap_div_width_half);
 minimap_map_data[1] = minimap_map_data[1] - (Math.floor(minimap_map_data[1] / minimap_div_width_half) * minimap_div_width_half);
 minimap_map_data[2] = minimap_map_data[2] + Math.floor(minimap_map_data[3] / minimap_div_width_half);
 minimap_map_data[3] = minimap_map_data[3] - (Math.floor(minimap_map_data[3] / minimap_div_width_half) * minimap_div_width_half);
 var hres, d, ch, parss, pars = minimap_map_data;
 var tleft = Math.floor((((pars[0] - minimap_min_x - (1 * (1 / pars[5]))) * minimap_div_width_half) + pars[1]) * pars[5], radix_decimal) + Math.floor(pars[5] / 2);
 var ttop = Math.floor((((pars[2] - minimap_min_y - (0.75 * (1 / pars[5]))) * minimap_div_width_half) + pars[3]) * pars[5], radix_decimal) + Math.floor(pars[5] / 2);
 var twidth = Math.floor(minimap_images_width * pars[5]);
 var theight = Math.floor(minimap_images_height * pars[5]);
 hres = (minimap_read_cookie('minimap_hres') == '1');
 //main image
 d = $('#minimap_imgdiv');
 d.css({'left': (-1 * tleft) + 'px', 'top': (-1 * ttop) + 'px'});
 ch = d.children(':first');
 ch.width(twidth).height(theight);
 hres = (hres ? (pars[5] >= 3 ? (minimap_images[4] && minimap_images[4][pars[4]] ? 4 : 1) : 1) : 1);
 if (ch.attr('src') == minimap_images[hres][pars[4]]) {
 $('#minimap_loading').css('display', 'none');
 $('#minimap_maindiv').css('display', 'block');
 }
 else {
 ch.attr('src', minimap_images[hres][pars[4]]);
 }
//dashed lines
 if ($('#minimap_cmark_enabled').is(':checked')) {
 minimap_map_data[7] = 1;
 $('#minimap_vl').css({'display': 'block', 'visibility': 'visible'});
 $('#minimap_hl').css({'display': 'block', 'visibility': 'visible'});
 if (!$('#minimap_editor_mode').is(':checked')) {
 parss = minimap_map_sdata;
 tleft = Math.floor((((parss[0] - minimap_min_x - (1 * (1 / pars[5]))) * minimap_div_width_half) + parss[1]) * pars[5], radix_decimal) + Math.floor(pars[5] / 2);
 ttop = Math.floor((((parss[2] - minimap_min_y - (0.75 * (1 / pars[5]))) * minimap_div_width_half) + parss[3]) * pars[5], radix_decimal) + Math.floor(pars[5] / 2);
 $('#minimap_vl').appendTo($('#minimap_imgdiv')).css({
 'left': (tleft + minimap_div_width_half) + 'px',
 'top': (ttop + (wgPageName != 'MapperTest' ? parseInt((minimap_div_heigth - parseInt(minimap_div_heigth * (pars[5] / parss[5]), radix_decimal)) / 2, radix_decimal) : 0)) + 'px',
 'height': (wgPageName != 'MapperTest' ? parseInt(minimap_div_heigth * (pars[5] / parss[5]), radix_decimal) : minimap_div_heigth) + 'px'
 });
 $('#minimap_hl').appendTo($('#minimap_imgdiv')).css({
 'left': (tleft + (wgPageName != 'MapperTest' ? parseInt((minimap_div_width - parseInt(minimap_div_width * (pars[5] / parss[5]), radix_decimal)) / 2, radix_decimal) : 0)) + 'px',
 'top': (ttop + minimap_div_heigth_half) + 'px',
 'width': (wgPageName != 'MapperTest' ? parseInt(minimap_div_width * (pars[5] / parss[5]), radix_decimal) : minimap_div_width) + 'px'
 });
 }
 else {
 $('#minimap_vl').appendTo($('#minimap_imgdiv').parent()).css({
 'left': minimap_div_width_half + 'px',
 'top': '0px',
 'height': minimap_div_heigth + 'px'
 });
 $('#minimap_hl').appendTo($('#minimap_imgdiv').parent()).css({
 'left': '0px',
 'top': minimap_div_heigth_half + 'px',
 'width': minimap_div_width + 'px'
 });
 }
 }
 else {
 minimap_map_data[7] = 0;
 $('#minimap_vl').css({'display': 'none', 'visibility': 'hidden'});
 $('#minimap_hl').css({'display': 'none', 'visibility': 'hidden'});
 }
//marks
 var tmpm, i = 1, msize, mleft, mtop;
 $('[id^="minimap_mark"]').filter(function () {
 var id = $(this).attr('id').replace('minimap_mark', );
 return (parseInt(id, radix_decimal) > 0 ? true : false);
 }).css({'display': 'none', 'visibility': 'hidden'});
 if ($('#minimap_marks_enabled').is(':checked')) {
 while (pars['mark' + i]) {
 tmpm = pars['mark' + i];
 if (!$('#minimap_mark' + i).size()) {
 $(' ')
 .css({'display': 'block', 'position': 'absolute', 'z-index': '2003', 'overflow': 'hidden', : })
 .html('' +
 '<a href=""><img src="' + minimap_images[0][0] + '" alt="" width="121" height="22" border="0" /></a>' +
 '' +
 '')
 .appendTo($('#minimap_imgdiv'));
 }
 if (tmpm[4] != pars[4]) {
 i++;
 continue;
 }//mark in same z
 msize = Math.floor(11 * pars[5] * pars[6]) + 'px';
 $('#minimap_mark' + i).css({
 'display': 'block', 'visibility': 'visible',
 'left': Math.floor(((((tmpm[0] - minimap_min_x) * minimap_fractional_limit) + (tmpm[1])) * pars[5]) - (5 * pars[5] * pars[6])) + 'px',
 'top': Math.floor(((((tmpm[2] - minimap_min_y) * minimap_fractional_limit) + (tmpm[3])) * pars[5]) - (5 * pars[5] * pars[6])) + 'px',
 'width': msize, 'height': msize
 });
 mleft = Math.floor(Math.floor(((tmpm[5] == 21 ? 22 : tmpm[5]) - 1) / 2) * 11 * pars[5] * pars[6]);
 mtop = Math.floor((Math.floor(((tmpm[5] == 21 ? 22 : tmpm[5])) / 2) == (((tmpm[5] == 21 ? 22 : tmpm[5])) / 2) ? 11 : 0) * pars[5] * pars[6]);
 $('#minimap_mark' + i)
 .children(':first')//hidder div
 .css({'left': (-1 * mleft) + 'px', 'top': (-1 * mtop) + 'px'})
 .children(':first')//a link
 .css('cursor', 'default').attr({'onclick': 'return false;', 'href': });
 if (tmpm[6] !== && tmpm[5] != 21) {
 $('#minimap_mark' + i).children(':first').children(':first')//a link
 .css('cursor', 'pointer').attr({
 'onclick': 'window.open(this.href); return false;',
 'href': '/wiki/' + encodeURI(tmpm[6])
 });
 }
 d = $('#minimap_mark' + i).children(':first').children(':first')[0];
 if (tmpm[5] == 21) {//numeric mark
 $('#minimap_mark' + i).children(':first').children(':first').next()
 .css({
 'display': 'block',
 'visibility': 'visible',
 'left': mleft + 'px',
 'top': mtop + 'px',
 'width': msize,
 'height': msize,
 'font-size': (parseInt(msize, radix_decimal) - 2) + 'px',
 'line-height': 'normal'
 })
 .html(tmpm[6] !== ? parseInt(tmpm[6].slice(0, 2), radix_decimal) || 0 : 0);
 }
 $('#minimap_mark' + i).children(':first').children(':first').children(':first')//image
 .attr({'title': tmpm[6], 'alt': tmpm[6]}).css({
 'width': Math.floor(121 * pars[5] * pars[6]),
 'height': Math.floor(22 * pars[5] * pars[6])
 });
 i++;
 }
 }
 minimap_codes_update(reset_list);
};
minimap_mapper_add_mark = function () {
 if ($('#minimap_loading').css('display') == 'block') {
 return;
 }
 var i = 1;
 while (minimap_map_data['mark' + i]) {
 i++;
 }
 minimap_map_data['mark' + i] = minimap_map_data.slice(0, 5);
 minimap_map_data['mark' + i][5] = $('[id^="mapper_marker_r"]:checked').val();
 minimap_map_data['mark' + i][6] = document.getElementById('mapper_optional_link').value.replace(/\s|%20/gi, '_');
 minimap_pos();
};
minimap_mapper_remove_mark = function () {
 if (document.getElementById('minimap_loading').style.display == 'block') {
 return;
 }
 if (!$('#mapper_list :selected').size()) {
 return;
 }
 $('#mapper_mark_remove').attr('disabled', true);
 $('#mapper_list :selected').remove();
 minimap_map_data = minimap_map_data.slice(0, 8);
 $('#mapper_list option').each(function (i) {
 var tmp = decodeURI($(this).val()).split(',', 7);
 minimap_map_data['mark' + (i + 1)] = [parseInt(tmp[0], radix_decimal), parseInt(tmp[1], radix_decimal), parseInt(tmp[2], radix_decimal),
 parseInt(tmp[3], radix_decimal), parseInt(tmp[4], radix_decimal), parseInt(tmp[5], radix_decimal), tmp[6]];
 });
 minimap_pos();
//0x.1x,2y.3y,4z,5zoom,6zoomm,7centermark
//0x.1x,2y.3y,4z,5icon,6link
};
minimap_load = function (url) {
 minimap_map_sdata = minimap_get_coords(url);
 minimap_map_data = minimap_get_coords(url);
 var pars = minimap_get_coords(url);
 var tid = 'minimap_w' + (wgPageName == 'MapperTest' ? 'f' : 'p');
 minimap_change_src();// bypass image cache if the user opts to
 if (wgPageName != 'MapperTest') {
 if (!$('#minimap_blackout').size()) {
 $('body').append(
 ' ');
 }
 if (!$('#minimap_wp').size()) {
 $('body').append('');
 }
 $('#minimap_blackout').css('display', 'block').height($(document).height());
 $('#minimap_wp').css('display', 'block');
 }
 var tmp =
 (wgPageName != 'MapperTest' ?
 'TibiaWiki Map' +
 'X'
 : 'Mapper') +
 '' +
 '<img src="' + minimap_images[0][1] + '" alt="Loading" width="' + minimap_div_width + '" height="' + minimap_div_heigth + '" />' +
 '' +
 '' +
 '<img id="minimap_img" src="" alt="" width="" height="" />' +
 '' +
 '';
 var tmpm, i = 1;
 while (url.indexOf('mark' + i) != -1) {
 tmpm = minimap_get_coords(url, 'mark' + i);
 minimap_map_sdata['mark' + i] = tmpm.slice(0);
 minimap_map_data['mark' + i] = tmpm;
 tmp +=
 '' +
 '' +
 '<a href=""><img src="' + minimap_images[0][0] + '" alt="" width="121" height="22" border="0" /></a>' +
 '' +
 '' +
 ;
 i++;
 }
 tmp +=
 '' +
 '' +
 '' +
 '' +
 '' +
 '<input type="button" onclick="minimap_pos_b(\'ns\', -30);" class="starn btns" value="" />' +
 '<input type="button" onclick="minimap_pos_b(\'we\', -30);" class="starw btns" value="" />' +
 '<input type="button" onclick="minimap_pos_b(\'reset\');" class="starc btns" value="" />' +
 '<input type="button" onclick="minimap_pos_b(\'we\', 30);" class="stare btns" value="" />' +
 '<input type="button" onclick="minimap_pos_b(\'ns\', 30);" class="stars btns" value="" />' +
 '' +
 '' +
 '' +
 '<input type="button" onclick="minimap_pos_b(\'zoom\', 0.5);" class="zoomm btn" value="" />' +
 '<input type="button" onclick="minimap_pos_b(\'floor\', -1);" class="floorp btn" value="" />' +
 '<input type="button" onclick="minimap_pos_b(\'zoom\', 2);" class="zoomp btn" value="" />' +
 '<input type="button" onclick="minimap_pos_b(\'floor\', 1);" class="floorm btn" value="" />' +
 '' +
 '' +
 '<input type="checkbox" value="1" checked="checked" id="minimap_marks_enabled" onclick="minimap_pos();" />Enable marks' +
 '<input type="checkbox" value="1" ' + (pars[7] ? 'checked="checked" ' : ) + 'id="minimap_cmark_enabled" onclick="minimap_pos();" />Center mark' +
 '' +
 'Current floor: <input id="minimap_current_floor" type="text" size="4" value="" readonly="readonly" onclick="this.select()" />' +
 'Coords: <input id="minimap_current_coords" type="text" size="18" value="" readonly="readonly" onclick="this.select()" />' +
 ' ' +
 '<input type="checkbox" value="1" ' + (minimap_read_cookie('minimap_hres') == '1' ? 'checked="checked" ' : ) + 'id="minimap_hres_enabled" onclick="minimap_write_cookie(\'minimap_hres\', (this.checked ? 1 : 0)); minimap_pos();" />Load high resolution images ' +
 '<input type="checkbox" value="0" ' + (!preload_image ? 'disabled=disabled' : ) + 'onclick="mapper_preload_files(this);" /> Preload images ' +
 (wgPageName == 'MapperTest' ?
 '<input type="checkbox" value="1" ' + (window.location.search.indexOf('coords=') !== -1 ? : 'checked="checked" ') + 'id="minimap_editor_mode" onclick="minimap_pos();" />Editor mode ' +
 '<input type="checkbox" value="1" ' + (minimap_read_cookie('minimap_fresh') == '1' ? 'checked="checked" ' : ) + 'onclick="minimap_write_cookie(\'minimap_fresh\', this.checked ? 1 : 0); minimap_change_src(); " />Force-reload images' +
 '</tr>' +
 'Mark manager' +
 '' +
 '' +
 '<a href="" onclick="$(\'#mapper_help1\').toggle(); return false;">Toggle Help</a>' +
 '' +
 'Enable Editor Mode' +
 'Select an icon' +
 'Optionally write a wiki article name' +
 'Use the dotted lines(Center Mark) to select where you want to add a mark' +
 'Click Add' +
 'To remove a mark, select it on the list, wait the map takes you to it and click Remove' +
 'The "1" Icon is used to add marks with numbers, write a number instead of an article name' +
 '' +
 '' +
 '<input type="radio" value="1" checked="checked" name="mapper_markc" id="mapper_marker_r1" class="mapper_marker_r" />' +
 '<input type="radio" value="3" name="mapper_markc" id="mapper_marker_r3" class="mapper_marker_r" />' +
 '<input type="radio" value="5" name="mapper_markc" id="mapper_marker_r5" class="mapper_marker_r" />' +
 '<input type="radio" value="7" name="mapper_markc" id="mapper_marker_r7" class="mapper_marker_r" />' +
 '<input type="radio" value="9" name="mapper_markc" id="mapper_marker_r9" class="mapper_marker_r" />' +
 '<input type="radio" value="11" name="mapper_markc" id="mapper_marker_r11" class="mapper_marker_r" />' +
 '<input type="radio" value="13" name="mapper_markc" id="mapper_marker_r13" class="mapper_marker_r" />' +
 '<input type="radio" value="15" name="mapper_markc" id="mapper_marker_r15" class="mapper_marker_r" />' +
 '<input type="radio" value="17" name="mapper_markc" id="mapper_marker_r17" class="mapper_marker_r" />' +
 '<input type="radio" value="19" name="mapper_markc" id="mapper_marker_r19" class="mapper_marker_r" />' +
 '<input type="radio" value="21" name="mapper_markc" id="mapper_marker_r21" class="mapper_marker_r" />' +
 '<img src="' + minimap_images[0][0] + '" width="242" height="44" />' +
 '<input type="radio" value="2" name="mapper_markc" id="mapper_marker_r2" class="mapper_marker_r" />' +
 '<input type="radio" value="4" name="mapper_markc" id="mapper_marker_r4" class="mapper_marker_r" />' +
 '<input type="radio" value="6" name="mapper_markc" id="mapper_marker_r6" class="mapper_marker_r" />' +
 '<input type="radio" value="8" name="mapper_markc" id="mapper_marker_r8" class="mapper_marker_r" />' +
 '<input type="radio" value="10" name="mapper_markc" id="mapper_marker_r10" class="mapper_marker_r" />' +
 '<input type="radio" value="12" name="mapper_markc" id="mapper_marker_r12" class="mapper_marker_r" />' +
 '<input type="radio" value="14" name="mapper_markc" id="mapper_marker_r14" class="mapper_marker_r" />' +
 '<input type="radio" value="16" name="mapper_markc" id="mapper_marker_r16" class="mapper_marker_r" />' +
 '<input type="radio" value="18" name="mapper_markc" id="mapper_marker_r18" class="mapper_marker_r" />' +
 '<input type="radio" value="20" name="mapper_markc" id="mapper_marker_r20" class="mapper_marker_r" />' +
 '<input type="radio" value="22" name="mapper_markc" id="mapper_marker_r22" class="mapper_marker_r" />' +
 'Optional Article: <input type="text" value="" size="15" id="mapper_optional_link" />' +
 '<input type="button" value="Add" onclick="minimap_mapper_add_mark();" />' +
 '' +
 '<select size="6" id="mapper_list" style="width:90px"></select>' +
 ' <input type="button" value="Remove" disabled="disabled" id="mapper_mark_remove" onclick="minimap_mapper_remove_mark();" />' +
 '' +
 'Link and templates' +
 'Wiki Link:' +
 '' +
 'Link text:' +
 '<input id= "minimap_tcode3" type="text" value="here" size="10" onkeyup="minimap_codes_update();" />' +
 'Code:' +
 '<input id= "minimap_tcode4" readonly="readonly" type="text" value="" size="30" onclick="this.select()" />' +
 '' +
 '</tr>Direct Link:<input id= "minimap_tcode1" readonly="readonly" type="text" value="" size="45" onclick="this.select()" />' +
 'Simple Template:' +
 '<input id= "minimap_tcode2" readonly="readonly" type="text" value="" size="45" onclick="this.select()" />'
 : ) +
 '' +
 (wgPageName != 'MapperTest' ?
 ''
 : ) +
 ;
 $('#' + tid).html(tmp);
 $('#mapper_list').change(function () {
 minimap_mapper_list_click();
 });
 if (wgPageName != 'MapperTest') {
 minimap_center_div();
 }
 $('#minimap_img').load(function () {
 $('#minimap_loading').css('display', 'none');
 $('#minimap_maindiv').css('display', 'block');
 });
 minimap_pos();
 minimap_dragstart();
 if (wgPageName == 'MapperTest') {
 try {
 $('#mapper_loading').hide();
 } catch (er) {
 }
 }
};
$('a[href*="' + minimap_mapper_page + '"]').click(function () {
 minimap_load($(this).attr('href'));
 return false;
});
if (wgPageName == 'MapperTest') {
 minimap_load(window.location.search.substring(1));
}
else {
 $(window).resize(function () {
 minimap_center_div();
 });
}
//
//