pax_global_header00006660000000000000000000000064121327740160014515gustar00rootroot0000000000000052 comment=9026591955d3042ae22e2eadb0a8c51a4610a2fd opentip-2.4.6/000077500000000000000000000000001213277401600132045ustar00rootroot00000000000000opentip-2.4.6/.gitignore000066400000000000000000000001001213277401600151630ustar00rootroot00000000000000components build .* !.gitignore !.travis.yml node_modules .tmp-*opentip-2.4.6/.tagconfig.json000066400000000000000000000050601213277401600161170ustar00rootroot00000000000000{ "files": [ { "name": "README.md", "regexs": [ "Version ###" ] }, { "name": "src/opentip.coffee", "regexs": [ "Opentip v###", "Opentip\\.version = \"###\"" ] }, { "name": "lib/opentip.js", "regexs": [ "Opentip v###", "Opentip\\.version = \"###\"" ] }, { "name": "component.json", "regexs": [ "\"version\": \"###\"" ] }, { "name": "bower.json", "regexs": [ "\"version\": \"###\"" ] }, { "name": "package.json", "regexs": [ "\"version\": \"###\"" ] }, { "name": "downloads/opentip-jquery-excanvas.js", "regexs": [ "Opentip\\.version = \"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-jquery.js", "regexs": [ "Opentip\\.version = \"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-native-excanvas.js", "regexs": [ "Opentip\\.version = \"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-native.js", "regexs": [ "Opentip\\.version = \"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-prototype-excanvas.js", "regexs": [ "Opentip\\.version = \"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-prototype.js", "regexs": [ "Opentip\\.version = \"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-jquery-excanvas.min.js", "regexs": [ "Opentip\\.version=\"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-jquery.min.js", "regexs": [ "Opentip\\.version=\"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-native-excanvas.min.js", "regexs": [ "Opentip\\.version=\"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-native.min.js", "regexs": [ "Opentip\\.version=\"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-prototype-excanvas.min.js", "regexs": [ "Opentip\\.version=\"###\"", "Opentip v###" ] }, { "name": "downloads/opentip-prototype.min.js", "regexs": [ "Opentip\\.version=\"###\"", "Opentip v###" ] }, { "name": "Gruntfile.coffee", "regexs": [ "Opentip v###" ] } ] } opentip-2.4.6/.travis.yml000066400000000000000000000000441213277401600153130ustar00rootroot00000000000000language: node_js node_js: - 0.10 opentip-2.4.6/CONTRIBUTING.md000066400000000000000000000040401213277401600154330ustar00rootroot00000000000000Contribute ========== The latest stable version is always in the **[master](https://github.com/enyo/opentip)** branch (which always points at the latest version tag). The latest development version is in the **[develop](https://github.com/enyo/opentip/tree/develop)** branch. > Use the develop branch if you want to contribute or test features. Please do also **send pull requests to the `develop` branch**. I will **not** merge pull requests to the `master` branch. Make sure that changes pass all [tests](#testing). ### Coffeescript & Stylus (-> Javascript & CSS) Opentip is written in [Coffeescript](http://coffeescript.org) and [Stylus](http://learnboost.github.com/stylus/) so *do not* make changes to the Javascript or CSS files **I will not merge requests written in Javascript or CSS.** Getting started --------------- You need node to compile and test Opentip. So [install node](http://nodejs.org) first if you haven't done so already. ### Building Opentip First you have to setup the node modules to build Opentip. Simply run this in the Opentip directory: ```bash $ npm install ``` This will setup [Grunt](http://gruntjs.com) so you can compile Coffeescript and Stylus and generate the download files. To get a list of available commands use `grunt -h`. The most important command is ```bash $ grunt watch ``` This will observe any change to a coffeescript or stylus file and compile it immediately. > Please only submit commits with changed `.coffee` and `.stylus` files and do > *not* include the compiled JS or CSS files. ### Testing To test the library make sure that the source has been compiled with `grunt js` (as mentioned before, use `grunt watch` to always stay up to date) and then either type `npm test` to run the tests on the command line, or open the file `test/test.html` in a browser. It should look like this: ![Tests screenshot](https://raw.github.com/enyo/opentip/develop/files/tests.png) All tests are located in `test/src` and are written in coffeescript. If you add a change, please make sure that all tests pass! opentip-2.4.6/Gruntfile.coffee000066400000000000000000000062621213277401600163220ustar00rootroot00000000000000module.exports = (grunt) -> grunt.initConfig pkg: grunt.file.readJSON "package.json" stylus: options: compress: false default: files: [ "css/opentip.css": "css/stylus/opentip.styl" ] coffee: default: expand: true options: bare: true cwd: "src/" src: [ "*.coffee" ] dest: "lib/" ext: ".js" test: files: "test/test.js": "test/src/*.coffee" watch: css: files: "css/stylus/*.styl" tasks: [ "css" ] options: nospawn: on js: files: "src/*.coffee" tasks: [ "js" ] options: nospawn: on test: files: [ "test/src/*.coffee" ] tasks: [ "coffee:test" ] options: nospawn: on curl: ".tmp-excanvas.js": "https://raw.github.com/enyo/excanvas/master/index.js" ".tmp-classlist.js": "https://raw.github.com/eligrey/classList.js/master/classList.js" ".tmp-addeventlistener.js": "https://gist.github.com/raw/4684216/c58a272ef9d9e0f55ea5e90ac313e3a3b2f2b7b3/eventListener.polyfill.js" clean: tmp: ".tmp-*" concat: js: files: "downloads/opentip-jquery.js": [ "lib/opentip.js", "lib/adapter-jquery.js" ] "downloads/opentip-jquery-excanvas.js": [ "downloads/opentip-jquery.js", ".tmp-excanvas.js" ] "downloads/opentip-prototype.js": [ "lib/opentip.js", "lib/adapter-prototype.js" ] "downloads/opentip-prototype-excanvas.js": [ "downloads/opentip-prototype.js", ".tmp-excanvas.js" ] "downloads/opentip-native.js": [ "lib/opentip.js", "lib/adapter-native.js", ".tmp-classlist.js", ".tmp-addeventlistener.js" ] "downloads/opentip-native-excanvas.js": [ "downloads/opentip-native.js", ".tmp-excanvas.js" ] uglify: options: banner: """ // Opentip v2.4.6 // Copyright (c) 2009-2012 // www.opentip.org // MIT Licensed """ js: files: [ "downloads/opentip-jquery.min.js": "downloads/opentip-jquery.js" "downloads/opentip-jquery-excanvas.min.js": "downloads/opentip-jquery-excanvas.js" "downloads/opentip-prototype.min.js": "downloads/opentip-prototype.js" "downloads/opentip-prototype-excanvas.min.js": "downloads/opentip-prototype-excanvas.js" "downloads/opentip-native.min.js": "downloads/opentip-native.js" "downloads/opentip-native-excanvas.min.js": "downloads/opentip-native-excanvas.js" ] grunt.loadNpmTasks "grunt-contrib-coffee" grunt.loadNpmTasks "grunt-contrib-stylus" grunt.loadNpmTasks "grunt-contrib-concat" grunt.loadNpmTasks "grunt-contrib-watch" grunt.loadNpmTasks "grunt-contrib-uglify" grunt.loadNpmTasks "grunt-contrib-clean" grunt.loadNpmTasks "grunt-curl" # Default tasks grunt.registerTask "default", [ "downloads" ] grunt.registerTask "css", "Compile the stylus files to css", [ "stylus" ] grunt.registerTask "js", "Compile coffeescript and create all download files", [ "coffee" ] grunt.registerTask "downloads", [ "css", "js", "curl", "concat", "clean", "uglify" ] opentip-2.4.6/Makefile000066400000000000000000000004771213277401600146540ustar00rootroot00000000000000build: index.js components @component build rebuild: index.js components rm -fr build make build components: @component install clean: rm -fr build components downloads: ./downloads/generate.coffee release: cake build cake css make downloads all: clear make clean make build .PHONY: clean, downloads opentip-2.4.6/README.md000066400000000000000000000140661213277401600144720ustar00rootroot00000000000000Opentip ======= [Opentip][opentip] is a free opensource Java-Script tooltip class. Features -------- It supports: - Stems (little pointers) - Automatic content download with [AJAX][ajax] - Different styles - Automatic repositioning of the tooltip if it's not in the viewport of the browser anymore - All kind of triggers (The tooltip can be triggered by mouse over, click, form submit,... everything you can think of really) - CSS3 Animations - Well tested, with over 200 unit tests As of Version 2.0 Opentip does **no longer depend on [Prototype]**. You can choose *any* adapter you want so you can work with the framework of your choice. Supported frameworks are: - Native. You can use this one if you don't use any framework. - [Ender] - [Component] - [jQuery] - [Prototype] > If you want to contribute, please read on in the [contribute](https://github.com/enyo/opentip/blob/master/CONTRIBUTING.md) > file. If you are migrating from version **1.x** please refer to the > [migration section](#migrating-from-opentip-1x-to-2x) ### Build status Master [![Build Status](https://travis-ci.org/enyo/opentip.png?branch=master)](https://travis-ci.org/enyo/opentip) Develop [![Build Status](https://travis-ci.org/enyo/opentip.png?branch=develop)](https://travis-ci.org/enyo/opentip) Installation ------------ ### jQuery, Prototype, Native Just download `lib/opentip.js` and `lib/adapter.FRAMEWORK.js` and include them in this order. You can also take the already minified and combined files in the `downloads/` folder. ### Component The easiest and recommended way to install *opentip* is with [component]. Just add `enyo/opentip` as dependency in your `component.json` and rebuild it. Simply requiring opentip then activates the tooltips: `require "opentip";` ### Ender If you prefer [ender] as package manager just install it like this: ```bash $ ender build opentip ``` ### Bower Another package manager supported is [bower]: ```bash $ bower install opentip ``` * * * You should include opentip's CSS as well. It's in `css/opentip.css`. (Except for [component] of course which automatically bundles the css.) * * * If you want to work it with <=IE8, you have to include excanvas as well. Please refer to the [installation guide](http://www.opentip.org/installation.html). Usage ----- *Version 2.4.6* With HTML data attributes: ```html
Click me
``` or with the Javascript API: ```js $('elementId').opentip('Content', { showOn: "click", ...options... }); ``` For the complete documentation please visit [www.opentip.org][opentip]. Future plans ------------ - ~~Become library independant. I'm currently working on extracting all prototype functionality, so I can switch library easily. The next library I'll support will be jquery, and then mootools.~~ - Add more skins. - ~~Add cooler loading animation.~~ - ~~Implement unit tests.~~ If you have ideas, please contact me! Contribute ---------- Please refer to the [CONTRIBUTING](https://github.com/enyo/opentip/blob/develop/CONTRIBUTING.md) readme. Migrating from Opentip 1.x to 2.x --------------------------------- Those are the major changes you should look out for when migrating from 1.x to 2.x: - There's no `Tip` or `Tips` object anymore. Everything is done through `Opentip` - The recommend way to create opentips now is to call `new Opentip(element, content, title, options)`, or with the framework of your choice (eg, [ender]: `$("#my-div").opentip(content, title options)`) - The instantiation of new tips inside an event (eg: `onclick`, `onmouseover`) is no longer supported! This would create new opentips everytime the event is fired. - `Opentip.debugging = true;` does no longer exist. Use `Opentip.debug = true;` - Positions are no longer of the weird form `[ "left", "top" ]` but simply strings like `"top left"` or `"right"` - `stem.size` has been dropped in favor of `stem.length` and `stem.base` - Most of the design is now done in JS since the whole thing is a canvas now. - The way close buttons are defined has completely changed. Please refer to the docs for more information. Tagging ------- Tagging in this project is done with my [tag script](http://github.com/enyo/tag). Authors ------- Opentip is written by Matias Meno.
Original graphics by Tjandra Mayerhold. ### Contributors Thanks to the following people for providing bug reports, feature requests and fixes: - Torsten Saam - Aaron Peckham - Oguri - MaxKirillov - Nick Daugherty If I forgot somebody, please just tell me. ### Related projects You might also be interested in my [formwatcher](http://www.formwatcher.org/) or [dropzone](http://www.dropzonejs.com/). License ------- (The MIT License) Copyright (c) 2012 Matias Meno <m@tias.me>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. [opentip]: http://www.opentip.org/ [prototype]: http://www.prototypejs.org/ [jquery]: http://jquery.com/ [ajax]: http://en.wikipedia.org/wiki/Ajax_(programming) [excanvas]: https://github.com/enyo/excanvas [ender]: http://ender.no.de [component]: https://github.com/component [bower]: https://github.com/twitter/bower#readme opentip-2.4.6/bower.json000066400000000000000000000002651213277401600152200ustar00rootroot00000000000000{ "name": "opentip", "version": "2.4.6", "main": [ "css/opentip.css", "lib/opentip.js", "lib/adapter-component.js" ], "dependencies": { "jquery": "~1.9.0" } } opentip-2.4.6/component.json000066400000000000000000000004731213277401600161050ustar00rootroot00000000000000{ "name": "opentip", "repo": "enyo/opentip", "version": "2.4.6", "description": "Free opensource tooltip class.", "keywords": [ "tooltip" ], "dependencies": { "component/jquery": "*" }, "styles": [ "css/opentip.css" ], "scripts": [ "index.js", "lib/opentip.js", "lib/adapter-component.js" ] } opentip-2.4.6/css/000077500000000000000000000000001213277401600137745ustar00rootroot00000000000000opentip-2.4.6/css/opentip.css000066400000000000000000000213271213277401600161710ustar00rootroot00000000000000.opentip-container, .opentip-container * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .opentip-container { position: absolute; max-width: 300px; z-index: 100; -webkit-transition: -webkit-transform 1s ease-in-out; -moz-transition: -moz-transform 1s ease-in-out; -o-transition: -o-transform 1s ease-in-out; -ms-transition: -ms-transform 1s ease-in-out; transition: transform 1s ease-in-out; pointer-events: none; -webkit-transform: translateX(0) translateY(0); -moz-transform: translateX(0) translateY(0); -o-transform: translateX(0) translateY(0); -ms-transform: translateX(0) translateY(0); transform: translateX(0) translateY(0); } .opentip-container.ot-fixed.ot-hidden.stem-top.stem-center, .opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-center, .opentip-container.ot-fixed.ot-hiding.stem-top.stem-center { -webkit-transform: translateY(-5px); -moz-transform: translateY(-5px); -o-transform: translateY(-5px); -ms-transform: translateY(-5px); transform: translateY(-5px); } .opentip-container.ot-fixed.ot-hidden.stem-top.stem-right, .opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-right, .opentip-container.ot-fixed.ot-hiding.stem-top.stem-right { -webkit-transform: translateY(-5px) translateX(5px); -moz-transform: translateY(-5px) translateX(5px); -o-transform: translateY(-5px) translateX(5px); -ms-transform: translateY(-5px) translateX(5px); transform: translateY(-5px) translateX(5px); } .opentip-container.ot-fixed.ot-hidden.stem-middle.stem-right, .opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-right, .opentip-container.ot-fixed.ot-hiding.stem-middle.stem-right { -webkit-transform: translateX(5px); -moz-transform: translateX(5px); -o-transform: translateX(5px); -ms-transform: translateX(5px); transform: translateX(5px); } .opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-right, .opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-right, .opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-right { -webkit-transform: translateY(5px) translateX(5px); -moz-transform: translateY(5px) translateX(5px); -o-transform: translateY(5px) translateX(5px); -ms-transform: translateY(5px) translateX(5px); transform: translateY(5px) translateX(5px); } .opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-center, .opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-center, .opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-center { -webkit-transform: translateY(5px); -moz-transform: translateY(5px); -o-transform: translateY(5px); -ms-transform: translateY(5px); transform: translateY(5px); } .opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-left, .opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-left, .opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-left { -webkit-transform: translateY(5px) translateX(-5px); -moz-transform: translateY(5px) translateX(-5px); -o-transform: translateY(5px) translateX(-5px); -ms-transform: translateY(5px) translateX(-5px); transform: translateY(5px) translateX(-5px); } .opentip-container.ot-fixed.ot-hidden.stem-middle.stem-left, .opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-left, .opentip-container.ot-fixed.ot-hiding.stem-middle.stem-left { -webkit-transform: translateX(-5px); -moz-transform: translateX(-5px); -o-transform: translateX(-5px); -ms-transform: translateX(-5px); transform: translateX(-5px); } .opentip-container.ot-fixed.ot-hidden.stem-top.stem-left, .opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-left, .opentip-container.ot-fixed.ot-hiding.stem-top.stem-left { -webkit-transform: translateY(-5px) translateX(-5px); -moz-transform: translateY(-5px) translateX(-5px); -o-transform: translateY(-5px) translateX(-5px); -ms-transform: translateY(-5px) translateX(-5px); transform: translateY(-5px) translateX(-5px); } .opentip-container.ot-fixed .opentip { pointer-events: auto; } .opentip-container.ot-hidden { display: none; } .opentip-container .opentip { position: relative; font-size: 13px; line-height: 120%; padding: 9px 14px; color: #4f4b47; text-shadow: -1px -1px 0px rgba(255,255,255,0.2); } .opentip-container .opentip .header { margin: 0; padding: 0; } .opentip-container .opentip .ot-close { pointer-events: auto; display: block; position: absolute; top: -12px; left: 60px; color: rgba(0,0,0,0.5); background: rgba(0,0,0,0); text-decoration: none; } .opentip-container .opentip .ot-close span { display: none; } .opentip-container .opentip .ot-loading-indicator { display: none; } .opentip-container.ot-loading .ot-loading-indicator { width: 30px; height: 30px; font-size: 30px; line-height: 30px; font-weight: bold; display: block; } .opentip-container.ot-loading .ot-loading-indicator span { display: block; -webkit-animation: otloading 2s linear infinite; -moz-animation: otloading 2s linear infinite; -o-animation: otloading 2s linear infinite; -ms-animation: otloading 2s linear infinite; animation: otloading 2s linear infinite; text-align: center; } .opentip-container.style-dark .opentip, .opentip-container.style-alert .opentip { color: #f8f8f8; text-shadow: 1px 1px 0px rgba(0,0,0,0.2); } .opentip-container.style-glass .opentip { padding: 15px 25px; color: #317cc5; text-shadow: 1px 1px 8px rgba(0,94,153,0.3); } .opentip-container.ot-hide-effect-fade { -webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 1s ease-in-out; -moz-transition: -moz-transform 0.5s ease-in-out, opacity 1s ease-in-out; -o-transition: -o-transform 0.5s ease-in-out, opacity 1s ease-in-out; -ms-transition: -ms-transform 0.5s ease-in-out, opacity 1s ease-in-out; transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; opacity: 1; -ms-filter: none; filter: none; } .opentip-container.ot-hide-effect-fade.ot-hiding { opacity: 0; filter: alpha(opacity=0); -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; } .opentip-container.ot-show-effect-appear.ot-going-to-show, .opentip-container.ot-show-effect-appear.ot-showing { -webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 1s ease-in-out; -moz-transition: -moz-transform 0.5s ease-in-out, opacity 1s ease-in-out; -o-transition: -o-transform 0.5s ease-in-out, opacity 1s ease-in-out; -ms-transition: -ms-transform 0.5s ease-in-out, opacity 1s ease-in-out; transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; } .opentip-container.ot-show-effect-appear.ot-going-to-show { opacity: 0; filter: alpha(opacity=0); -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; } .opentip-container.ot-show-effect-appear.ot-showing { opacity: 1; -ms-filter: none; filter: none; } .opentip-container.ot-show-effect-appear.ot-visible { opacity: 1; -ms-filter: none; filter: none; } @-moz-keyframes otloading { 0% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); -moz-transform: rotate(360deg); -o-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); } } @-webkit-keyframes otloading { 0% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); -moz-transform: rotate(360deg); -o-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); } } @-o-keyframes otloading { 0% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); -moz-transform: rotate(360deg); -o-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); } } @-ms-keyframes otloading { 0% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); -moz-transform: rotate(360deg); -o-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes otloading { 0% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); -moz-transform: rotate(360deg); -o-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); } } opentip-2.4.6/css/stylus/000077500000000000000000000000001213277401600153375ustar00rootroot00000000000000opentip-2.4.6/css/stylus/opentip.styl000066400000000000000000000051201213277401600177300ustar00rootroot00000000000000@import "nib" @keyframes otloading from transform rotate(0deg) to transform rotate(360deg) .opentip-container, .opentip-container * box-sizing border-box .opentip-container position absolute max-width 300px z-index 100 transition transform 1s ease-in-out pointer-events none transform translateX(0) translateY(0) &.ot-fixed &.ot-hidden &.ot-going-to-show &.ot-hiding &.stem-top.stem-center transform translateY(-5px) &.stem-top.stem-right transform translateY(-5px) translateX(5px) &.stem-middle.stem-right transform translateX(5px) &.stem-bottom.stem-right transform translateY(5px) translateX(5px) &.stem-bottom.stem-center transform translateY(5px) &.stem-bottom.stem-left transform translateY(5px) translateX(-5px) &.stem-middle.stem-left transform translateX(-5px) &.stem-top.stem-left transform translateY(-5px) translateX(-5px) &.ot-fixed // When it's fixed, the close button, and links inside the tooltip should // be clickable .opentip pointer-events auto &.ot-hidden display none .opentip position relative font-size 13px line-height 120% padding 9px 14px color #4F4B47 text-shadow -1px -1px 0px rgba(255, 255, 255, 0.2) .header margin 0 padding 0 .ot-close pointer-events auto display block absolute top -12px left 60px color rgba(0, 0, 0, 0.5) background rgba(0, 0, 0, 0) // So IE9 renders this as clickable text-decoration none span display none .ot-loading-indicator display none &.ot-loading .ot-loading-indicator width 30px height @width font-size @width line-height @width font-weight bold display block span display block animation otloading 2s linear infinite text-align center // Styles // ====== &.style-dark &.style-alert .opentip color #f8f8f8 text-shadow 1px 1px 0px rgba(0, 0, 0, 0.2) &.style-glass .opentip padding 15px 25px color #317CC5 text-shadow 1px 1px 8px rgba(0, 94, 153, 0.3) // Effects // ======= &.ot-hide-effect-fade transition transform 0.5s ease-in-out, opacity 1s ease-in-out opacity 1 &.ot-hiding opacity 0 &.ot-show-effect-appear &.ot-going-to-show &.ot-showing transition transform 0.5s ease-in-out, opacity 1s ease-in-out &.ot-going-to-show opacity 0 &.ot-showing opacity 1 &.ot-visible opacity 1 opentip-2.4.6/docs/000077500000000000000000000000001213277401600141345ustar00rootroot00000000000000opentip-2.4.6/docs/adapter.ender.html000066400000000000000000000670311213277401600175450ustar00rootroot00000000000000 adapter.ender.coffee
Jump To …

adapter.ender.coffee

Ender Opentip Adapter

Uses ender packages

Because $ is my favorite character

(($) ->

Using bean as event handler

  bean = require "bean"

Using reqwest as AJAX lib

  reqwest = require "reqwest"

Augment ender

  $.ender {
    opentip: (content, title, options) -> new Opentip this, content, title, options
  }, true

And now the class

  class Adapter

    name: "ender"

Simply using $.domReady

    domReady: (callback) -> $.domReady callback

DOM

Using bonzo to create html

    create: (html) -> $ html

Element handling

Wraps the element in ender

    wrap: (element) ->
      element = $ element
      throw new Error "Multiple elements provided." if element.length > 1
      element

Returns the unwrapped element

    unwrap: (element) -> $(element).get 0

Returns the tag name of the element

    tagName: (element) -> @unwrap(element).tagName

Returns or sets the given attribute of element It's important not to simply forward name and value because the value is set whether or not the value argument is present

    attr: (element, args...) -> $(element).attr args...

Returns or sets the given data of element It's important not to simply forward name and value because the value is set whether or not the value argument is present

    data: (element, args...) -> $(element).data args...

Finds elements by selector

    find: (element, selector) -> $(element).find selector

Finds all elements by selector

    findAll: -> @find.apply @, arguments

Updates the content of the element

    update: (element, content, escape) ->
      element = $ element
      if escape
        element.text content
      else
        element.html content

Appends given child to element

    append: (element, child) -> $(element).append child

Add a class

    addClass: (element, className) -> $(element).addClass className

Remove a class

    removeClass: (element, className) -> $(element).removeClass className

Set given css properties

    css: (element, properties) -> $(element).css properties

Returns an object with given dimensions

    dimensions: (element) -> $(element).dim()

Returns the scroll offsets of current document

    scrollOffset: ->
      [
        window.pageXOffset or document.documentElement.scrollLeft or document.body.scrollLeft
        window.pageYOffset or document.documentElement.scrollTop or document.body.scrollTop
      ]

Returns the dimensions of the viewport (currently visible browser area)

    viewportDimensions: ->
      {
        width: document.documentElement.clientWidth
        height: document.documentElement.clientHeight
      }

Returns an object with x and y

    mousePosition: (e) ->
      pos = x: 0, y: 0

      e ?= window.event

      return unless e?

      if e.pageX or e.pageY
        pos.x = e.pageX
        pos.y = e.pageY
      else if e.clientX or e.clientY
        pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft
        pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop

      pos

Returns the offset of the element

    offset: (element) -> 
      offset = $(element).offset()
      {
        top: offset.top
        left: offset.left
      }

Observe given eventName

    observe: (element, eventName, observer) ->
      $(element).on eventName, observer

Stop observing event

    stopObserving: (element, eventName, observer) -> $(element).unbind eventName, observer

Perform an AJAX request and call the appropriate callbacks.

    ajax: (options) ->
      throw new Error "No url provided" unless options.url?
      reqwest
        url: options.url
        type: 'html'
        method: options.method?.toUpperCase() ? "GET"
        error: (resp) -> options.onError? "Server responded with status #{resp.status}"
        success: (resp) -> options.onSuccess? resp
        complete: -> options.onComplete?()

Utility functions

Creates a shallow copy of the object

    clone: (object) ->
      newObject = { }
      for own key, val of object
        newObject[key] = val
      newObject

Copies all properties from sources to target

    extend: (target, sources...) ->
      for source in sources
        for own key, val of source
          target[key] = val
      target

Add the adapter to the list

  Opentip.addAdapter new Adapter

)(ender)

opentip-2.4.6/docs/adapter.jquery.html000066400000000000000000000610771213277401600177730ustar00rootroot00000000000000 adapter.jquery.coffee
Jump To …

adapter.jquery.coffee

jQuery Opentip Adapter

Uses jQuery

Because $ is my favorite character

(($) ->

Augment jQuery

  $.fn.opentip = (content, title, options) ->
    new Opentip this, content, title, options

And now the class

  class Adapter

    name: "jquery"

Simply using $.domReady

    domReady: (callback) -> $ callback

DOM

Using bonzo to create html

    create: (html) -> $ html

Element handling

Wraps the element in ender

    wrap: (element) ->
      element = $ element
      throw new Error "Multiple elements provided." if element.length > 1
      element

Returns the unwrapped element

    unwrap: (element) -> $(element)[0]

Returns the tag name of the element

    tagName: (element) -> @unwrap(element).tagName

Returns or sets the given attribute of element

It's important not to simply forward name and value because the value is set whether or not the value argument is present

    attr: (element, args...) -> $(element).attr args...

Returns or sets the given data of element It's important not to simply forward name and value because the value is set whether or not the value argument is present

    data: (element, args...) -> $(element).data args...

Finds elements by selector

    find: (element, selector) -> $(element).find selector

Finds all elements by selector

    findAll: -> @find.apply @, arguments

Updates the content of the element

    update: (element, content, escape) ->
      element = $ element
      if escape
        element.text content
      else
        element.html content

Appends given child to element

    append: (element, child) -> $(element).append child

Add a class

    addClass: (element, className) -> $(element).addClass className

Remove a class

    removeClass: (element, className) -> $(element).removeClass className

Set given css properties

    css: (element, properties) -> $(element).css properties

Returns an object with given dimensions

    dimensions: (element) ->
      {
        width: $(element).outerWidth()
        height: $(element).outerHeight()
      }

Returns the scroll offsets of current document

    scrollOffset: ->
      [
        window.pageXOffset or document.documentElement.scrollLeft or document.body.scrollLeft
        window.pageYOffset or document.documentElement.scrollTop or document.body.scrollTop
      ]

Returns the dimensions of the viewport (currently visible browser area)

    viewportDimensions: ->
      {
        width: document.documentElement.clientWidth
        height: document.documentElement.clientHeight
      }

Returns an object with x and y

    mousePosition: (e) ->
      return null unless e?
      x: e.pageX, y: e.pageY

Returns the offset of the element

    offset: (element) ->
      offset = $(element).offset()
      {
        left: offset.left
        top: offset.top
      }

Observe given eventName

    observe: (element, eventName, observer) -> $(element).bind eventName, observer

Stop observing event

    stopObserving: (element, eventName, observer) -> $(element).unbind eventName, observer

Perform an AJAX request and call the appropriate callbacks.

    ajax: (options) ->
      throw new Error "No url provided" unless options.url?
      $.ajax(
        url: options.url
        type: options.method?.toUpperCase() ? "GET"
      )
        .done((content) -> options.onSuccess? content)
        .fail((request) -> options.onError? "Server responded with status #{request.status}")
        .always(-> options.onComplete?())

Utility functions

Creates a shallow copy of the object

    clone: (object) -> $.extend { }, object

Copies all properties from sources to target

    extend: (target, sources...) -> $.extend target, sources...

Add the adapter to the list

  Opentip.addAdapter new Adapter

)(jQuery)

opentip-2.4.6/docs/adapter.native.html000066400000000000000000001211421213277401600177300ustar00rootroot00000000000000 adapter.native.coffee
Jump To …

adapter.native.coffee

Native Opentip Adapter

Use this adapter if you don't use a framework like jQuery and you don't really care about oldschool browser compatibility.

class Adapter

  name: "native"

Invoke callback as soon as dom is ready Source: https://github.com/dperini/ContentLoaded/blob/master/src/contentloaded.js

  domReady: (callback) ->
    done = no
    top = true
    win = window
    doc = document

    return callback() if doc.readyState in [ "complete", "loaded" ]

    root = doc.documentElement
    add = (if doc.addEventListener then "addEventListener" else "attachEvent")
    rem = (if doc.addEventListener then "removeEventListener" else "detachEvent")
    pre = (if doc.addEventListener then "" else "on")

    init = (e) ->
      return  if e.type is "readystatechange" and doc.readyState isnt "complete"
      (if e.type is "load" then win else doc)[rem] pre + e.type, init, false
      unless done
        done = yes
        callback()

    poll = ->
      try
        root.doScroll "left"
      catch e
        setTimeout poll, 50
        return
      init "poll"

    unless doc.readyState is "complete"
      if doc.createEventObject and root.doScroll
        try
          top = not win.frameElement
        poll()  if top
      doc[add] pre + "DOMContentLoaded", init, false
      doc[add] pre + "readystatechange", init, false
      win[add] pre + "load", init, false

DOM

Create the HTML passed as string

  create: (htmlString) ->
    div = document.createElement "div"
    div.innerHTML = htmlString
    @wrap div.childNodes

Element handling

Wrap the element in the framework

  wrap: (element) ->
    if element instanceof NodeList
      element = (el for el in element)
    else if element not instanceof Array
      element = [ element ]
    element

Returns the unwrapped element

  unwrap: (element) -> @wrap(element)[0]

Returns the tag name of the element

  tagName: (element) -> @unwrap(element).tagName

Returns or sets the given attribute of element

  attr: (element, attr, value) ->
    if arguments.length == 3
      @unwrap(element).setAttribute attr, value
    else
      @unwrap(element).getAttribute? attr


  lastDataId = 0
  dataValues = { }

Returns or sets the given data of element

  data: (element, name, value) ->
    dataId = @attr element, "data-id"
    unless dataId
      dataId = ++lastDataId
      @attr element, "data-id", dataId
      dataValues[dataId] = { }

    if arguments.length == 3

Setter

      dataValues[dataId][name] = value
    else
      value = dataValues[dataId][name]
      return value if value?

      value = @attr element, "data-#{Opentip::dasherize name}"
      if value
        dataValues[dataId][name] = value
      return value

Finds elements by selector

  find: (element, selector) -> @unwrap(element).querySelector selector

Finds all elements by selector

  findAll: (element, selector) -> @unwrap(element).querySelectorAll selector

Updates the content of the element

  update: (element, content, escape) ->
    element = @unwrap element
    if escape
      element.innerHTML = "" # Clearing the content
      element.appendChild document.createTextNode content
    else
      element.innerHTML = content

Appends given child to element

  append: (element, child) ->
    unwrappedChild = @unwrap child
    unwrappedElement = @unwrap element
    unwrappedElement.appendChild unwrappedChild

Add a class

  addClass: (element, className) -> @unwrap(element).classList.add className

Remove a class

  removeClass: (element, className) -> @unwrap(element).classList.remove className

Set given css properties

  css: (element, properties) ->
    element = @unwrap @wrap element
    for own key, value of properties
      element.style[key] = value

Returns an object with given dimensions

  dimensions: (element) ->
    element = @unwrap @wrap element
    dimensions =
      width: element.offsetWidth
      height: element.offsetHeight

    unless dimensions.width and dimensions.height

The element is probably invisible. So make it visible

      revert =
        position: element.style.position || ''
        visibility: element.style.visibility || ''
        display: element.style.display || ''

      @css element,
        position: "absolute"
        visibility: "hidden"
        display: "block"

      dimensions =
        width: element.offsetWidth
        height: element.offsetHeight

      @css element, revert      

    dimensions

Returns the scroll offsets of current document

  scrollOffset: ->
    [
      window.pageXOffset or document.documentElement.scrollLeft or document.body.scrollLeft
      window.pageYOffset or document.documentElement.scrollTop or document.body.scrollTop
    ]

Returns the dimensions of the viewport (currently visible browser area)

  viewportDimensions: ->
    {
      width: document.documentElement.clientWidth
      height: document.documentElement.clientHeight
    }

Returns an object with x and y

  mousePosition: (e) ->
    pos = x: 0, y: 0

    e ?= window.event

    return unless e?

    if e.pageX or e.pageY
      pos.x = e.pageX
      pos.y = e.pageY
    else if e.clientX or e.clientY
      pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft
      pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop

    pos

Returns the offset of the element

  offset: (element) ->
    element = @unwrap element

    offset = {
      top: element.offsetTop
      left: element.offsetLeft
    }

    while element = element.offsetParent
      offset.top += element.offsetTop
      offset.left += element.offsetLeft

      if element != document.body
        offset.top -= element.scrollTop
        offset.left -= element.scrollLeft

    offset

Observe given eventName

  observe: (element, eventName, observer) -> @unwrap(element).addEventListener eventName, observer

Stop observing event

  stopObserving: (element, eventName, observer) -> @unwrap(element).removeEventListener eventName, observer

Perform an AJAX request and call the appropriate callbacks.

  ajax: (options) ->
    throw new Error "No url provided" unless options.url?

    if window.XMLHttpRequest

Mozilla, Safari, ...

      request = new XMLHttpRequest
    else if window.ActiveXObject

IE

      try
        request = new ActiveXObject "Msxml2.XMLHTTP"
      catch e
        try
          request = new ActiveXObject "Microsoft.XMLHTTP"
        catch e

    throw new Error "Can't create XMLHttpRequest" unless request

    request.onreadystatechange = ->
      if request.readyState == 4
        try
          if request.status == 200
            options.onSuccess? request.responseText
          else
            options.onError? "Server responded with status #{request.status}"
        catch e
          options.onError? e.message

        options.onComplete?()


    request.open options.method?.toUpperCase() ? "GET", options.url
    request.send()

Utility functions

Creates a shallow copy of the object

  clone: (object) ->
    newObject = { }
    for own key, val of object
      newObject[key] = val
    newObject

Copies all properties from sources to target

  extend: (target, sources...) ->
    for source in sources
      for own key, val of source
        target[key] = val
    target

Add the adapter to the list

Opentip.addAdapter new Adapter

opentip-2.4.6/docs/adapter.prototype.html000066400000000000000000000131141213277401600205060ustar00rootroot00000000000000 adapter.prototype.coffee
Jump To …

adapter.prototype.coffee

$ = ender


class Adapter

  name: "prototype"

Simply using $.domReady

  domReady: (callback) -> Event.observe window, "dom:loaded", callback

Using bonzo to create html

  create: (html) -> $ html

Mimics scriptaculous Builder.node behaviour element: (tagName, attributes, children) -> if Object.isArray(attributes) or Object.isString(attributes) or Object.isElement(attributes) children = attributes attributes = null element = new Element(tagName, attributes or {})

    

# This is a prototype 1.6 bug, that doesn't apply the className to IE8 elements. # Thanks to Alexander Shakhnovsky for finding the bug, and pinpointing the problem. if attributes and attributes["className"] attributes["className"].split(" ").each (classname) -> element.addClassName classname

if children if Object.isArray(children) children.each (child) -> element.insert bottom: child

else
  element.insert bottom: children

element

adapter = new Adapter

Opentip.addAdapter adapter

opentip-2.4.6/docs/docco.css000066400000000000000000000156751213277401600157530ustar00rootroot00000000000000/*--------------------- Layout and Typography ----------------------------*/ body { font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; font-size: 15px; line-height: 22px; color: #252519; margin: 0; padding: 0; } a { color: #261a3b; } a:visited { color: #261a3b; } p { margin: 0 0 15px 0; } h1, h2, h3, h4, h5, h6 { margin: 0px 0 15px 0; } h1 { margin-top: 40px; } #container { position: relative; } #background { position: fixed; top: 0; left: 525px; right: 0; bottom: 0; background: #f5f5ff; border-left: 1px solid #e5e5ee; z-index: -1; } #jump_to, #jump_page { background: white; -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; font: 10px Arial; text-transform: uppercase; cursor: pointer; text-align: right; } #jump_to, #jump_wrapper { position: fixed; right: 0; top: 0; padding: 5px 10px; } #jump_wrapper { padding: 0; display: none; } #jump_to:hover #jump_wrapper { display: block; } #jump_page { padding: 5px 0 3px; margin: 0 0 25px 25px; } #jump_page .source { display: block; padding: 5px 10px; text-decoration: none; border-top: 1px solid #eee; } #jump_page .source:hover { background: #f5f5ff; } #jump_page .source:first-child { } table td { border: 0; outline: 0; } td.docs, th.docs { max-width: 450px; min-width: 450px; min-height: 5px; padding: 10px 25px 1px 50px; overflow-x: hidden; vertical-align: top; text-align: left; } .docs pre { margin: 15px 0 15px; padding-left: 15px; } .docs p tt, .docs p code { background: #f8f8ff; border: 1px solid #dedede; font-size: 12px; padding: 0 0.2em; } .pilwrap { position: relative; } .pilcrow { font: 12px Arial; text-decoration: none; color: #454545; position: absolute; top: 3px; left: -20px; padding: 1px 2px; opacity: 0; -webkit-transition: opacity 0.2s linear; } td.docs:hover .pilcrow { opacity: 1; } td.code, th.code { padding: 14px 15px 16px 25px; width: 100%; vertical-align: top; background: #f5f5ff; border-left: 1px solid #e5e5ee; } pre, tt, code { font-size: 12px; line-height: 18px; font-family: Monaco, Consolas, "Lucida Console", monospace; margin: 0; padding: 0; } /*---------------------- Syntax Highlighting -----------------------------*/ td.linenos { background-color: #f0f0f0; padding-right: 10px; } span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } body .hll { background-color: #ffffcc } body .c { color: #408080; font-style: italic } /* Comment */ body .err { border: 1px solid #FF0000 } /* Error */ body .k { color: #954121 } /* Keyword */ body .o { color: #666666 } /* Operator */ body .cm { color: #408080; font-style: italic } /* Comment.Multiline */ body .cp { color: #BC7A00 } /* Comment.Preproc */ body .c1 { color: #408080; font-style: italic } /* Comment.Single */ body .cs { color: #408080; font-style: italic } /* Comment.Special */ body .gd { color: #A00000 } /* Generic.Deleted */ body .ge { font-style: italic } /* Generic.Emph */ body .gr { color: #FF0000 } /* Generic.Error */ body .gh { color: #000080; font-weight: bold } /* Generic.Heading */ body .gi { color: #00A000 } /* Generic.Inserted */ body .go { color: #808080 } /* Generic.Output */ body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ body .gs { font-weight: bold } /* Generic.Strong */ body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ body .gt { color: #0040D0 } /* Generic.Traceback */ body .kc { color: #954121 } /* Keyword.Constant */ body .kd { color: #954121; font-weight: bold } /* Keyword.Declaration */ body .kn { color: #954121; font-weight: bold } /* Keyword.Namespace */ body .kp { color: #954121 } /* Keyword.Pseudo */ body .kr { color: #954121; font-weight: bold } /* Keyword.Reserved */ body .kt { color: #B00040 } /* Keyword.Type */ body .m { color: #666666 } /* Literal.Number */ body .s { color: #219161 } /* Literal.String */ body .na { color: #7D9029 } /* Name.Attribute */ body .nb { color: #954121 } /* Name.Builtin */ body .nc { color: #0000FF; font-weight: bold } /* Name.Class */ body .no { color: #880000 } /* Name.Constant */ body .nd { color: #AA22FF } /* Name.Decorator */ body .ni { color: #999999; font-weight: bold } /* Name.Entity */ body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ body .nf { color: #0000FF } /* Name.Function */ body .nl { color: #A0A000 } /* Name.Label */ body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ body .nt { color: #954121; font-weight: bold } /* Name.Tag */ body .nv { color: #19469D } /* Name.Variable */ body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ body .w { color: #bbbbbb } /* Text.Whitespace */ body .mf { color: #666666 } /* Literal.Number.Float */ body .mh { color: #666666 } /* Literal.Number.Hex */ body .mi { color: #666666 } /* Literal.Number.Integer */ body .mo { color: #666666 } /* Literal.Number.Oct */ body .sb { color: #219161 } /* Literal.String.Backtick */ body .sc { color: #219161 } /* Literal.String.Char */ body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */ body .s2 { color: #219161 } /* Literal.String.Double */ body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ body .sh { color: #219161 } /* Literal.String.Heredoc */ body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ body .sx { color: #954121 } /* Literal.String.Other */ body .sr { color: #BB6688 } /* Literal.String.Regex */ body .s1 { color: #219161 } /* Literal.String.Single */ body .ss { color: #19469D } /* Literal.String.Symbol */ body .bp { color: #954121 } /* Name.Builtin.Pseudo */ body .vc { color: #19469D } /* Name.Variable.Class */ body .vg { color: #19469D } /* Name.Variable.Global */ body .vi { color: #19469D } /* Name.Variable.Instance */ body .il { color: #666666 } /* Literal.Number.Integer.Long */opentip-2.4.6/docs/opentip.html000066400000000000000000007035101213277401600165060ustar00rootroot00000000000000 opentip.coffee
Jump To …

opentip.coffee

#

More info at www.opentip.org

Copyright (c) 2012, Matias Meno
Graphics by Tjandra Mayerhold

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#

Opentip

Usage:

<div data-ot="This will be viewed in tooltip"></div>

or externally:

new Opentip(element, content, title, options);

For a full documentation, please visit www.opentip.org

class Opentip

  STICKS_OUT_TOP: 1
  STICKS_OUT_BOTTOM: 2
  STICKS_OUT_LEFT: 1
  STICKS_OUT_RIGHT: 2


  class:
    container: "opentip-container"
    opentip: "opentip"
    content: "content"
    loadingIndicator: "loading-indicator"
    close: "close"

    goingToHide: "going-to-hide"
    hidden: "hidden"
    hiding: "hiding"
    goingToShow: "going-to-show"
    showing: "showing"
    visible: "visible"

    loading: "loading"
    ajaxError: "ajax-error"
    fixed: "fixed"
    showEffectPrefix: "show-effect-"
    hideEffectPrefix: "hide-effect-"
    stylePrefix: "style-"
  

Sets up and configures the tooltip but does not build the html elements.

content, title and options are optional but have to be in this order.

  constructor: (element, content, title, options) ->
    @id = ++Opentip.lastId

    @debug "Creating Opentip."

    @adapter = Opentip.adapter

Add the ID to the element

    elementsOpentips = @adapter.data(element, "opentips") || [ ]
    elementsOpentips.push this
    @adapter.data element, "opentips", elementsOpentips

    @triggerElement = @adapter.wrap element

    throw new Error "You can't call Opentip on multiple elements." if @triggerElement.length > 1
    throw new Error "Invalid element." if @triggerElement.length < 1

AJAX

    @loaded = no
    @loading = no

    @visible = no
    @waitingToShow = no
    @waitingToHide = no

Some initial values

    @currentPosition = left: 0, top: 0
    @dimensions = width: 100, height: 50

    @content = ""

    @redraw = on

    @currentObservers =
      showing: no
      visible: no
      hiding: no
      hidden: no

Make sure to not overwrite the users options object

    options = @adapter.clone options

    if typeof content == "object"
      options = content
      content = title = undefined
    else if typeof title == "object"
      options = title
      title = undefined

Now build the complete options object from the styles

    options.title = title if title?
    @setContent content if content?

    options.style = Opentip.defaultStyle unless options.style

All options are based on the standard style

    styleOptions = @adapter.extend { }, Opentip.styles.standard

    optionSources = [ ]

All options are based on the standard style

    optionSources.push Opentip.styles.standard
    optionSources.push Opentip.styles[options.style] unless options.style == "standard"
    optionSources.push options

    options = @adapter.extend { }, optionSources...

Deep copying the hideTriggers array

    options.hideTriggers = (hideTrigger for hideTrigger in options.hideTriggers)

    options.hideTriggers.push options.hideTrigger if options.hideTrigger

Sanitize all positions

    options[prop] = new Opentip.Joint(options[prop]) for prop in [
      "tipJoint"
      "targetJoint"
      "stem"
    ] when options[prop] and typeof options[prop] == "string"

If the url of an Ajax request is not set, get it from the link it's attached to.

    if options.ajax and (options.ajax == on or not options.ajax)
      if @adapter.tagName(@triggerElement) == "A"
        options.ajax = @adapter.attr @triggerElement, "href"
      else 
        options.ajax = off

If the event is 'click', no point in following a link

    if options.showOn == "click" && @adapter.tagName(@triggerElement) == "A"
      @adapter.observe @triggerElement, "click", (e) ->
        e.preventDefault()
        e.stopPropagation()
        e.stopped = yes

Doesn't make sense to use a target without the opentip being fixed

    options.fixed = yes if options.target

    options.stem = new Opentip.Joint(options.tipJoint) if options.stem == yes

    if options.target == yes
      options.target = @triggerElement
    else if options.target
      options.target = @adapter.wrap options.target

    @currentStem = options.stem

    unless options.delay?
      options.delay = if options.showOn == "mouseover" then 0.2 else 0

    unless options.targetJoint?
      options.targetJoint = new Opentip.Joint(options.tipJoint).flip()

Used to show the opentip obviously

    @showTriggersWhenHidden = [ ]

Those ensure that opentip doesn't disappear when hovering other related elements

    @showTriggersWhenVisible = [ ]

Elements that hide Opentip

    @hideTriggers = [ ]

The obvious showTriggerELementWhenHidden is the options.showOn

    if options.showOn and options.showOn != "creation"
      @showTriggersWhenHidden.push
        element: @triggerElement
        event: options.showOn

    @options = options

Build the HTML elements when the dom is ready.

    @adapter.domReady => @_init()

Initializes the tooltip by creating the container and setting up the event listeners.

This does not yet create all elements. They are created when the tooltip actually shows for the first time.

This function activates the tooltip as well.

  _init: ->
    @_buildContainer()

    for hideTrigger, i in @options.hideTriggers
      hideTriggerElement = null

      hideOn = if @options.hideOn instanceof Array then @options.hideOn[i] else @options.hideOn

      if typeof hideTrigger == "string"
        switch hideTrigger
          when "trigger"
            hideOn = hideOn || "mouseout"
            hideTriggerElement = @triggerElement
          when "tip"
            hideOn = hideOn || "mouseover"
            hideTriggerElement = @container
          when "target"
            hideOn = hideOn || "mouseover"
            hideTriggerElement = this.options.target
          when "closeButton"

The close button gets handled later

          else
            throw new Error "Unknown hide trigger: #{hideTrigger}."
      else
        hideOn = hideOn || "mouseover"
        hideTriggerElement = @adapter.wrap hideTrigger

      if hideTriggerElement
        @hideTriggers.push
          element: hideTriggerElement
          event: hideOn

        if hideOn == "mouseout"

When the hide trigger is mouseout, we have to attach a mouseover trigger to that element, so the tooltip doesn't disappear when hovering child elements. (Hovering children fires a mouseout mouseover event)

          @showTriggersWhenVisible.push
            element: hideTriggerElement
            event: "mouseover"

    @bound = { }
    @bound[methodToBind] = (do (methodToBind) => return => @[methodToBind].apply this, arguments) for methodToBind in [
      "prepareToShow"
      "prepareToHide"
      "show"
      "hide"
      "reposition"
    ]

    @activate()

    @prepareToShow() if @options.showOn == "creation"

This just builds the opentip container, which is the absolute minimum to attach events to it.

The actual creation of the elements is in buildElements()

  _buildContainer: ->
    @container = @adapter.create """<div id="opentip-#{@id}" class="#{@class.container} #{@class.hidden} #{@class.stylePrefix}#{@options.className}"></div>"""

    @adapter.css @container, position: "absolute"

    @adapter.addClass @container, @class.loading if @options.ajax
    @adapter.addClass @container, @class.fixed if @options.fixed
    @adapter.addClass @container, "#{@class.showEffectPrefix}#{@options.showEffect}" if @options.showEffect
    @adapter.addClass @container, "#{@class.hideEffectPrefix}#{@options.hideEffect}" if @options.hideEffect

Builds all elements inside the container and put the container in body.

  _buildElements: ->

The actual content will be set by _updateElementContent()

    @tooltipElement = @adapter.create """<div class="#{@class.opentip}"><header></header><div class="#{@class.content}"></div></div>"""

    @backgroundCanvas = @adapter.create """<canvas style="position: absolute;"></canvas>"""

    headerElement = @adapter.find @tooltipElement, "header"

    if @options.title

Create the title element and append it to the header

      titleElement = @adapter.create """<h1></h1>"""
      @adapter.update titleElement, @options.title, @options.escapeTitle
      @adapter.append headerElement, titleElement

    if @options.ajax
      @adapter.append @tooltipElement, @adapter.create """<div class="#{@class.loadingIndicator}"><span>Loading...</span></div>"""

    if "closeButton" in @options.hideTriggers
      @closeButtonElement = @adapter.create """<a href="javascript:undefined;" class="#{@class.close}"><span>Close</span></a>"""
      @adapter.append headerElement, @closeButtonElement

Now put the tooltip and the canvas in the container and the container in the body

    @adapter.append @container, @backgroundCanvas
    @adapter.append @container, @tooltipElement
    @adapter.append document.body, @container

Sets the content and updates the HTML element if currently visible

This can be a function or a string. The function will be executed, and the result used as new content of the tooltip.

  setContent: (@content) -> @_updateElementContent() if @visible

Actually updates the content.

If content is a function it is evaluated here.

  _updateElementContent: ->
    contentDiv = @adapter.find @container, ".content"

    if contentDiv?
      if typeof @content == "function"
        @debug "Executing content function."
        @content = @content this
      @adapter.update contentDiv, @content, @options.escapeContent

    @_storeAndLockDimensions()
    @reposition()

Sets width auto to the element so it uses the appropriate width, gets the dimensions and sets them so the tolltip won't change in size (which can be annoying when the tooltip gets too close to the browser edge)

  _storeAndLockDimensions: ->
    prevDimension = @dimensions

    @adapter.css @container,
      width: "auto"
      left: "0px" # So it doesn't force wrapping
      top: "0px"
    @dimensions = @adapter.dimensions @container

    @adapter.css @container,
      width: "#{@dimensions.width}px"
      top: "#{@currentPosition.top}px"
      left: "#{@currentPosition.left}px"

    unless @_dimensionsEqual @dimensions, prevDimension
      @redraw = on 
      @_draw()

Sets up appropriate observers

  activate: ->
    @_setupObservers "-showing", "-visible", "hidden", "hiding"

Hides the tooltip and sets up appropriate observers

  deactivate: ->
    @debug "Deactivating tooltip."
    @hide()

If a state starts with a minus all observers are removed instead of set.

  _setupObservers: (states...) ->
    for state in states

      removeObserver = no
      if state.charAt(0) == "-"
        removeObserver = yes
        state = state.substr 1 # Remove leading -

Do nothing if the state is already achieved

      continue if @currentObservers[state] is not removeObserver
      @currentObservers[state] = not removeObserver

      observeOrStop = (args...) =>
        if removeObserver then @adapter.stopObserving args...
        else @adapter.observe args...

      switch state
        when "showing"

Setup the triggers to hide the tip

          for trigger in @hideTriggers
            observeOrStop trigger.element, trigger.event, @bound.prepareToHide

Start listening to window changes

          observeOrStop (if document.onresize? then document else window), "resize", @bound.reposition
          observeOrStop window, "scroll", @bound.reposition

        when "visible"

Most of the observers have already been handled by "showing" Add the triggers that make sure opentip doesn't hide prematurely

          for trigger in @showTriggersWhenVisible
            observeOrStop trigger.element, trigger.event, @bound.prepareToShow

        when "hiding"

Setup the triggers to show the tip

          for trigger in @showTriggersWhenHidden
            observeOrStop trigger.element, trigger.event, @bound.prepareToShow
          
        when "hidden"

Nothing to do since all observers are setup in "hiding"

        else
          throw new Error "Unknown state: #{state}"

    null # No unnecessary array collection

  prepareToShow: ->
    @_abortHiding()
    return if @visible

    @debug "Showing in #{@options.delay}s."

    Opentip._abortShowingGroup @options.group if @options.group

    @preparingToShow = true

Even though it is not yet visible, I already attach the observers, so the tooltip won't show if a hideEvent is triggered.

    @_setupObservers "-hidden", "-hiding", "showing"

Making sure the tooltip is at the right position as soon as it shows

    @_followMousePosition()
    @reposition()

    @_showTimeoutId = @setTimeout @bound.show, @options.delay || 0

  show: ->
    @_clearTimeouts()
    return if @visible

    return @deactivate() unless @_triggerElementExists()

    @debug "Showing now."

    Opentip._hideGroup @options.group if @options.group

    @visible = yes
    @preparingToShow = no

    @_buildElements() unless @tooltipElement?
    @_updateElementContent()

    @_loadAjax() if @options.ajax and (not @loaded or not @options.ajaxCache)

    @_searchAndActivateCloseButtons()

    @_startEnsureTriggerElement()

    @adapter.css @container, zIndex: Opentip.lastZIndex++

The order is important here! Do not reverse.

    @_setupObservers "-hidden", "-hiding", "showing", "visible"

    @reposition()

    @adapter.removeClass @container, @class.hiding
    @adapter.removeClass @container, @class.hidden
    @adapter.addClass @container, @class.goingToShow
    @setCss3Style @container, transitionDuration: "0s"

    @defer =>
      @adapter.removeClass @container, @class.goingToShow
      @adapter.addClass @container, @class.showing

      delay = 0
      delay = @options.showEffectDuration if @options.showEffect and @options.showEffectDuration
      @setCss3Style @container, transitionDuration: "#{delay}s"

      @_visibilityStateTimeoutId = @setTimeout =>
        @adapter.removeClass @container, @class.showing
        @adapter.addClass @container, @class.visible
      , delay

      @_activateFirstInput()

Just making sure the canvas has been drawn initially. It could happen that the canvas isn't drawn yet when reposition is called once before the canvas element has been created. If the position doesn't change after it will never call @_draw() again.

    @_draw()

  _abortShowing: ->
    if @preparingToShow
      @debug "Aborting showing."
      @_clearTimeouts()
      @_stopFollowingMousePosition()
      @preparingToShow = false
      @_setupObservers "-showing", "-visible", "hiding", "hidden"

  prepareToHide: ->
    @_abortShowing()

    return unless @visible

    @debug "Hiding in #{@options.hideDelay}s"

    @preparingToHide = yes

We start observing even though it is not yet hidden, so the tooltip does not disappear when a showEvent is triggered.

    @_setupObservers "-showing", "-visible", "-hidden", "hiding"

    @_hideTimeoutId = @setTimeout @bound.hide, @options.hideDelay

  hide: ->
    @_clearTimeouts()

    return unless @visible

    @debug "Hiding!"

    @visible = no

    @preparingToHide = no

    @_stopEnsureTriggerElement()

    @_setupObservers "-showing", "-visible", "hiding", "hidden"

    @_stopFollowingMousePosition() unless @options.fixed

 
    @adapter.removeClass @container, @class.visible
    @adapter.removeClass @container, @class.showing
    @adapter.addClass @container, @class.goingToHide
    @setCss3Style @container, transitionDuration: "0s"

    @defer =>
      @adapter.removeClass @container, @class.goingToHide
      @adapter.addClass @container, @class.hiding

      hideDelay = 0
      hideDelay = @options.hideEffectDuration if @options.hideEffect and @options.hideEffectDuration
      @setCss3Style @container, { transitionDuration: "#{hideDelay}s" }

      @_visibilityStateTimeoutId = @setTimeout =>
        @adapter.removeClass @container, @class.hiding
        @adapter.addClass @container, @class.hidden
        @setCss3Style @container, { transitionDuration: "0s" }
      , hideDelay

  _abortHiding: ->
    if @preparingToHide
      @debug "Aborting hiding."
      @_clearTimeouts()
      @preparingToHide = no
      @_setupObservers "-hiding", "showing", "visible"

  reposition: (e) ->
    e ?= @lastEvent

    position = @getPosition e
    return unless position?

    {position, stem} = @_ensureViewportContainment e, position

If the position didn't change, no need to do anything

    return if @_positionsEqual position, @currentPosition

The only time the canvas has to bee redrawn is when the stem changes.

    @redraw = on unless !@options.stem or stem.eql @currentStem

    @currentPosition = position
    @currentStem = stem

_draw() itself tests if it has to be redrawn.

    @_draw()

    @adapter.css @container, { left: "#{position.left}px", top: "#{position.top}px" }

Following is a redraw fix, because I noticed some drawing errors in some browsers when tooltips where overlapping.

    @defer =>
      rawContainer = @adapter.unwrap @container

I chose visibility instead of display so that I don't interfere with appear/disappear effects.

      rawContainer.style.visibility = "hidden"
      redrawFix = rawContainer.offsetHeight
      rawContainer.style.visibility = "visible"


  getPosition: (e, tipJoint, targetJoint, stem) ->

    tipJoint ?= @options.tipJoint
    targetJoint ?= @options.targetJoint

    position = { }

    if @options.target

Position is fixed

      targetPosition = @adapter.offset @options.target
      targetDimensions = @adapter.dimensions @options.target

      position = targetPosition

      if targetJoint.right

For wrapping inline elements, left + width does not give the right border, because left is where the element started, not its most left position.

        unwrappedTarget = @adapter.unwrap @options.target
        if unwrappedTarget.getBoundingClientRect?

TODO: make sure this actually works.

          position.left = unwrappedTarget.getBoundingClientRect().right + (window.pageXOffset ? document.body.scrollLeft)
        else

Well... browser doesn't support it

          position.left += targetDimensions.width
      else if targetJoint.center

Center

        position.left += Math.round targetDimensions.width / 2

      if targetJoint.bottom
        position.top += targetDimensions.height
      else if targetJoint.middle

Middle

        position.top += Math.round targetDimensions.height / 2

      if @options.borderWidth
        if @options.tipJoint.left
          position.left += @options.borderWidth
        if @options.tipJoint.right
          position.left -= @options.borderWidth
        if @options.tipJoint.top
          position.top += @options.borderWidth
        else if @options.tipJoint.bottom
          position.top -= @options.borderWidth
        

    else

Follow mouse

      @lastEvent = e if e?
      mousePosition = @adapter.mousePosition e
      return unless mousePosition?
      position = top: mousePosition.y, left: mousePosition.x

    if @options.autoOffset
      stemLength = if @options.stem then @options.stemLength else 0

If there is as stem offsets dont need to be that big if fixed.

      offsetDistance = if stemLength and @options.fixed then 2 else 10

Corners can be closer but when middle or center they are too close

      additionalHorizontal = if tipJoint.middle and not @options.fixed then 15 else 0
      additionalVertical = if tipJoint.center and not @options.fixed then 15 else 0

      if tipJoint.right then position.left -= offsetDistance + additionalHorizontal
      else if tipJoint.left then position.left += offsetDistance + additionalHorizontal

      if tipJoint.bottom then position.top -= offsetDistance + additionalVertical
      else if tipJoint.top then position.top += offsetDistance + additionalVertical

      if stemLength
        stem ?= @options.stem
        if stem.right then position.left -= stemLength
        else if stem.left then position.left += stemLength

        if stem.bottom then position.top -= stemLength
        else if stem.top then position.top += stemLength

    position.left += @options.offset[0]
    position.top += @options.offset[1]

    if tipJoint.right then position.left -= @dimensions.width
    else if tipJoint.center then position.left -= Math.round @dimensions.width / 2

    if tipJoint.bottom then position.top -= @dimensions.height
    else if tipJoint.middle then position.top -= Math.round @dimensions.height / 2

    position

  _ensureViewportContainment: (e, position) ->

    stem = @options.stem

    originals = {
      position: position
      stem: stem
    }

Sometimes the element is theoretically visible, but an effect is not yet showing it. So the calculation of the offsets is incorrect sometimes, which results in faulty repositioning.

    return originals unless @visible and position
    
    sticksOut = @_sticksOut position

    return originals unless sticksOut[0] or sticksOut[1]

    tipJoint = new Opentip.Joint @options.tipJoint
    targetJoint = new Opentip.Joint @options.targetJoint if @options.targetJoint

    scrollOffset = @adapter.scrollOffset()
    viewportDimensions = @adapter.viewportDimensions()

The opentip's position inside the viewport

    viewportPosition = [
      position.left - scrollOffset[0]
      position.top - scrollOffset[1]
    ]

    needsRepositioning = no



    if viewportDimensions.width >= @dimensions.width

Well if the viewport is smaller than the tooltip there's not much to do

      if sticksOut[0]
        needsRepositioning = yes

        switch sticksOut[0]
          when @STICKS_OUT_LEFT
            tipJoint.setHorizontal "left"
            targetJoint.setHorizontal "right" if @options.targetJoint
          when @STICKS_OUT_RIGHT
            tipJoint.setHorizontal "right"
            targetJoint.setHorizontal "left" if @options.targetJoint

    if viewportDimensions.height >= @dimensions.height

Well if the viewport is smaller than the tooltip there's not much to do

      if sticksOut[1]
        needsRepositioning = yes

        switch sticksOut[1]
          when @STICKS_OUT_TOP
            tipJoint.setVertical "top"
            targetJoint.setVertical "bottom" if @options.targetJoint
          when @STICKS_OUT_BOTTOM
            tipJoint.setVertical "bottom"
            targetJoint.setVertical "top" if @options.targetJoint

    return originals unless needsRepositioning

Needs to reposition

TODO: actually handle the stem here

    stem = tipJoint if @options.stem
    position = @getPosition e, tipJoint, targetJoint, stem

    newSticksOut = @_sticksOut position

    revertedX = no
    revertedY = no

    if newSticksOut[0] and (newSticksOut[0] isnt sticksOut[0])

The tooltip changed sides, but now is sticking out the other side of the window.

      revertedX = yes
      tipJoint.setHorizontal @options.tipJoint.horizontal
      targetJoint.setHorizontal @options.targetJoint.horizontal if @options.targetJoint
    if newSticksOut[1] and (newSticksOut[1] isnt sticksOut[1])
      revertedY = yes
      tipJoint.setVertical @options.tipJoint.vertical
      targetJoint.setVertical @options.targetJoint.vertical if @options.targetJoint


    return originals if revertedX and revertedY
      
    if revertedX or revertedY

One of the positions have been reverted. So get the position again.

      stem = tipJoint if @options.stem
      position = @getPosition e, tipJoint, targetJoint, stem

    {
      position: position
      stem: stem
    }



  _sticksOut: (position) ->
    scrollOffset = @adapter.scrollOffset()
      
    viewportDimensions = @adapter.viewportDimensions()
   
    positionOffset = [
      position.left - scrollOffset[0]
      position.top - scrollOffset[1]
    ]

    sticksOut = [ no, no ]

    if positionOffset[0] < 0
      sticksOut[0] = @STICKS_OUT_LEFT 
    else if positionOffset[0] + @dimensions.width > viewportDimensions.width
      sticksOut[0] = @STICKS_OUT_RIGHT

    if positionOffset[1] < 0
      sticksOut[1] = @STICKS_OUT_TOP 
    else if positionOffset[1] + @dimensions.height > viewportDimensions.height
      sticksOut[1] = @STICKS_OUT_BOTTOM 

    sticksOut

This is by far the most complex and difficult function to understand. I tried to comment everything as good as possible

  _draw: ->

This function could be called before _buildElements()

    return unless @backgroundCanvas and @redraw

    @debug "Drawing background."

    @redraw = off

Prepare for the close button

    closeButtonInner = [ 0, 0 ]
    closeButtonOuter = [ 0, 0 ]
    if "closeButton" in @options.hideTriggers
      closeButton = new Opentip.Joint(if @currentStem?.toString() == "top right" then "top left" else "top right")
      closeButtonInner = [
        @options.closeButtonRadius + @options.closeButtonOffset[0]
        @options.closeButtonRadius + @options.closeButtonOffset[1]
      ]
      closeButtonOuter = [
        @options.closeButtonRadius - @options.closeButtonOffset[0]
        @options.closeButtonRadius - @options.closeButtonOffset[1]
      ]

Now for the canvas dimensions and position

    canvasDimensions = @adapter.clone @dimensions
    canvasPosition = [ 0, 0 ]

Account for border

    if @options.borderWidth
      canvasDimensions.width += @options.borderWidth * 2
      canvasDimensions.height += @options.borderWidth * 2
      canvasPosition[0] -= @options.borderWidth
      canvasPosition[1] -= @options.borderWidth

Account for the shadow

    if @options.shadow
      canvasDimensions.width += @options.shadowBlur * 2

If the shadow offset is bigger than the actual shadow blur, the whole canvas gets bigger

      canvasDimensions.width += Math.max 0, @options.shadowOffset[0] - @options.shadowBlur * 2
      
      canvasDimensions.height += @options.shadowBlur * 2
      canvasDimensions.height += Math.max 0, @options.shadowOffset[1] - @options.shadowBlur * 2

      canvasPosition[0] -= Math.max 0, @options.shadowBlur - @options.shadowOffset[0]
      canvasPosition[1] -= Math.max 0, @options.shadowBlur - @options.shadowOffset[1]

Bulges could be caused by stems or close buttons

    bulge = left: 0, right: 0, top: 0, bottom: 0

Account for the stem

    if @currentStem
      if @currentStem.left then bulge.left = @options.stemLength
      else if @currentStem.right then bulge.right = @options.stemLength

      if @currentStem.top then bulge.top = @options.stemLength
      else if @currentStem.bottom then bulge.bottom = @options.stemLength

Account for the close button

    if closeButton
      if closeButton.left then bulge.left = Math.max bulge.left, closeButtonOuter[0]
      else if closeButton.right then bulge.right = Math.max bulge.right, closeButtonOuter[0]

      if closeButton.top then bulge.top = Math.max bulge.top, closeButtonOuter[1]
      else if closeButton.bottom then bulge.bottom = Math.max bulge.bottom, closeButtonOuter[1]


    canvasDimensions.width += bulge.left + bulge.right
    canvasDimensions.height += bulge.top + bulge.bottom
    canvasPosition[0] -= bulge.left
    canvasPosition[1] -= bulge.top


    if @currentStem and @options.borderWidth
      {stemLength, stemBase} = @_getPathStemMeasures @options.stemBase, @options.stemLength, @options.borderWidth

Need to draw on the DOM canvas element itself

    backgroundCanvas = @adapter.unwrap @backgroundCanvas

    backgroundCanvas.width = canvasDimensions.width
    backgroundCanvas.height = canvasDimensions.height

    @adapter.css @backgroundCanvas,
      width: "#{backgroundCanvas.width}px"
      height: "#{backgroundCanvas.height}px"
      left: "#{canvasPosition[0]}px"
      top: "#{canvasPosition[1]}px"


    ctx = backgroundCanvas.getContext "2d"

    ctx.clearRect 0, 0, backgroundCanvas.width, backgroundCanvas.height
    ctx.beginPath()

    ctx.fillStyle = @_getColor ctx, @dimensions, @options.background, @options.backgroundGradientHorizontal
    ctx.lineJoin = "miter"
    ctx.miterLimit = 500

Since borders are always in the middle and I want them outside I need to draw the actual path half the border width outset.

(hb = half border)

    hb = @options.borderWidth / 2

    if @options.borderWidth
      ctx.strokeStyle = @options.borderColor
      ctx.lineWidth = @options.borderWidth
    else
      stemLength = @options.stemLength
      stemBase = @options.stemBase

Draws a line with stem if necessary

    drawLine = (length, stem, first) =>
      if first

This ensures that the outline is properly closed

        ctx.moveTo Math.max(stemBase, @options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb
      if stem
        ctx.lineTo length / 2 - stemBase / 2, -hb
        ctx.lineTo length / 2, - stemLength - hb
        ctx.lineTo length / 2 + stemBase / 2, -hb

Draws a corner with stem if necessary

    drawCorner = (stem, closeButton, i) =>
      if stem
        ctx.lineTo -stemBase + hb, 0 - hb
        ctx.lineTo stemLength + hb, -stemLength - hb
        ctx.lineTo hb, stemBase - hb
      else if closeButton
        offset = @options.closeButtonOffset
        innerWidth = closeButtonInner[0]

        if i % 2 != 0

Since the canvas gets rotated for every corner, but the close button is always defined as [ horizontal, vertical ] offsets, I have to switch the offsets in case the canvas is rotated by 90degs

          offset = [ offset[1], offset[0] ]
          innerWidth = closeButtonInner[1]

Basic math

I added a graphical explanation since it's sometimes hard to understand geometrical calculations without visualization: https://raw.github.com/enyo/opentip/develop/files/close-button-angle.png

        angle1 = Math.acos(offset[1] / @options.closeButtonRadius)
        angle2 = Math.acos(offset[0] / @options.closeButtonRadius)

        ctx.lineTo -innerWidth + hb, -hb
        ctx.arc hb-offset[0], -hb+offset[1], @options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2
      else
        ctx.lineTo -@options.borderRadius + hb, -hb
        ctx.quadraticCurveTo hb, -hb, hb, @options.borderRadius - hb

Start drawing without caring about the shadows or stems The canvas position is exactly the amount that has been moved to account for shadows and stems

    ctx.translate -canvasPosition[0], -canvasPosition[1]

    ctx.save()

    do => # Wrapping variables

This part is a bit funky... All in all I just iterate over all four corners, translate the canvas to it and rotate it so the next line goes to the right. This way I can call drawLine and drawCorner withouth them knowing which line their actually currently drawing.

      for i in [0...Opentip.positions.length/2]
        positionIdx = i * 2

        positionX = if i == 0 or i == 3 then 0 else @dimensions.width
        positionY = if i < 2 then 0 else @dimensions.height
        rotation = (Math.PI / 2) * i
        lineLength = if i % 2 == 0 then @dimensions.width else @dimensions.height
        lineStem = new Opentip.Joint Opentip.positions[positionIdx]
        cornerStem = new Opentip.Joint Opentip.positions[positionIdx + 1]

        ctx.save()
        ctx.translate positionX, positionY
        ctx.rotate rotation
        drawLine lineLength, lineStem.eql(@currentStem), i == 0
        ctx.translate lineLength, 0
        drawCorner cornerStem.eql(@currentStem), cornerStem.eql(closeButton), i
        ctx.restore()

    ctx.closePath()
    ctx.save()

    if @options.shadow
      ctx.shadowColor = @options.shadowColor
      ctx.shadowBlur = @options.shadowBlur
      ctx.shadowOffsetX = @options.shadowOffset[0]
      ctx.shadowOffsetY = @options.shadowOffset[1]

    ctx.fill()
    ctx.restore() # Without shadow
    ctx.stroke() if @options.borderWidth

    ctx.restore() # Without shadow

    if closeButton
      do =>

Draw the cross

        crossWidth = crossHeight = @options.closeButtonRadius * 2

        if closeButton.toString() == "top right"
          linkCenter = [
            @dimensions.width - @options.closeButtonOffset[0]
            @options.closeButtonOffset[1]
          ]
          crossCenter = [
            linkCenter[0] + hb
            linkCenter[1] - hb
          ]
        else
          linkCenter = [
            @options.closeButtonOffset[0]
            @options.closeButtonOffset[1]
          ]
          crossCenter = [
            linkCenter[0] - hb
            linkCenter[1] - hb
          ]

        ctx.translate crossCenter[0], crossCenter[1]

        hcs = @options.closeButtonCrossSize / 2

        ctx.save()

        ctx.beginPath()

        ctx.strokeStyle = @options.closeButtonCrossColor
        ctx.lineWidth = @options.closeButtonCrossLineWidth
        ctx.lineCap = "round"

        ctx.moveTo -hcs, -hcs
        ctx.lineTo hcs, hcs
        ctx.stroke()

        ctx.beginPath()
        ctx.moveTo hcs, -hcs
        ctx.lineTo -hcs, hcs
        ctx.stroke()

        ctx.restore()

Position the link

        
        @adapter.css @closeButtonElement,
          left: "#{linkCenter[0] - hcs - @options.closeButtonLinkOverscan}px"
          top: "#{linkCenter[1] - hcs - @options.closeButtonLinkOverscan}px"
          width: "#{@options.closeButtonCrossSize + @options.closeButtonLinkOverscan * 2}px"
          height: "#{@options.closeButtonCrossSize + @options.closeButtonLinkOverscan * 2}px"

I have to account for the border width when implementing the stems. The tip height & width obviously should be added to the outer border, but the path is drawn in the middle of the border. If I just draw the stem size specified on the path, the stem will be bigger than requested.

So I have to calculate the stemBase and stemLength of the path stem.

  _getPathStemMeasures: (outerStemBase, outerStemLength, borderWidth) ->

Now for some math!

 /
/|\

/ | angle / | \ / | \ /_|_\

    hb = borderWidth / 2

This is the angle of the tip

    halfAngle = Math.atan (outerStemBase / 2) / outerStemLength
    angle = halfAngle * 2

The rhombus from the border tip to the path tip

    rhombusSide = hb / Math.sin angle

    distanceBetweenTips = 2 * rhombusSide * Math.cos halfAngle
    stemLength = hb + outerStemLength - distanceBetweenTips

    throw new Error "Sorry but your stemLength / stemBase ratio is strange." if stemLength < 0

Now calculate the new base

    stemBase = (Math.tan(halfAngle) * stemLength) * 2

    { stemLength: stemLength, stemBase: stemBase }

Turns a color string into a possible gradient

  _getColor: (ctx, dimensions, color, horizontal = no) ->

There is no comma so just return

    return color if typeof color == "string"

Create gradient

    if horizontal
      gradient = ctx.createLinearGradient 0, 0, dimensions.width, 0
    else
      gradient = ctx.createLinearGradient 0, 0, 0, dimensions.height

    for colorStop, i in color
      gradient.addColorStop colorStop[0], colorStop[1]

    gradient


  _searchAndActivateCloseButtons: ->
    for element in @adapter.findAll @container, ".#{@class.close}"
      @hideTriggers.push
        element: @adapter.wrap element
        event: "click"

Creating the observers for the new close buttons

    @_setupObservers "-showing", "showing" if @currentObservers.showing
    @_setupObservers "-visible", "visible" if @currentObservers.visible

  _activateFirstInput: ->
    input = @adapter.unwrap @adapter.find @container, "input, textarea"
    input?.focus?()

Calls reposition() everytime the mouse moves

  _followMousePosition: -> @adapter.observe document.body, "mousemove", @bound.reposition unless @options.fixed

Removes observer

  _stopFollowingMousePosition: -> @adapter.stopObserving document.body, "mousemove", @bound.reposition unless @options.fixed

I thinks those are self explanatory

  _clearShowTimeout: -> clearTimeout @_showTimeoutId
  _clearHideTimeout: -> clearTimeout @_hideTimeoutId
  _clearTimeouts: ->
    clearTimeout @_visibilityStateTimeoutId
    @_clearShowTimeout()
    @_clearHideTimeout()

Makes sure the trigger element exists, is visible, and part of this world.

  _triggerElementExists: ->
    el = @adapter.unwrap @triggerElement
    while el.parentNode
      return yes if el.parentNode.tagName == "BODY"
      el = el.parentNode

TODO: Add a check if the element is actually visible

    return no

  _loadAjax: ->
    return if @loading

    @loaded = no
    @loading = yes
    @adapter.addClass @container, @class.loading

    @debug "Loading content from #{@options.ajax}"

    @adapter.ajax
      url: @options.ajax
      method: @options.ajaxMethod
      onSuccess: (responseText) =>
        @debug "Loading successful."

This has to happen before setting the content since loading indicators may still be visible.

        @adapter.removeClass @container, @class.loading
        @setContent responseText
      onError: (error) =>
        message = "There was a problem downloading the content."
        @debug message, error
        @setContent message
        @adapter.addClass @container, @class.ajaxError
      onComplete: =>
        @adapter.removeClass @container, @class.loading
        @loading = no
        @loaded = yes
        @_searchAndActivateCloseButtons()
        @_activateFirstInput()
        @reposition()

Regularely checks if the element is still in the dom.

  _ensureTriggerElement: ->
    unless @_triggerElementExists()
      @deactivate()
      @_stopEnsureTriggerElement()

In milliseconds, how often opentip should check for the existance of the element

  _ensureTriggerElementInterval: 1000

Sets up an interval to call _ensureTriggerElement regularely

  _startEnsureTriggerElement: ->
    @_ensureTriggerElementTimeoutId = setInterval (=> @_ensureTriggerElement()), @_ensureTriggerElementInterval

Stops the interval

  _stopEnsureTriggerElement: ->
    clearInterval @_ensureTriggerElementTimeoutId

Utils

vendors = [
  "khtml"
  "ms"
  "o"
  "moz"
  "webkit"
]

Sets a sepcific css3 value for all vendors

Opentip::setCss3Style = (element, styles) ->
  element = @adapter.unwrap element
  for own prop, value of styles
    if element.style[prop]?
      element.style[prop] = value
    else
      for vendor in vendors
        vendorProp = "#{@ucfirst vendor}#{@ucfirst prop}"
        element.style[vendorProp] = value if element.style[vendorProp]?

Defers the call

Opentip::defer = (func) -> setTimeout func, 0

Changes seconds to milliseconds

Opentip::setTimeout = (func, seconds) -> setTimeout func, if seconds then seconds * 1000 else 0

Turns only the first character uppercase

Opentip::ucfirst = (string) ->
  return "" unless string?
  string.charAt(0).toUpperCase() + string.slice(1)

Converts a camelized string into a dasherized one

Opentip::dasherize = (string) ->
  string.replace /([A-Z])/g, (_, char) -> "-#{char.toLowerCase()}"

Every position is converted to this class

class Opentip.Joint

Accepts pointer in nearly every form.

  • "top left"
  • "topLeft"
  • "top-left"
  • "RIGHT to TOP"

All that counts is that the words top, bottom, left or right are present.

It also accepts a Pointer object, creating a new object then

  constructor: (pointerString) ->
    return unless pointerString?

    if pointerString instanceof Opentip.Joint
      pointerString = pointerString.toString()

    @set pointerString

    @

  set: (string) ->
    string = string.toLowerCase()

    @setHorizontal string
    @setVertical string

    @

  setHorizontal: (string) ->
    valid = [ "left", "center", "right" ]
    @horizontal = i.toLowerCase() for i in valid when ~string.indexOf i
    @horizontal = "center" unless @horizontal?

    for i in valid
      this[i] = if @horizontal == i then i else undefined

  setVertical: (string) ->
    valid = [ "top", "middle", "bottom" ]
    @vertical = i.toLowerCase() for i in valid when ~string.indexOf i
    @vertical = "middle" unless @vertical?
    for i in valid
      this[i] = if @vertical == i then i else undefined

Checks if two pointers point in the same direction

  eql: (pointer) ->
    pointer? and @horizontal == pointer.horizontal and @vertical == pointer.vertical

Turns topLeft into bottomRight

  flip: ->
    positionIdx = Opentip.position[@toString yes]

There are 8 positions, and smart as I am I layed them out in a circle.

    flippedIndex = (positionIdx + 4) % 8
    @set Opentip.positions[flippedIndex]
    @

  toString: (camelized = no) ->
    vertical = if @vertical == "middle" then "" else @vertical
    horizontal = if @horizontal == "center" then "" else @horizontal

    if vertical and horizontal
      if camelized then horizontal = Opentip::ucfirst horizontal
      else horizontal = " #{horizontal}"

    "#{vertical}#{horizontal}"

Returns true if top and left are equal

Opentip::_positionsEqual = (posA, posB) ->
  posA? and posB? and posA.left == posB.left and posA.top == posB.top

Returns true if width and height are equal

Opentip::_dimensionsEqual = (dimA, dimB) ->
  dimA? and dimB? and dimA.width == dimB.width and dimA.height == dimB.height

Just forwards to console.debug if Opentip.debug is true and console.debug exists.

Opentip::debug = (args...) ->
  if Opentip.debug and console?.debug?
    args.unshift "##{@id} |"
    console.debug args... 

Startup

Opentip.findElements = ->
  adapter = Opentip.adapter

Go through all elements with data-ot="[...]"

  for element in adapter.findAll document.body, "[data-ot]"
    options = { }

    content = adapter.data element, "ot"

    if content in [ "", "true", "yes"]

Take the content from the title attribute

      content = adapter.attr element, "title"
      adapter.attr element, "title", ""

    content = content || ""

    for optionName of Opentip.styles.standard
      if optionValue = adapter.data element, "ot#{Opentip::ucfirst optionName}"
        if optionValue in [ "yes", "true", "on" ] then optionValue = true 
        else if optionValue in [ "no", "false", "off" ] then optionValue = false
        options[optionName] = optionValue

    new Opentip element, content, options

Publicly available

Opentip.version = "2.0.0-dev"

Opentip.debug = off

Opentip.lastId = 0

Opentip.lastZIndex = 100


Opentip.tips = [ ]

Opentip._abortShowingGroup = ->

TODO

Opentip._hideGroup = ->

TODO

A list of possible adapters. Used for testing

Opentip.adapters = { }

The current adapter used.

Opentip.adapter = null

firstAdapter = yes
Opentip.addAdapter = (adapter) ->
  Opentip.adapters[adapter.name] = adapter
  if firstAdapter
    Opentip.adapter = adapter
    adapter.domReady Opentip.findElements
    firstAdapter = no

Opentip.positions = [
  "top"
  "topRight"
  "right"
  "bottomRight"
  "bottom"
  "bottomLeft"
  "left"
  "topLeft"
]
Opentip.position = { }
for position, i in Opentip.positions
  Opentip.position[position] = i

The standard style.

Opentip.styles =
  standard:    

This style also contains all default values for other styles.

Following abbreviations are used:

  • POINTER : a string that contains at least one of top, bottom, right or left
  • OFFSET : [ XVALUE, YVALUE ] (integers)
  • ELEMENT : element or element id

Will be set if provided in constructor

    title: undefined

Whether the provided title should be html escaped

    escapeTitle: yes

Whether the content should be html escaped

    escapeContent: no

The class name to be added to the HTML element

    className: "standard"
  • false (no stem)
  • true (stem at tipJoint position)
  • POINTER (for stems in other directions)
    stem: yes

float (in seconds) If null, the default is used: 0.2 for mouseover, 0 for click

    delay: null

See delay

    hideDelay: 0.1

If target is not null, elements are always fixed.

    fixed: no
  • eventname (eg: "click", "mouseover", etc..)
  • "creation" (the tooltip will show when being created)
  • null if you want to handle it yourself (Opentip will not register for any events)
    showOn: "mouseover"
  • "trigger"
  • "tip"
  • "target"
  • "closeButton"
  • ELEMENT

This is just a shortcut, and will be added to hideTriggers

    hideTrigger: "trigger"

An array of hideTriggers.

    hideTriggers: [ ]
  • eventname (eg: "click")
  • array of event strings if multiple hideTriggers
  • null (let Opentip decide)
    hideOn: null

OFFSET

    offset: [ 0, 0 ]

Whether the targetJoint/tipJoint should be changed if the tooltip is not in the viewport anymore.

    containInViewport: true

If set to true, offsets are calculated automatically to position the tooltip. (pixels are added if there are stems for example)

    autoOffset: true

    showEffect: "appear"
    hideEffect: "fade"
    showEffectDuration: 0.3
    hideEffectDuration: 0.2

integer

    stemLength: 5

integer

    stemBase: 8

POINTER

    tipJoint: "top left"
  • null (no target, opentip uses mouse as target)
  • true (target is the triggerElement)
  • ELEMENT (for another element)
    target: null 
  • POINTER (Ignored if target == null)
  • null (targetJoint is the opposite of tipJoint)
    targetJoint: null 

AJAX URL Set to false if no AJAX or true if it's attached to an <a /> element. In the latter case the href attribute will be used.

    ajax: off

Which method should AJAX use.

    ajaxMethod: "GET"

If off, the content will be downloaded every time the tooltip is shown.

    ajaxCache: on

You can group opentips together. So when a tooltip shows, it looks if there are others in the same group, and hides them.

    group: null

Will be set automatically in constructor

    style: null

The background color of the tip

    background: "#fff18f"

Whether the gradient should be horizontal.

    backgroundGradientHorizontal: no

Positive values offset inside the tooltip

    closeButtonOffset: [ 5, 5 ]

The little circle that stick out of a tip

    closeButtonRadius: 7

Size of the cross

    closeButtonCrossSize: 4

Color of the cross

    closeButtonCrossColor: "#d2c35b"

The stroke width of the cross

    closeButtonCrossLineWidth: 1.5

You will most probably never want to change this. It specifies how many pixels the invisible element should be larger than the actual cross

    closeButtonLinkOverscan: 6

Border radius...

    borderRadius: 5

Set to 0 or false if you don't want a border

    borderWidth: 1

Normal CSS value

    borderColor: "#f2e37b"

Set to false if you don't want a shadow

    shadow: yes

How the shadow should be blurred. Set to 0 if you want a hard drop shadow

    shadowBlur: 10

Shadow offset...

    shadowOffset: [ 3, 3 ]

Shadow color...

    shadowColor: "rgba(0, 0, 0, 0.1)"

  slick:
    className: "slick"
    stem: true
  rounded:
    className: "rounded"
    stem: true
  glass:
    className: "glass"
  dark:
    className: "dark"
    borderRadius: 13
    borderColor: "#444"

    closeButtonCrossColor: "rgba(240, 240, 240, 1)"

    shadowColor: "rgba(0, 0, 0, 0.3)"
    shadowOffset: [ 2, 2 ]
    background: [
      [ 0, "rgba(30, 30, 30, 0.7)" ]
      [ 0.5, "rgba(30, 30, 30, 0.8)" ]
      [ 0.5, "rgba(10, 10, 10, 0.8)" ]
      [ 1, "rgba(10, 10, 10, 0.9)" ]
    ]

Change this to the style name you want all your tooltips to have as default.

Opentip.defaultStyle = "standard"



window.Opentip = Opentip

opentip-2.4.6/downloads/000077500000000000000000000000001213277401600151765ustar00rootroot00000000000000opentip-2.4.6/downloads/opentip-jquery-excanvas.js000066400000000000000000002526771213277401600223600ustar00rootroot00000000000000// Generated by CoffeeScript 1.4.0 /* # # Opentip v2.4.6 # # More info at [www.opentip.org](http://www.opentip.org) # # Copyright (c) 2012, Matias Meno # Graphics by Tjandra Mayerhold # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # */ var Opentip, firstAdapter, i, mouseMoved, mousePosition, mousePositionObservers, position, vendors, _i, _len, _ref, __slice = [].slice, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __hasProp = {}.hasOwnProperty; Opentip = (function() { Opentip.prototype.STICKS_OUT_TOP = 1; Opentip.prototype.STICKS_OUT_BOTTOM = 2; Opentip.prototype.STICKS_OUT_LEFT = 1; Opentip.prototype.STICKS_OUT_RIGHT = 2; Opentip.prototype["class"] = { container: "opentip-container", opentip: "opentip", header: "ot-header", content: "ot-content", loadingIndicator: "ot-loading-indicator", close: "ot-close", goingToHide: "ot-going-to-hide", hidden: "ot-hidden", hiding: "ot-hiding", goingToShow: "ot-going-to-show", showing: "ot-showing", visible: "ot-visible", loading: "ot-loading", ajaxError: "ot-ajax-error", fixed: "ot-fixed", showEffectPrefix: "ot-show-effect-", hideEffectPrefix: "ot-hide-effect-", stylePrefix: "style-" }; function Opentip(element, content, title, options) { var elementsOpentips, hideTrigger, methodToBind, optionSources, prop, styleName, _i, _j, _len, _len1, _ref, _ref1, _ref2, _tmpStyle, _this = this; this.id = ++Opentip.lastId; this.debug("Creating Opentip."); Opentip.tips.push(this); this.adapter = Opentip.adapter; elementsOpentips = this.adapter.data(element, "opentips") || []; elementsOpentips.push(this); this.adapter.data(element, "opentips", elementsOpentips); this.triggerElement = this.adapter.wrap(element); if (this.triggerElement.length > 1) { throw new Error("You can't call Opentip on multiple elements."); } if (this.triggerElement.length < 1) { throw new Error("Invalid element."); } this.loaded = false; this.loading = false; this.visible = false; this.waitingToShow = false; this.waitingToHide = false; this.currentPosition = { left: 0, top: 0 }; this.dimensions = { width: 100, height: 50 }; this.content = ""; this.redraw = true; this.currentObservers = { showing: false, visible: false, hiding: false, hidden: false }; options = this.adapter.clone(options); if (typeof content === "object") { options = content; content = title = void 0; } else if (typeof title === "object") { options = title; title = void 0; } if (title != null) { options.title = title; } if (content != null) { this.setContent(content); } if (options["extends"] == null) { if (options.style != null) { options["extends"] = options.style; } else { options["extends"] = Opentip.defaultStyle; } } optionSources = [options]; _tmpStyle = options; while (_tmpStyle["extends"]) { styleName = _tmpStyle["extends"]; _tmpStyle = Opentip.styles[styleName]; if (_tmpStyle == null) { throw new Error("Invalid style: " + styleName); } optionSources.unshift(_tmpStyle); if (!((_tmpStyle["extends"] != null) || styleName === "standard")) { _tmpStyle["extends"] = "standard"; } } options = (_ref = this.adapter).extend.apply(_ref, [{}].concat(__slice.call(optionSources))); options.hideTriggers = (function() { var _i, _len, _ref1, _results; _ref1 = options.hideTriggers; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { hideTrigger = _ref1[_i]; _results.push(hideTrigger); } return _results; })(); if (options.hideTrigger && options.hideTriggers.length === 0) { options.hideTriggers.push(options.hideTrigger); } _ref1 = ["tipJoint", "targetJoint", "stem"]; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { prop = _ref1[_i]; if (options[prop] && typeof options[prop] === "string") { options[prop] = new Opentip.Joint(options[prop]); } } if (options.ajax && (options.ajax === true || !options.ajax)) { if (this.adapter.tagName(this.triggerElement) === "A") { options.ajax = this.adapter.attr(this.triggerElement, "href"); } else { options.ajax = false; } } if (options.showOn === "click" && this.adapter.tagName(this.triggerElement) === "A") { this.adapter.observe(this.triggerElement, "click", function(e) { e.preventDefault(); e.stopPropagation(); return e.stopped = true; }); } if (options.target) { options.fixed = true; } if (options.stem === true) { options.stem = new Opentip.Joint(options.tipJoint); } if (options.target === true) { options.target = this.triggerElement; } else if (options.target) { options.target = this.adapter.wrap(options.target); } this.currentStem = options.stem; if (options.delay == null) { options.delay = options.showOn === "mouseover" ? 0.2 : 0; } if (options.targetJoint == null) { options.targetJoint = new Opentip.Joint(options.tipJoint).flip(); } this.showTriggers = []; this.showTriggersWhenVisible = []; this.hideTriggers = []; if (options.showOn && options.showOn !== "creation") { this.showTriggers.push({ element: this.triggerElement, event: options.showOn }); } if (options.ajaxCache != null) { options.cache = options.ajaxCache; delete options.ajaxCache; } this.options = options; this.bound = {}; _ref2 = ["prepareToShow", "prepareToHide", "show", "hide", "reposition"]; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { methodToBind = _ref2[_j]; this.bound[methodToBind] = (function(methodToBind) { return function() { return _this[methodToBind].apply(_this, arguments); }; })(methodToBind); } this.adapter.domReady(function() { _this.activate(); if (_this.options.showOn === "creation") { return _this.prepareToShow(); } }); } Opentip.prototype._setup = function() { var hideOn, hideTrigger, hideTriggerElement, i, _i, _j, _len, _len1, _ref, _ref1, _results; this.debug("Setting up the tooltip."); this._buildContainer(); this.hideTriggers = []; _ref = this.options.hideTriggers; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { hideTrigger = _ref[i]; hideTriggerElement = null; hideOn = this.options.hideOn instanceof Array ? this.options.hideOn[i] : this.options.hideOn; if (typeof hideTrigger === "string") { switch (hideTrigger) { case "trigger": hideOn = hideOn || "mouseout"; hideTriggerElement = this.triggerElement; break; case "tip": hideOn = hideOn || "mouseover"; hideTriggerElement = this.container; break; case "target": hideOn = hideOn || "mouseover"; hideTriggerElement = this.options.target; break; case "closeButton": break; default: throw new Error("Unknown hide trigger: " + hideTrigger + "."); } } else { hideOn = hideOn || "mouseover"; hideTriggerElement = this.adapter.wrap(hideTrigger); } if (hideTriggerElement) { this.hideTriggers.push({ element: hideTriggerElement, event: hideOn, original: hideTrigger }); } } _ref1 = this.hideTriggers; _results = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { hideTrigger = _ref1[_j]; _results.push(this.showTriggersWhenVisible.push({ element: hideTrigger.element, event: "mouseover" })); } return _results; }; Opentip.prototype._buildContainer = function() { this.container = this.adapter.create("
"); this.adapter.css(this.container, { position: "absolute" }); if (this.options.ajax) { this.adapter.addClass(this.container, this["class"].loading); } if (this.options.fixed) { this.adapter.addClass(this.container, this["class"].fixed); } if (this.options.showEffect) { this.adapter.addClass(this.container, "" + this["class"].showEffectPrefix + this.options.showEffect); } if (this.options.hideEffect) { return this.adapter.addClass(this.container, "" + this["class"].hideEffectPrefix + this.options.hideEffect); } }; Opentip.prototype._buildElements = function() { var headerElement, titleElement; this.tooltipElement = this.adapter.create("
"); this.backgroundCanvas = this.adapter.wrap(document.createElement("canvas")); this.adapter.css(this.backgroundCanvas, { position: "absolute" }); if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)); } headerElement = this.adapter.find(this.tooltipElement, "." + this["class"].header); if (this.options.title) { titleElement = this.adapter.create("

"); this.adapter.update(titleElement, this.options.title, this.options.escapeTitle); this.adapter.append(headerElement, titleElement); } if (this.options.ajax && !this.loaded) { this.adapter.append(this.tooltipElement, this.adapter.create("
↻
")); } if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { this.closeButtonElement = this.adapter.create("Close"); this.adapter.append(headerElement, this.closeButtonElement); } this.adapter.append(this.container, this.backgroundCanvas); this.adapter.append(this.container, this.tooltipElement); this.adapter.append(document.body, this.container); this._newContent = true; return this.redraw = true; }; Opentip.prototype.setContent = function(content) { this.content = content; this._newContent = true; if (typeof this.content === "function") { this._contentFunction = this.content; this.content = ""; } else { this._contentFunction = null; } if (this.visible) { return this._updateElementContent(); } }; Opentip.prototype._updateElementContent = function() { var contentDiv; if (this._newContent || (!this.options.cache && this._contentFunction)) { contentDiv = this.adapter.find(this.container, "." + this["class"].content); if (contentDiv != null) { if (this._contentFunction) { this.debug("Executing content function."); this.content = this._contentFunction(this); } this.adapter.update(contentDiv, this.content, this.options.escapeContent); } this._newContent = false; } this._storeAndLockDimensions(); return this.reposition(); }; Opentip.prototype._storeAndLockDimensions = function() { var prevDimension; if (!this.container) { return; } prevDimension = this.dimensions; this.adapter.css(this.container, { width: "auto", left: "0px", top: "0px" }); this.dimensions = this.adapter.dimensions(this.container); this.dimensions.width += 1; this.adapter.css(this.container, { width: "" + this.dimensions.width + "px", top: "" + this.currentPosition.top + "px", left: "" + this.currentPosition.left + "px" }); if (!this._dimensionsEqual(this.dimensions, prevDimension)) { this.redraw = true; return this._draw(); } }; Opentip.prototype.activate = function() { return this._setupObservers("hidden", "hiding"); }; Opentip.prototype.deactivate = function() { this.debug("Deactivating tooltip."); this.hide(); return this._setupObservers("-showing", "-visible", "-hidden", "-hiding"); }; Opentip.prototype._setupObservers = function() { var observeOrStop, removeObserver, state, states, trigger, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _this = this; states = 1 <= arguments.length ? __slice.call(arguments, 0) : []; for (_i = 0, _len = states.length; _i < _len; _i++) { state = states[_i]; removeObserver = false; if (state.charAt(0) === "-") { removeObserver = true; state = state.substr(1); } if (this.currentObservers[state] === !removeObserver) { continue; } this.currentObservers[state] = !removeObserver; observeOrStop = function() { var args, _ref, _ref1; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (removeObserver) { return (_ref = _this.adapter).stopObserving.apply(_ref, args); } else { return (_ref1 = _this.adapter).observe.apply(_ref1, args); } }; switch (state) { case "showing": _ref = this.hideTriggers; for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { trigger = _ref[_j]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToHide); } observeOrStop((document.onresize != null ? document : window), "resize", this.bound.reposition); observeOrStop(window, "scroll", this.bound.reposition); break; case "visible": _ref1 = this.showTriggersWhenVisible; for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { trigger = _ref1[_k]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hiding": _ref2 = this.showTriggers; for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { trigger = _ref2[_l]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hidden": break; default: throw new Error("Unknown state: " + state); } } return null; }; Opentip.prototype.prepareToShow = function() { this._abortHiding(); this._abortShowing(); if (this.visible) { return; } this.debug("Showing in " + this.options.delay + "s."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._abortShowingGroup(this.options.group, this); } this.preparingToShow = true; this._setupObservers("-hidden", "-hiding", "showing"); this._followMousePosition(); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); return this._showTimeoutId = this.setTimeout(this.bound.show, this.options.delay || 0); }; Opentip.prototype.show = function() { var _this = this; this._abortHiding(); if (this.visible) { return; } this._clearTimeouts(); if (!this._triggerElementExists()) { return this.deactivate(); } this.debug("Showing now."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._hideGroup(this.options.group, this); } this.visible = true; this.preparingToShow = false; if (this.tooltipElement == null) { this._buildElements(); } this._updateElementContent(); if (this.options.ajax && (!this.loaded || !this.options.cache)) { this._loadAjax(); } this._searchAndActivateCloseButtons(); this._startEnsureTriggerElement(); this.adapter.css(this.container, { zIndex: Opentip.lastZIndex++ }); this._setupObservers("-hidden", "-hiding", "-showing", "-visible", "showing", "visible"); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); this.adapter.removeClass(this.container, this["class"].hiding); this.adapter.removeClass(this.container, this["class"].hidden); this.adapter.addClass(this.container, this["class"].goingToShow); this.setCss3Style(this.container, { transitionDuration: "0s" }); this.defer(function() { var delay; if (!_this.visible || _this.preparingToHide) { return; } _this.adapter.removeClass(_this.container, _this["class"].goingToShow); _this.adapter.addClass(_this.container, _this["class"].showing); delay = 0; if (_this.options.showEffect && _this.options.showEffectDuration) { delay = _this.options.showEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + delay + "s" }); _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].showing); return _this.adapter.addClass(_this.container, _this["class"].visible); }, delay); return _this._activateFirstInput(); }); return this._draw(); }; Opentip.prototype._abortShowing = function() { if (this.preparingToShow) { this.debug("Aborting showing."); this._clearTimeouts(); this._stopFollowingMousePosition(); this.preparingToShow = false; return this._setupObservers("-showing", "-visible", "hiding", "hidden"); } }; Opentip.prototype.prepareToHide = function() { this._abortShowing(); this._abortHiding(); if (!this.visible) { return; } this.debug("Hiding in " + this.options.hideDelay + "s"); this.preparingToHide = true; this._setupObservers("-showing", "visible", "-hidden", "hiding"); return this._hideTimeoutId = this.setTimeout(this.bound.hide, this.options.hideDelay); }; Opentip.prototype.hide = function() { var _this = this; this._abortShowing(); if (!this.visible) { return; } this._clearTimeouts(); this.debug("Hiding!"); this.visible = false; this.preparingToHide = false; this._stopEnsureTriggerElement(); this._setupObservers("-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden"); if (!this.options.fixed) { this._stopFollowingMousePosition(); } if (!this.container) { return; } this.adapter.removeClass(this.container, this["class"].visible); this.adapter.removeClass(this.container, this["class"].showing); this.adapter.addClass(this.container, this["class"].goingToHide); this.setCss3Style(this.container, { transitionDuration: "0s" }); return this.defer(function() { var hideDelay; _this.adapter.removeClass(_this.container, _this["class"].goingToHide); _this.adapter.addClass(_this.container, _this["class"].hiding); hideDelay = 0; if (_this.options.hideEffect && _this.options.hideEffectDuration) { hideDelay = _this.options.hideEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + hideDelay + "s" }); return _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].hiding); _this.adapter.addClass(_this.container, _this["class"].hidden); _this.setCss3Style(_this.container, { transitionDuration: "0s" }); if (_this.options.removeElementsOnHide) { _this.debug("Removing HTML elements."); _this.adapter.remove(_this.container); delete _this.container; return delete _this.tooltipElement; } }, hideDelay); }); }; Opentip.prototype._abortHiding = function() { if (this.preparingToHide) { this.debug("Aborting hiding."); this._clearTimeouts(); this.preparingToHide = false; return this._setupObservers("-hiding", "showing", "visible"); } }; Opentip.prototype.reposition = function() { var position, stem, _ref, _this = this; position = this.getPosition(); if (position == null) { return; } stem = this.options.stem; if (this.options.containInViewport) { _ref = this._ensureViewportContainment(position), position = _ref.position, stem = _ref.stem; } if (this._positionsEqual(position, this.currentPosition)) { return; } if (!(!this.options.stem || stem.eql(this.currentStem))) { this.redraw = true; } this.currentPosition = position; this.currentStem = stem; this._draw(); this.adapter.css(this.container, { left: "" + position.left + "px", top: "" + position.top + "px" }); return this.defer(function() { var rawContainer, redrawFix; rawContainer = _this.adapter.unwrap(_this.container); rawContainer.style.visibility = "hidden"; redrawFix = rawContainer.offsetHeight; return rawContainer.style.visibility = "visible"; }); }; Opentip.prototype.getPosition = function(tipJoint, targetJoint, stem) { var additionalHorizontal, additionalVertical, offsetDistance, position, stemLength, targetDimensions, targetPosition, unwrappedTarget, _ref; if (!this.container) { return; } if (tipJoint == null) { tipJoint = this.options.tipJoint; } if (targetJoint == null) { targetJoint = this.options.targetJoint; } position = {}; if (this.options.target) { targetPosition = this.adapter.offset(this.options.target); targetDimensions = this.adapter.dimensions(this.options.target); position = targetPosition; if (targetJoint.right) { unwrappedTarget = this.adapter.unwrap(this.options.target); if (unwrappedTarget.getBoundingClientRect != null) { position.left = unwrappedTarget.getBoundingClientRect().right + ((_ref = window.pageXOffset) != null ? _ref : document.body.scrollLeft); } else { position.left += targetDimensions.width; } } else if (targetJoint.center) { position.left += Math.round(targetDimensions.width / 2); } if (targetJoint.bottom) { position.top += targetDimensions.height; } else if (targetJoint.middle) { position.top += Math.round(targetDimensions.height / 2); } if (this.options.borderWidth) { if (this.options.tipJoint.left) { position.left += this.options.borderWidth; } if (this.options.tipJoint.right) { position.left -= this.options.borderWidth; } if (this.options.tipJoint.top) { position.top += this.options.borderWidth; } else if (this.options.tipJoint.bottom) { position.top -= this.options.borderWidth; } } } else { if (this.initialMousePosition) { position = { top: this.initialMousePosition.y, left: this.initialMousePosition.x }; } else { position = { top: mousePosition.y, left: mousePosition.x }; } } if (this.options.autoOffset) { stemLength = this.options.stem ? this.options.stemLength : 0; offsetDistance = stemLength && this.options.fixed ? 2 : 10; additionalHorizontal = tipJoint.middle && !this.options.fixed ? 15 : 0; additionalVertical = tipJoint.center && !this.options.fixed ? 15 : 0; if (tipJoint.right) { position.left -= offsetDistance + additionalHorizontal; } else if (tipJoint.left) { position.left += offsetDistance + additionalHorizontal; } if (tipJoint.bottom) { position.top -= offsetDistance + additionalVertical; } else if (tipJoint.top) { position.top += offsetDistance + additionalVertical; } if (stemLength) { if (stem == null) { stem = this.options.stem; } if (stem.right) { position.left -= stemLength; } else if (stem.left) { position.left += stemLength; } if (stem.bottom) { position.top -= stemLength; } else if (stem.top) { position.top += stemLength; } } } position.left += this.options.offset[0]; position.top += this.options.offset[1]; if (tipJoint.right) { position.left -= this.dimensions.width; } else if (tipJoint.center) { position.left -= Math.round(this.dimensions.width / 2); } if (tipJoint.bottom) { position.top -= this.dimensions.height; } else if (tipJoint.middle) { position.top -= Math.round(this.dimensions.height / 2); } return position; }; Opentip.prototype._ensureViewportContainment = function(position) { var needsRepositioning, newSticksOut, originals, revertedX, revertedY, scrollOffset, stem, sticksOut, targetJoint, tipJoint, viewportDimensions, viewportPosition; stem = this.options.stem; originals = { position: position, stem: stem }; if (!(this.visible && position)) { return originals; } sticksOut = this._sticksOut(position); if (!(sticksOut[0] || sticksOut[1])) { return originals; } tipJoint = new Opentip.Joint(this.options.tipJoint); if (this.options.targetJoint) { targetJoint = new Opentip.Joint(this.options.targetJoint); } scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); viewportPosition = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; needsRepositioning = false; if (viewportDimensions.width >= this.dimensions.width) { if (sticksOut[0]) { needsRepositioning = true; switch (sticksOut[0]) { case this.STICKS_OUT_LEFT: tipJoint.setHorizontal("left"); if (this.options.targetJoint) { targetJoint.setHorizontal("right"); } break; case this.STICKS_OUT_RIGHT: tipJoint.setHorizontal("right"); if (this.options.targetJoint) { targetJoint.setHorizontal("left"); } } } } if (viewportDimensions.height >= this.dimensions.height) { if (sticksOut[1]) { needsRepositioning = true; switch (sticksOut[1]) { case this.STICKS_OUT_TOP: tipJoint.setVertical("top"); if (this.options.targetJoint) { targetJoint.setVertical("bottom"); } break; case this.STICKS_OUT_BOTTOM: tipJoint.setVertical("bottom"); if (this.options.targetJoint) { targetJoint.setVertical("top"); } } } } if (!needsRepositioning) { return originals; } if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); newSticksOut = this._sticksOut(position); revertedX = false; revertedY = false; if (newSticksOut[0] && (newSticksOut[0] !== sticksOut[0])) { revertedX = true; tipJoint.setHorizontal(this.options.tipJoint.horizontal); if (this.options.targetJoint) { targetJoint.setHorizontal(this.options.targetJoint.horizontal); } } if (newSticksOut[1] && (newSticksOut[1] !== sticksOut[1])) { revertedY = true; tipJoint.setVertical(this.options.tipJoint.vertical); if (this.options.targetJoint) { targetJoint.setVertical(this.options.targetJoint.vertical); } } if (revertedX && revertedY) { return originals; } if (revertedX || revertedY) { if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); } return { position: position, stem: stem }; }; Opentip.prototype._sticksOut = function(position) { var positionOffset, scrollOffset, sticksOut, viewportDimensions; scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); positionOffset = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; sticksOut = [false, false]; if (positionOffset[0] < 0) { sticksOut[0] = this.STICKS_OUT_LEFT; } else if (positionOffset[0] + this.dimensions.width > viewportDimensions.width) { sticksOut[0] = this.STICKS_OUT_RIGHT; } if (positionOffset[1] < 0) { sticksOut[1] = this.STICKS_OUT_TOP; } else if (positionOffset[1] + this.dimensions.height > viewportDimensions.height) { sticksOut[1] = this.STICKS_OUT_BOTTOM; } return sticksOut; }; Opentip.prototype._draw = function() { var backgroundCanvas, bulge, canvasDimensions, canvasPosition, closeButton, closeButtonInner, closeButtonOuter, ctx, drawCorner, drawLine, hb, position, stemBase, stemLength, _i, _len, _ref, _ref1, _ref2, _this = this; if (!(this.backgroundCanvas && this.redraw)) { return; } this.debug("Drawing background."); this.redraw = false; if (this.currentStem) { _ref = ["top", "right", "bottom", "left"]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { position = _ref[_i]; this.adapter.removeClass(this.container, "stem-" + position); } this.adapter.addClass(this.container, "stem-" + this.currentStem.horizontal); this.adapter.addClass(this.container, "stem-" + this.currentStem.vertical); } closeButtonInner = [0, 0]; closeButtonOuter = [0, 0]; if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { closeButton = new Opentip.Joint(((_ref1 = this.currentStem) != null ? _ref1.toString() : void 0) === "top right" ? "top left" : "top right"); closeButtonInner = [this.options.closeButtonRadius + this.options.closeButtonOffset[0], this.options.closeButtonRadius + this.options.closeButtonOffset[1]]; closeButtonOuter = [this.options.closeButtonRadius - this.options.closeButtonOffset[0], this.options.closeButtonRadius - this.options.closeButtonOffset[1]]; } canvasDimensions = this.adapter.clone(this.dimensions); canvasPosition = [0, 0]; if (this.options.borderWidth) { canvasDimensions.width += this.options.borderWidth * 2; canvasDimensions.height += this.options.borderWidth * 2; canvasPosition[0] -= this.options.borderWidth; canvasPosition[1] -= this.options.borderWidth; } if (this.options.shadow) { canvasDimensions.width += this.options.shadowBlur * 2; canvasDimensions.width += Math.max(0, this.options.shadowOffset[0] - this.options.shadowBlur * 2); canvasDimensions.height += this.options.shadowBlur * 2; canvasDimensions.height += Math.max(0, this.options.shadowOffset[1] - this.options.shadowBlur * 2); canvasPosition[0] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[0]); canvasPosition[1] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[1]); } bulge = { left: 0, right: 0, top: 0, bottom: 0 }; if (this.currentStem) { if (this.currentStem.left) { bulge.left = this.options.stemLength; } else if (this.currentStem.right) { bulge.right = this.options.stemLength; } if (this.currentStem.top) { bulge.top = this.options.stemLength; } else if (this.currentStem.bottom) { bulge.bottom = this.options.stemLength; } } if (closeButton) { if (closeButton.left) { bulge.left = Math.max(bulge.left, closeButtonOuter[0]); } else if (closeButton.right) { bulge.right = Math.max(bulge.right, closeButtonOuter[0]); } if (closeButton.top) { bulge.top = Math.max(bulge.top, closeButtonOuter[1]); } else if (closeButton.bottom) { bulge.bottom = Math.max(bulge.bottom, closeButtonOuter[1]); } } canvasDimensions.width += bulge.left + bulge.right; canvasDimensions.height += bulge.top + bulge.bottom; canvasPosition[0] -= bulge.left; canvasPosition[1] -= bulge.top; if (this.currentStem && this.options.borderWidth) { _ref2 = this._getPathStemMeasures(this.options.stemBase, this.options.stemLength, this.options.borderWidth), stemLength = _ref2.stemLength, stemBase = _ref2.stemBase; } backgroundCanvas = this.adapter.unwrap(this.backgroundCanvas); backgroundCanvas.width = canvasDimensions.width; backgroundCanvas.height = canvasDimensions.height; this.adapter.css(this.backgroundCanvas, { width: "" + backgroundCanvas.width + "px", height: "" + backgroundCanvas.height + "px", left: "" + canvasPosition[0] + "px", top: "" + canvasPosition[1] + "px" }); ctx = backgroundCanvas.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height); ctx.beginPath(); ctx.fillStyle = this._getColor(ctx, this.dimensions, this.options.background, this.options.backgroundGradientHorizontal); ctx.lineJoin = "miter"; ctx.miterLimit = 500; hb = this.options.borderWidth / 2; if (this.options.borderWidth) { ctx.strokeStyle = this.options.borderColor; ctx.lineWidth = this.options.borderWidth; } else { stemLength = this.options.stemLength; stemBase = this.options.stemBase; } if (stemBase == null) { stemBase = 0; } drawLine = function(length, stem, first) { if (first) { ctx.moveTo(Math.max(stemBase, _this.options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb); } if (stem) { ctx.lineTo(length / 2 - stemBase / 2, -hb); ctx.lineTo(length / 2, -stemLength - hb); return ctx.lineTo(length / 2 + stemBase / 2, -hb); } }; drawCorner = function(stem, closeButton, i) { var angle1, angle2, innerWidth, offset; if (stem) { ctx.lineTo(-stemBase + hb, 0 - hb); ctx.lineTo(stemLength + hb, -stemLength - hb); return ctx.lineTo(hb, stemBase - hb); } else if (closeButton) { offset = _this.options.closeButtonOffset; innerWidth = closeButtonInner[0]; if (i % 2 !== 0) { offset = [offset[1], offset[0]]; innerWidth = closeButtonInner[1]; } angle1 = Math.acos(offset[1] / _this.options.closeButtonRadius); angle2 = Math.acos(offset[0] / _this.options.closeButtonRadius); ctx.lineTo(-innerWidth + hb, -hb); return ctx.arc(hb - offset[0], -hb + offset[1], _this.options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, false); } else { ctx.lineTo(-_this.options.borderRadius + hb, -hb); return ctx.quadraticCurveTo(hb, -hb, hb, _this.options.borderRadius - hb); } }; ctx.translate(-canvasPosition[0], -canvasPosition[1]); ctx.save(); (function() { var cornerStem, i, lineLength, lineStem, positionIdx, positionX, positionY, rotation, _j, _ref3, _results; _results = []; for (i = _j = 0, _ref3 = Opentip.positions.length / 2; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) { positionIdx = i * 2; positionX = i === 0 || i === 3 ? 0 : _this.dimensions.width; positionY = i < 2 ? 0 : _this.dimensions.height; rotation = (Math.PI / 2) * i; lineLength = i % 2 === 0 ? _this.dimensions.width : _this.dimensions.height; lineStem = new Opentip.Joint(Opentip.positions[positionIdx]); cornerStem = new Opentip.Joint(Opentip.positions[positionIdx + 1]); ctx.save(); ctx.translate(positionX, positionY); ctx.rotate(rotation); drawLine(lineLength, lineStem.eql(_this.currentStem), i === 0); ctx.translate(lineLength, 0); drawCorner(cornerStem.eql(_this.currentStem), cornerStem.eql(closeButton), i); _results.push(ctx.restore()); } return _results; })(); ctx.closePath(); ctx.save(); if (this.options.shadow) { ctx.shadowColor = this.options.shadowColor; ctx.shadowBlur = this.options.shadowBlur; ctx.shadowOffsetX = this.options.shadowOffset[0]; ctx.shadowOffsetY = this.options.shadowOffset[1]; } ctx.fill(); ctx.restore(); if (this.options.borderWidth) { ctx.stroke(); } ctx.restore(); if (closeButton) { return (function() { var crossCenter, crossHeight, crossWidth, hcs, linkCenter; crossWidth = crossHeight = _this.options.closeButtonRadius * 2; if (closeButton.toString() === "top right") { linkCenter = [_this.dimensions.width - _this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] + hb, linkCenter[1] - hb]; } else { linkCenter = [_this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] - hb, linkCenter[1] - hb]; } ctx.translate(crossCenter[0], crossCenter[1]); hcs = _this.options.closeButtonCrossSize / 2; ctx.save(); ctx.beginPath(); ctx.strokeStyle = _this.options.closeButtonCrossColor; ctx.lineWidth = _this.options.closeButtonCrossLineWidth; ctx.lineCap = "round"; ctx.moveTo(-hcs, -hcs); ctx.lineTo(hcs, hcs); ctx.stroke(); ctx.beginPath(); ctx.moveTo(hcs, -hcs); ctx.lineTo(-hcs, hcs); ctx.stroke(); ctx.restore(); return _this.adapter.css(_this.closeButtonElement, { left: "" + (linkCenter[0] - hcs - _this.options.closeButtonLinkOverscan) + "px", top: "" + (linkCenter[1] - hcs - _this.options.closeButtonLinkOverscan) + "px", width: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px", height: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px" }); })(); } }; Opentip.prototype._getPathStemMeasures = function(outerStemBase, outerStemLength, borderWidth) { var angle, distanceBetweenTips, halfAngle, hb, rhombusSide, stemBase, stemLength; hb = borderWidth / 2; halfAngle = Math.atan((outerStemBase / 2) / outerStemLength); angle = halfAngle * 2; rhombusSide = hb / Math.sin(angle); distanceBetweenTips = 2 * rhombusSide * Math.cos(halfAngle); stemLength = hb + outerStemLength - distanceBetweenTips; if (stemLength < 0) { throw new Error("Sorry but your stemLength / stemBase ratio is strange."); } stemBase = (Math.tan(halfAngle) * stemLength) * 2; return { stemLength: stemLength, stemBase: stemBase }; }; Opentip.prototype._getColor = function(ctx, dimensions, color, horizontal) { var colorStop, gradient, i, _i, _len; if (horizontal == null) { horizontal = false; } if (typeof color === "string") { return color; } if (horizontal) { gradient = ctx.createLinearGradient(0, 0, dimensions.width, 0); } else { gradient = ctx.createLinearGradient(0, 0, 0, dimensions.height); } for (i = _i = 0, _len = color.length; _i < _len; i = ++_i) { colorStop = color[i]; gradient.addColorStop(colorStop[0], colorStop[1]); } return gradient; }; Opentip.prototype._searchAndActivateCloseButtons = function() { var element, _i, _len, _ref; _ref = this.adapter.findAll(this.container, "." + this["class"].close); for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; this.hideTriggers.push({ element: this.adapter.wrap(element), event: "click" }); } if (this.currentObservers.showing) { this._setupObservers("-showing", "showing"); } if (this.currentObservers.visible) { return this._setupObservers("-visible", "visible"); } }; Opentip.prototype._activateFirstInput = function() { var input; input = this.adapter.unwrap(this.adapter.find(this.container, "input, textarea")); return input != null ? typeof input.focus === "function" ? input.focus() : void 0 : void 0; }; Opentip.prototype._followMousePosition = function() { if (!this.options.fixed) { return Opentip._observeMousePosition(this.bound.reposition); } }; Opentip.prototype._stopFollowingMousePosition = function() { if (!this.options.fixed) { return Opentip._stopObservingMousePosition(this.bound.reposition); } }; Opentip.prototype._clearShowTimeout = function() { return clearTimeout(this._showTimeoutId); }; Opentip.prototype._clearHideTimeout = function() { return clearTimeout(this._hideTimeoutId); }; Opentip.prototype._clearTimeouts = function() { clearTimeout(this._visibilityStateTimeoutId); this._clearShowTimeout(); return this._clearHideTimeout(); }; Opentip.prototype._triggerElementExists = function() { var el; el = this.adapter.unwrap(this.triggerElement); while (el.parentNode) { if (el.parentNode.tagName === "BODY") { return true; } el = el.parentNode; } return false; }; Opentip.prototype._loadAjax = function() { var _this = this; if (this.loading) { return; } this.loaded = false; this.loading = true; this.adapter.addClass(this.container, this["class"].loading); this.setContent(""); this.debug("Loading content from " + this.options.ajax); return this.adapter.ajax({ url: this.options.ajax, method: this.options.ajaxMethod, onSuccess: function(responseText) { _this.debug("Loading successful."); _this.adapter.removeClass(_this.container, _this["class"].loading); return _this.setContent(responseText); }, onError: function(error) { var message; message = _this.options.ajaxErrorMessage; _this.debug(message, error); _this.setContent(message); return _this.adapter.addClass(_this.container, _this["class"].ajaxError); }, onComplete: function() { _this.adapter.removeClass(_this.container, _this["class"].loading); _this.loading = false; _this.loaded = true; _this._searchAndActivateCloseButtons(); _this._activateFirstInput(); return _this.reposition(); } }); }; Opentip.prototype._ensureTriggerElement = function() { if (!this._triggerElementExists()) { this.deactivate(); return this._stopEnsureTriggerElement(); } }; Opentip.prototype._ensureTriggerElementInterval = 1000; Opentip.prototype._startEnsureTriggerElement = function() { var _this = this; return this._ensureTriggerElementTimeoutId = setInterval((function() { return _this._ensureTriggerElement(); }), this._ensureTriggerElementInterval); }; Opentip.prototype._stopEnsureTriggerElement = function() { return clearInterval(this._ensureTriggerElementTimeoutId); }; return Opentip; })(); vendors = ["khtml", "ms", "o", "moz", "webkit"]; Opentip.prototype.setCss3Style = function(element, styles) { var prop, value, vendor, vendorProp, _results; element = this.adapter.unwrap(element); _results = []; for (prop in styles) { if (!__hasProp.call(styles, prop)) continue; value = styles[prop]; if (element.style[prop] != null) { _results.push(element.style[prop] = value); } else { _results.push((function() { var _i, _len, _results1; _results1 = []; for (_i = 0, _len = vendors.length; _i < _len; _i++) { vendor = vendors[_i]; vendorProp = "" + (this.ucfirst(vendor)) + (this.ucfirst(prop)); if (element.style[vendorProp] != null) { _results1.push(element.style[vendorProp] = value); } else { _results1.push(void 0); } } return _results1; }).call(this)); } } return _results; }; Opentip.prototype.defer = function(func) { return setTimeout(func, 0); }; Opentip.prototype.setTimeout = function(func, seconds) { return setTimeout(func, seconds ? seconds * 1000 : 0); }; Opentip.prototype.ucfirst = function(string) { if (string == null) { return ""; } return string.charAt(0).toUpperCase() + string.slice(1); }; Opentip.prototype.dasherize = function(string) { return string.replace(/([A-Z])/g, function(_, character) { return "-" + (character.toLowerCase()); }); }; mousePositionObservers = []; mousePosition = { x: 0, y: 0 }; mouseMoved = function(e) { var observer, _i, _len, _results; mousePosition = Opentip.adapter.mousePosition(e); _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; _results.push(observer()); } return _results; }; Opentip.followMousePosition = function() { return Opentip.adapter.observe(document.body, "mousemove", mouseMoved); }; Opentip._observeMousePosition = function(observer) { return mousePositionObservers.push(observer); }; Opentip._stopObservingMousePosition = function(removeObserver) { var observer; return mousePositionObservers = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; if (observer !== removeObserver) { _results.push(observer); } } return _results; })(); }; Opentip.Joint = (function() { function Joint(pointerString) { if (pointerString == null) { return; } if (pointerString instanceof Opentip.Joint) { pointerString = pointerString.toString(); } this.set(pointerString); this; } Joint.prototype.set = function(string) { string = string.toLowerCase(); this.setHorizontal(string); this.setVertical(string); return this; }; Joint.prototype.setHorizontal = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["left", "center", "right"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.horizontal = i.toLowerCase(); } } if (this.horizontal == null) { this.horizontal = "center"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.horizontal === i ? i : void 0); } return _results; }; Joint.prototype.setVertical = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["top", "middle", "bottom"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.vertical = i.toLowerCase(); } } if (this.vertical == null) { this.vertical = "middle"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.vertical === i ? i : void 0); } return _results; }; Joint.prototype.eql = function(pointer) { return (pointer != null) && this.horizontal === pointer.horizontal && this.vertical === pointer.vertical; }; Joint.prototype.flip = function() { var flippedIndex, positionIdx; positionIdx = Opentip.position[this.toString(true)]; flippedIndex = (positionIdx + 4) % 8; this.set(Opentip.positions[flippedIndex]); return this; }; Joint.prototype.toString = function(camelized) { var horizontal, vertical; if (camelized == null) { camelized = false; } vertical = this.vertical === "middle" ? "" : this.vertical; horizontal = this.horizontal === "center" ? "" : this.horizontal; if (vertical && horizontal) { if (camelized) { horizontal = Opentip.prototype.ucfirst(horizontal); } else { horizontal = " " + horizontal; } } return "" + vertical + horizontal; }; return Joint; })(); Opentip.prototype._positionsEqual = function(posA, posB) { return (posA != null) && (posB != null) && posA.left === posB.left && posA.top === posB.top; }; Opentip.prototype._dimensionsEqual = function(dimA, dimB) { return (dimA != null) && (dimB != null) && dimA.width === dimB.width && dimA.height === dimB.height; }; Opentip.prototype.debug = function() { var args; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (Opentip.debug && ((typeof console !== "undefined" && console !== null ? console.debug : void 0) != null)) { args.unshift("#" + this.id + " |"); return console.debug.apply(console, args); } }; Opentip.findElements = function() { var adapter, content, element, optionName, optionValue, options, _i, _len, _ref, _results; adapter = Opentip.adapter; _ref = adapter.findAll(document.body, "[data-ot]"); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; options = {}; content = adapter.data(element, "ot"); if (content === "" || content === "true" || content === "yes") { content = adapter.attr(element, "title"); adapter.attr(element, "title", ""); } content = content || ""; for (optionName in Opentip.styles.standard) { optionValue = adapter.data(element, "ot" + (Opentip.prototype.ucfirst(optionName))); if (optionValue != null) { if (optionValue === "yes" || optionValue === "true" || optionValue === "on") { optionValue = true; } else if (optionValue === "no" || optionValue === "false" || optionValue === "off") { optionValue = false; } options[optionName] = optionValue; } } _results.push(new Opentip(element, content, options)); } return _results; }; Opentip.version = "2.4.6"; Opentip.debug = false; Opentip.lastId = 0; Opentip.lastZIndex = 100; Opentip.tips = []; Opentip._abortShowingGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip._abortShowing()); } else { _results.push(void 0); } } return _results; }; Opentip._hideGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip.hide()); } else { _results.push(void 0); } } return _results; }; Opentip.adapters = {}; Opentip.adapter = null; firstAdapter = true; Opentip.addAdapter = function(adapter) { Opentip.adapters[adapter.name] = adapter; if (firstAdapter) { Opentip.adapter = adapter; adapter.domReady(Opentip.findElements); adapter.domReady(Opentip.followMousePosition); return firstAdapter = false; } }; Opentip.positions = ["top", "topRight", "right", "bottomRight", "bottom", "bottomLeft", "left", "topLeft"]; Opentip.position = {}; _ref = Opentip.positions; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { position = _ref[i]; Opentip.position[position] = i; } Opentip.styles = { standard: { "extends": null, title: void 0, escapeTitle: true, escapeContent: false, className: "standard", stem: true, delay: null, hideDelay: 0.1, fixed: false, showOn: "mouseover", hideTrigger: "trigger", hideTriggers: [], hideOn: null, removeElementsOnHide: false, offset: [0, 0], containInViewport: true, autoOffset: true, showEffect: "appear", hideEffect: "fade", showEffectDuration: 0.3, hideEffectDuration: 0.2, stemLength: 5, stemBase: 8, tipJoint: "top left", target: null, targetJoint: null, cache: true, ajax: false, ajaxMethod: "GET", ajaxErrorMessage: "There was a problem downloading the content.", group: null, style: null, background: "#fff18f", backgroundGradientHorizontal: false, closeButtonOffset: [5, 5], closeButtonRadius: 7, closeButtonCrossSize: 4, closeButtonCrossColor: "#d2c35b", closeButtonCrossLineWidth: 1.5, closeButtonLinkOverscan: 6, borderRadius: 5, borderWidth: 1, borderColor: "#f2e37b", shadow: true, shadowBlur: 10, shadowOffset: [3, 3], shadowColor: "rgba(0, 0, 0, 0.1)" }, glass: { "extends": "standard", className: "glass", background: [[0, "rgba(252, 252, 252, 0.8)"], [0.5, "rgba(255, 255, 255, 0.8)"], [0.5, "rgba(250, 250, 250, 0.9)"], [1, "rgba(245, 245, 245, 0.9)"]], borderColor: "#eee", closeButtonCrossColor: "rgba(0, 0, 0, 0.2)", borderRadius: 15, closeButtonRadius: 10, closeButtonOffset: [8, 8] }, dark: { "extends": "standard", className: "dark", borderRadius: 13, borderColor: "#444", closeButtonCrossColor: "rgba(240, 240, 240, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(30, 30, 30, 0.7)"], [0.5, "rgba(30, 30, 30, 0.8)"], [0.5, "rgba(10, 10, 10, 0.8)"], [1, "rgba(10, 10, 10, 0.9)"]] }, alert: { "extends": "standard", className: "alert", borderRadius: 1, borderColor: "#AE0D11", closeButtonCrossColor: "rgba(255, 255, 255, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(203, 15, 19, 0.7)"], [0.5, "rgba(203, 15, 19, 0.8)"], [0.5, "rgba(189, 14, 18, 0.8)"], [1, "rgba(179, 14, 17, 0.9)"]] } }; Opentip.defaultStyle = "standard"; if (typeof module !== "undefined" && module !== null) { module.exports = Opentip; } else { window.Opentip = Opentip; } // Generated by CoffeeScript 1.4.0 var __slice = [].slice; (function($) { var Adapter; $.fn.opentip = function(content, title, options) { return new Opentip(this, content, title, options); }; Adapter = (function() { function Adapter() {} Adapter.prototype.name = "jquery"; Adapter.prototype.domReady = function(callback) { return $(callback); }; Adapter.prototype.create = function(html) { return $(html); }; Adapter.prototype.wrap = function(element) { element = $(element); if (element.length > 1) { throw new Error("Multiple elements provided."); } return element; }; Adapter.prototype.unwrap = function(element) { return $(element)[0]; }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref = $(element)).attr.apply(_ref, args); }; Adapter.prototype.data = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref = $(element)).data.apply(_ref, args); }; Adapter.prototype.find = function(element, selector) { return $(element).find(selector).get(0); }; Adapter.prototype.findAll = function(element, selector) { return $(element).find(selector); }; Adapter.prototype.update = function(element, content, escape) { element = $(element); if (escape) { return element.text(content); } else { return element.html(content); } }; Adapter.prototype.append = function(element, child) { return $(element).append(child); }; Adapter.prototype.remove = function(element) { return $(element).remove(); }; Adapter.prototype.addClass = function(element, className) { return $(element).addClass(className); }; Adapter.prototype.removeClass = function(element, className) { return $(element).removeClass(className); }; Adapter.prototype.css = function(element, properties) { return $(element).css(properties); }; Adapter.prototype.dimensions = function(element) { return { width: $(element).outerWidth(), height: $(element).outerHeight() }; }; Adapter.prototype.scrollOffset = function() { return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; }; Adapter.prototype.viewportDimensions = function() { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; }; Adapter.prototype.mousePosition = function(e) { if (e == null) { return null; } return { x: e.pageX, y: e.pageY }; }; Adapter.prototype.offset = function(element) { var offset; offset = $(element).offset(); return { left: offset.left, top: offset.top }; }; Adapter.prototype.observe = function(element, eventName, observer) { return $(element).bind(eventName, observer); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return $(element).unbind(eventName, observer); }; Adapter.prototype.ajax = function(options) { var _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } return $.ajax({ url: options.url, type: (_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET" }).done(function(content) { return typeof options.onSuccess === "function" ? options.onSuccess(content) : void 0; }).fail(function(request) { return typeof options.onError === "function" ? options.onError("Server responded with status " + request.status) : void 0; }).always(function() { return typeof options.onComplete === "function" ? options.onComplete() : void 0; }); }; Adapter.prototype.clone = function(object) { return $.extend({}, object); }; Adapter.prototype.extend = function() { var sources, target; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return $.extend.apply($, [target].concat(__slice.call(sources))); }; return Adapter; })(); return Opentip.addAdapter(new Adapter); })(jQuery); // Modified by Matias Meno to work in IE8. // I removed the line 312, as proposed by someone on the google forum. // Copyright 2006 Google 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. // Known Issues: // // * Patterns are not implemented. // * Radial gradient are not implemented. The VML version of these look very // different from the canvas one. // * Clipping paths are not implemented. // * Coordsize. The width and height attribute have higher priority than the // width and height style values which isn't correct. // * Painting mode isn't implemented. // * Canvas width/height should is using content-box by default. IE in // Quirks mode will draw the canvas using border-box. Either change your // doctype to HTML5 // (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) // or use Box Sizing Behavior from WebFX // (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) // * Non uniform scaling does not correctly scale strokes. // * Optimize. There is always room for speed improvements. // Only add this code if we do not already have a canvas implementation if (!document.createElement('canvas').getContext) { (function() { // alias some functions to make (compiled) code shorter var m = Math; var mr = m.round; var ms = m.sin; var mc = m.cos; var abs = m.abs; var sqrt = m.sqrt; // this is used for sub pixel precision var Z = 10; var Z2 = Z / 2; /** * This funtion is assigned to the elements as element.getContext(). * @this {HTMLElement} * @return {CanvasRenderingContext2D_} */ function getContext() { return this.context_ || (this.context_ = new CanvasRenderingContext2D_(this)); } var slice = Array.prototype.slice; /** * Binds a function to an object. The returned function will always use the * passed in {@code obj} as {@code this}. * * Example: * * g = bind(f, obj, a, b) * g(c, d) // will do f.call(obj, a, b, c, d) * * @param {Function} f The function to bind the object to * @param {Object} obj The object that should act as this when the function * is called * @param {*} var_args Rest arguments that will be used as the initial * arguments when the function is called * @return {Function} A new function that has bound this */ function bind(f, obj, var_args) { var a = slice.call(arguments, 2); return function() { return f.apply(obj, a.concat(slice.call(arguments))); }; } var G_vmlCanvasManager_ = { init: function(opt_doc) { if (/MSIE/.test(navigator.userAgent) && !window.opera) { var doc = opt_doc || document; // Create a dummy element so that IE will allow canvas elements to be // recognized. doc.createElement('canvas'); doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); } }, init_: function(doc) { // create xmlns if (!doc.namespaces['g_vml_']) { doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', '#default#VML'); } if (!doc.namespaces['g_o_']) { doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', '#default#VML'); } // Setup default CSS. Only add one style sheet per document if (!doc.styleSheets['ex_canvas_']) { var ss = doc.createStyleSheet(); ss.owningElement.id = 'ex_canvas_'; ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + // default size is 300x150 in Gecko and Opera 'text-align:left;width:300px;height:150px}' + 'g_vml_\\:*{behavior:url(#default#VML)}' + 'g_o_\\:*{behavior:url(#default#VML)}'; } // find all canvas elements var els = doc.getElementsByTagName('canvas'); for (var i = 0; i < els.length; i++) { this.initElement(els[i]); } }, /** * Public initializes a canvas element so that it can be used as canvas * element from now on. This is called automatically before the page is * loaded but if you are creating elements using createElement you need to * make sure this is called on the element. * @param {HTMLElement} el The canvas element to initialize. * @return {HTMLElement} the element that was created. */ initElement: function(el) { if (!el.getContext) { el.getContext = getContext; // Remove fallback content. There is no way to hide text nodes so we // just remove all childNodes. We could hide all elements and remove // text nodes but who really cares about the fallback content. el.innerHTML = ''; // do not use inline function because that will leak memory el.attachEvent('onpropertychange', onPropertyChange); el.attachEvent('onresize', onResize); var attrs = el.attributes; if (attrs.width && attrs.width.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setWidth_(attrs.width.nodeValue); el.style.width = attrs.width.nodeValue + 'px'; } else { el.width = el.clientWidth; } if (attrs.height && attrs.height.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setHeight_(attrs.height.nodeValue); el.style.height = attrs.height.nodeValue + 'px'; } else { el.height = el.clientHeight; } //el.getContext().setCoordsize_() } return el; } }; function onPropertyChange(e) { var el = e.srcElement; switch (e.propertyName) { case 'width': el.style.width = el.attributes.width.nodeValue + 'px'; el.getContext().clearRect(); break; case 'height': el.style.height = el.attributes.height.nodeValue + 'px'; el.getContext().clearRect(); break; } } function onResize(e) { var el = e.srcElement; if (el.firstChild) { el.firstChild.style.width = el.clientWidth + 'px'; el.firstChild.style.height = el.clientHeight + 'px'; } } G_vmlCanvasManager_.init(); // precompute "00" to "FF" var dec2hex = []; for (var i = 0; i < 16; i++) { for (var j = 0; j < 16; j++) { dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); } } function createMatrixIdentity() { return [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]; } function matrixMultiply(m1, m2) { var result = createMatrixIdentity(); for (var x = 0; x < 3; x++) { for (var y = 0; y < 3; y++) { var sum = 0; for (var z = 0; z < 3; z++) { sum += m1[x][z] * m2[z][y]; } result[x][y] = sum; } } return result; } function copyState(o1, o2) { o2.fillStyle = o1.fillStyle; o2.lineCap = o1.lineCap; o2.lineJoin = o1.lineJoin; o2.lineWidth = o1.lineWidth; o2.miterLimit = o1.miterLimit; o2.shadowBlur = o1.shadowBlur; o2.shadowColor = o1.shadowColor; o2.shadowOffsetX = o1.shadowOffsetX; o2.shadowOffsetY = o1.shadowOffsetY; o2.strokeStyle = o1.strokeStyle; o2.globalAlpha = o1.globalAlpha; o2.arcScaleX_ = o1.arcScaleX_; o2.arcScaleY_ = o1.arcScaleY_; o2.lineScale_ = o1.lineScale_; } function processStyle(styleString) { var str, alpha = 1; styleString = String(styleString); if (styleString.substring(0, 3) == 'rgb') { var start = styleString.indexOf('(', 3); var end = styleString.indexOf(')', start + 1); var guts = styleString.substring(start + 1, end).split(','); str = '#'; for (var i = 0; i < 3; i++) { str += dec2hex[Number(guts[i])]; } if (guts.length == 4 && styleString.substr(3, 1) == 'a') { alpha = guts[3]; } } else { str = styleString; } return {color: str, alpha: alpha}; } function processLineCap(lineCap) { switch (lineCap) { case 'butt': return 'flat'; case 'round': return 'round'; case 'square': default: return 'square'; } } /** * This class implements CanvasRenderingContext2D interface as described by * the WHATWG. * @param {HTMLElement} surfaceElement The element that the 2D context should * be associated with */ function CanvasRenderingContext2D_(surfaceElement) { this.m_ = createMatrixIdentity(); this.mStack_ = []; this.aStack_ = []; this.currentPath_ = []; // Canvas context properties this.strokeStyle = '#000'; this.fillStyle = '#000'; this.lineWidth = 1; this.lineJoin = 'miter'; this.lineCap = 'butt'; this.miterLimit = Z * 1; this.globalAlpha = 1; this.canvas = surfaceElement; var el = surfaceElement.ownerDocument.createElement('div'); el.style.width = surfaceElement.clientWidth + 'px'; el.style.height = surfaceElement.clientHeight + 'px'; // el.style.overflow = 'hidden'; el.style.position = 'absolute'; surfaceElement.appendChild(el); this.element_ = el; this.arcScaleX_ = 1; this.arcScaleY_ = 1; this.lineScale_ = 1; } var contextPrototype = CanvasRenderingContext2D_.prototype; contextPrototype.clearRect = function() { this.element_.innerHTML = ''; }; contextPrototype.beginPath = function() { // TODO: Branch current matrix so that save/restore has no effect // as per safari docs. this.currentPath_ = []; }; contextPrototype.moveTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.lineTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { var p = this.getCoords_(aX, aY); var cp1 = this.getCoords_(aCP1x, aCP1y); var cp2 = this.getCoords_(aCP2x, aCP2y); bezierCurveTo(this, cp1, cp2, p); }; // Helper function that takes the already fixed cordinates. function bezierCurveTo(self, cp1, cp2, p) { self.currentPath_.push({ type: 'bezierCurveTo', cp1x: cp1.x, cp1y: cp1.y, cp2x: cp2.x, cp2y: cp2.y, x: p.x, y: p.y }); self.currentX_ = p.x; self.currentY_ = p.y; } contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { // the following is lifted almost directly from // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes var cp = this.getCoords_(aCPx, aCPy); var p = this.getCoords_(aX, aY); var cp1 = { x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) }; var cp2 = { x: cp1.x + (p.x - this.currentX_) / 3.0, y: cp1.y + (p.y - this.currentY_) / 3.0 }; bezierCurveTo(this, cp1, cp2, p); }; contextPrototype.arc = function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { aRadius *= Z; var arcType = aClockwise ? 'at' : 'wa'; var xStart = aX + mc(aStartAngle) * aRadius - Z2; var yStart = aY + ms(aStartAngle) * aRadius - Z2; var xEnd = aX + mc(aEndAngle) * aRadius - Z2; var yEnd = aY + ms(aEndAngle) * aRadius - Z2; // IE won't render arches drawn counter clockwise if xStart == xEnd. if (xStart == xEnd && !aClockwise) { xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something // that can be represented in binary } var p = this.getCoords_(aX, aY); var pStart = this.getCoords_(xStart, yStart); var pEnd = this.getCoords_(xEnd, yEnd); this.currentPath_.push({type: arcType, x: p.x, y: p.y, radius: aRadius, xStart: pStart.x, yStart: pStart.y, xEnd: pEnd.x, yEnd: pEnd.y}); }; contextPrototype.rect = function(aX, aY, aWidth, aHeight) { this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); }; contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.stroke(); this.currentPath_ = oldPath; }; contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.fill(); this.currentPath_ = oldPath; }; contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { var gradient = new CanvasGradient_('gradient'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.x1_ = aX1; gradient.y1_ = aY1; return gradient; }; contextPrototype.createRadialGradient = function(aX0, aY0, aR0, aX1, aY1, aR1) { var gradient = new CanvasGradient_('gradientradial'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.r0_ = aR0; gradient.x1_ = aX1; gradient.y1_ = aY1; gradient.r1_ = aR1; return gradient; }; contextPrototype.drawImage = function(image, var_args) { var dx, dy, dw, dh, sx, sy, sw, sh; // to find the original width we overide the width and height var oldRuntimeWidth = image.runtimeStyle.width; var oldRuntimeHeight = image.runtimeStyle.height; image.runtimeStyle.width = 'auto'; image.runtimeStyle.height = 'auto'; // get the original size var w = image.width; var h = image.height; // and remove overides image.runtimeStyle.width = oldRuntimeWidth; image.runtimeStyle.height = oldRuntimeHeight; if (arguments.length == 3) { dx = arguments[1]; dy = arguments[2]; sx = sy = 0; sw = dw = w; sh = dh = h; } else if (arguments.length == 5) { dx = arguments[1]; dy = arguments[2]; dw = arguments[3]; dh = arguments[4]; sx = sy = 0; sw = w; sh = h; } else if (arguments.length == 9) { sx = arguments[1]; sy = arguments[2]; sw = arguments[3]; sh = arguments[4]; dx = arguments[5]; dy = arguments[6]; dw = arguments[7]; dh = arguments[8]; } else { throw Error('Invalid number of arguments'); } var d = this.getCoords_(dx, dy); var w2 = sw / 2; var h2 = sh / 2; var vmlStr = []; var W = 10; var H = 10; // For some reason that I've now forgotten, using divs didn't work vmlStr.push(' ' , '', ''); this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); }; contextPrototype.stroke = function(aFill) { var lineStr = []; var lineOpen = false; var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); var color = a.color; var opacity = a.alpha * this.globalAlpha; var W = 10; var H = 10; lineStr.push(''); if (!aFill) { var lineWidth = this.lineScale_ * this.lineWidth; // VML cannot correctly render a line if the width is less than 1px. // In that case, we dilute the color to make the line look thinner. if (lineWidth < 1) { opacity *= lineWidth; } lineStr.push( '' ); } else if (typeof this.fillStyle == 'object') { var fillStyle = this.fillStyle; var angle = 0; var focus = {x: 0, y: 0}; // additional offset var shift = 0; // scale factor for offset var expansion = 1; if (fillStyle.type_ == 'gradient') { var x0 = fillStyle.x0_ / this.arcScaleX_; var y0 = fillStyle.y0_ / this.arcScaleY_; var x1 = fillStyle.x1_ / this.arcScaleX_; var y1 = fillStyle.y1_ / this.arcScaleY_; var p0 = this.getCoords_(x0, y0); var p1 = this.getCoords_(x1, y1); var dx = p1.x - p0.x; var dy = p1.y - p0.y; angle = Math.atan2(dx, dy) * 180 / Math.PI; // The angle should be a non-negative number. if (angle < 0) { angle += 360; } // Very small angles produce an unexpected result because they are // converted to a scientific notation string. if (angle < 1e-6) { angle = 0; } } else { var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); var width = max.x - min.x; var height = max.y - min.y; focus = { x: (p0.x - min.x) / width, y: (p0.y - min.y) / height }; width /= this.arcScaleX_ * Z; height /= this.arcScaleY_ * Z; var dimension = m.max(width, height); shift = 2 * fillStyle.r0_ / dimension; expansion = 2 * fillStyle.r1_ / dimension - shift; } // We need to sort the color stops in ascending order by offset, // otherwise IE won't interpret it correctly. var stops = fillStyle.colors_; stops.sort(function(cs1, cs2) { return cs1.offset - cs2.offset; }); var length = stops.length; var color1 = stops[0].color; var color2 = stops[length - 1].color; var opacity1 = stops[0].alpha * this.globalAlpha; var opacity2 = stops[length - 1].alpha * this.globalAlpha; var colors = []; for (var i = 0; i < length; i++) { var stop = stops[i]; colors.push(stop.offset * expansion + shift + ' ' + stop.color); } // When colors attribute is used, the meanings of opacity and o:opacity2 // are reversed. lineStr.push(''); } else { lineStr.push(''); } lineStr.push(''); this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); }; contextPrototype.fill = function() { this.stroke(true); } contextPrototype.closePath = function() { this.currentPath_.push({type: 'close'}); }; /** * @private */ contextPrototype.getCoords_ = function(aX, aY) { var m = this.m_; return { x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 } }; contextPrototype.save = function() { var o = {}; copyState(this, o); this.aStack_.push(o); this.mStack_.push(this.m_); this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); }; contextPrototype.restore = function() { copyState(this.aStack_.pop(), this); this.m_ = this.mStack_.pop(); }; function matrixIsFinite(m) { for (var j = 0; j < 3; j++) { for (var k = 0; k < 2; k++) { if (!isFinite(m[j][k]) || isNaN(m[j][k])) { return false; } } } return true; } function setM(ctx, m, updateLineScale) { if (!matrixIsFinite(m)) { return; } ctx.m_ = m; if (updateLineScale) { // Get the line scale. // Determinant of this.m_ means how much the area is enlarged by the // transformation. So its square root can be used as a scale factor // for width. var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; ctx.lineScale_ = sqrt(abs(det)); } } contextPrototype.translate = function(aX, aY) { var m1 = [ [1, 0, 0], [0, 1, 0], [aX, aY, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.rotate = function(aRot) { var c = mc(aRot); var s = ms(aRot); var m1 = [ [c, s, 0], [-s, c, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.scale = function(aX, aY) { this.arcScaleX_ *= aX; this.arcScaleY_ *= aY; var m1 = [ [aX, 0, 0], [0, aY, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { var m1 = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { var m = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, m, true); }; /******** STUBS ********/ contextPrototype.clip = function() { // TODO: Implement }; contextPrototype.arcTo = function() { // TODO: Implement }; contextPrototype.createPattern = function() { return new CanvasPattern_; }; // Gradient / Pattern Stubs function CanvasGradient_(aType) { this.type_ = aType; this.x0_ = 0; this.y0_ = 0; this.r0_ = 0; this.x1_ = 0; this.y1_ = 0; this.r1_ = 0; this.colors_ = []; } CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { aColor = processStyle(aColor); this.colors_.push({offset: aOffset, color: aColor.color, alpha: aColor.alpha}); }; function CanvasPattern_() {} // set up externs G_vmlCanvasManager = G_vmlCanvasManager_; CanvasRenderingContext2D = CanvasRenderingContext2D_; CanvasGradient = CanvasGradient_; CanvasPattern = CanvasPattern_; })(); } // if opentip-2.4.6/downloads/opentip-jquery-excanvas.min.js000066400000000000000000001277551213277401600231400ustar00rootroot00000000000000// Opentip v2.4.6 // Copyright (c) 2009-2012 // www.opentip.org // MIT Licensed var Opentip,firstAdapter,i,mouseMoved,mousePosition,mousePositionObservers,position,vendors,_i,_len,_ref,__slice=[].slice,__indexOf=[].indexOf||function(t){for(var e=0,i=this.length;i>e;e++)if(e in this&&this[e]===t)return e;return-1},__hasProp={}.hasOwnProperty;for(Opentip=function(){function t(e,i,o,s){var n,r,a,h,p,l,d,u,c,g,f,m,v,_,w=this;if(this.id=++t.lastId,this.debug("Creating Opentip."),t.tips.push(this),this.adapter=t.adapter,n=this.adapter.data(e,"opentips")||[],n.push(this),this.adapter.data(e,"opentips",n),this.triggerElement=this.adapter.wrap(e),this.triggerElement.length>1)throw Error("You can't call Opentip on multiple elements.");if(1>this.triggerElement.length)throw Error("Invalid element.");this.loaded=!1,this.loading=!1,this.visible=!1,this.waitingToShow=!1,this.waitingToHide=!1,this.currentPosition={left:0,top:0},this.dimensions={width:100,height:50},this.content="",this.redraw=!0,this.currentObservers={showing:!1,visible:!1,hiding:!1,hidden:!1},s=this.adapter.clone(s),typeof i=="object"?(s=i,i=o=void 0):typeof o=="object"&&(s=o,o=void 0),o!=null&&(s.title=o),i!=null&&this.setContent(i),s["extends"]==null&&(s["extends"]=s.style!=null?s.style:t.defaultStyle),h=[s],_=s;while(_["extends"]){if(l=_["extends"],_=t.styles[l],_==null)throw Error("Invalid style: "+l);h.unshift(_),_["extends"]==null&&l!=="standard"&&(_["extends"]="standard")}for(s=(f=this.adapter).extend.apply(f,[{}].concat(__slice.call(h))),s.hideTriggers=function(){var t,e,i,o;for(i=s.hideTriggers,o=[],t=0,e=i.length;e>t;t++)r=i[t],o.push(r);return o}(),s.hideTrigger&&s.hideTriggers.length===0&&s.hideTriggers.push(s.hideTrigger),m=["tipJoint","targetJoint","stem"],d=0,c=m.length;c>d;d++)p=m[d],s[p]&&typeof s[p]=="string"&&(s[p]=new t.Joint(s[p]));for(!s.ajax||s.ajax!==!0&&s.ajax||(s.ajax=this.adapter.tagName(this.triggerElement)==="A"?this.adapter.attr(this.triggerElement,"href"):!1),s.showOn==="click"&&this.adapter.tagName(this.triggerElement)==="A"&&this.adapter.observe(this.triggerElement,"click",function(t){return t.preventDefault(),t.stopPropagation(),t.stopped=!0}),s.target&&(s.fixed=!0),s.stem===!0&&(s.stem=new t.Joint(s.tipJoint)),s.target===!0?s.target=this.triggerElement:s.target&&(s.target=this.adapter.wrap(s.target)),this.currentStem=s.stem,s.delay==null&&(s.delay=s.showOn==="mouseover"?.2:0),s.targetJoint==null&&(s.targetJoint=new t.Joint(s.tipJoint).flip()),this.showTriggers=[],this.showTriggersWhenVisible=[],this.hideTriggers=[],s.showOn&&s.showOn!=="creation"&&this.showTriggers.push({element:this.triggerElement,event:s.showOn}),s.ajaxCache!=null&&(s.cache=s.ajaxCache,delete s.ajaxCache),this.options=s,this.bound={},v=["prepareToShow","prepareToHide","show","hide","reposition"],u=0,g=v.length;g>u;u++)a=v[u],this.bound[a]=function(t){return function(){return w[t].apply(w,arguments)}}(a);this.adapter.domReady(function(){return w.activate(),w.options.showOn==="creation"?w.prepareToShow():void 0})}return t.prototype.STICKS_OUT_TOP=1,t.prototype.STICKS_OUT_BOTTOM=2,t.prototype.STICKS_OUT_LEFT=1,t.prototype.STICKS_OUT_RIGHT=2,t.prototype["class"]={container:"opentip-container",opentip:"opentip",header:"ot-header",content:"ot-content",loadingIndicator:"ot-loading-indicator",close:"ot-close",goingToHide:"ot-going-to-hide",hidden:"ot-hidden",hiding:"ot-hiding",goingToShow:"ot-going-to-show",showing:"ot-showing",visible:"ot-visible",loading:"ot-loading",ajaxError:"ot-ajax-error",fixed:"ot-fixed",showEffectPrefix:"ot-show-effect-",hideEffectPrefix:"ot-hide-effect-",stylePrefix:"style-"},t.prototype._setup=function(){var t,e,i,o,s,n,r,a,h,p,l;for(this.debug("Setting up the tooltip."),this._buildContainer(),this.hideTriggers=[],h=this.options.hideTriggers,o=s=0,r=h.length;r>s;o=++s){if(e=h[o],i=null,t=this.options.hideOn instanceof Array?this.options.hideOn[o]:this.options.hideOn,typeof e=="string")switch(e){case"trigger":t=t||"mouseout",i=this.triggerElement;break;case"tip":t=t||"mouseover",i=this.container;break;case"target":t=t||"mouseover",i=this.options.target;break;case"closeButton":break;default:throw Error("Unknown hide trigger: "+e+".")}else t=t||"mouseover",i=this.adapter.wrap(e);i&&this.hideTriggers.push({element:i,event:t,original:e})}for(p=this.hideTriggers,l=[],n=0,a=p.length;a>n;n++)e=p[n],l.push(this.showTriggersWhenVisible.push({element:e.element,event:"mouseover"}));return l},t.prototype._buildContainer=function(){return this.container=this.adapter.create('
'),this.adapter.css(this.container,{position:"absolute"}),this.options.ajax&&this.adapter.addClass(this.container,this["class"].loading),this.options.fixed&&this.adapter.addClass(this.container,this["class"].fixed),this.options.showEffect&&this.adapter.addClass(this.container,""+this["class"].showEffectPrefix+this.options.showEffect),this.options.hideEffect?this.adapter.addClass(this.container,""+this["class"].hideEffectPrefix+this.options.hideEffect):void 0},t.prototype._buildElements=function(){var t,e;return this.tooltipElement=this.adapter.create('
'),this.backgroundCanvas=this.adapter.wrap(document.createElement("canvas")),this.adapter.css(this.backgroundCanvas,{position:"absolute"}),typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager!==null&&G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)),t=this.adapter.find(this.tooltipElement,"."+this["class"].header),this.options.title&&(e=this.adapter.create("

"),this.adapter.update(e,this.options.title,this.options.escapeTitle),this.adapter.append(t,e)),this.options.ajax&&!this.loaded&&this.adapter.append(this.tooltipElement,this.adapter.create('
↻
')),__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(this.closeButtonElement=this.adapter.create('Close'),this.adapter.append(t,this.closeButtonElement)),this.adapter.append(this.container,this.backgroundCanvas),this.adapter.append(this.container,this.tooltipElement),this.adapter.append(document.body,this.container),this._newContent=!0,this.redraw=!0},t.prototype.setContent=function(t){return this.content=t,this._newContent=!0,typeof this.content=="function"?(this._contentFunction=this.content,this.content=""):this._contentFunction=null,this.visible?this._updateElementContent():void 0},t.prototype._updateElementContent=function(){var t;return(this._newContent||!this.options.cache&&this._contentFunction)&&(t=this.adapter.find(this.container,"."+this["class"].content),t!=null&&(this._contentFunction&&(this.debug("Executing content function."),this.content=this._contentFunction(this)),this.adapter.update(t,this.content,this.options.escapeContent)),this._newContent=!1),this._storeAndLockDimensions(),this.reposition()},t.prototype._storeAndLockDimensions=function(){var t;if(this.container)return t=this.dimensions,this.adapter.css(this.container,{width:"auto",left:"0px",top:"0px"}),this.dimensions=this.adapter.dimensions(this.container),this.dimensions.width+=1,this.adapter.css(this.container,{width:""+this.dimensions.width+"px",top:""+this.currentPosition.top+"px",left:""+this.currentPosition.left+"px"}),this._dimensionsEqual(this.dimensions,t)?void 0:(this.redraw=!0,this._draw())},t.prototype.activate=function(){return this._setupObservers("hidden","hiding")},t.prototype.deactivate=function(){return this.debug("Deactivating tooltip."),this.hide(),this._setupObservers("-showing","-visible","-hidden","-hiding")},t.prototype._setupObservers=function(){var t,e,i,o,s,n,r,a,h,p,l,d,u,c,g,f,m=this;for(o=arguments.length>=1?__slice.call(arguments,0):[],n=0,p=o.length;p>n;n++)if(i=o[n],e=!1,i.charAt(0)==="-"&&(e=!0,i=i.substr(1)),this.currentObservers[i]!==!e)switch(this.currentObservers[i]=!e,t=function(){var t,i,o;return t=arguments.length>=1?__slice.call(arguments,0):[],e?(i=m.adapter).stopObserving.apply(i,t):(o=m.adapter).observe.apply(o,t)},i){case"showing":for(c=this.hideTriggers,r=0,l=c.length;l>r;r++)s=c[r],t(s.element,s.event,this.bound.prepareToHide);t(document.onresize!=null?document:window,"resize",this.bound.reposition),t(window,"scroll",this.bound.reposition);break;case"visible":for(g=this.showTriggersWhenVisible,a=0,d=g.length;d>a;a++)s=g[a],t(s.element,s.event,this.bound.prepareToShow);break;case"hiding":for(f=this.showTriggers,h=0,u=f.length;u>h;h++)s=f[h],t(s.element,s.event,this.bound.prepareToShow);break;case"hidden":break;default:throw Error("Unknown state: "+i)}return null},t.prototype.prepareToShow=function(){return this._abortHiding(),this._abortShowing(),this.visible?void 0:(this.debug("Showing in "+this.options.delay+"s."),this.container==null&&this._setup(),this.options.group&&t._abortShowingGroup(this.options.group,this),this.preparingToShow=!0,this._setupObservers("-hidden","-hiding","showing"),this._followMousePosition(),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this._showTimeoutId=this.setTimeout(this.bound.show,this.options.delay||0))},t.prototype.show=function(){var e=this;return this._abortHiding(),this.visible?void 0:(this._clearTimeouts(),this._triggerElementExists()?(this.debug("Showing now."),this.container==null&&this._setup(),this.options.group&&t._hideGroup(this.options.group,this),this.visible=!0,this.preparingToShow=!1,this.tooltipElement==null&&this._buildElements(),this._updateElementContent(),!this.options.ajax||this.loaded&&this.options.cache||this._loadAjax(),this._searchAndActivateCloseButtons(),this._startEnsureTriggerElement(),this.adapter.css(this.container,{zIndex:t.lastZIndex++}),this._setupObservers("-hidden","-hiding","-showing","-visible","showing","visible"),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this.adapter.removeClass(this.container,this["class"].hiding),this.adapter.removeClass(this.container,this["class"].hidden),this.adapter.addClass(this.container,this["class"].goingToShow),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var t;if(e.visible&&!e.preparingToHide)return e.adapter.removeClass(e.container,e["class"].goingToShow),e.adapter.addClass(e.container,e["class"].showing),t=0,e.options.showEffect&&e.options.showEffectDuration&&(t=e.options.showEffectDuration),e.setCss3Style(e.container,{transitionDuration:""+t+"s"}),e._visibilityStateTimeoutId=e.setTimeout(function(){return e.adapter.removeClass(e.container,e["class"].showing),e.adapter.addClass(e.container,e["class"].visible)},t),e._activateFirstInput()}),this._draw()):this.deactivate())},t.prototype._abortShowing=function(){return this.preparingToShow?(this.debug("Aborting showing."),this._clearTimeouts(),this._stopFollowingMousePosition(),this.preparingToShow=!1,this._setupObservers("-showing","-visible","hiding","hidden")):void 0},t.prototype.prepareToHide=function(){return this._abortShowing(),this._abortHiding(),this.visible?(this.debug("Hiding in "+this.options.hideDelay+"s"),this.preparingToHide=!0,this._setupObservers("-showing","visible","-hidden","hiding"),this._hideTimeoutId=this.setTimeout(this.bound.hide,this.options.hideDelay)):void 0},t.prototype.hide=function(){var t=this;return this._abortShowing(),this.visible&&(this._clearTimeouts(),this.debug("Hiding!"),this.visible=!1,this.preparingToHide=!1,this._stopEnsureTriggerElement(),this._setupObservers("-showing","-visible","-hiding","-hidden","hiding","hidden"),this.options.fixed||this._stopFollowingMousePosition(),this.container)?(this.adapter.removeClass(this.container,this["class"].visible),this.adapter.removeClass(this.container,this["class"].showing),this.adapter.addClass(this.container,this["class"].goingToHide),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var e;return t.adapter.removeClass(t.container,t["class"].goingToHide),t.adapter.addClass(t.container,t["class"].hiding),e=0,t.options.hideEffect&&t.options.hideEffectDuration&&(e=t.options.hideEffectDuration),t.setCss3Style(t.container,{transitionDuration:""+e+"s"}),t._visibilityStateTimeoutId=t.setTimeout(function(){return t.adapter.removeClass(t.container,t["class"].hiding),t.adapter.addClass(t.container,t["class"].hidden),t.setCss3Style(t.container,{transitionDuration:"0s"}),t.options.removeElementsOnHide?(t.debug("Removing HTML elements."),t.adapter.remove(t.container),delete t.container,delete t.tooltipElement):void 0},e)})):void 0},t.prototype._abortHiding=function(){return this.preparingToHide?(this.debug("Aborting hiding."),this._clearTimeouts(),this.preparingToHide=!1,this._setupObservers("-hiding","showing","visible")):void 0},t.prototype.reposition=function(){var t,e,i,o=this;return t=this.getPosition(),t==null||(e=this.options.stem,this.options.containInViewport&&(i=this._ensureViewportContainment(t),t=i.position,e=i.stem),this._positionsEqual(t,this.currentPosition))?void 0:(this.options.stem&&!e.eql(this.currentStem)&&(this.redraw=!0),this.currentPosition=t,this.currentStem=e,this._draw(),this.adapter.css(this.container,{left:""+t.left+"px",top:""+t.top+"px"}),this.defer(function(){var t,e;return t=o.adapter.unwrap(o.container),t.style.visibility="hidden",e=t.offsetHeight,t.style.visibility="visible"}))},t.prototype.getPosition=function(t,e,i){var o,s,n,r,a,h,p,l,d;if(this.container)return t==null&&(t=this.options.tipJoint),e==null&&(e=this.options.targetJoint),r={},this.options.target?(p=this.adapter.offset(this.options.target),h=this.adapter.dimensions(this.options.target),r=p,e.right?(l=this.adapter.unwrap(this.options.target),l.getBoundingClientRect!=null?r.left=l.getBoundingClientRect().right+((d=window.pageXOffset)!=null?d:document.body.scrollLeft):r.left+=h.width):e.center&&(r.left+=Math.round(h.width/2)),e.bottom?r.top+=h.height:e.middle&&(r.top+=Math.round(h.height/2)),this.options.borderWidth&&(this.options.tipJoint.left&&(r.left+=this.options.borderWidth),this.options.tipJoint.right&&(r.left-=this.options.borderWidth),this.options.tipJoint.top?r.top+=this.options.borderWidth:this.options.tipJoint.bottom&&(r.top-=this.options.borderWidth))):r=this.initialMousePosition?{top:this.initialMousePosition.y,left:this.initialMousePosition.x}:{top:mousePosition.y,left:mousePosition.x},this.options.autoOffset&&(a=this.options.stem?this.options.stemLength:0,n=a&&this.options.fixed?2:10,o=t.middle&&!this.options.fixed?15:0,s=t.center&&!this.options.fixed?15:0,t.right?r.left-=n+o:t.left&&(r.left+=n+o),t.bottom?r.top-=n+s:t.top&&(r.top+=n+s),a&&(i==null&&(i=this.options.stem),i.right?r.left-=a:i.left&&(r.left+=a),i.bottom?r.top-=a:i.top&&(r.top+=a))),r.left+=this.options.offset[0],r.top+=this.options.offset[1],t.right?r.left-=this.dimensions.width:t.center&&(r.left-=Math.round(this.dimensions.width/2)),t.bottom?r.top-=this.dimensions.height:t.middle&&(r.top-=Math.round(this.dimensions.height/2)),r},t.prototype._ensureViewportContainment=function(e){var i,o,s,n,r,a,h,p,l,d,u,c;if(h=this.options.stem,s={position:e,stem:h},!this.visible||!e)return s;if(p=this._sticksOut(e),!p[0]&&!p[1])return s;if(d=new t.Joint(this.options.tipJoint),this.options.targetJoint&&(l=new t.Joint(this.options.targetJoint)),a=this.adapter.scrollOffset(),u=this.adapter.viewportDimensions(),c=[e.left-a[0],e.top-a[1]],i=!1,u.width>=this.dimensions.width&&p[0])switch(i=!0,p[0]){case this.STICKS_OUT_LEFT:d.setHorizontal("left"),this.options.targetJoint&&l.setHorizontal("right");break;case this.STICKS_OUT_RIGHT:d.setHorizontal("right"),this.options.targetJoint&&l.setHorizontal("left")}if(u.height>=this.dimensions.height&&p[1])switch(i=!0,p[1]){case this.STICKS_OUT_TOP:d.setVertical("top"),this.options.targetJoint&&l.setVertical("bottom");break;case this.STICKS_OUT_BOTTOM:d.setVertical("bottom"),this.options.targetJoint&&l.setVertical("top")}return i?(this.options.stem&&(h=d),e=this.getPosition(d,l,h),o=this._sticksOut(e),n=!1,r=!1,o[0]&&o[0]!==p[0]&&(n=!0,d.setHorizontal(this.options.tipJoint.horizontal),this.options.targetJoint&&l.setHorizontal(this.options.targetJoint.horizontal)),o[1]&&o[1]!==p[1]&&(r=!0,d.setVertical(this.options.tipJoint.vertical),this.options.targetJoint&&l.setVertical(this.options.targetJoint.vertical)),n&&r?s:((n||r)&&(this.options.stem&&(h=d),e=this.getPosition(d,l,h)),{position:e,stem:h})):s},t.prototype._sticksOut=function(t){var e,i,o,s;return i=this.adapter.scrollOffset(),s=this.adapter.viewportDimensions(),e=[t.left-i[0],t.top-i[1]],o=[!1,!1],0>e[0]?o[0]=this.STICKS_OUT_LEFT:e[0]+this.dimensions.width>s.width&&(o[0]=this.STICKS_OUT_RIGHT),0>e[1]?o[1]=this.STICKS_OUT_TOP:e[1]+this.dimensions.height>s.height&&(o[1]=this.STICKS_OUT_BOTTOM),o},t.prototype._draw=function(){var e,i,o,s,n,r,a,h,p,l,d,u,c,g,f,m,v,_,w,b=this;if(this.backgroundCanvas&&this.redraw){if(this.debug("Drawing background."),this.redraw=!1,this.currentStem){for(v=["top","right","bottom","left"],f=0,m=v.length;m>f;f++)u=v[f],this.adapter.removeClass(this.container,"stem-"+u);this.adapter.addClass(this.container,"stem-"+this.currentStem.horizontal),this.adapter.addClass(this.container,"stem-"+this.currentStem.vertical)}return r=[0,0],a=[0,0],__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(n=new t.Joint(((_=this.currentStem)!=null?_+"":void 0)==="top right"?"top left":"top right"),r=[this.options.closeButtonRadius+this.options.closeButtonOffset[0],this.options.closeButtonRadius+this.options.closeButtonOffset[1]],a=[this.options.closeButtonRadius-this.options.closeButtonOffset[0],this.options.closeButtonRadius-this.options.closeButtonOffset[1]]),o=this.adapter.clone(this.dimensions),s=[0,0],this.options.borderWidth&&(o.width+=this.options.borderWidth*2,o.height+=this.options.borderWidth*2,s[0]-=this.options.borderWidth,s[1]-=this.options.borderWidth),this.options.shadow&&(o.width+=this.options.shadowBlur*2,o.width+=Math.max(0,this.options.shadowOffset[0]-this.options.shadowBlur*2),o.height+=this.options.shadowBlur*2,o.height+=Math.max(0,this.options.shadowOffset[1]-this.options.shadowBlur*2),s[0]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[0]),s[1]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[1])),i={left:0,right:0,top:0,bottom:0},this.currentStem&&(this.currentStem.left?i.left=this.options.stemLength:this.currentStem.right&&(i.right=this.options.stemLength),this.currentStem.top?i.top=this.options.stemLength:this.currentStem.bottom&&(i.bottom=this.options.stemLength)),n&&(n.left?i.left=Math.max(i.left,a[0]):n.right&&(i.right=Math.max(i.right,a[0])),n.top?i.top=Math.max(i.top,a[1]):n.bottom&&(i.bottom=Math.max(i.bottom,a[1]))),o.width+=i.left+i.right,o.height+=i.top+i.bottom,s[0]-=i.left,s[1]-=i.top,this.currentStem&&this.options.borderWidth&&(w=this._getPathStemMeasures(this.options.stemBase,this.options.stemLength,this.options.borderWidth),g=w.stemLength,c=w.stemBase),e=this.adapter.unwrap(this.backgroundCanvas),e.width=o.width,e.height=o.height,this.adapter.css(this.backgroundCanvas,{width:""+e.width+"px",height:""+e.height+"px",left:""+s[0]+"px",top:""+s[1]+"px"}),h=e.getContext("2d"),h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,e.width,e.height),h.beginPath(),h.fillStyle=this._getColor(h,this.dimensions,this.options.background,this.options.backgroundGradientHorizontal),h.lineJoin="miter",h.miterLimit=500,d=this.options.borderWidth/2,this.options.borderWidth?(h.strokeStyle=this.options.borderColor,h.lineWidth=this.options.borderWidth):(g=this.options.stemLength,c=this.options.stemBase),c==null&&(c=0),l=function(t,e,i){return i&&h.moveTo(Math.max(c,b.options.borderRadius,r[0])+1-d,-d),e?(h.lineTo(t/2-c/2,-d),h.lineTo(t/2,-g-d),h.lineTo(t/2+c/2,-d)):void 0},p=function(t,e,i){var o,s,n,a;return t?(h.lineTo(-c+d,0-d),h.lineTo(g+d,-g-d),h.lineTo(d,c-d)):e?(a=b.options.closeButtonOffset,n=r[0],i%2!==0&&(a=[a[1],a[0]],n=r[1]),o=Math.acos(a[1]/b.options.closeButtonRadius),s=Math.acos(a[0]/b.options.closeButtonRadius),h.lineTo(-n+d,-d),h.arc(d-a[0],-d+a[1],b.options.closeButtonRadius,-(Math.PI/2+o),s,!1)):(h.lineTo(-b.options.borderRadius+d,-d),h.quadraticCurveTo(d,-d,d,b.options.borderRadius-d))},h.translate(-s[0],-s[1]),h.save(),function(){var e,i,o,s,r,a,d,u,c,g,f;for(f=[],i=c=0,g=t.positions.length/2;g>=0?g>c:c>g;i=g>=0?++c:--c)r=i*2,a=i===0||i===3?0:b.dimensions.width,d=2>i?0:b.dimensions.height,u=Math.PI/2*i,o=i%2===0?b.dimensions.width:b.dimensions.height,s=new t.Joint(t.positions[r]),e=new t.Joint(t.positions[r+1]),h.save(),h.translate(a,d),h.rotate(u),l(o,s.eql(b.currentStem),i===0),h.translate(o,0),p(e.eql(b.currentStem),e.eql(n),i),f.push(h.restore());return f}(),h.closePath(),h.save(),this.options.shadow&&(h.shadowColor=this.options.shadowColor,h.shadowBlur=this.options.shadowBlur,h.shadowOffsetX=this.options.shadowOffset[0],h.shadowOffsetY=this.options.shadowOffset[1]),h.fill(),h.restore(),this.options.borderWidth&&h.stroke(),h.restore(),n?function(){var t,e,i,o,s;return i=e=b.options.closeButtonRadius*2,n+""=="top right"?(s=[b.dimensions.width-b.options.closeButtonOffset[0],b.options.closeButtonOffset[1]],t=[s[0]+d,s[1]-d]):(s=[b.options.closeButtonOffset[0],b.options.closeButtonOffset[1]],t=[s[0]-d,s[1]-d]),h.translate(t[0],t[1]),o=b.options.closeButtonCrossSize/2,h.save(),h.beginPath(),h.strokeStyle=b.options.closeButtonCrossColor,h.lineWidth=b.options.closeButtonCrossLineWidth,h.lineCap="round",h.moveTo(-o,-o),h.lineTo(o,o),h.stroke(),h.beginPath(),h.moveTo(o,-o),h.lineTo(-o,o),h.stroke(),h.restore(),b.adapter.css(b.closeButtonElement,{left:""+(s[0]-o-b.options.closeButtonLinkOverscan)+"px",top:""+(s[1]-o-b.options.closeButtonLinkOverscan)+"px",width:""+(b.options.closeButtonCrossSize+b.options.closeButtonLinkOverscan*2)+"px",height:""+(b.options.closeButtonCrossSize+b.options.closeButtonLinkOverscan*2)+"px"})}():void 0}},t.prototype._getPathStemMeasures=function(t,e,i){var o,s,n,r,a,h,p;if(r=i/2,n=Math.atan(t/2/e),o=n*2,a=r/Math.sin(o),s=2*a*Math.cos(n),p=r+e-s,0>p)throw Error("Sorry but your stemLength / stemBase ratio is strange.");return h=Math.tan(n)*p*2,{stemLength:p,stemBase:h}},t.prototype._getColor=function(t,e,i,o){var s,n,r,a,h;if(o==null&&(o=!1),typeof i=="string")return i;for(n=o?t.createLinearGradient(0,0,e.width,0):t.createLinearGradient(0,0,0,e.height),r=a=0,h=i.length;h>a;r=++a)s=i[r],n.addColorStop(s[0],s[1]);return n},t.prototype._searchAndActivateCloseButtons=function(){var t,e,i,o;for(o=this.adapter.findAll(this.container,"."+this["class"].close),e=0,i=o.length;i>e;e++)t=o[e],this.hideTriggers.push({element:this.adapter.wrap(t),event:"click"});return this.currentObservers.showing&&this._setupObservers("-showing","showing"),this.currentObservers.visible?this._setupObservers("-visible","visible"):void 0},t.prototype._activateFirstInput=function(){var t;return t=this.adapter.unwrap(this.adapter.find(this.container,"input, textarea")),t!=null?typeof t.focus=="function"?t.focus():void 0:void 0},t.prototype._followMousePosition=function(){return this.options.fixed?void 0:t._observeMousePosition(this.bound.reposition)},t.prototype._stopFollowingMousePosition=function(){return this.options.fixed?void 0:t._stopObservingMousePosition(this.bound.reposition)},t.prototype._clearShowTimeout=function(){return clearTimeout(this._showTimeoutId)},t.prototype._clearHideTimeout=function(){return clearTimeout(this._hideTimeoutId)},t.prototype._clearTimeouts=function(){return clearTimeout(this._visibilityStateTimeoutId),this._clearShowTimeout(),this._clearHideTimeout()},t.prototype._triggerElementExists=function(){var t;t=this.adapter.unwrap(this.triggerElement);while(t.parentNode){if(t.parentNode.tagName==="BODY")return!0;t=t.parentNode}return!1},t.prototype._loadAjax=function(){var t=this;if(!this.loading)return this.loaded=!1,this.loading=!0,this.adapter.addClass(this.container,this["class"].loading),this.setContent(""),this.debug("Loading content from "+this.options.ajax),this.adapter.ajax({url:this.options.ajax,method:this.options.ajaxMethod,onSuccess:function(e){return t.debug("Loading successful."),t.adapter.removeClass(t.container,t["class"].loading),t.setContent(e)},onError:function(e){var i;return i=t.options.ajaxErrorMessage,t.debug(i,e),t.setContent(i),t.adapter.addClass(t.container,t["class"].ajaxError)},onComplete:function(){return t.adapter.removeClass(t.container,t["class"].loading),t.loading=!1,t.loaded=!0,t._searchAndActivateCloseButtons(),t._activateFirstInput(),t.reposition()}})},t.prototype._ensureTriggerElement=function(){return this._triggerElementExists()?void 0:(this.deactivate(),this._stopEnsureTriggerElement())},t.prototype._ensureTriggerElementInterval=1e3,t.prototype._startEnsureTriggerElement=function(){var t=this;return this._ensureTriggerElementTimeoutId=setInterval(function(){return t._ensureTriggerElement()},this._ensureTriggerElementInterval)},t.prototype._stopEnsureTriggerElement=function(){return clearInterval(this._ensureTriggerElementTimeoutId)},t}(),vendors=["khtml","ms","o","moz","webkit"],Opentip.prototype.setCss3Style=function(t,e){var i,o,s,n,r;t=this.adapter.unwrap(t),r=[];for(i in e)__hasProp.call(e,i)&&(o=e[i],t.style[i]!=null?r.push(t.style[i]=o):r.push(function(){var e,r,a;for(a=[],e=0,r=vendors.length;r>e;e++)s=vendors[e],n=""+this.ucfirst(s)+this.ucfirst(i),t.style[n]!=null?a.push(t.style[n]=o):a.push(void 0);return a}.call(this)));return r},Opentip.prototype.defer=function(t){return setTimeout(t,0)},Opentip.prototype.setTimeout=function(t,e){return setTimeout(t,e?e*1e3:0)},Opentip.prototype.ucfirst=function(t){return t==null?"":t.charAt(0).toUpperCase()+t.slice(1)},Opentip.prototype.dasherize=function(t){return t.replace(/([A-Z])/g,function(t,e){return"-"+e.toLowerCase()})},mousePositionObservers=[],mousePosition={x:0,y:0},mouseMoved=function(t){var e,i,o,s;for(mousePosition=Opentip.adapter.mousePosition(t),s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],s.push(e());return s},Opentip.followMousePosition=function(){return Opentip.adapter.observe(document.body,"mousemove",mouseMoved)},Opentip._observeMousePosition=function(t){return mousePositionObservers.push(t)},Opentip._stopObservingMousePosition=function(t){var e;return mousePositionObservers=function(){var i,o,s;for(s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],e!==t&&s.push(e);return s}()},Opentip.Joint=function(){function t(t){t!=null&&(t instanceof Opentip.Joint&&(t+=""),this.set(t))}return t.prototype.set=function(t){return t=t.toLowerCase(),this.setHorizontal(t),this.setVertical(t),this},t.prototype.setHorizontal=function(t){var e,i,o,s,n,r,a;for(i=["left","center","right"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.horizontal=e.toLowerCase());for(this.horizontal==null&&(this.horizontal="center"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.horizontal===e?e:void 0);return a},t.prototype.setVertical=function(t){var e,i,o,s,n,r,a;for(i=["top","middle","bottom"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.vertical=e.toLowerCase());for(this.vertical==null&&(this.vertical="middle"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.vertical===e?e:void 0);return a},t.prototype.eql=function(t){return t!=null&&this.horizontal===t.horizontal&&this.vertical===t.vertical},t.prototype.flip=function(){var t,e;return e=Opentip.position[this.toString(!0)],t=(e+4)%8,this.set(Opentip.positions[t]),this},t.prototype.toString=function(t){var e,i;return t==null&&(t=!1),i=this.vertical==="middle"?"":this.vertical,e=this.horizontal==="center"?"":this.horizontal,i&&e&&(e=t?Opentip.prototype.ucfirst(e):" "+e),""+i+e},t}(),Opentip.prototype._positionsEqual=function(t,e){return t!=null&&e!=null&&t.left===e.left&&t.top===e.top},Opentip.prototype._dimensionsEqual=function(t,e){return t!=null&&e!=null&&t.width===e.width&&t.height===e.height},Opentip.prototype.debug=function(){var t;return t=arguments.length>=1?__slice.call(arguments,0):[],Opentip.debug&&(typeof console!="undefined"&&console!==null?console.debug:void 0)!=null?(t.unshift("#"+this.id+" |"),console.debug.apply(console,t)):void 0},Opentip.findElements=function(){var t,e,i,o,s,n,r,a,h,p;for(t=Opentip.adapter,h=t.findAll(document.body,"[data-ot]"),p=[],r=0,a=h.length;a>r;r++){i=h[r],n={},e=t.data(i,"ot"),(e===""||e==="true"||e==="yes")&&(e=t.attr(i,"title"),t.attr(i,"title","")),e=e||"";for(o in Opentip.styles.standard)s=t.data(i,"ot"+Opentip.prototype.ucfirst(o)),s!=null&&(s==="yes"||s==="true"||s==="on"?s=!0:(s==="no"||s==="false"||s==="off")&&(s=!1),n[o]=s);p.push(new Opentip(i,e,n))}return p},Opentip.version="2.4.6",Opentip.debug=!1,Opentip.lastId=0,Opentip.lastZIndex=100,Opentip.tips=[],Opentip._abortShowingGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i._abortShowing()):r.push(void 0);return r},Opentip._hideGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i.hide()):r.push(void 0);return r},Opentip.adapters={},Opentip.adapter=null,firstAdapter=!0,Opentip.addAdapter=function(t){return Opentip.adapters[t.name]=t,firstAdapter?(Opentip.adapter=t,t.domReady(Opentip.findElements),t.domReady(Opentip.followMousePosition),firstAdapter=!1):void 0},Opentip.positions=["top","topRight","right","bottomRight","bottom","bottomLeft","left","topLeft"],Opentip.position={},_ref=Opentip.positions,i=_i=0,_len=_ref.length;_len>_i;i=++_i)position=_ref[i],Opentip.position[position]=i;Opentip.styles={standard:{"extends":null,title:void 0,escapeTitle:!0,escapeContent:!1,className:"standard",stem:!0,delay:null,hideDelay:.1,fixed:!1,showOn:"mouseover",hideTrigger:"trigger",hideTriggers:[],hideOn:null,removeElementsOnHide:!1,offset:[0,0],containInViewport:!0,autoOffset:!0,showEffect:"appear",hideEffect:"fade",showEffectDuration:.3,hideEffectDuration:.2,stemLength:5,stemBase:8,tipJoint:"top left",target:null,targetJoint:null,cache:!0,ajax:!1,ajaxMethod:"GET",ajaxErrorMessage:"There was a problem downloading the content.",group:null,style:null,background:"#fff18f",backgroundGradientHorizontal:!1,closeButtonOffset:[5,5],closeButtonRadius:7,closeButtonCrossSize:4,closeButtonCrossColor:"#d2c35b",closeButtonCrossLineWidth:1.5,closeButtonLinkOverscan:6,borderRadius:5,borderWidth:1,borderColor:"#f2e37b",shadow:!0,shadowBlur:10,shadowOffset:[3,3],shadowColor:"rgba(0, 0, 0, 0.1)"},glass:{"extends":"standard",className:"glass",background:[[0,"rgba(252, 252, 252, 0.8)"],[.5,"rgba(255, 255, 255, 0.8)"],[.5,"rgba(250, 250, 250, 0.9)"],[1,"rgba(245, 245, 245, 0.9)"]],borderColor:"#eee",closeButtonCrossColor:"rgba(0, 0, 0, 0.2)",borderRadius:15,closeButtonRadius:10,closeButtonOffset:[8,8]},dark:{"extends":"standard",className:"dark",borderRadius:13,borderColor:"#444",closeButtonCrossColor:"rgba(240, 240, 240, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(30, 30, 30, 0.7)"],[.5,"rgba(30, 30, 30, 0.8)"],[.5,"rgba(10, 10, 10, 0.8)"],[1,"rgba(10, 10, 10, 0.9)"]]},alert:{"extends":"standard",className:"alert",borderRadius:1,borderColor:"#AE0D11",closeButtonCrossColor:"rgba(255, 255, 255, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(203, 15, 19, 0.7)"],[.5,"rgba(203, 15, 19, 0.8)"],[.5,"rgba(189, 14, 18, 0.8)"],[1,"rgba(179, 14, 17, 0.9)"]]}},Opentip.defaultStyle="standard",typeof module!="undefined"&&module!==null?module.exports=Opentip:window.Opentip=Opentip;var __slice=[].slice;(function(t){var e;return t.fn.opentip=function(t,e,i){return new Opentip(this,t,e,i)},e=function(){function e(){}return e.prototype.name="jquery",e.prototype.domReady=function(e){return t(e)},e.prototype.create=function(e){return t(e)},e.prototype.wrap=function(e){if(e=t(e),e.length>1)throw Error("Multiple elements provided.");return e},e.prototype.unwrap=function(e){return t(e)[0] },e.prototype.tagName=function(t){return this.unwrap(t).tagName},e.prototype.attr=function(){var e,i,o;return i=arguments[0],e=arguments.length>=2?__slice.call(arguments,1):[],(o=t(i)).attr.apply(o,e)},e.prototype.data=function(){var e,i,o;return i=arguments[0],e=arguments.length>=2?__slice.call(arguments,1):[],(o=t(i)).data.apply(o,e)},e.prototype.find=function(e,i){return t(e).find(i).get(0)},e.prototype.findAll=function(e,i){return t(e).find(i)},e.prototype.update=function(e,i,o){return e=t(e),o?e.text(i):e.html(i)},e.prototype.append=function(e,i){return t(e).append(i)},e.prototype.remove=function(e){return t(e).remove()},e.prototype.addClass=function(e,i){return t(e).addClass(i)},e.prototype.removeClass=function(e,i){return t(e).removeClass(i)},e.prototype.css=function(e,i){return t(e).css(i)},e.prototype.dimensions=function(e){return{width:t(e).outerWidth(),height:t(e).outerHeight()}},e.prototype.scrollOffset=function(){return[window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop]},e.prototype.viewportDimensions=function(){return{width:document.documentElement.clientWidth,height:document.documentElement.clientHeight}},e.prototype.mousePosition=function(t){return t==null?null:{x:t.pageX,y:t.pageY}},e.prototype.offset=function(e){var i;return i=t(e).offset(),{left:i.left,top:i.top}},e.prototype.observe=function(e,i,o){return t(e).bind(i,o)},e.prototype.stopObserving=function(e,i,o){return t(e).unbind(i,o)},e.prototype.ajax=function(e){var i,o;if(e.url==null)throw Error("No url provided");return t.ajax({url:e.url,type:(i=(o=e.method)!=null?o.toUpperCase():void 0)!=null?i:"GET"}).done(function(t){return typeof e.onSuccess=="function"?e.onSuccess(t):void 0}).fail(function(t){return typeof e.onError=="function"?e.onError("Server responded with status "+t.status):void 0}).always(function(){return typeof e.onComplete=="function"?e.onComplete():void 0})},e.prototype.clone=function(e){return t.extend({},e)},e.prototype.extend=function(){var e,i;return i=arguments[0],e=arguments.length>=2?__slice.call(arguments,1):[],t.extend.apply(t,[i].concat(__slice.call(e)))},e}(),Opentip.addAdapter(new e)})(jQuery),document.createElement("canvas").getContext||function(){function t(){return this.context_||(this.context_=new p(this))}function e(t,e){var i=T.call(arguments,2);return function(){return t.apply(e,i.concat(T.call(arguments)))}}function i(t){var e=t.srcElement;switch(t.propertyName){case"width":e.style.width=e.attributes.width.nodeValue+"px",e.getContext().clearRect();break;case"height":e.style.height=e.attributes.height.nodeValue+"px",e.getContext().clearRect()}}function o(t){var e=t.srcElement;e.firstChild&&(e.firstChild.style.width=e.clientWidth+"px",e.firstChild.style.height=e.clientHeight+"px")}function s(){return[[1,0,0],[0,1,0],[0,0,1]]}function n(t,e){for(var i=s(),o=0;3>o;o++)for(var n=0;3>n;n++){for(var r=0,a=0;3>a;a++)r+=t[o][a]*e[a][n];i[o][n]=r}return i}function r(t,e){e.fillStyle=t.fillStyle,e.lineCap=t.lineCap,e.lineJoin=t.lineJoin,e.lineWidth=t.lineWidth,e.miterLimit=t.miterLimit,e.shadowBlur=t.shadowBlur,e.shadowColor=t.shadowColor,e.shadowOffsetX=t.shadowOffsetX,e.shadowOffsetY=t.shadowOffsetY,e.strokeStyle=t.strokeStyle,e.globalAlpha=t.globalAlpha,e.arcScaleX_=t.arcScaleX_,e.arcScaleY_=t.arcScaleY_,e.lineScale_=t.lineScale_}function a(t){var e,i=1;if(t+="",t.substring(0,3)=="rgb"){var o=t.indexOf("(",3),s=t.indexOf(")",o+1),n=t.substring(o+1,s).split(",");e="#";for(var r=0;3>r;r++)e+=C[Number(n[r])];n.length==4&&t.substr(3,1)=="a"&&(i=n[3])}else e=t;return{color:e,alpha:i}}function h(t){switch(t){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function p(t){this.m_=s(),this.mStack_=[],this.aStack_=[],this.currentPath_=[],this.strokeStyle="#000",this.fillStyle="#000",this.lineWidth=1,this.lineJoin="miter",this.lineCap="butt",this.miterLimit=y*1,this.globalAlpha=1,this.canvas=t;var e=t.ownerDocument.createElement("div");e.style.width=t.clientWidth+"px",e.style.height=t.clientHeight+"px",e.style.position="absolute",t.appendChild(e),this.element_=e,this.arcScaleX_=1,this.arcScaleY_=1,this.lineScale_=1}function l(t,e,i,o){t.currentPath_.push({type:"bezierCurveTo",cp1x:e.x,cp1y:e.y,cp2x:i.x,cp2y:i.y,x:o.x,y:o.y}),t.currentX_=o.x,t.currentY_=o.y}function d(t){for(var e=0;3>e;e++)for(var i=0;2>i;i++)if(!isFinite(t[e][i])||isNaN(t[e][i]))return!1;return!0}function u(t,e,i){if(d(e)&&(t.m_=e,i)){var o=e[0][0]*e[1][1]-e[0][1]*e[1][0];t.lineScale_=b(w(o))}}function c(t){this.type_=t,this.x0_=0,this.y0_=0,this.r0_=0,this.x1_=0,this.y1_=0,this.r1_=0,this.colors_=[]}function g(){}var f=Math,m=f.round,v=f.sin,_=f.cos,w=f.abs,b=f.sqrt,y=10,O=y/2,T=Array.prototype.slice,x={init:function(t){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=t||document;i.createElement("canvas"),i.attachEvent("onreadystatechange",e(this.init_,this,i))}},init_:function(t){if(t.namespaces.g_vml_||t.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML"),t.namespaces.g_o_||t.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML"),!t.styleSheets.ex_canvas_){var e=t.createStyleSheet();e.owningElement.id="ex_canvas_",e.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}for(var i=t.getElementsByTagName("canvas"),o=0;i.length>o;o++)this.initElement(i[o])},initElement:function(e){if(!e.getContext){e.getContext=t,e.innerHTML="",e.attachEvent("onpropertychange",i),e.attachEvent("onresize",o);var s=e.attributes;s.width&&s.width.specified?e.style.width=s.width.nodeValue+"px":e.width=e.clientWidth,s.height&&s.height.specified?e.style.height=s.height.nodeValue+"px":e.height=e.clientHeight}return e}};x.init();for(var C=[],S=0;16>S;S++)for(var E=0;16>E;E++)C[S*16+E]=S.toString(16)+E.toString(16);var P=p.prototype;P.clearRect=function(){this.element_.innerHTML=""},P.beginPath=function(){this.currentPath_=[]},P.moveTo=function(t,e){var i=this.getCoords_(t,e);this.currentPath_.push({type:"moveTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},P.lineTo=function(t,e){var i=this.getCoords_(t,e);this.currentPath_.push({type:"lineTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},P.bezierCurveTo=function(t,e,i,o,s,n){var r=this.getCoords_(s,n),a=this.getCoords_(t,e),h=this.getCoords_(i,o);l(this,a,h,r)},P.quadraticCurveTo=function(t,e,i,o){var s=this.getCoords_(t,e),n=this.getCoords_(i,o),r={x:this.currentX_+2/3*(s.x-this.currentX_),y:this.currentY_+2/3*(s.y-this.currentY_)},a={x:r.x+(n.x-this.currentX_)/3,y:r.y+(n.y-this.currentY_)/3};l(this,r,a,n)},P.arc=function(t,e,i,o,s,n){i*=y;var r=n?"at":"wa",a=t+_(o)*i-O,h=e+v(o)*i-O,p=t+_(s)*i-O,l=e+v(s)*i-O;a!=p||n||(a+=.125);var d=this.getCoords_(t,e),u=this.getCoords_(a,h),c=this.getCoords_(p,l);this.currentPath_.push({type:r,x:d.x,y:d.y,radius:i,xStart:u.x,yStart:u.y,xEnd:c.x,yEnd:c.y})},P.rect=function(t,e,i,o){this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath()},P.strokeRect=function(t,e,i,o){var s=this.currentPath_;this.beginPath(),this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath(),this.stroke(),this.currentPath_=s},P.fillRect=function(t,e,i,o){var s=this.currentPath_;this.beginPath(),this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath(),this.fill(),this.currentPath_=s},P.createLinearGradient=function(t,e,i,o){var s=new c("gradient");return s.x0_=t,s.y0_=e,s.x1_=i,s.y1_=o,s},P.createRadialGradient=function(t,e,i,o,s,n){var r=new c("gradientradial");return r.x0_=t,r.y0_=e,r.r0_=i,r.x1_=o,r.y1_=s,r.r1_=n,r},P.drawImage=function(t){var e,i,o,s,n,r,a,h,p=t.runtimeStyle.width,l=t.runtimeStyle.height;t.runtimeStyle.width="auto",t.runtimeStyle.height="auto";var d=t.width,u=t.height;if(t.runtimeStyle.width=p,t.runtimeStyle.height=l,arguments.length==3)e=arguments[1],i=arguments[2],n=r=0,a=o=d,h=s=u;else if(arguments.length==5)e=arguments[1],i=arguments[2],o=arguments[3],s=arguments[4],n=r=0,a=d,h=u;else{if(arguments.length!=9)throw Error("Invalid number of arguments");n=arguments[1],r=arguments[2],a=arguments[3],h=arguments[4],e=arguments[5],i=arguments[6],o=arguments[7],s=arguments[8]}var c=this.getCoords_(e,i),g=[],v=10,_=10;if(g.push(" ','",""),this.element_.insertAdjacentHTML("BeforeEnd",g.join(""))},P.stroke=function(t){var e=[],i=a(t?this.fillStyle:this.strokeStyle),o=i.color,s=i.alpha*this.globalAlpha,n=10,r=10;e.push("c.x)&&(p.x=c.x),(l.x==null||c.x>l.x)&&(l.x=c.x),(p.y==null||p.y>c.y)&&(p.y=c.y),(l.y==null||c.y>l.y)&&(l.y=c.y))}if(e.push(' ">'),t)if(typeof this.fillStyle=="object"){var g=this.fillStyle,v=0,_={x:0,y:0},w=0,b=1;if(g.type_=="gradient"){var O=g.x0_/this.arcScaleX_,T=g.y0_/this.arcScaleY_,x=g.x1_/this.arcScaleX_,C=g.y1_/this.arcScaleY_,S=this.getCoords_(O,T),E=this.getCoords_(x,C),P=E.x-S.x,B=E.y-S.y;v=Math.atan2(P,B)*180/Math.PI,0>v&&(v+=360),1e-6>v&&(v=0)}else{var S=this.getCoords_(g.x0_,g.y0_),M=l.x-p.x,k=l.y-p.y;_={x:(S.x-p.x)/M,y:(S.y-p.y)/k},M/=this.arcScaleX_*y,k/=this.arcScaleY_*y;var I=f.max(M,k);w=2*g.r0_/I,b=2*g.r1_/I-w}var L=g.colors_;L.sort(function(t,e){return t.offset-e.offset});for(var H=L.length,J=L[0].color,j=L[H-1].color,z=L[0].alpha*this.globalAlpha,R=L[H-1].alpha*this.globalAlpha,A=[],d=0;H>d;d++){var W=L[d];A.push(W.offset*b+w+" "+W.color)}e.push('')}else e.push('');else{var D=this.lineScale_*this.lineWidth;1>D&&(s*=D),e.push("')}e.push(""),this.element_.insertAdjacentHTML("beforeEnd",e.join(""))},P.fill=function(){this.stroke(!0)},P.closePath=function(){this.currentPath_.push({type:"close"})},P.getCoords_=function(t,e){var i=this.m_;return{x:y*(t*i[0][0]+e*i[1][0]+i[2][0])-O,y:y*(t*i[0][1]+e*i[1][1]+i[2][1])-O}},P.save=function(){var t={};r(this,t),this.aStack_.push(t),this.mStack_.push(this.m_),this.m_=n(s(),this.m_)},P.restore=function(){r(this.aStack_.pop(),this),this.m_=this.mStack_.pop()},P.translate=function(t,e){var i=[[1,0,0],[0,1,0],[t,e,1]];u(this,n(i,this.m_),!1)},P.rotate=function(t){var e=_(t),i=v(t),o=[[e,i,0],[-i,e,0],[0,0,1]];u(this,n(o,this.m_),!1)},P.scale=function(t,e){this.arcScaleX_*=t,this.arcScaleY_*=e;var i=[[t,0,0],[0,e,0],[0,0,1]];u(this,n(i,this.m_),!0)},P.transform=function(t,e,i,o,s,r){var a=[[t,e,0],[i,o,0],[s,r,1]];u(this,n(a,this.m_),!0)},P.setTransform=function(t,e,i,o,s,n){var r=[[t,e,0],[i,o,0],[s,n,1]];u(this,r,!0)},P.clip=function(){},P.arcTo=function(){},P.createPattern=function(){return new g},c.prototype.addColorStop=function(t,e){e=a(e),this.colors_.push({offset:t,color:e.color,alpha:e.alpha})},G_vmlCanvasManager=x,CanvasRenderingContext2D=p,CanvasGradient=c,CanvasPattern=g}()opentip-2.4.6/downloads/opentip-jquery.js000066400000000000000000001656421213277401600205450ustar00rootroot00000000000000// Generated by CoffeeScript 1.4.0 /* # # Opentip v2.4.6 # # More info at [www.opentip.org](http://www.opentip.org) # # Copyright (c) 2012, Matias Meno # Graphics by Tjandra Mayerhold # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # */ var Opentip, firstAdapter, i, mouseMoved, mousePosition, mousePositionObservers, position, vendors, _i, _len, _ref, __slice = [].slice, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __hasProp = {}.hasOwnProperty; Opentip = (function() { Opentip.prototype.STICKS_OUT_TOP = 1; Opentip.prototype.STICKS_OUT_BOTTOM = 2; Opentip.prototype.STICKS_OUT_LEFT = 1; Opentip.prototype.STICKS_OUT_RIGHT = 2; Opentip.prototype["class"] = { container: "opentip-container", opentip: "opentip", header: "ot-header", content: "ot-content", loadingIndicator: "ot-loading-indicator", close: "ot-close", goingToHide: "ot-going-to-hide", hidden: "ot-hidden", hiding: "ot-hiding", goingToShow: "ot-going-to-show", showing: "ot-showing", visible: "ot-visible", loading: "ot-loading", ajaxError: "ot-ajax-error", fixed: "ot-fixed", showEffectPrefix: "ot-show-effect-", hideEffectPrefix: "ot-hide-effect-", stylePrefix: "style-" }; function Opentip(element, content, title, options) { var elementsOpentips, hideTrigger, methodToBind, optionSources, prop, styleName, _i, _j, _len, _len1, _ref, _ref1, _ref2, _tmpStyle, _this = this; this.id = ++Opentip.lastId; this.debug("Creating Opentip."); Opentip.tips.push(this); this.adapter = Opentip.adapter; elementsOpentips = this.adapter.data(element, "opentips") || []; elementsOpentips.push(this); this.adapter.data(element, "opentips", elementsOpentips); this.triggerElement = this.adapter.wrap(element); if (this.triggerElement.length > 1) { throw new Error("You can't call Opentip on multiple elements."); } if (this.triggerElement.length < 1) { throw new Error("Invalid element."); } this.loaded = false; this.loading = false; this.visible = false; this.waitingToShow = false; this.waitingToHide = false; this.currentPosition = { left: 0, top: 0 }; this.dimensions = { width: 100, height: 50 }; this.content = ""; this.redraw = true; this.currentObservers = { showing: false, visible: false, hiding: false, hidden: false }; options = this.adapter.clone(options); if (typeof content === "object") { options = content; content = title = void 0; } else if (typeof title === "object") { options = title; title = void 0; } if (title != null) { options.title = title; } if (content != null) { this.setContent(content); } if (options["extends"] == null) { if (options.style != null) { options["extends"] = options.style; } else { options["extends"] = Opentip.defaultStyle; } } optionSources = [options]; _tmpStyle = options; while (_tmpStyle["extends"]) { styleName = _tmpStyle["extends"]; _tmpStyle = Opentip.styles[styleName]; if (_tmpStyle == null) { throw new Error("Invalid style: " + styleName); } optionSources.unshift(_tmpStyle); if (!((_tmpStyle["extends"] != null) || styleName === "standard")) { _tmpStyle["extends"] = "standard"; } } options = (_ref = this.adapter).extend.apply(_ref, [{}].concat(__slice.call(optionSources))); options.hideTriggers = (function() { var _i, _len, _ref1, _results; _ref1 = options.hideTriggers; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { hideTrigger = _ref1[_i]; _results.push(hideTrigger); } return _results; })(); if (options.hideTrigger && options.hideTriggers.length === 0) { options.hideTriggers.push(options.hideTrigger); } _ref1 = ["tipJoint", "targetJoint", "stem"]; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { prop = _ref1[_i]; if (options[prop] && typeof options[prop] === "string") { options[prop] = new Opentip.Joint(options[prop]); } } if (options.ajax && (options.ajax === true || !options.ajax)) { if (this.adapter.tagName(this.triggerElement) === "A") { options.ajax = this.adapter.attr(this.triggerElement, "href"); } else { options.ajax = false; } } if (options.showOn === "click" && this.adapter.tagName(this.triggerElement) === "A") { this.adapter.observe(this.triggerElement, "click", function(e) { e.preventDefault(); e.stopPropagation(); return e.stopped = true; }); } if (options.target) { options.fixed = true; } if (options.stem === true) { options.stem = new Opentip.Joint(options.tipJoint); } if (options.target === true) { options.target = this.triggerElement; } else if (options.target) { options.target = this.adapter.wrap(options.target); } this.currentStem = options.stem; if (options.delay == null) { options.delay = options.showOn === "mouseover" ? 0.2 : 0; } if (options.targetJoint == null) { options.targetJoint = new Opentip.Joint(options.tipJoint).flip(); } this.showTriggers = []; this.showTriggersWhenVisible = []; this.hideTriggers = []; if (options.showOn && options.showOn !== "creation") { this.showTriggers.push({ element: this.triggerElement, event: options.showOn }); } if (options.ajaxCache != null) { options.cache = options.ajaxCache; delete options.ajaxCache; } this.options = options; this.bound = {}; _ref2 = ["prepareToShow", "prepareToHide", "show", "hide", "reposition"]; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { methodToBind = _ref2[_j]; this.bound[methodToBind] = (function(methodToBind) { return function() { return _this[methodToBind].apply(_this, arguments); }; })(methodToBind); } this.adapter.domReady(function() { _this.activate(); if (_this.options.showOn === "creation") { return _this.prepareToShow(); } }); } Opentip.prototype._setup = function() { var hideOn, hideTrigger, hideTriggerElement, i, _i, _j, _len, _len1, _ref, _ref1, _results; this.debug("Setting up the tooltip."); this._buildContainer(); this.hideTriggers = []; _ref = this.options.hideTriggers; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { hideTrigger = _ref[i]; hideTriggerElement = null; hideOn = this.options.hideOn instanceof Array ? this.options.hideOn[i] : this.options.hideOn; if (typeof hideTrigger === "string") { switch (hideTrigger) { case "trigger": hideOn = hideOn || "mouseout"; hideTriggerElement = this.triggerElement; break; case "tip": hideOn = hideOn || "mouseover"; hideTriggerElement = this.container; break; case "target": hideOn = hideOn || "mouseover"; hideTriggerElement = this.options.target; break; case "closeButton": break; default: throw new Error("Unknown hide trigger: " + hideTrigger + "."); } } else { hideOn = hideOn || "mouseover"; hideTriggerElement = this.adapter.wrap(hideTrigger); } if (hideTriggerElement) { this.hideTriggers.push({ element: hideTriggerElement, event: hideOn, original: hideTrigger }); } } _ref1 = this.hideTriggers; _results = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { hideTrigger = _ref1[_j]; _results.push(this.showTriggersWhenVisible.push({ element: hideTrigger.element, event: "mouseover" })); } return _results; }; Opentip.prototype._buildContainer = function() { this.container = this.adapter.create("
"); this.adapter.css(this.container, { position: "absolute" }); if (this.options.ajax) { this.adapter.addClass(this.container, this["class"].loading); } if (this.options.fixed) { this.adapter.addClass(this.container, this["class"].fixed); } if (this.options.showEffect) { this.adapter.addClass(this.container, "" + this["class"].showEffectPrefix + this.options.showEffect); } if (this.options.hideEffect) { return this.adapter.addClass(this.container, "" + this["class"].hideEffectPrefix + this.options.hideEffect); } }; Opentip.prototype._buildElements = function() { var headerElement, titleElement; this.tooltipElement = this.adapter.create("
"); this.backgroundCanvas = this.adapter.wrap(document.createElement("canvas")); this.adapter.css(this.backgroundCanvas, { position: "absolute" }); if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)); } headerElement = this.adapter.find(this.tooltipElement, "." + this["class"].header); if (this.options.title) { titleElement = this.adapter.create("

"); this.adapter.update(titleElement, this.options.title, this.options.escapeTitle); this.adapter.append(headerElement, titleElement); } if (this.options.ajax && !this.loaded) { this.adapter.append(this.tooltipElement, this.adapter.create("
↻
")); } if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { this.closeButtonElement = this.adapter.create("Close"); this.adapter.append(headerElement, this.closeButtonElement); } this.adapter.append(this.container, this.backgroundCanvas); this.adapter.append(this.container, this.tooltipElement); this.adapter.append(document.body, this.container); this._newContent = true; return this.redraw = true; }; Opentip.prototype.setContent = function(content) { this.content = content; this._newContent = true; if (typeof this.content === "function") { this._contentFunction = this.content; this.content = ""; } else { this._contentFunction = null; } if (this.visible) { return this._updateElementContent(); } }; Opentip.prototype._updateElementContent = function() { var contentDiv; if (this._newContent || (!this.options.cache && this._contentFunction)) { contentDiv = this.adapter.find(this.container, "." + this["class"].content); if (contentDiv != null) { if (this._contentFunction) { this.debug("Executing content function."); this.content = this._contentFunction(this); } this.adapter.update(contentDiv, this.content, this.options.escapeContent); } this._newContent = false; } this._storeAndLockDimensions(); return this.reposition(); }; Opentip.prototype._storeAndLockDimensions = function() { var prevDimension; if (!this.container) { return; } prevDimension = this.dimensions; this.adapter.css(this.container, { width: "auto", left: "0px", top: "0px" }); this.dimensions = this.adapter.dimensions(this.container); this.dimensions.width += 1; this.adapter.css(this.container, { width: "" + this.dimensions.width + "px", top: "" + this.currentPosition.top + "px", left: "" + this.currentPosition.left + "px" }); if (!this._dimensionsEqual(this.dimensions, prevDimension)) { this.redraw = true; return this._draw(); } }; Opentip.prototype.activate = function() { return this._setupObservers("hidden", "hiding"); }; Opentip.prototype.deactivate = function() { this.debug("Deactivating tooltip."); this.hide(); return this._setupObservers("-showing", "-visible", "-hidden", "-hiding"); }; Opentip.prototype._setupObservers = function() { var observeOrStop, removeObserver, state, states, trigger, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _this = this; states = 1 <= arguments.length ? __slice.call(arguments, 0) : []; for (_i = 0, _len = states.length; _i < _len; _i++) { state = states[_i]; removeObserver = false; if (state.charAt(0) === "-") { removeObserver = true; state = state.substr(1); } if (this.currentObservers[state] === !removeObserver) { continue; } this.currentObservers[state] = !removeObserver; observeOrStop = function() { var args, _ref, _ref1; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (removeObserver) { return (_ref = _this.adapter).stopObserving.apply(_ref, args); } else { return (_ref1 = _this.adapter).observe.apply(_ref1, args); } }; switch (state) { case "showing": _ref = this.hideTriggers; for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { trigger = _ref[_j]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToHide); } observeOrStop((document.onresize != null ? document : window), "resize", this.bound.reposition); observeOrStop(window, "scroll", this.bound.reposition); break; case "visible": _ref1 = this.showTriggersWhenVisible; for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { trigger = _ref1[_k]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hiding": _ref2 = this.showTriggers; for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { trigger = _ref2[_l]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hidden": break; default: throw new Error("Unknown state: " + state); } } return null; }; Opentip.prototype.prepareToShow = function() { this._abortHiding(); this._abortShowing(); if (this.visible) { return; } this.debug("Showing in " + this.options.delay + "s."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._abortShowingGroup(this.options.group, this); } this.preparingToShow = true; this._setupObservers("-hidden", "-hiding", "showing"); this._followMousePosition(); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); return this._showTimeoutId = this.setTimeout(this.bound.show, this.options.delay || 0); }; Opentip.prototype.show = function() { var _this = this; this._abortHiding(); if (this.visible) { return; } this._clearTimeouts(); if (!this._triggerElementExists()) { return this.deactivate(); } this.debug("Showing now."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._hideGroup(this.options.group, this); } this.visible = true; this.preparingToShow = false; if (this.tooltipElement == null) { this._buildElements(); } this._updateElementContent(); if (this.options.ajax && (!this.loaded || !this.options.cache)) { this._loadAjax(); } this._searchAndActivateCloseButtons(); this._startEnsureTriggerElement(); this.adapter.css(this.container, { zIndex: Opentip.lastZIndex++ }); this._setupObservers("-hidden", "-hiding", "-showing", "-visible", "showing", "visible"); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); this.adapter.removeClass(this.container, this["class"].hiding); this.adapter.removeClass(this.container, this["class"].hidden); this.adapter.addClass(this.container, this["class"].goingToShow); this.setCss3Style(this.container, { transitionDuration: "0s" }); this.defer(function() { var delay; if (!_this.visible || _this.preparingToHide) { return; } _this.adapter.removeClass(_this.container, _this["class"].goingToShow); _this.adapter.addClass(_this.container, _this["class"].showing); delay = 0; if (_this.options.showEffect && _this.options.showEffectDuration) { delay = _this.options.showEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + delay + "s" }); _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].showing); return _this.adapter.addClass(_this.container, _this["class"].visible); }, delay); return _this._activateFirstInput(); }); return this._draw(); }; Opentip.prototype._abortShowing = function() { if (this.preparingToShow) { this.debug("Aborting showing."); this._clearTimeouts(); this._stopFollowingMousePosition(); this.preparingToShow = false; return this._setupObservers("-showing", "-visible", "hiding", "hidden"); } }; Opentip.prototype.prepareToHide = function() { this._abortShowing(); this._abortHiding(); if (!this.visible) { return; } this.debug("Hiding in " + this.options.hideDelay + "s"); this.preparingToHide = true; this._setupObservers("-showing", "visible", "-hidden", "hiding"); return this._hideTimeoutId = this.setTimeout(this.bound.hide, this.options.hideDelay); }; Opentip.prototype.hide = function() { var _this = this; this._abortShowing(); if (!this.visible) { return; } this._clearTimeouts(); this.debug("Hiding!"); this.visible = false; this.preparingToHide = false; this._stopEnsureTriggerElement(); this._setupObservers("-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden"); if (!this.options.fixed) { this._stopFollowingMousePosition(); } if (!this.container) { return; } this.adapter.removeClass(this.container, this["class"].visible); this.adapter.removeClass(this.container, this["class"].showing); this.adapter.addClass(this.container, this["class"].goingToHide); this.setCss3Style(this.container, { transitionDuration: "0s" }); return this.defer(function() { var hideDelay; _this.adapter.removeClass(_this.container, _this["class"].goingToHide); _this.adapter.addClass(_this.container, _this["class"].hiding); hideDelay = 0; if (_this.options.hideEffect && _this.options.hideEffectDuration) { hideDelay = _this.options.hideEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + hideDelay + "s" }); return _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].hiding); _this.adapter.addClass(_this.container, _this["class"].hidden); _this.setCss3Style(_this.container, { transitionDuration: "0s" }); if (_this.options.removeElementsOnHide) { _this.debug("Removing HTML elements."); _this.adapter.remove(_this.container); delete _this.container; return delete _this.tooltipElement; } }, hideDelay); }); }; Opentip.prototype._abortHiding = function() { if (this.preparingToHide) { this.debug("Aborting hiding."); this._clearTimeouts(); this.preparingToHide = false; return this._setupObservers("-hiding", "showing", "visible"); } }; Opentip.prototype.reposition = function() { var position, stem, _ref, _this = this; position = this.getPosition(); if (position == null) { return; } stem = this.options.stem; if (this.options.containInViewport) { _ref = this._ensureViewportContainment(position), position = _ref.position, stem = _ref.stem; } if (this._positionsEqual(position, this.currentPosition)) { return; } if (!(!this.options.stem || stem.eql(this.currentStem))) { this.redraw = true; } this.currentPosition = position; this.currentStem = stem; this._draw(); this.adapter.css(this.container, { left: "" + position.left + "px", top: "" + position.top + "px" }); return this.defer(function() { var rawContainer, redrawFix; rawContainer = _this.adapter.unwrap(_this.container); rawContainer.style.visibility = "hidden"; redrawFix = rawContainer.offsetHeight; return rawContainer.style.visibility = "visible"; }); }; Opentip.prototype.getPosition = function(tipJoint, targetJoint, stem) { var additionalHorizontal, additionalVertical, offsetDistance, position, stemLength, targetDimensions, targetPosition, unwrappedTarget, _ref; if (!this.container) { return; } if (tipJoint == null) { tipJoint = this.options.tipJoint; } if (targetJoint == null) { targetJoint = this.options.targetJoint; } position = {}; if (this.options.target) { targetPosition = this.adapter.offset(this.options.target); targetDimensions = this.adapter.dimensions(this.options.target); position = targetPosition; if (targetJoint.right) { unwrappedTarget = this.adapter.unwrap(this.options.target); if (unwrappedTarget.getBoundingClientRect != null) { position.left = unwrappedTarget.getBoundingClientRect().right + ((_ref = window.pageXOffset) != null ? _ref : document.body.scrollLeft); } else { position.left += targetDimensions.width; } } else if (targetJoint.center) { position.left += Math.round(targetDimensions.width / 2); } if (targetJoint.bottom) { position.top += targetDimensions.height; } else if (targetJoint.middle) { position.top += Math.round(targetDimensions.height / 2); } if (this.options.borderWidth) { if (this.options.tipJoint.left) { position.left += this.options.borderWidth; } if (this.options.tipJoint.right) { position.left -= this.options.borderWidth; } if (this.options.tipJoint.top) { position.top += this.options.borderWidth; } else if (this.options.tipJoint.bottom) { position.top -= this.options.borderWidth; } } } else { if (this.initialMousePosition) { position = { top: this.initialMousePosition.y, left: this.initialMousePosition.x }; } else { position = { top: mousePosition.y, left: mousePosition.x }; } } if (this.options.autoOffset) { stemLength = this.options.stem ? this.options.stemLength : 0; offsetDistance = stemLength && this.options.fixed ? 2 : 10; additionalHorizontal = tipJoint.middle && !this.options.fixed ? 15 : 0; additionalVertical = tipJoint.center && !this.options.fixed ? 15 : 0; if (tipJoint.right) { position.left -= offsetDistance + additionalHorizontal; } else if (tipJoint.left) { position.left += offsetDistance + additionalHorizontal; } if (tipJoint.bottom) { position.top -= offsetDistance + additionalVertical; } else if (tipJoint.top) { position.top += offsetDistance + additionalVertical; } if (stemLength) { if (stem == null) { stem = this.options.stem; } if (stem.right) { position.left -= stemLength; } else if (stem.left) { position.left += stemLength; } if (stem.bottom) { position.top -= stemLength; } else if (stem.top) { position.top += stemLength; } } } position.left += this.options.offset[0]; position.top += this.options.offset[1]; if (tipJoint.right) { position.left -= this.dimensions.width; } else if (tipJoint.center) { position.left -= Math.round(this.dimensions.width / 2); } if (tipJoint.bottom) { position.top -= this.dimensions.height; } else if (tipJoint.middle) { position.top -= Math.round(this.dimensions.height / 2); } return position; }; Opentip.prototype._ensureViewportContainment = function(position) { var needsRepositioning, newSticksOut, originals, revertedX, revertedY, scrollOffset, stem, sticksOut, targetJoint, tipJoint, viewportDimensions, viewportPosition; stem = this.options.stem; originals = { position: position, stem: stem }; if (!(this.visible && position)) { return originals; } sticksOut = this._sticksOut(position); if (!(sticksOut[0] || sticksOut[1])) { return originals; } tipJoint = new Opentip.Joint(this.options.tipJoint); if (this.options.targetJoint) { targetJoint = new Opentip.Joint(this.options.targetJoint); } scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); viewportPosition = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; needsRepositioning = false; if (viewportDimensions.width >= this.dimensions.width) { if (sticksOut[0]) { needsRepositioning = true; switch (sticksOut[0]) { case this.STICKS_OUT_LEFT: tipJoint.setHorizontal("left"); if (this.options.targetJoint) { targetJoint.setHorizontal("right"); } break; case this.STICKS_OUT_RIGHT: tipJoint.setHorizontal("right"); if (this.options.targetJoint) { targetJoint.setHorizontal("left"); } } } } if (viewportDimensions.height >= this.dimensions.height) { if (sticksOut[1]) { needsRepositioning = true; switch (sticksOut[1]) { case this.STICKS_OUT_TOP: tipJoint.setVertical("top"); if (this.options.targetJoint) { targetJoint.setVertical("bottom"); } break; case this.STICKS_OUT_BOTTOM: tipJoint.setVertical("bottom"); if (this.options.targetJoint) { targetJoint.setVertical("top"); } } } } if (!needsRepositioning) { return originals; } if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); newSticksOut = this._sticksOut(position); revertedX = false; revertedY = false; if (newSticksOut[0] && (newSticksOut[0] !== sticksOut[0])) { revertedX = true; tipJoint.setHorizontal(this.options.tipJoint.horizontal); if (this.options.targetJoint) { targetJoint.setHorizontal(this.options.targetJoint.horizontal); } } if (newSticksOut[1] && (newSticksOut[1] !== sticksOut[1])) { revertedY = true; tipJoint.setVertical(this.options.tipJoint.vertical); if (this.options.targetJoint) { targetJoint.setVertical(this.options.targetJoint.vertical); } } if (revertedX && revertedY) { return originals; } if (revertedX || revertedY) { if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); } return { position: position, stem: stem }; }; Opentip.prototype._sticksOut = function(position) { var positionOffset, scrollOffset, sticksOut, viewportDimensions; scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); positionOffset = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; sticksOut = [false, false]; if (positionOffset[0] < 0) { sticksOut[0] = this.STICKS_OUT_LEFT; } else if (positionOffset[0] + this.dimensions.width > viewportDimensions.width) { sticksOut[0] = this.STICKS_OUT_RIGHT; } if (positionOffset[1] < 0) { sticksOut[1] = this.STICKS_OUT_TOP; } else if (positionOffset[1] + this.dimensions.height > viewportDimensions.height) { sticksOut[1] = this.STICKS_OUT_BOTTOM; } return sticksOut; }; Opentip.prototype._draw = function() { var backgroundCanvas, bulge, canvasDimensions, canvasPosition, closeButton, closeButtonInner, closeButtonOuter, ctx, drawCorner, drawLine, hb, position, stemBase, stemLength, _i, _len, _ref, _ref1, _ref2, _this = this; if (!(this.backgroundCanvas && this.redraw)) { return; } this.debug("Drawing background."); this.redraw = false; if (this.currentStem) { _ref = ["top", "right", "bottom", "left"]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { position = _ref[_i]; this.adapter.removeClass(this.container, "stem-" + position); } this.adapter.addClass(this.container, "stem-" + this.currentStem.horizontal); this.adapter.addClass(this.container, "stem-" + this.currentStem.vertical); } closeButtonInner = [0, 0]; closeButtonOuter = [0, 0]; if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { closeButton = new Opentip.Joint(((_ref1 = this.currentStem) != null ? _ref1.toString() : void 0) === "top right" ? "top left" : "top right"); closeButtonInner = [this.options.closeButtonRadius + this.options.closeButtonOffset[0], this.options.closeButtonRadius + this.options.closeButtonOffset[1]]; closeButtonOuter = [this.options.closeButtonRadius - this.options.closeButtonOffset[0], this.options.closeButtonRadius - this.options.closeButtonOffset[1]]; } canvasDimensions = this.adapter.clone(this.dimensions); canvasPosition = [0, 0]; if (this.options.borderWidth) { canvasDimensions.width += this.options.borderWidth * 2; canvasDimensions.height += this.options.borderWidth * 2; canvasPosition[0] -= this.options.borderWidth; canvasPosition[1] -= this.options.borderWidth; } if (this.options.shadow) { canvasDimensions.width += this.options.shadowBlur * 2; canvasDimensions.width += Math.max(0, this.options.shadowOffset[0] - this.options.shadowBlur * 2); canvasDimensions.height += this.options.shadowBlur * 2; canvasDimensions.height += Math.max(0, this.options.shadowOffset[1] - this.options.shadowBlur * 2); canvasPosition[0] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[0]); canvasPosition[1] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[1]); } bulge = { left: 0, right: 0, top: 0, bottom: 0 }; if (this.currentStem) { if (this.currentStem.left) { bulge.left = this.options.stemLength; } else if (this.currentStem.right) { bulge.right = this.options.stemLength; } if (this.currentStem.top) { bulge.top = this.options.stemLength; } else if (this.currentStem.bottom) { bulge.bottom = this.options.stemLength; } } if (closeButton) { if (closeButton.left) { bulge.left = Math.max(bulge.left, closeButtonOuter[0]); } else if (closeButton.right) { bulge.right = Math.max(bulge.right, closeButtonOuter[0]); } if (closeButton.top) { bulge.top = Math.max(bulge.top, closeButtonOuter[1]); } else if (closeButton.bottom) { bulge.bottom = Math.max(bulge.bottom, closeButtonOuter[1]); } } canvasDimensions.width += bulge.left + bulge.right; canvasDimensions.height += bulge.top + bulge.bottom; canvasPosition[0] -= bulge.left; canvasPosition[1] -= bulge.top; if (this.currentStem && this.options.borderWidth) { _ref2 = this._getPathStemMeasures(this.options.stemBase, this.options.stemLength, this.options.borderWidth), stemLength = _ref2.stemLength, stemBase = _ref2.stemBase; } backgroundCanvas = this.adapter.unwrap(this.backgroundCanvas); backgroundCanvas.width = canvasDimensions.width; backgroundCanvas.height = canvasDimensions.height; this.adapter.css(this.backgroundCanvas, { width: "" + backgroundCanvas.width + "px", height: "" + backgroundCanvas.height + "px", left: "" + canvasPosition[0] + "px", top: "" + canvasPosition[1] + "px" }); ctx = backgroundCanvas.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height); ctx.beginPath(); ctx.fillStyle = this._getColor(ctx, this.dimensions, this.options.background, this.options.backgroundGradientHorizontal); ctx.lineJoin = "miter"; ctx.miterLimit = 500; hb = this.options.borderWidth / 2; if (this.options.borderWidth) { ctx.strokeStyle = this.options.borderColor; ctx.lineWidth = this.options.borderWidth; } else { stemLength = this.options.stemLength; stemBase = this.options.stemBase; } if (stemBase == null) { stemBase = 0; } drawLine = function(length, stem, first) { if (first) { ctx.moveTo(Math.max(stemBase, _this.options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb); } if (stem) { ctx.lineTo(length / 2 - stemBase / 2, -hb); ctx.lineTo(length / 2, -stemLength - hb); return ctx.lineTo(length / 2 + stemBase / 2, -hb); } }; drawCorner = function(stem, closeButton, i) { var angle1, angle2, innerWidth, offset; if (stem) { ctx.lineTo(-stemBase + hb, 0 - hb); ctx.lineTo(stemLength + hb, -stemLength - hb); return ctx.lineTo(hb, stemBase - hb); } else if (closeButton) { offset = _this.options.closeButtonOffset; innerWidth = closeButtonInner[0]; if (i % 2 !== 0) { offset = [offset[1], offset[0]]; innerWidth = closeButtonInner[1]; } angle1 = Math.acos(offset[1] / _this.options.closeButtonRadius); angle2 = Math.acos(offset[0] / _this.options.closeButtonRadius); ctx.lineTo(-innerWidth + hb, -hb); return ctx.arc(hb - offset[0], -hb + offset[1], _this.options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, false); } else { ctx.lineTo(-_this.options.borderRadius + hb, -hb); return ctx.quadraticCurveTo(hb, -hb, hb, _this.options.borderRadius - hb); } }; ctx.translate(-canvasPosition[0], -canvasPosition[1]); ctx.save(); (function() { var cornerStem, i, lineLength, lineStem, positionIdx, positionX, positionY, rotation, _j, _ref3, _results; _results = []; for (i = _j = 0, _ref3 = Opentip.positions.length / 2; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) { positionIdx = i * 2; positionX = i === 0 || i === 3 ? 0 : _this.dimensions.width; positionY = i < 2 ? 0 : _this.dimensions.height; rotation = (Math.PI / 2) * i; lineLength = i % 2 === 0 ? _this.dimensions.width : _this.dimensions.height; lineStem = new Opentip.Joint(Opentip.positions[positionIdx]); cornerStem = new Opentip.Joint(Opentip.positions[positionIdx + 1]); ctx.save(); ctx.translate(positionX, positionY); ctx.rotate(rotation); drawLine(lineLength, lineStem.eql(_this.currentStem), i === 0); ctx.translate(lineLength, 0); drawCorner(cornerStem.eql(_this.currentStem), cornerStem.eql(closeButton), i); _results.push(ctx.restore()); } return _results; })(); ctx.closePath(); ctx.save(); if (this.options.shadow) { ctx.shadowColor = this.options.shadowColor; ctx.shadowBlur = this.options.shadowBlur; ctx.shadowOffsetX = this.options.shadowOffset[0]; ctx.shadowOffsetY = this.options.shadowOffset[1]; } ctx.fill(); ctx.restore(); if (this.options.borderWidth) { ctx.stroke(); } ctx.restore(); if (closeButton) { return (function() { var crossCenter, crossHeight, crossWidth, hcs, linkCenter; crossWidth = crossHeight = _this.options.closeButtonRadius * 2; if (closeButton.toString() === "top right") { linkCenter = [_this.dimensions.width - _this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] + hb, linkCenter[1] - hb]; } else { linkCenter = [_this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] - hb, linkCenter[1] - hb]; } ctx.translate(crossCenter[0], crossCenter[1]); hcs = _this.options.closeButtonCrossSize / 2; ctx.save(); ctx.beginPath(); ctx.strokeStyle = _this.options.closeButtonCrossColor; ctx.lineWidth = _this.options.closeButtonCrossLineWidth; ctx.lineCap = "round"; ctx.moveTo(-hcs, -hcs); ctx.lineTo(hcs, hcs); ctx.stroke(); ctx.beginPath(); ctx.moveTo(hcs, -hcs); ctx.lineTo(-hcs, hcs); ctx.stroke(); ctx.restore(); return _this.adapter.css(_this.closeButtonElement, { left: "" + (linkCenter[0] - hcs - _this.options.closeButtonLinkOverscan) + "px", top: "" + (linkCenter[1] - hcs - _this.options.closeButtonLinkOverscan) + "px", width: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px", height: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px" }); })(); } }; Opentip.prototype._getPathStemMeasures = function(outerStemBase, outerStemLength, borderWidth) { var angle, distanceBetweenTips, halfAngle, hb, rhombusSide, stemBase, stemLength; hb = borderWidth / 2; halfAngle = Math.atan((outerStemBase / 2) / outerStemLength); angle = halfAngle * 2; rhombusSide = hb / Math.sin(angle); distanceBetweenTips = 2 * rhombusSide * Math.cos(halfAngle); stemLength = hb + outerStemLength - distanceBetweenTips; if (stemLength < 0) { throw new Error("Sorry but your stemLength / stemBase ratio is strange."); } stemBase = (Math.tan(halfAngle) * stemLength) * 2; return { stemLength: stemLength, stemBase: stemBase }; }; Opentip.prototype._getColor = function(ctx, dimensions, color, horizontal) { var colorStop, gradient, i, _i, _len; if (horizontal == null) { horizontal = false; } if (typeof color === "string") { return color; } if (horizontal) { gradient = ctx.createLinearGradient(0, 0, dimensions.width, 0); } else { gradient = ctx.createLinearGradient(0, 0, 0, dimensions.height); } for (i = _i = 0, _len = color.length; _i < _len; i = ++_i) { colorStop = color[i]; gradient.addColorStop(colorStop[0], colorStop[1]); } return gradient; }; Opentip.prototype._searchAndActivateCloseButtons = function() { var element, _i, _len, _ref; _ref = this.adapter.findAll(this.container, "." + this["class"].close); for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; this.hideTriggers.push({ element: this.adapter.wrap(element), event: "click" }); } if (this.currentObservers.showing) { this._setupObservers("-showing", "showing"); } if (this.currentObservers.visible) { return this._setupObservers("-visible", "visible"); } }; Opentip.prototype._activateFirstInput = function() { var input; input = this.adapter.unwrap(this.adapter.find(this.container, "input, textarea")); return input != null ? typeof input.focus === "function" ? input.focus() : void 0 : void 0; }; Opentip.prototype._followMousePosition = function() { if (!this.options.fixed) { return Opentip._observeMousePosition(this.bound.reposition); } }; Opentip.prototype._stopFollowingMousePosition = function() { if (!this.options.fixed) { return Opentip._stopObservingMousePosition(this.bound.reposition); } }; Opentip.prototype._clearShowTimeout = function() { return clearTimeout(this._showTimeoutId); }; Opentip.prototype._clearHideTimeout = function() { return clearTimeout(this._hideTimeoutId); }; Opentip.prototype._clearTimeouts = function() { clearTimeout(this._visibilityStateTimeoutId); this._clearShowTimeout(); return this._clearHideTimeout(); }; Opentip.prototype._triggerElementExists = function() { var el; el = this.adapter.unwrap(this.triggerElement); while (el.parentNode) { if (el.parentNode.tagName === "BODY") { return true; } el = el.parentNode; } return false; }; Opentip.prototype._loadAjax = function() { var _this = this; if (this.loading) { return; } this.loaded = false; this.loading = true; this.adapter.addClass(this.container, this["class"].loading); this.setContent(""); this.debug("Loading content from " + this.options.ajax); return this.adapter.ajax({ url: this.options.ajax, method: this.options.ajaxMethod, onSuccess: function(responseText) { _this.debug("Loading successful."); _this.adapter.removeClass(_this.container, _this["class"].loading); return _this.setContent(responseText); }, onError: function(error) { var message; message = _this.options.ajaxErrorMessage; _this.debug(message, error); _this.setContent(message); return _this.adapter.addClass(_this.container, _this["class"].ajaxError); }, onComplete: function() { _this.adapter.removeClass(_this.container, _this["class"].loading); _this.loading = false; _this.loaded = true; _this._searchAndActivateCloseButtons(); _this._activateFirstInput(); return _this.reposition(); } }); }; Opentip.prototype._ensureTriggerElement = function() { if (!this._triggerElementExists()) { this.deactivate(); return this._stopEnsureTriggerElement(); } }; Opentip.prototype._ensureTriggerElementInterval = 1000; Opentip.prototype._startEnsureTriggerElement = function() { var _this = this; return this._ensureTriggerElementTimeoutId = setInterval((function() { return _this._ensureTriggerElement(); }), this._ensureTriggerElementInterval); }; Opentip.prototype._stopEnsureTriggerElement = function() { return clearInterval(this._ensureTriggerElementTimeoutId); }; return Opentip; })(); vendors = ["khtml", "ms", "o", "moz", "webkit"]; Opentip.prototype.setCss3Style = function(element, styles) { var prop, value, vendor, vendorProp, _results; element = this.adapter.unwrap(element); _results = []; for (prop in styles) { if (!__hasProp.call(styles, prop)) continue; value = styles[prop]; if (element.style[prop] != null) { _results.push(element.style[prop] = value); } else { _results.push((function() { var _i, _len, _results1; _results1 = []; for (_i = 0, _len = vendors.length; _i < _len; _i++) { vendor = vendors[_i]; vendorProp = "" + (this.ucfirst(vendor)) + (this.ucfirst(prop)); if (element.style[vendorProp] != null) { _results1.push(element.style[vendorProp] = value); } else { _results1.push(void 0); } } return _results1; }).call(this)); } } return _results; }; Opentip.prototype.defer = function(func) { return setTimeout(func, 0); }; Opentip.prototype.setTimeout = function(func, seconds) { return setTimeout(func, seconds ? seconds * 1000 : 0); }; Opentip.prototype.ucfirst = function(string) { if (string == null) { return ""; } return string.charAt(0).toUpperCase() + string.slice(1); }; Opentip.prototype.dasherize = function(string) { return string.replace(/([A-Z])/g, function(_, character) { return "-" + (character.toLowerCase()); }); }; mousePositionObservers = []; mousePosition = { x: 0, y: 0 }; mouseMoved = function(e) { var observer, _i, _len, _results; mousePosition = Opentip.adapter.mousePosition(e); _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; _results.push(observer()); } return _results; }; Opentip.followMousePosition = function() { return Opentip.adapter.observe(document.body, "mousemove", mouseMoved); }; Opentip._observeMousePosition = function(observer) { return mousePositionObservers.push(observer); }; Opentip._stopObservingMousePosition = function(removeObserver) { var observer; return mousePositionObservers = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; if (observer !== removeObserver) { _results.push(observer); } } return _results; })(); }; Opentip.Joint = (function() { function Joint(pointerString) { if (pointerString == null) { return; } if (pointerString instanceof Opentip.Joint) { pointerString = pointerString.toString(); } this.set(pointerString); this; } Joint.prototype.set = function(string) { string = string.toLowerCase(); this.setHorizontal(string); this.setVertical(string); return this; }; Joint.prototype.setHorizontal = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["left", "center", "right"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.horizontal = i.toLowerCase(); } } if (this.horizontal == null) { this.horizontal = "center"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.horizontal === i ? i : void 0); } return _results; }; Joint.prototype.setVertical = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["top", "middle", "bottom"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.vertical = i.toLowerCase(); } } if (this.vertical == null) { this.vertical = "middle"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.vertical === i ? i : void 0); } return _results; }; Joint.prototype.eql = function(pointer) { return (pointer != null) && this.horizontal === pointer.horizontal && this.vertical === pointer.vertical; }; Joint.prototype.flip = function() { var flippedIndex, positionIdx; positionIdx = Opentip.position[this.toString(true)]; flippedIndex = (positionIdx + 4) % 8; this.set(Opentip.positions[flippedIndex]); return this; }; Joint.prototype.toString = function(camelized) { var horizontal, vertical; if (camelized == null) { camelized = false; } vertical = this.vertical === "middle" ? "" : this.vertical; horizontal = this.horizontal === "center" ? "" : this.horizontal; if (vertical && horizontal) { if (camelized) { horizontal = Opentip.prototype.ucfirst(horizontal); } else { horizontal = " " + horizontal; } } return "" + vertical + horizontal; }; return Joint; })(); Opentip.prototype._positionsEqual = function(posA, posB) { return (posA != null) && (posB != null) && posA.left === posB.left && posA.top === posB.top; }; Opentip.prototype._dimensionsEqual = function(dimA, dimB) { return (dimA != null) && (dimB != null) && dimA.width === dimB.width && dimA.height === dimB.height; }; Opentip.prototype.debug = function() { var args; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (Opentip.debug && ((typeof console !== "undefined" && console !== null ? console.debug : void 0) != null)) { args.unshift("#" + this.id + " |"); return console.debug.apply(console, args); } }; Opentip.findElements = function() { var adapter, content, element, optionName, optionValue, options, _i, _len, _ref, _results; adapter = Opentip.adapter; _ref = adapter.findAll(document.body, "[data-ot]"); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; options = {}; content = adapter.data(element, "ot"); if (content === "" || content === "true" || content === "yes") { content = adapter.attr(element, "title"); adapter.attr(element, "title", ""); } content = content || ""; for (optionName in Opentip.styles.standard) { optionValue = adapter.data(element, "ot" + (Opentip.prototype.ucfirst(optionName))); if (optionValue != null) { if (optionValue === "yes" || optionValue === "true" || optionValue === "on") { optionValue = true; } else if (optionValue === "no" || optionValue === "false" || optionValue === "off") { optionValue = false; } options[optionName] = optionValue; } } _results.push(new Opentip(element, content, options)); } return _results; }; Opentip.version = "2.4.6"; Opentip.debug = false; Opentip.lastId = 0; Opentip.lastZIndex = 100; Opentip.tips = []; Opentip._abortShowingGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip._abortShowing()); } else { _results.push(void 0); } } return _results; }; Opentip._hideGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip.hide()); } else { _results.push(void 0); } } return _results; }; Opentip.adapters = {}; Opentip.adapter = null; firstAdapter = true; Opentip.addAdapter = function(adapter) { Opentip.adapters[adapter.name] = adapter; if (firstAdapter) { Opentip.adapter = adapter; adapter.domReady(Opentip.findElements); adapter.domReady(Opentip.followMousePosition); return firstAdapter = false; } }; Opentip.positions = ["top", "topRight", "right", "bottomRight", "bottom", "bottomLeft", "left", "topLeft"]; Opentip.position = {}; _ref = Opentip.positions; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { position = _ref[i]; Opentip.position[position] = i; } Opentip.styles = { standard: { "extends": null, title: void 0, escapeTitle: true, escapeContent: false, className: "standard", stem: true, delay: null, hideDelay: 0.1, fixed: false, showOn: "mouseover", hideTrigger: "trigger", hideTriggers: [], hideOn: null, removeElementsOnHide: false, offset: [0, 0], containInViewport: true, autoOffset: true, showEffect: "appear", hideEffect: "fade", showEffectDuration: 0.3, hideEffectDuration: 0.2, stemLength: 5, stemBase: 8, tipJoint: "top left", target: null, targetJoint: null, cache: true, ajax: false, ajaxMethod: "GET", ajaxErrorMessage: "There was a problem downloading the content.", group: null, style: null, background: "#fff18f", backgroundGradientHorizontal: false, closeButtonOffset: [5, 5], closeButtonRadius: 7, closeButtonCrossSize: 4, closeButtonCrossColor: "#d2c35b", closeButtonCrossLineWidth: 1.5, closeButtonLinkOverscan: 6, borderRadius: 5, borderWidth: 1, borderColor: "#f2e37b", shadow: true, shadowBlur: 10, shadowOffset: [3, 3], shadowColor: "rgba(0, 0, 0, 0.1)" }, glass: { "extends": "standard", className: "glass", background: [[0, "rgba(252, 252, 252, 0.8)"], [0.5, "rgba(255, 255, 255, 0.8)"], [0.5, "rgba(250, 250, 250, 0.9)"], [1, "rgba(245, 245, 245, 0.9)"]], borderColor: "#eee", closeButtonCrossColor: "rgba(0, 0, 0, 0.2)", borderRadius: 15, closeButtonRadius: 10, closeButtonOffset: [8, 8] }, dark: { "extends": "standard", className: "dark", borderRadius: 13, borderColor: "#444", closeButtonCrossColor: "rgba(240, 240, 240, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(30, 30, 30, 0.7)"], [0.5, "rgba(30, 30, 30, 0.8)"], [0.5, "rgba(10, 10, 10, 0.8)"], [1, "rgba(10, 10, 10, 0.9)"]] }, alert: { "extends": "standard", className: "alert", borderRadius: 1, borderColor: "#AE0D11", closeButtonCrossColor: "rgba(255, 255, 255, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(203, 15, 19, 0.7)"], [0.5, "rgba(203, 15, 19, 0.8)"], [0.5, "rgba(189, 14, 18, 0.8)"], [1, "rgba(179, 14, 17, 0.9)"]] } }; Opentip.defaultStyle = "standard"; if (typeof module !== "undefined" && module !== null) { module.exports = Opentip; } else { window.Opentip = Opentip; } // Generated by CoffeeScript 1.4.0 var __slice = [].slice; (function($) { var Adapter; $.fn.opentip = function(content, title, options) { return new Opentip(this, content, title, options); }; Adapter = (function() { function Adapter() {} Adapter.prototype.name = "jquery"; Adapter.prototype.domReady = function(callback) { return $(callback); }; Adapter.prototype.create = function(html) { return $(html); }; Adapter.prototype.wrap = function(element) { element = $(element); if (element.length > 1) { throw new Error("Multiple elements provided."); } return element; }; Adapter.prototype.unwrap = function(element) { return $(element)[0]; }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref = $(element)).attr.apply(_ref, args); }; Adapter.prototype.data = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref = $(element)).data.apply(_ref, args); }; Adapter.prototype.find = function(element, selector) { return $(element).find(selector).get(0); }; Adapter.prototype.findAll = function(element, selector) { return $(element).find(selector); }; Adapter.prototype.update = function(element, content, escape) { element = $(element); if (escape) { return element.text(content); } else { return element.html(content); } }; Adapter.prototype.append = function(element, child) { return $(element).append(child); }; Adapter.prototype.remove = function(element) { return $(element).remove(); }; Adapter.prototype.addClass = function(element, className) { return $(element).addClass(className); }; Adapter.prototype.removeClass = function(element, className) { return $(element).removeClass(className); }; Adapter.prototype.css = function(element, properties) { return $(element).css(properties); }; Adapter.prototype.dimensions = function(element) { return { width: $(element).outerWidth(), height: $(element).outerHeight() }; }; Adapter.prototype.scrollOffset = function() { return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; }; Adapter.prototype.viewportDimensions = function() { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; }; Adapter.prototype.mousePosition = function(e) { if (e == null) { return null; } return { x: e.pageX, y: e.pageY }; }; Adapter.prototype.offset = function(element) { var offset; offset = $(element).offset(); return { left: offset.left, top: offset.top }; }; Adapter.prototype.observe = function(element, eventName, observer) { return $(element).bind(eventName, observer); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return $(element).unbind(eventName, observer); }; Adapter.prototype.ajax = function(options) { var _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } return $.ajax({ url: options.url, type: (_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET" }).done(function(content) { return typeof options.onSuccess === "function" ? options.onSuccess(content) : void 0; }).fail(function(request) { return typeof options.onError === "function" ? options.onError("Server responded with status " + request.status) : void 0; }).always(function() { return typeof options.onComplete === "function" ? options.onComplete() : void 0; }); }; Adapter.prototype.clone = function(object) { return $.extend({}, object); }; Adapter.prototype.extend = function() { var sources, target; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return $.extend.apply($, [target].concat(__slice.call(sources))); }; return Adapter; })(); return Opentip.addAdapter(new Adapter); })(jQuery); opentip-2.4.6/downloads/opentip-jquery.min.js000066400000000000000000001030601213277401600213110ustar00rootroot00000000000000// Opentip v2.4.6 // Copyright (c) 2009-2012 // www.opentip.org // MIT Licensed var Opentip,firstAdapter,i,mouseMoved,mousePosition,mousePositionObservers,position,vendors,_i,_len,_ref,__slice=[].slice,__indexOf=[].indexOf||function(t){for(var e=0,i=this.length;i>e;e++)if(e in this&&this[e]===t)return e;return-1},__hasProp={}.hasOwnProperty;for(Opentip=function(){function t(e,i,o,s){var n,r,a,h,p,d,l,u,c,g,f,m,v,b,w=this;if(this.id=++t.lastId,this.debug("Creating Opentip."),t.tips.push(this),this.adapter=t.adapter,n=this.adapter.data(e,"opentips")||[],n.push(this),this.adapter.data(e,"opentips",n),this.triggerElement=this.adapter.wrap(e),this.triggerElement.length>1)throw Error("You can't call Opentip on multiple elements.");if(1>this.triggerElement.length)throw Error("Invalid element.");this.loaded=!1,this.loading=!1,this.visible=!1,this.waitingToShow=!1,this.waitingToHide=!1,this.currentPosition={left:0,top:0},this.dimensions={width:100,height:50},this.content="",this.redraw=!0,this.currentObservers={showing:!1,visible:!1,hiding:!1,hidden:!1},s=this.adapter.clone(s),typeof i=="object"?(s=i,i=o=void 0):typeof o=="object"&&(s=o,o=void 0),o!=null&&(s.title=o),i!=null&&this.setContent(i),s["extends"]==null&&(s["extends"]=s.style!=null?s.style:t.defaultStyle),h=[s],b=s;while(b["extends"]){if(d=b["extends"],b=t.styles[d],b==null)throw Error("Invalid style: "+d);h.unshift(b),b["extends"]==null&&d!=="standard"&&(b["extends"]="standard")}for(s=(f=this.adapter).extend.apply(f,[{}].concat(__slice.call(h))),s.hideTriggers=function(){var t,e,i,o;for(i=s.hideTriggers,o=[],t=0,e=i.length;e>t;t++)r=i[t],o.push(r);return o}(),s.hideTrigger&&s.hideTriggers.length===0&&s.hideTriggers.push(s.hideTrigger),m=["tipJoint","targetJoint","stem"],l=0,c=m.length;c>l;l++)p=m[l],s[p]&&typeof s[p]=="string"&&(s[p]=new t.Joint(s[p]));for(!s.ajax||s.ajax!==!0&&s.ajax||(s.ajax=this.adapter.tagName(this.triggerElement)==="A"?this.adapter.attr(this.triggerElement,"href"):!1),s.showOn==="click"&&this.adapter.tagName(this.triggerElement)==="A"&&this.adapter.observe(this.triggerElement,"click",function(t){return t.preventDefault(),t.stopPropagation(),t.stopped=!0}),s.target&&(s.fixed=!0),s.stem===!0&&(s.stem=new t.Joint(s.tipJoint)),s.target===!0?s.target=this.triggerElement:s.target&&(s.target=this.adapter.wrap(s.target)),this.currentStem=s.stem,s.delay==null&&(s.delay=s.showOn==="mouseover"?.2:0),s.targetJoint==null&&(s.targetJoint=new t.Joint(s.tipJoint).flip()),this.showTriggers=[],this.showTriggersWhenVisible=[],this.hideTriggers=[],s.showOn&&s.showOn!=="creation"&&this.showTriggers.push({element:this.triggerElement,event:s.showOn}),s.ajaxCache!=null&&(s.cache=s.ajaxCache,delete s.ajaxCache),this.options=s,this.bound={},v=["prepareToShow","prepareToHide","show","hide","reposition"],u=0,g=v.length;g>u;u++)a=v[u],this.bound[a]=function(t){return function(){return w[t].apply(w,arguments)}}(a);this.adapter.domReady(function(){return w.activate(),w.options.showOn==="creation"?w.prepareToShow():void 0})}return t.prototype.STICKS_OUT_TOP=1,t.prototype.STICKS_OUT_BOTTOM=2,t.prototype.STICKS_OUT_LEFT=1,t.prototype.STICKS_OUT_RIGHT=2,t.prototype["class"]={container:"opentip-container",opentip:"opentip",header:"ot-header",content:"ot-content",loadingIndicator:"ot-loading-indicator",close:"ot-close",goingToHide:"ot-going-to-hide",hidden:"ot-hidden",hiding:"ot-hiding",goingToShow:"ot-going-to-show",showing:"ot-showing",visible:"ot-visible",loading:"ot-loading",ajaxError:"ot-ajax-error",fixed:"ot-fixed",showEffectPrefix:"ot-show-effect-",hideEffectPrefix:"ot-hide-effect-",stylePrefix:"style-"},t.prototype._setup=function(){var t,e,i,o,s,n,r,a,h,p,d;for(this.debug("Setting up the tooltip."),this._buildContainer(),this.hideTriggers=[],h=this.options.hideTriggers,o=s=0,r=h.length;r>s;o=++s){if(e=h[o],i=null,t=this.options.hideOn instanceof Array?this.options.hideOn[o]:this.options.hideOn,typeof e=="string")switch(e){case"trigger":t=t||"mouseout",i=this.triggerElement;break;case"tip":t=t||"mouseover",i=this.container;break;case"target":t=t||"mouseover",i=this.options.target;break;case"closeButton":break;default:throw Error("Unknown hide trigger: "+e+".")}else t=t||"mouseover",i=this.adapter.wrap(e);i&&this.hideTriggers.push({element:i,event:t,original:e})}for(p=this.hideTriggers,d=[],n=0,a=p.length;a>n;n++)e=p[n],d.push(this.showTriggersWhenVisible.push({element:e.element,event:"mouseover"}));return d},t.prototype._buildContainer=function(){return this.container=this.adapter.create('
'),this.adapter.css(this.container,{position:"absolute"}),this.options.ajax&&this.adapter.addClass(this.container,this["class"].loading),this.options.fixed&&this.adapter.addClass(this.container,this["class"].fixed),this.options.showEffect&&this.adapter.addClass(this.container,""+this["class"].showEffectPrefix+this.options.showEffect),this.options.hideEffect?this.adapter.addClass(this.container,""+this["class"].hideEffectPrefix+this.options.hideEffect):void 0},t.prototype._buildElements=function(){var t,e;return this.tooltipElement=this.adapter.create('
'),this.backgroundCanvas=this.adapter.wrap(document.createElement("canvas")),this.adapter.css(this.backgroundCanvas,{position:"absolute"}),typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager!==null&&G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)),t=this.adapter.find(this.tooltipElement,"."+this["class"].header),this.options.title&&(e=this.adapter.create("

"),this.adapter.update(e,this.options.title,this.options.escapeTitle),this.adapter.append(t,e)),this.options.ajax&&!this.loaded&&this.adapter.append(this.tooltipElement,this.adapter.create('
↻
')),__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(this.closeButtonElement=this.adapter.create('Close'),this.adapter.append(t,this.closeButtonElement)),this.adapter.append(this.container,this.backgroundCanvas),this.adapter.append(this.container,this.tooltipElement),this.adapter.append(document.body,this.container),this._newContent=!0,this.redraw=!0},t.prototype.setContent=function(t){return this.content=t,this._newContent=!0,typeof this.content=="function"?(this._contentFunction=this.content,this.content=""):this._contentFunction=null,this.visible?this._updateElementContent():void 0},t.prototype._updateElementContent=function(){var t;return(this._newContent||!this.options.cache&&this._contentFunction)&&(t=this.adapter.find(this.container,"."+this["class"].content),t!=null&&(this._contentFunction&&(this.debug("Executing content function."),this.content=this._contentFunction(this)),this.adapter.update(t,this.content,this.options.escapeContent)),this._newContent=!1),this._storeAndLockDimensions(),this.reposition()},t.prototype._storeAndLockDimensions=function(){var t;if(this.container)return t=this.dimensions,this.adapter.css(this.container,{width:"auto",left:"0px",top:"0px"}),this.dimensions=this.adapter.dimensions(this.container),this.dimensions.width+=1,this.adapter.css(this.container,{width:""+this.dimensions.width+"px",top:""+this.currentPosition.top+"px",left:""+this.currentPosition.left+"px"}),this._dimensionsEqual(this.dimensions,t)?void 0:(this.redraw=!0,this._draw())},t.prototype.activate=function(){return this._setupObservers("hidden","hiding")},t.prototype.deactivate=function(){return this.debug("Deactivating tooltip."),this.hide(),this._setupObservers("-showing","-visible","-hidden","-hiding")},t.prototype._setupObservers=function(){var t,e,i,o,s,n,r,a,h,p,d,l,u,c,g,f,m=this;for(o=arguments.length>=1?__slice.call(arguments,0):[],n=0,p=o.length;p>n;n++)if(i=o[n],e=!1,i.charAt(0)==="-"&&(e=!0,i=i.substr(1)),this.currentObservers[i]!==!e)switch(this.currentObservers[i]=!e,t=function(){var t,i,o;return t=arguments.length>=1?__slice.call(arguments,0):[],e?(i=m.adapter).stopObserving.apply(i,t):(o=m.adapter).observe.apply(o,t)},i){case"showing":for(c=this.hideTriggers,r=0,d=c.length;d>r;r++)s=c[r],t(s.element,s.event,this.bound.prepareToHide);t(document.onresize!=null?document:window,"resize",this.bound.reposition),t(window,"scroll",this.bound.reposition);break;case"visible":for(g=this.showTriggersWhenVisible,a=0,l=g.length;l>a;a++)s=g[a],t(s.element,s.event,this.bound.prepareToShow);break;case"hiding":for(f=this.showTriggers,h=0,u=f.length;u>h;h++)s=f[h],t(s.element,s.event,this.bound.prepareToShow);break;case"hidden":break;default:throw Error("Unknown state: "+i)}return null},t.prototype.prepareToShow=function(){return this._abortHiding(),this._abortShowing(),this.visible?void 0:(this.debug("Showing in "+this.options.delay+"s."),this.container==null&&this._setup(),this.options.group&&t._abortShowingGroup(this.options.group,this),this.preparingToShow=!0,this._setupObservers("-hidden","-hiding","showing"),this._followMousePosition(),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this._showTimeoutId=this.setTimeout(this.bound.show,this.options.delay||0))},t.prototype.show=function(){var e=this;return this._abortHiding(),this.visible?void 0:(this._clearTimeouts(),this._triggerElementExists()?(this.debug("Showing now."),this.container==null&&this._setup(),this.options.group&&t._hideGroup(this.options.group,this),this.visible=!0,this.preparingToShow=!1,this.tooltipElement==null&&this._buildElements(),this._updateElementContent(),!this.options.ajax||this.loaded&&this.options.cache||this._loadAjax(),this._searchAndActivateCloseButtons(),this._startEnsureTriggerElement(),this.adapter.css(this.container,{zIndex:t.lastZIndex++}),this._setupObservers("-hidden","-hiding","-showing","-visible","showing","visible"),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this.adapter.removeClass(this.container,this["class"].hiding),this.adapter.removeClass(this.container,this["class"].hidden),this.adapter.addClass(this.container,this["class"].goingToShow),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var t;if(e.visible&&!e.preparingToHide)return e.adapter.removeClass(e.container,e["class"].goingToShow),e.adapter.addClass(e.container,e["class"].showing),t=0,e.options.showEffect&&e.options.showEffectDuration&&(t=e.options.showEffectDuration),e.setCss3Style(e.container,{transitionDuration:""+t+"s"}),e._visibilityStateTimeoutId=e.setTimeout(function(){return e.adapter.removeClass(e.container,e["class"].showing),e.adapter.addClass(e.container,e["class"].visible)},t),e._activateFirstInput()}),this._draw()):this.deactivate())},t.prototype._abortShowing=function(){return this.preparingToShow?(this.debug("Aborting showing."),this._clearTimeouts(),this._stopFollowingMousePosition(),this.preparingToShow=!1,this._setupObservers("-showing","-visible","hiding","hidden")):void 0},t.prototype.prepareToHide=function(){return this._abortShowing(),this._abortHiding(),this.visible?(this.debug("Hiding in "+this.options.hideDelay+"s"),this.preparingToHide=!0,this._setupObservers("-showing","visible","-hidden","hiding"),this._hideTimeoutId=this.setTimeout(this.bound.hide,this.options.hideDelay)):void 0},t.prototype.hide=function(){var t=this;return this._abortShowing(),this.visible&&(this._clearTimeouts(),this.debug("Hiding!"),this.visible=!1,this.preparingToHide=!1,this._stopEnsureTriggerElement(),this._setupObservers("-showing","-visible","-hiding","-hidden","hiding","hidden"),this.options.fixed||this._stopFollowingMousePosition(),this.container)?(this.adapter.removeClass(this.container,this["class"].visible),this.adapter.removeClass(this.container,this["class"].showing),this.adapter.addClass(this.container,this["class"].goingToHide),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var e;return t.adapter.removeClass(t.container,t["class"].goingToHide),t.adapter.addClass(t.container,t["class"].hiding),e=0,t.options.hideEffect&&t.options.hideEffectDuration&&(e=t.options.hideEffectDuration),t.setCss3Style(t.container,{transitionDuration:""+e+"s"}),t._visibilityStateTimeoutId=t.setTimeout(function(){return t.adapter.removeClass(t.container,t["class"].hiding),t.adapter.addClass(t.container,t["class"].hidden),t.setCss3Style(t.container,{transitionDuration:"0s"}),t.options.removeElementsOnHide?(t.debug("Removing HTML elements."),t.adapter.remove(t.container),delete t.container,delete t.tooltipElement):void 0},e)})):void 0},t.prototype._abortHiding=function(){return this.preparingToHide?(this.debug("Aborting hiding."),this._clearTimeouts(),this.preparingToHide=!1,this._setupObservers("-hiding","showing","visible")):void 0},t.prototype.reposition=function(){var t,e,i,o=this;return t=this.getPosition(),t==null||(e=this.options.stem,this.options.containInViewport&&(i=this._ensureViewportContainment(t),t=i.position,e=i.stem),this._positionsEqual(t,this.currentPosition))?void 0:(this.options.stem&&!e.eql(this.currentStem)&&(this.redraw=!0),this.currentPosition=t,this.currentStem=e,this._draw(),this.adapter.css(this.container,{left:""+t.left+"px",top:""+t.top+"px"}),this.defer(function(){var t,e;return t=o.adapter.unwrap(o.container),t.style.visibility="hidden",e=t.offsetHeight,t.style.visibility="visible"}))},t.prototype.getPosition=function(t,e,i){var o,s,n,r,a,h,p,d,l;if(this.container)return t==null&&(t=this.options.tipJoint),e==null&&(e=this.options.targetJoint),r={},this.options.target?(p=this.adapter.offset(this.options.target),h=this.adapter.dimensions(this.options.target),r=p,e.right?(d=this.adapter.unwrap(this.options.target),d.getBoundingClientRect!=null?r.left=d.getBoundingClientRect().right+((l=window.pageXOffset)!=null?l:document.body.scrollLeft):r.left+=h.width):e.center&&(r.left+=Math.round(h.width/2)),e.bottom?r.top+=h.height:e.middle&&(r.top+=Math.round(h.height/2)),this.options.borderWidth&&(this.options.tipJoint.left&&(r.left+=this.options.borderWidth),this.options.tipJoint.right&&(r.left-=this.options.borderWidth),this.options.tipJoint.top?r.top+=this.options.borderWidth:this.options.tipJoint.bottom&&(r.top-=this.options.borderWidth))):r=this.initialMousePosition?{top:this.initialMousePosition.y,left:this.initialMousePosition.x}:{top:mousePosition.y,left:mousePosition.x},this.options.autoOffset&&(a=this.options.stem?this.options.stemLength:0,n=a&&this.options.fixed?2:10,o=t.middle&&!this.options.fixed?15:0,s=t.center&&!this.options.fixed?15:0,t.right?r.left-=n+o:t.left&&(r.left+=n+o),t.bottom?r.top-=n+s:t.top&&(r.top+=n+s),a&&(i==null&&(i=this.options.stem),i.right?r.left-=a:i.left&&(r.left+=a),i.bottom?r.top-=a:i.top&&(r.top+=a))),r.left+=this.options.offset[0],r.top+=this.options.offset[1],t.right?r.left-=this.dimensions.width:t.center&&(r.left-=Math.round(this.dimensions.width/2)),t.bottom?r.top-=this.dimensions.height:t.middle&&(r.top-=Math.round(this.dimensions.height/2)),r},t.prototype._ensureViewportContainment=function(e){var i,o,s,n,r,a,h,p,d,l,u,c;if(h=this.options.stem,s={position:e,stem:h},!this.visible||!e)return s;if(p=this._sticksOut(e),!p[0]&&!p[1])return s;if(l=new t.Joint(this.options.tipJoint),this.options.targetJoint&&(d=new t.Joint(this.options.targetJoint)),a=this.adapter.scrollOffset(),u=this.adapter.viewportDimensions(),c=[e.left-a[0],e.top-a[1]],i=!1,u.width>=this.dimensions.width&&p[0])switch(i=!0,p[0]){case this.STICKS_OUT_LEFT:l.setHorizontal("left"),this.options.targetJoint&&d.setHorizontal("right");break;case this.STICKS_OUT_RIGHT:l.setHorizontal("right"),this.options.targetJoint&&d.setHorizontal("left")}if(u.height>=this.dimensions.height&&p[1])switch(i=!0,p[1]){case this.STICKS_OUT_TOP:l.setVertical("top"),this.options.targetJoint&&d.setVertical("bottom");break;case this.STICKS_OUT_BOTTOM:l.setVertical("bottom"),this.options.targetJoint&&d.setVertical("top")}return i?(this.options.stem&&(h=l),e=this.getPosition(l,d,h),o=this._sticksOut(e),n=!1,r=!1,o[0]&&o[0]!==p[0]&&(n=!0,l.setHorizontal(this.options.tipJoint.horizontal),this.options.targetJoint&&d.setHorizontal(this.options.targetJoint.horizontal)),o[1]&&o[1]!==p[1]&&(r=!0,l.setVertical(this.options.tipJoint.vertical),this.options.targetJoint&&d.setVertical(this.options.targetJoint.vertical)),n&&r?s:((n||r)&&(this.options.stem&&(h=l),e=this.getPosition(l,d,h)),{position:e,stem:h})):s},t.prototype._sticksOut=function(t){var e,i,o,s;return i=this.adapter.scrollOffset(),s=this.adapter.viewportDimensions(),e=[t.left-i[0],t.top-i[1]],o=[!1,!1],0>e[0]?o[0]=this.STICKS_OUT_LEFT:e[0]+this.dimensions.width>s.width&&(o[0]=this.STICKS_OUT_RIGHT),0>e[1]?o[1]=this.STICKS_OUT_TOP:e[1]+this.dimensions.height>s.height&&(o[1]=this.STICKS_OUT_BOTTOM),o},t.prototype._draw=function(){var e,i,o,s,n,r,a,h,p,d,l,u,c,g,f,m,v,b,w,_=this;if(this.backgroundCanvas&&this.redraw){if(this.debug("Drawing background."),this.redraw=!1,this.currentStem){for(v=["top","right","bottom","left"],f=0,m=v.length;m>f;f++)u=v[f],this.adapter.removeClass(this.container,"stem-"+u);this.adapter.addClass(this.container,"stem-"+this.currentStem.horizontal),this.adapter.addClass(this.container,"stem-"+this.currentStem.vertical)}return r=[0,0],a=[0,0],__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(n=new t.Joint(((b=this.currentStem)!=null?b+"":void 0)==="top right"?"top left":"top right"),r=[this.options.closeButtonRadius+this.options.closeButtonOffset[0],this.options.closeButtonRadius+this.options.closeButtonOffset[1]],a=[this.options.closeButtonRadius-this.options.closeButtonOffset[0],this.options.closeButtonRadius-this.options.closeButtonOffset[1]]),o=this.adapter.clone(this.dimensions),s=[0,0],this.options.borderWidth&&(o.width+=this.options.borderWidth*2,o.height+=this.options.borderWidth*2,s[0]-=this.options.borderWidth,s[1]-=this.options.borderWidth),this.options.shadow&&(o.width+=this.options.shadowBlur*2,o.width+=Math.max(0,this.options.shadowOffset[0]-this.options.shadowBlur*2),o.height+=this.options.shadowBlur*2,o.height+=Math.max(0,this.options.shadowOffset[1]-this.options.shadowBlur*2),s[0]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[0]),s[1]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[1])),i={left:0,right:0,top:0,bottom:0},this.currentStem&&(this.currentStem.left?i.left=this.options.stemLength:this.currentStem.right&&(i.right=this.options.stemLength),this.currentStem.top?i.top=this.options.stemLength:this.currentStem.bottom&&(i.bottom=this.options.stemLength)),n&&(n.left?i.left=Math.max(i.left,a[0]):n.right&&(i.right=Math.max(i.right,a[0])),n.top?i.top=Math.max(i.top,a[1]):n.bottom&&(i.bottom=Math.max(i.bottom,a[1]))),o.width+=i.left+i.right,o.height+=i.top+i.bottom,s[0]-=i.left,s[1]-=i.top,this.currentStem&&this.options.borderWidth&&(w=this._getPathStemMeasures(this.options.stemBase,this.options.stemLength,this.options.borderWidth),g=w.stemLength,c=w.stemBase),e=this.adapter.unwrap(this.backgroundCanvas),e.width=o.width,e.height=o.height,this.adapter.css(this.backgroundCanvas,{width:""+e.width+"px",height:""+e.height+"px",left:""+s[0]+"px",top:""+s[1]+"px"}),h=e.getContext("2d"),h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,e.width,e.height),h.beginPath(),h.fillStyle=this._getColor(h,this.dimensions,this.options.background,this.options.backgroundGradientHorizontal),h.lineJoin="miter",h.miterLimit=500,l=this.options.borderWidth/2,this.options.borderWidth?(h.strokeStyle=this.options.borderColor,h.lineWidth=this.options.borderWidth):(g=this.options.stemLength,c=this.options.stemBase),c==null&&(c=0),d=function(t,e,i){return i&&h.moveTo(Math.max(c,_.options.borderRadius,r[0])+1-l,-l),e?(h.lineTo(t/2-c/2,-l),h.lineTo(t/2,-g-l),h.lineTo(t/2+c/2,-l)):void 0},p=function(t,e,i){var o,s,n,a;return t?(h.lineTo(-c+l,0-l),h.lineTo(g+l,-g-l),h.lineTo(l,c-l)):e?(a=_.options.closeButtonOffset,n=r[0],i%2!==0&&(a=[a[1],a[0]],n=r[1]),o=Math.acos(a[1]/_.options.closeButtonRadius),s=Math.acos(a[0]/_.options.closeButtonRadius),h.lineTo(-n+l,-l),h.arc(l-a[0],-l+a[1],_.options.closeButtonRadius,-(Math.PI/2+o),s,!1)):(h.lineTo(-_.options.borderRadius+l,-l),h.quadraticCurveTo(l,-l,l,_.options.borderRadius-l))},h.translate(-s[0],-s[1]),h.save(),function(){var e,i,o,s,r,a,l,u,c,g,f;for(f=[],i=c=0,g=t.positions.length/2;g>=0?g>c:c>g;i=g>=0?++c:--c)r=i*2,a=i===0||i===3?0:_.dimensions.width,l=2>i?0:_.dimensions.height,u=Math.PI/2*i,o=i%2===0?_.dimensions.width:_.dimensions.height,s=new t.Joint(t.positions[r]),e=new t.Joint(t.positions[r+1]),h.save(),h.translate(a,l),h.rotate(u),d(o,s.eql(_.currentStem),i===0),h.translate(o,0),p(e.eql(_.currentStem),e.eql(n),i),f.push(h.restore());return f}(),h.closePath(),h.save(),this.options.shadow&&(h.shadowColor=this.options.shadowColor,h.shadowBlur=this.options.shadowBlur,h.shadowOffsetX=this.options.shadowOffset[0],h.shadowOffsetY=this.options.shadowOffset[1]),h.fill(),h.restore(),this.options.borderWidth&&h.stroke(),h.restore(),n?function(){var t,e,i,o,s;return i=e=_.options.closeButtonRadius*2,n+""=="top right"?(s=[_.dimensions.width-_.options.closeButtonOffset[0],_.options.closeButtonOffset[1]],t=[s[0]+l,s[1]-l]):(s=[_.options.closeButtonOffset[0],_.options.closeButtonOffset[1]],t=[s[0]-l,s[1]-l]),h.translate(t[0],t[1]),o=_.options.closeButtonCrossSize/2,h.save(),h.beginPath(),h.strokeStyle=_.options.closeButtonCrossColor,h.lineWidth=_.options.closeButtonCrossLineWidth,h.lineCap="round",h.moveTo(-o,-o),h.lineTo(o,o),h.stroke(),h.beginPath(),h.moveTo(o,-o),h.lineTo(-o,o),h.stroke(),h.restore(),_.adapter.css(_.closeButtonElement,{left:""+(s[0]-o-_.options.closeButtonLinkOverscan)+"px",top:""+(s[1]-o-_.options.closeButtonLinkOverscan)+"px",width:""+(_.options.closeButtonCrossSize+_.options.closeButtonLinkOverscan*2)+"px",height:""+(_.options.closeButtonCrossSize+_.options.closeButtonLinkOverscan*2)+"px"})}():void 0}},t.prototype._getPathStemMeasures=function(t,e,i){var o,s,n,r,a,h,p;if(r=i/2,n=Math.atan(t/2/e),o=n*2,a=r/Math.sin(o),s=2*a*Math.cos(n),p=r+e-s,0>p)throw Error("Sorry but your stemLength / stemBase ratio is strange.");return h=Math.tan(n)*p*2,{stemLength:p,stemBase:h}},t.prototype._getColor=function(t,e,i,o){var s,n,r,a,h;if(o==null&&(o=!1),typeof i=="string")return i;for(n=o?t.createLinearGradient(0,0,e.width,0):t.createLinearGradient(0,0,0,e.height),r=a=0,h=i.length;h>a;r=++a)s=i[r],n.addColorStop(s[0],s[1]);return n},t.prototype._searchAndActivateCloseButtons=function(){var t,e,i,o;for(o=this.adapter.findAll(this.container,"."+this["class"].close),e=0,i=o.length;i>e;e++)t=o[e],this.hideTriggers.push({element:this.adapter.wrap(t),event:"click"});return this.currentObservers.showing&&this._setupObservers("-showing","showing"),this.currentObservers.visible?this._setupObservers("-visible","visible"):void 0},t.prototype._activateFirstInput=function(){var t;return t=this.adapter.unwrap(this.adapter.find(this.container,"input, textarea")),t!=null?typeof t.focus=="function"?t.focus():void 0:void 0},t.prototype._followMousePosition=function(){return this.options.fixed?void 0:t._observeMousePosition(this.bound.reposition)},t.prototype._stopFollowingMousePosition=function(){return this.options.fixed?void 0:t._stopObservingMousePosition(this.bound.reposition)},t.prototype._clearShowTimeout=function(){return clearTimeout(this._showTimeoutId)},t.prototype._clearHideTimeout=function(){return clearTimeout(this._hideTimeoutId)},t.prototype._clearTimeouts=function(){return clearTimeout(this._visibilityStateTimeoutId),this._clearShowTimeout(),this._clearHideTimeout()},t.prototype._triggerElementExists=function(){var t;t=this.adapter.unwrap(this.triggerElement);while(t.parentNode){if(t.parentNode.tagName==="BODY")return!0;t=t.parentNode}return!1},t.prototype._loadAjax=function(){var t=this;if(!this.loading)return this.loaded=!1,this.loading=!0,this.adapter.addClass(this.container,this["class"].loading),this.setContent(""),this.debug("Loading content from "+this.options.ajax),this.adapter.ajax({url:this.options.ajax,method:this.options.ajaxMethod,onSuccess:function(e){return t.debug("Loading successful."),t.adapter.removeClass(t.container,t["class"].loading),t.setContent(e)},onError:function(e){var i;return i=t.options.ajaxErrorMessage,t.debug(i,e),t.setContent(i),t.adapter.addClass(t.container,t["class"].ajaxError)},onComplete:function(){return t.adapter.removeClass(t.container,t["class"].loading),t.loading=!1,t.loaded=!0,t._searchAndActivateCloseButtons(),t._activateFirstInput(),t.reposition()}})},t.prototype._ensureTriggerElement=function(){return this._triggerElementExists()?void 0:(this.deactivate(),this._stopEnsureTriggerElement())},t.prototype._ensureTriggerElementInterval=1e3,t.prototype._startEnsureTriggerElement=function(){var t=this;return this._ensureTriggerElementTimeoutId=setInterval(function(){return t._ensureTriggerElement()},this._ensureTriggerElementInterval)},t.prototype._stopEnsureTriggerElement=function(){return clearInterval(this._ensureTriggerElementTimeoutId)},t}(),vendors=["khtml","ms","o","moz","webkit"],Opentip.prototype.setCss3Style=function(t,e){var i,o,s,n,r;t=this.adapter.unwrap(t),r=[];for(i in e)__hasProp.call(e,i)&&(o=e[i],t.style[i]!=null?r.push(t.style[i]=o):r.push(function(){var e,r,a;for(a=[],e=0,r=vendors.length;r>e;e++)s=vendors[e],n=""+this.ucfirst(s)+this.ucfirst(i),t.style[n]!=null?a.push(t.style[n]=o):a.push(void 0);return a}.call(this)));return r},Opentip.prototype.defer=function(t){return setTimeout(t,0)},Opentip.prototype.setTimeout=function(t,e){return setTimeout(t,e?e*1e3:0)},Opentip.prototype.ucfirst=function(t){return t==null?"":t.charAt(0).toUpperCase()+t.slice(1)},Opentip.prototype.dasherize=function(t){return t.replace(/([A-Z])/g,function(t,e){return"-"+e.toLowerCase()})},mousePositionObservers=[],mousePosition={x:0,y:0},mouseMoved=function(t){var e,i,o,s;for(mousePosition=Opentip.adapter.mousePosition(t),s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],s.push(e());return s},Opentip.followMousePosition=function(){return Opentip.adapter.observe(document.body,"mousemove",mouseMoved)},Opentip._observeMousePosition=function(t){return mousePositionObservers.push(t)},Opentip._stopObservingMousePosition=function(t){var e;return mousePositionObservers=function(){var i,o,s;for(s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],e!==t&&s.push(e);return s}()},Opentip.Joint=function(){function t(t){t!=null&&(t instanceof Opentip.Joint&&(t+=""),this.set(t))}return t.prototype.set=function(t){return t=t.toLowerCase(),this.setHorizontal(t),this.setVertical(t),this},t.prototype.setHorizontal=function(t){var e,i,o,s,n,r,a;for(i=["left","center","right"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.horizontal=e.toLowerCase());for(this.horizontal==null&&(this.horizontal="center"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.horizontal===e?e:void 0);return a},t.prototype.setVertical=function(t){var e,i,o,s,n,r,a;for(i=["top","middle","bottom"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.vertical=e.toLowerCase());for(this.vertical==null&&(this.vertical="middle"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.vertical===e?e:void 0);return a},t.prototype.eql=function(t){return t!=null&&this.horizontal===t.horizontal&&this.vertical===t.vertical},t.prototype.flip=function(){var t,e;return e=Opentip.position[this.toString(!0)],t=(e+4)%8,this.set(Opentip.positions[t]),this},t.prototype.toString=function(t){var e,i;return t==null&&(t=!1),i=this.vertical==="middle"?"":this.vertical,e=this.horizontal==="center"?"":this.horizontal,i&&e&&(e=t?Opentip.prototype.ucfirst(e):" "+e),""+i+e},t}(),Opentip.prototype._positionsEqual=function(t,e){return t!=null&&e!=null&&t.left===e.left&&t.top===e.top},Opentip.prototype._dimensionsEqual=function(t,e){return t!=null&&e!=null&&t.width===e.width&&t.height===e.height},Opentip.prototype.debug=function(){var t;return t=arguments.length>=1?__slice.call(arguments,0):[],Opentip.debug&&(typeof console!="undefined"&&console!==null?console.debug:void 0)!=null?(t.unshift("#"+this.id+" |"),console.debug.apply(console,t)):void 0},Opentip.findElements=function(){var t,e,i,o,s,n,r,a,h,p;for(t=Opentip.adapter,h=t.findAll(document.body,"[data-ot]"),p=[],r=0,a=h.length;a>r;r++){i=h[r],n={},e=t.data(i,"ot"),(e===""||e==="true"||e==="yes")&&(e=t.attr(i,"title"),t.attr(i,"title","")),e=e||"";for(o in Opentip.styles.standard)s=t.data(i,"ot"+Opentip.prototype.ucfirst(o)),s!=null&&(s==="yes"||s==="true"||s==="on"?s=!0:(s==="no"||s==="false"||s==="off")&&(s=!1),n[o]=s);p.push(new Opentip(i,e,n))}return p},Opentip.version="2.4.6",Opentip.debug=!1,Opentip.lastId=0,Opentip.lastZIndex=100,Opentip.tips=[],Opentip._abortShowingGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i._abortShowing()):r.push(void 0);return r},Opentip._hideGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i.hide()):r.push(void 0);return r},Opentip.adapters={},Opentip.adapter=null,firstAdapter=!0,Opentip.addAdapter=function(t){return Opentip.adapters[t.name]=t,firstAdapter?(Opentip.adapter=t,t.domReady(Opentip.findElements),t.domReady(Opentip.followMousePosition),firstAdapter=!1):void 0},Opentip.positions=["top","topRight","right","bottomRight","bottom","bottomLeft","left","topLeft"],Opentip.position={},_ref=Opentip.positions,i=_i=0,_len=_ref.length;_len>_i;i=++_i)position=_ref[i],Opentip.position[position]=i;Opentip.styles={standard:{"extends":null,title:void 0,escapeTitle:!0,escapeContent:!1,className:"standard",stem:!0,delay:null,hideDelay:.1,fixed:!1,showOn:"mouseover",hideTrigger:"trigger",hideTriggers:[],hideOn:null,removeElementsOnHide:!1,offset:[0,0],containInViewport:!0,autoOffset:!0,showEffect:"appear",hideEffect:"fade",showEffectDuration:.3,hideEffectDuration:.2,stemLength:5,stemBase:8,tipJoint:"top left",target:null,targetJoint:null,cache:!0,ajax:!1,ajaxMethod:"GET",ajaxErrorMessage:"There was a problem downloading the content.",group:null,style:null,background:"#fff18f",backgroundGradientHorizontal:!1,closeButtonOffset:[5,5],closeButtonRadius:7,closeButtonCrossSize:4,closeButtonCrossColor:"#d2c35b",closeButtonCrossLineWidth:1.5,closeButtonLinkOverscan:6,borderRadius:5,borderWidth:1,borderColor:"#f2e37b",shadow:!0,shadowBlur:10,shadowOffset:[3,3],shadowColor:"rgba(0, 0, 0, 0.1)"},glass:{"extends":"standard",className:"glass",background:[[0,"rgba(252, 252, 252, 0.8)"],[.5,"rgba(255, 255, 255, 0.8)"],[.5,"rgba(250, 250, 250, 0.9)"],[1,"rgba(245, 245, 245, 0.9)"]],borderColor:"#eee",closeButtonCrossColor:"rgba(0, 0, 0, 0.2)",borderRadius:15,closeButtonRadius:10,closeButtonOffset:[8,8]},dark:{"extends":"standard",className:"dark",borderRadius:13,borderColor:"#444",closeButtonCrossColor:"rgba(240, 240, 240, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(30, 30, 30, 0.7)"],[.5,"rgba(30, 30, 30, 0.8)"],[.5,"rgba(10, 10, 10, 0.8)"],[1,"rgba(10, 10, 10, 0.9)"]]},alert:{"extends":"standard",className:"alert",borderRadius:1,borderColor:"#AE0D11",closeButtonCrossColor:"rgba(255, 255, 255, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(203, 15, 19, 0.7)"],[.5,"rgba(203, 15, 19, 0.8)"],[.5,"rgba(189, 14, 18, 0.8)"],[1,"rgba(179, 14, 17, 0.9)"]]}},Opentip.defaultStyle="standard",typeof module!="undefined"&&module!==null?module.exports=Opentip:window.Opentip=Opentip;var __slice=[].slice;(function(t){var e;return t.fn.opentip=function(t,e,i){return new Opentip(this,t,e,i)},e=function(){function e(){}return e.prototype.name="jquery",e.prototype.domReady=function(e){return t(e)},e.prototype.create=function(e){return t(e)},e.prototype.wrap=function(e){if(e=t(e),e.length>1)throw Error("Multiple elements provided.");return e},e.prototype.unwrap=function(e){return t(e)[0] },e.prototype.tagName=function(t){return this.unwrap(t).tagName},e.prototype.attr=function(){var e,i,o;return i=arguments[0],e=arguments.length>=2?__slice.call(arguments,1):[],(o=t(i)).attr.apply(o,e)},e.prototype.data=function(){var e,i,o;return i=arguments[0],e=arguments.length>=2?__slice.call(arguments,1):[],(o=t(i)).data.apply(o,e)},e.prototype.find=function(e,i){return t(e).find(i).get(0)},e.prototype.findAll=function(e,i){return t(e).find(i)},e.prototype.update=function(e,i,o){return e=t(e),o?e.text(i):e.html(i)},e.prototype.append=function(e,i){return t(e).append(i)},e.prototype.remove=function(e){return t(e).remove()},e.prototype.addClass=function(e,i){return t(e).addClass(i)},e.prototype.removeClass=function(e,i){return t(e).removeClass(i)},e.prototype.css=function(e,i){return t(e).css(i)},e.prototype.dimensions=function(e){return{width:t(e).outerWidth(),height:t(e).outerHeight()}},e.prototype.scrollOffset=function(){return[window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop]},e.prototype.viewportDimensions=function(){return{width:document.documentElement.clientWidth,height:document.documentElement.clientHeight}},e.prototype.mousePosition=function(t){return t==null?null:{x:t.pageX,y:t.pageY}},e.prototype.offset=function(e){var i;return i=t(e).offset(),{left:i.left,top:i.top}},e.prototype.observe=function(e,i,o){return t(e).bind(i,o)},e.prototype.stopObserving=function(e,i,o){return t(e).unbind(i,o)},e.prototype.ajax=function(e){var i,o;if(e.url==null)throw Error("No url provided");return t.ajax({url:e.url,type:(i=(o=e.method)!=null?o.toUpperCase():void 0)!=null?i:"GET"}).done(function(t){return typeof e.onSuccess=="function"?e.onSuccess(t):void 0}).fail(function(t){return typeof e.onError=="function"?e.onError("Server responded with status "+t.status):void 0}).always(function(){return typeof e.onComplete=="function"?e.onComplete():void 0})},e.prototype.clone=function(e){return t.extend({},e)},e.prototype.extend=function(){var e,i;return i=arguments[0],e=arguments.length>=2?__slice.call(arguments,1):[],t.extend.apply(t,[i].concat(__slice.call(e)))},e}(),Opentip.addAdapter(new e)})(jQuery)opentip-2.4.6/downloads/opentip-native-excanvas.js000066400000000000000000002771111213277401600223150ustar00rootroot00000000000000// Generated by CoffeeScript 1.4.0 /* # # Opentip v2.4.6 # # More info at [www.opentip.org](http://www.opentip.org) # # Copyright (c) 2012, Matias Meno # Graphics by Tjandra Mayerhold # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # */ var Opentip, firstAdapter, i, mouseMoved, mousePosition, mousePositionObservers, position, vendors, _i, _len, _ref, __slice = [].slice, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __hasProp = {}.hasOwnProperty; Opentip = (function() { Opentip.prototype.STICKS_OUT_TOP = 1; Opentip.prototype.STICKS_OUT_BOTTOM = 2; Opentip.prototype.STICKS_OUT_LEFT = 1; Opentip.prototype.STICKS_OUT_RIGHT = 2; Opentip.prototype["class"] = { container: "opentip-container", opentip: "opentip", header: "ot-header", content: "ot-content", loadingIndicator: "ot-loading-indicator", close: "ot-close", goingToHide: "ot-going-to-hide", hidden: "ot-hidden", hiding: "ot-hiding", goingToShow: "ot-going-to-show", showing: "ot-showing", visible: "ot-visible", loading: "ot-loading", ajaxError: "ot-ajax-error", fixed: "ot-fixed", showEffectPrefix: "ot-show-effect-", hideEffectPrefix: "ot-hide-effect-", stylePrefix: "style-" }; function Opentip(element, content, title, options) { var elementsOpentips, hideTrigger, methodToBind, optionSources, prop, styleName, _i, _j, _len, _len1, _ref, _ref1, _ref2, _tmpStyle, _this = this; this.id = ++Opentip.lastId; this.debug("Creating Opentip."); Opentip.tips.push(this); this.adapter = Opentip.adapter; elementsOpentips = this.adapter.data(element, "opentips") || []; elementsOpentips.push(this); this.adapter.data(element, "opentips", elementsOpentips); this.triggerElement = this.adapter.wrap(element); if (this.triggerElement.length > 1) { throw new Error("You can't call Opentip on multiple elements."); } if (this.triggerElement.length < 1) { throw new Error("Invalid element."); } this.loaded = false; this.loading = false; this.visible = false; this.waitingToShow = false; this.waitingToHide = false; this.currentPosition = { left: 0, top: 0 }; this.dimensions = { width: 100, height: 50 }; this.content = ""; this.redraw = true; this.currentObservers = { showing: false, visible: false, hiding: false, hidden: false }; options = this.adapter.clone(options); if (typeof content === "object") { options = content; content = title = void 0; } else if (typeof title === "object") { options = title; title = void 0; } if (title != null) { options.title = title; } if (content != null) { this.setContent(content); } if (options["extends"] == null) { if (options.style != null) { options["extends"] = options.style; } else { options["extends"] = Opentip.defaultStyle; } } optionSources = [options]; _tmpStyle = options; while (_tmpStyle["extends"]) { styleName = _tmpStyle["extends"]; _tmpStyle = Opentip.styles[styleName]; if (_tmpStyle == null) { throw new Error("Invalid style: " + styleName); } optionSources.unshift(_tmpStyle); if (!((_tmpStyle["extends"] != null) || styleName === "standard")) { _tmpStyle["extends"] = "standard"; } } options = (_ref = this.adapter).extend.apply(_ref, [{}].concat(__slice.call(optionSources))); options.hideTriggers = (function() { var _i, _len, _ref1, _results; _ref1 = options.hideTriggers; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { hideTrigger = _ref1[_i]; _results.push(hideTrigger); } return _results; })(); if (options.hideTrigger && options.hideTriggers.length === 0) { options.hideTriggers.push(options.hideTrigger); } _ref1 = ["tipJoint", "targetJoint", "stem"]; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { prop = _ref1[_i]; if (options[prop] && typeof options[prop] === "string") { options[prop] = new Opentip.Joint(options[prop]); } } if (options.ajax && (options.ajax === true || !options.ajax)) { if (this.adapter.tagName(this.triggerElement) === "A") { options.ajax = this.adapter.attr(this.triggerElement, "href"); } else { options.ajax = false; } } if (options.showOn === "click" && this.adapter.tagName(this.triggerElement) === "A") { this.adapter.observe(this.triggerElement, "click", function(e) { e.preventDefault(); e.stopPropagation(); return e.stopped = true; }); } if (options.target) { options.fixed = true; } if (options.stem === true) { options.stem = new Opentip.Joint(options.tipJoint); } if (options.target === true) { options.target = this.triggerElement; } else if (options.target) { options.target = this.adapter.wrap(options.target); } this.currentStem = options.stem; if (options.delay == null) { options.delay = options.showOn === "mouseover" ? 0.2 : 0; } if (options.targetJoint == null) { options.targetJoint = new Opentip.Joint(options.tipJoint).flip(); } this.showTriggers = []; this.showTriggersWhenVisible = []; this.hideTriggers = []; if (options.showOn && options.showOn !== "creation") { this.showTriggers.push({ element: this.triggerElement, event: options.showOn }); } if (options.ajaxCache != null) { options.cache = options.ajaxCache; delete options.ajaxCache; } this.options = options; this.bound = {}; _ref2 = ["prepareToShow", "prepareToHide", "show", "hide", "reposition"]; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { methodToBind = _ref2[_j]; this.bound[methodToBind] = (function(methodToBind) { return function() { return _this[methodToBind].apply(_this, arguments); }; })(methodToBind); } this.adapter.domReady(function() { _this.activate(); if (_this.options.showOn === "creation") { return _this.prepareToShow(); } }); } Opentip.prototype._setup = function() { var hideOn, hideTrigger, hideTriggerElement, i, _i, _j, _len, _len1, _ref, _ref1, _results; this.debug("Setting up the tooltip."); this._buildContainer(); this.hideTriggers = []; _ref = this.options.hideTriggers; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { hideTrigger = _ref[i]; hideTriggerElement = null; hideOn = this.options.hideOn instanceof Array ? this.options.hideOn[i] : this.options.hideOn; if (typeof hideTrigger === "string") { switch (hideTrigger) { case "trigger": hideOn = hideOn || "mouseout"; hideTriggerElement = this.triggerElement; break; case "tip": hideOn = hideOn || "mouseover"; hideTriggerElement = this.container; break; case "target": hideOn = hideOn || "mouseover"; hideTriggerElement = this.options.target; break; case "closeButton": break; default: throw new Error("Unknown hide trigger: " + hideTrigger + "."); } } else { hideOn = hideOn || "mouseover"; hideTriggerElement = this.adapter.wrap(hideTrigger); } if (hideTriggerElement) { this.hideTriggers.push({ element: hideTriggerElement, event: hideOn, original: hideTrigger }); } } _ref1 = this.hideTriggers; _results = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { hideTrigger = _ref1[_j]; _results.push(this.showTriggersWhenVisible.push({ element: hideTrigger.element, event: "mouseover" })); } return _results; }; Opentip.prototype._buildContainer = function() { this.container = this.adapter.create("
"); this.adapter.css(this.container, { position: "absolute" }); if (this.options.ajax) { this.adapter.addClass(this.container, this["class"].loading); } if (this.options.fixed) { this.adapter.addClass(this.container, this["class"].fixed); } if (this.options.showEffect) { this.adapter.addClass(this.container, "" + this["class"].showEffectPrefix + this.options.showEffect); } if (this.options.hideEffect) { return this.adapter.addClass(this.container, "" + this["class"].hideEffectPrefix + this.options.hideEffect); } }; Opentip.prototype._buildElements = function() { var headerElement, titleElement; this.tooltipElement = this.adapter.create("
"); this.backgroundCanvas = this.adapter.wrap(document.createElement("canvas")); this.adapter.css(this.backgroundCanvas, { position: "absolute" }); if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)); } headerElement = this.adapter.find(this.tooltipElement, "." + this["class"].header); if (this.options.title) { titleElement = this.adapter.create("

"); this.adapter.update(titleElement, this.options.title, this.options.escapeTitle); this.adapter.append(headerElement, titleElement); } if (this.options.ajax && !this.loaded) { this.adapter.append(this.tooltipElement, this.adapter.create("
↻
")); } if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { this.closeButtonElement = this.adapter.create("Close"); this.adapter.append(headerElement, this.closeButtonElement); } this.adapter.append(this.container, this.backgroundCanvas); this.adapter.append(this.container, this.tooltipElement); this.adapter.append(document.body, this.container); this._newContent = true; return this.redraw = true; }; Opentip.prototype.setContent = function(content) { this.content = content; this._newContent = true; if (typeof this.content === "function") { this._contentFunction = this.content; this.content = ""; } else { this._contentFunction = null; } if (this.visible) { return this._updateElementContent(); } }; Opentip.prototype._updateElementContent = function() { var contentDiv; if (this._newContent || (!this.options.cache && this._contentFunction)) { contentDiv = this.adapter.find(this.container, "." + this["class"].content); if (contentDiv != null) { if (this._contentFunction) { this.debug("Executing content function."); this.content = this._contentFunction(this); } this.adapter.update(contentDiv, this.content, this.options.escapeContent); } this._newContent = false; } this._storeAndLockDimensions(); return this.reposition(); }; Opentip.prototype._storeAndLockDimensions = function() { var prevDimension; if (!this.container) { return; } prevDimension = this.dimensions; this.adapter.css(this.container, { width: "auto", left: "0px", top: "0px" }); this.dimensions = this.adapter.dimensions(this.container); this.dimensions.width += 1; this.adapter.css(this.container, { width: "" + this.dimensions.width + "px", top: "" + this.currentPosition.top + "px", left: "" + this.currentPosition.left + "px" }); if (!this._dimensionsEqual(this.dimensions, prevDimension)) { this.redraw = true; return this._draw(); } }; Opentip.prototype.activate = function() { return this._setupObservers("hidden", "hiding"); }; Opentip.prototype.deactivate = function() { this.debug("Deactivating tooltip."); this.hide(); return this._setupObservers("-showing", "-visible", "-hidden", "-hiding"); }; Opentip.prototype._setupObservers = function() { var observeOrStop, removeObserver, state, states, trigger, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _this = this; states = 1 <= arguments.length ? __slice.call(arguments, 0) : []; for (_i = 0, _len = states.length; _i < _len; _i++) { state = states[_i]; removeObserver = false; if (state.charAt(0) === "-") { removeObserver = true; state = state.substr(1); } if (this.currentObservers[state] === !removeObserver) { continue; } this.currentObservers[state] = !removeObserver; observeOrStop = function() { var args, _ref, _ref1; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (removeObserver) { return (_ref = _this.adapter).stopObserving.apply(_ref, args); } else { return (_ref1 = _this.adapter).observe.apply(_ref1, args); } }; switch (state) { case "showing": _ref = this.hideTriggers; for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { trigger = _ref[_j]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToHide); } observeOrStop((document.onresize != null ? document : window), "resize", this.bound.reposition); observeOrStop(window, "scroll", this.bound.reposition); break; case "visible": _ref1 = this.showTriggersWhenVisible; for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { trigger = _ref1[_k]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hiding": _ref2 = this.showTriggers; for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { trigger = _ref2[_l]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hidden": break; default: throw new Error("Unknown state: " + state); } } return null; }; Opentip.prototype.prepareToShow = function() { this._abortHiding(); this._abortShowing(); if (this.visible) { return; } this.debug("Showing in " + this.options.delay + "s."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._abortShowingGroup(this.options.group, this); } this.preparingToShow = true; this._setupObservers("-hidden", "-hiding", "showing"); this._followMousePosition(); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); return this._showTimeoutId = this.setTimeout(this.bound.show, this.options.delay || 0); }; Opentip.prototype.show = function() { var _this = this; this._abortHiding(); if (this.visible) { return; } this._clearTimeouts(); if (!this._triggerElementExists()) { return this.deactivate(); } this.debug("Showing now."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._hideGroup(this.options.group, this); } this.visible = true; this.preparingToShow = false; if (this.tooltipElement == null) { this._buildElements(); } this._updateElementContent(); if (this.options.ajax && (!this.loaded || !this.options.cache)) { this._loadAjax(); } this._searchAndActivateCloseButtons(); this._startEnsureTriggerElement(); this.adapter.css(this.container, { zIndex: Opentip.lastZIndex++ }); this._setupObservers("-hidden", "-hiding", "-showing", "-visible", "showing", "visible"); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); this.adapter.removeClass(this.container, this["class"].hiding); this.adapter.removeClass(this.container, this["class"].hidden); this.adapter.addClass(this.container, this["class"].goingToShow); this.setCss3Style(this.container, { transitionDuration: "0s" }); this.defer(function() { var delay; if (!_this.visible || _this.preparingToHide) { return; } _this.adapter.removeClass(_this.container, _this["class"].goingToShow); _this.adapter.addClass(_this.container, _this["class"].showing); delay = 0; if (_this.options.showEffect && _this.options.showEffectDuration) { delay = _this.options.showEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + delay + "s" }); _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].showing); return _this.adapter.addClass(_this.container, _this["class"].visible); }, delay); return _this._activateFirstInput(); }); return this._draw(); }; Opentip.prototype._abortShowing = function() { if (this.preparingToShow) { this.debug("Aborting showing."); this._clearTimeouts(); this._stopFollowingMousePosition(); this.preparingToShow = false; return this._setupObservers("-showing", "-visible", "hiding", "hidden"); } }; Opentip.prototype.prepareToHide = function() { this._abortShowing(); this._abortHiding(); if (!this.visible) { return; } this.debug("Hiding in " + this.options.hideDelay + "s"); this.preparingToHide = true; this._setupObservers("-showing", "visible", "-hidden", "hiding"); return this._hideTimeoutId = this.setTimeout(this.bound.hide, this.options.hideDelay); }; Opentip.prototype.hide = function() { var _this = this; this._abortShowing(); if (!this.visible) { return; } this._clearTimeouts(); this.debug("Hiding!"); this.visible = false; this.preparingToHide = false; this._stopEnsureTriggerElement(); this._setupObservers("-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden"); if (!this.options.fixed) { this._stopFollowingMousePosition(); } if (!this.container) { return; } this.adapter.removeClass(this.container, this["class"].visible); this.adapter.removeClass(this.container, this["class"].showing); this.adapter.addClass(this.container, this["class"].goingToHide); this.setCss3Style(this.container, { transitionDuration: "0s" }); return this.defer(function() { var hideDelay; _this.adapter.removeClass(_this.container, _this["class"].goingToHide); _this.adapter.addClass(_this.container, _this["class"].hiding); hideDelay = 0; if (_this.options.hideEffect && _this.options.hideEffectDuration) { hideDelay = _this.options.hideEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + hideDelay + "s" }); return _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].hiding); _this.adapter.addClass(_this.container, _this["class"].hidden); _this.setCss3Style(_this.container, { transitionDuration: "0s" }); if (_this.options.removeElementsOnHide) { _this.debug("Removing HTML elements."); _this.adapter.remove(_this.container); delete _this.container; return delete _this.tooltipElement; } }, hideDelay); }); }; Opentip.prototype._abortHiding = function() { if (this.preparingToHide) { this.debug("Aborting hiding."); this._clearTimeouts(); this.preparingToHide = false; return this._setupObservers("-hiding", "showing", "visible"); } }; Opentip.prototype.reposition = function() { var position, stem, _ref, _this = this; position = this.getPosition(); if (position == null) { return; } stem = this.options.stem; if (this.options.containInViewport) { _ref = this._ensureViewportContainment(position), position = _ref.position, stem = _ref.stem; } if (this._positionsEqual(position, this.currentPosition)) { return; } if (!(!this.options.stem || stem.eql(this.currentStem))) { this.redraw = true; } this.currentPosition = position; this.currentStem = stem; this._draw(); this.adapter.css(this.container, { left: "" + position.left + "px", top: "" + position.top + "px" }); return this.defer(function() { var rawContainer, redrawFix; rawContainer = _this.adapter.unwrap(_this.container); rawContainer.style.visibility = "hidden"; redrawFix = rawContainer.offsetHeight; return rawContainer.style.visibility = "visible"; }); }; Opentip.prototype.getPosition = function(tipJoint, targetJoint, stem) { var additionalHorizontal, additionalVertical, offsetDistance, position, stemLength, targetDimensions, targetPosition, unwrappedTarget, _ref; if (!this.container) { return; } if (tipJoint == null) { tipJoint = this.options.tipJoint; } if (targetJoint == null) { targetJoint = this.options.targetJoint; } position = {}; if (this.options.target) { targetPosition = this.adapter.offset(this.options.target); targetDimensions = this.adapter.dimensions(this.options.target); position = targetPosition; if (targetJoint.right) { unwrappedTarget = this.adapter.unwrap(this.options.target); if (unwrappedTarget.getBoundingClientRect != null) { position.left = unwrappedTarget.getBoundingClientRect().right + ((_ref = window.pageXOffset) != null ? _ref : document.body.scrollLeft); } else { position.left += targetDimensions.width; } } else if (targetJoint.center) { position.left += Math.round(targetDimensions.width / 2); } if (targetJoint.bottom) { position.top += targetDimensions.height; } else if (targetJoint.middle) { position.top += Math.round(targetDimensions.height / 2); } if (this.options.borderWidth) { if (this.options.tipJoint.left) { position.left += this.options.borderWidth; } if (this.options.tipJoint.right) { position.left -= this.options.borderWidth; } if (this.options.tipJoint.top) { position.top += this.options.borderWidth; } else if (this.options.tipJoint.bottom) { position.top -= this.options.borderWidth; } } } else { if (this.initialMousePosition) { position = { top: this.initialMousePosition.y, left: this.initialMousePosition.x }; } else { position = { top: mousePosition.y, left: mousePosition.x }; } } if (this.options.autoOffset) { stemLength = this.options.stem ? this.options.stemLength : 0; offsetDistance = stemLength && this.options.fixed ? 2 : 10; additionalHorizontal = tipJoint.middle && !this.options.fixed ? 15 : 0; additionalVertical = tipJoint.center && !this.options.fixed ? 15 : 0; if (tipJoint.right) { position.left -= offsetDistance + additionalHorizontal; } else if (tipJoint.left) { position.left += offsetDistance + additionalHorizontal; } if (tipJoint.bottom) { position.top -= offsetDistance + additionalVertical; } else if (tipJoint.top) { position.top += offsetDistance + additionalVertical; } if (stemLength) { if (stem == null) { stem = this.options.stem; } if (stem.right) { position.left -= stemLength; } else if (stem.left) { position.left += stemLength; } if (stem.bottom) { position.top -= stemLength; } else if (stem.top) { position.top += stemLength; } } } position.left += this.options.offset[0]; position.top += this.options.offset[1]; if (tipJoint.right) { position.left -= this.dimensions.width; } else if (tipJoint.center) { position.left -= Math.round(this.dimensions.width / 2); } if (tipJoint.bottom) { position.top -= this.dimensions.height; } else if (tipJoint.middle) { position.top -= Math.round(this.dimensions.height / 2); } return position; }; Opentip.prototype._ensureViewportContainment = function(position) { var needsRepositioning, newSticksOut, originals, revertedX, revertedY, scrollOffset, stem, sticksOut, targetJoint, tipJoint, viewportDimensions, viewportPosition; stem = this.options.stem; originals = { position: position, stem: stem }; if (!(this.visible && position)) { return originals; } sticksOut = this._sticksOut(position); if (!(sticksOut[0] || sticksOut[1])) { return originals; } tipJoint = new Opentip.Joint(this.options.tipJoint); if (this.options.targetJoint) { targetJoint = new Opentip.Joint(this.options.targetJoint); } scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); viewportPosition = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; needsRepositioning = false; if (viewportDimensions.width >= this.dimensions.width) { if (sticksOut[0]) { needsRepositioning = true; switch (sticksOut[0]) { case this.STICKS_OUT_LEFT: tipJoint.setHorizontal("left"); if (this.options.targetJoint) { targetJoint.setHorizontal("right"); } break; case this.STICKS_OUT_RIGHT: tipJoint.setHorizontal("right"); if (this.options.targetJoint) { targetJoint.setHorizontal("left"); } } } } if (viewportDimensions.height >= this.dimensions.height) { if (sticksOut[1]) { needsRepositioning = true; switch (sticksOut[1]) { case this.STICKS_OUT_TOP: tipJoint.setVertical("top"); if (this.options.targetJoint) { targetJoint.setVertical("bottom"); } break; case this.STICKS_OUT_BOTTOM: tipJoint.setVertical("bottom"); if (this.options.targetJoint) { targetJoint.setVertical("top"); } } } } if (!needsRepositioning) { return originals; } if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); newSticksOut = this._sticksOut(position); revertedX = false; revertedY = false; if (newSticksOut[0] && (newSticksOut[0] !== sticksOut[0])) { revertedX = true; tipJoint.setHorizontal(this.options.tipJoint.horizontal); if (this.options.targetJoint) { targetJoint.setHorizontal(this.options.targetJoint.horizontal); } } if (newSticksOut[1] && (newSticksOut[1] !== sticksOut[1])) { revertedY = true; tipJoint.setVertical(this.options.tipJoint.vertical); if (this.options.targetJoint) { targetJoint.setVertical(this.options.targetJoint.vertical); } } if (revertedX && revertedY) { return originals; } if (revertedX || revertedY) { if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); } return { position: position, stem: stem }; }; Opentip.prototype._sticksOut = function(position) { var positionOffset, scrollOffset, sticksOut, viewportDimensions; scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); positionOffset = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; sticksOut = [false, false]; if (positionOffset[0] < 0) { sticksOut[0] = this.STICKS_OUT_LEFT; } else if (positionOffset[0] + this.dimensions.width > viewportDimensions.width) { sticksOut[0] = this.STICKS_OUT_RIGHT; } if (positionOffset[1] < 0) { sticksOut[1] = this.STICKS_OUT_TOP; } else if (positionOffset[1] + this.dimensions.height > viewportDimensions.height) { sticksOut[1] = this.STICKS_OUT_BOTTOM; } return sticksOut; }; Opentip.prototype._draw = function() { var backgroundCanvas, bulge, canvasDimensions, canvasPosition, closeButton, closeButtonInner, closeButtonOuter, ctx, drawCorner, drawLine, hb, position, stemBase, stemLength, _i, _len, _ref, _ref1, _ref2, _this = this; if (!(this.backgroundCanvas && this.redraw)) { return; } this.debug("Drawing background."); this.redraw = false; if (this.currentStem) { _ref = ["top", "right", "bottom", "left"]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { position = _ref[_i]; this.adapter.removeClass(this.container, "stem-" + position); } this.adapter.addClass(this.container, "stem-" + this.currentStem.horizontal); this.adapter.addClass(this.container, "stem-" + this.currentStem.vertical); } closeButtonInner = [0, 0]; closeButtonOuter = [0, 0]; if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { closeButton = new Opentip.Joint(((_ref1 = this.currentStem) != null ? _ref1.toString() : void 0) === "top right" ? "top left" : "top right"); closeButtonInner = [this.options.closeButtonRadius + this.options.closeButtonOffset[0], this.options.closeButtonRadius + this.options.closeButtonOffset[1]]; closeButtonOuter = [this.options.closeButtonRadius - this.options.closeButtonOffset[0], this.options.closeButtonRadius - this.options.closeButtonOffset[1]]; } canvasDimensions = this.adapter.clone(this.dimensions); canvasPosition = [0, 0]; if (this.options.borderWidth) { canvasDimensions.width += this.options.borderWidth * 2; canvasDimensions.height += this.options.borderWidth * 2; canvasPosition[0] -= this.options.borderWidth; canvasPosition[1] -= this.options.borderWidth; } if (this.options.shadow) { canvasDimensions.width += this.options.shadowBlur * 2; canvasDimensions.width += Math.max(0, this.options.shadowOffset[0] - this.options.shadowBlur * 2); canvasDimensions.height += this.options.shadowBlur * 2; canvasDimensions.height += Math.max(0, this.options.shadowOffset[1] - this.options.shadowBlur * 2); canvasPosition[0] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[0]); canvasPosition[1] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[1]); } bulge = { left: 0, right: 0, top: 0, bottom: 0 }; if (this.currentStem) { if (this.currentStem.left) { bulge.left = this.options.stemLength; } else if (this.currentStem.right) { bulge.right = this.options.stemLength; } if (this.currentStem.top) { bulge.top = this.options.stemLength; } else if (this.currentStem.bottom) { bulge.bottom = this.options.stemLength; } } if (closeButton) { if (closeButton.left) { bulge.left = Math.max(bulge.left, closeButtonOuter[0]); } else if (closeButton.right) { bulge.right = Math.max(bulge.right, closeButtonOuter[0]); } if (closeButton.top) { bulge.top = Math.max(bulge.top, closeButtonOuter[1]); } else if (closeButton.bottom) { bulge.bottom = Math.max(bulge.bottom, closeButtonOuter[1]); } } canvasDimensions.width += bulge.left + bulge.right; canvasDimensions.height += bulge.top + bulge.bottom; canvasPosition[0] -= bulge.left; canvasPosition[1] -= bulge.top; if (this.currentStem && this.options.borderWidth) { _ref2 = this._getPathStemMeasures(this.options.stemBase, this.options.stemLength, this.options.borderWidth), stemLength = _ref2.stemLength, stemBase = _ref2.stemBase; } backgroundCanvas = this.adapter.unwrap(this.backgroundCanvas); backgroundCanvas.width = canvasDimensions.width; backgroundCanvas.height = canvasDimensions.height; this.adapter.css(this.backgroundCanvas, { width: "" + backgroundCanvas.width + "px", height: "" + backgroundCanvas.height + "px", left: "" + canvasPosition[0] + "px", top: "" + canvasPosition[1] + "px" }); ctx = backgroundCanvas.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height); ctx.beginPath(); ctx.fillStyle = this._getColor(ctx, this.dimensions, this.options.background, this.options.backgroundGradientHorizontal); ctx.lineJoin = "miter"; ctx.miterLimit = 500; hb = this.options.borderWidth / 2; if (this.options.borderWidth) { ctx.strokeStyle = this.options.borderColor; ctx.lineWidth = this.options.borderWidth; } else { stemLength = this.options.stemLength; stemBase = this.options.stemBase; } if (stemBase == null) { stemBase = 0; } drawLine = function(length, stem, first) { if (first) { ctx.moveTo(Math.max(stemBase, _this.options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb); } if (stem) { ctx.lineTo(length / 2 - stemBase / 2, -hb); ctx.lineTo(length / 2, -stemLength - hb); return ctx.lineTo(length / 2 + stemBase / 2, -hb); } }; drawCorner = function(stem, closeButton, i) { var angle1, angle2, innerWidth, offset; if (stem) { ctx.lineTo(-stemBase + hb, 0 - hb); ctx.lineTo(stemLength + hb, -stemLength - hb); return ctx.lineTo(hb, stemBase - hb); } else if (closeButton) { offset = _this.options.closeButtonOffset; innerWidth = closeButtonInner[0]; if (i % 2 !== 0) { offset = [offset[1], offset[0]]; innerWidth = closeButtonInner[1]; } angle1 = Math.acos(offset[1] / _this.options.closeButtonRadius); angle2 = Math.acos(offset[0] / _this.options.closeButtonRadius); ctx.lineTo(-innerWidth + hb, -hb); return ctx.arc(hb - offset[0], -hb + offset[1], _this.options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, false); } else { ctx.lineTo(-_this.options.borderRadius + hb, -hb); return ctx.quadraticCurveTo(hb, -hb, hb, _this.options.borderRadius - hb); } }; ctx.translate(-canvasPosition[0], -canvasPosition[1]); ctx.save(); (function() { var cornerStem, i, lineLength, lineStem, positionIdx, positionX, positionY, rotation, _j, _ref3, _results; _results = []; for (i = _j = 0, _ref3 = Opentip.positions.length / 2; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) { positionIdx = i * 2; positionX = i === 0 || i === 3 ? 0 : _this.dimensions.width; positionY = i < 2 ? 0 : _this.dimensions.height; rotation = (Math.PI / 2) * i; lineLength = i % 2 === 0 ? _this.dimensions.width : _this.dimensions.height; lineStem = new Opentip.Joint(Opentip.positions[positionIdx]); cornerStem = new Opentip.Joint(Opentip.positions[positionIdx + 1]); ctx.save(); ctx.translate(positionX, positionY); ctx.rotate(rotation); drawLine(lineLength, lineStem.eql(_this.currentStem), i === 0); ctx.translate(lineLength, 0); drawCorner(cornerStem.eql(_this.currentStem), cornerStem.eql(closeButton), i); _results.push(ctx.restore()); } return _results; })(); ctx.closePath(); ctx.save(); if (this.options.shadow) { ctx.shadowColor = this.options.shadowColor; ctx.shadowBlur = this.options.shadowBlur; ctx.shadowOffsetX = this.options.shadowOffset[0]; ctx.shadowOffsetY = this.options.shadowOffset[1]; } ctx.fill(); ctx.restore(); if (this.options.borderWidth) { ctx.stroke(); } ctx.restore(); if (closeButton) { return (function() { var crossCenter, crossHeight, crossWidth, hcs, linkCenter; crossWidth = crossHeight = _this.options.closeButtonRadius * 2; if (closeButton.toString() === "top right") { linkCenter = [_this.dimensions.width - _this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] + hb, linkCenter[1] - hb]; } else { linkCenter = [_this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] - hb, linkCenter[1] - hb]; } ctx.translate(crossCenter[0], crossCenter[1]); hcs = _this.options.closeButtonCrossSize / 2; ctx.save(); ctx.beginPath(); ctx.strokeStyle = _this.options.closeButtonCrossColor; ctx.lineWidth = _this.options.closeButtonCrossLineWidth; ctx.lineCap = "round"; ctx.moveTo(-hcs, -hcs); ctx.lineTo(hcs, hcs); ctx.stroke(); ctx.beginPath(); ctx.moveTo(hcs, -hcs); ctx.lineTo(-hcs, hcs); ctx.stroke(); ctx.restore(); return _this.adapter.css(_this.closeButtonElement, { left: "" + (linkCenter[0] - hcs - _this.options.closeButtonLinkOverscan) + "px", top: "" + (linkCenter[1] - hcs - _this.options.closeButtonLinkOverscan) + "px", width: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px", height: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px" }); })(); } }; Opentip.prototype._getPathStemMeasures = function(outerStemBase, outerStemLength, borderWidth) { var angle, distanceBetweenTips, halfAngle, hb, rhombusSide, stemBase, stemLength; hb = borderWidth / 2; halfAngle = Math.atan((outerStemBase / 2) / outerStemLength); angle = halfAngle * 2; rhombusSide = hb / Math.sin(angle); distanceBetweenTips = 2 * rhombusSide * Math.cos(halfAngle); stemLength = hb + outerStemLength - distanceBetweenTips; if (stemLength < 0) { throw new Error("Sorry but your stemLength / stemBase ratio is strange."); } stemBase = (Math.tan(halfAngle) * stemLength) * 2; return { stemLength: stemLength, stemBase: stemBase }; }; Opentip.prototype._getColor = function(ctx, dimensions, color, horizontal) { var colorStop, gradient, i, _i, _len; if (horizontal == null) { horizontal = false; } if (typeof color === "string") { return color; } if (horizontal) { gradient = ctx.createLinearGradient(0, 0, dimensions.width, 0); } else { gradient = ctx.createLinearGradient(0, 0, 0, dimensions.height); } for (i = _i = 0, _len = color.length; _i < _len; i = ++_i) { colorStop = color[i]; gradient.addColorStop(colorStop[0], colorStop[1]); } return gradient; }; Opentip.prototype._searchAndActivateCloseButtons = function() { var element, _i, _len, _ref; _ref = this.adapter.findAll(this.container, "." + this["class"].close); for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; this.hideTriggers.push({ element: this.adapter.wrap(element), event: "click" }); } if (this.currentObservers.showing) { this._setupObservers("-showing", "showing"); } if (this.currentObservers.visible) { return this._setupObservers("-visible", "visible"); } }; Opentip.prototype._activateFirstInput = function() { var input; input = this.adapter.unwrap(this.adapter.find(this.container, "input, textarea")); return input != null ? typeof input.focus === "function" ? input.focus() : void 0 : void 0; }; Opentip.prototype._followMousePosition = function() { if (!this.options.fixed) { return Opentip._observeMousePosition(this.bound.reposition); } }; Opentip.prototype._stopFollowingMousePosition = function() { if (!this.options.fixed) { return Opentip._stopObservingMousePosition(this.bound.reposition); } }; Opentip.prototype._clearShowTimeout = function() { return clearTimeout(this._showTimeoutId); }; Opentip.prototype._clearHideTimeout = function() { return clearTimeout(this._hideTimeoutId); }; Opentip.prototype._clearTimeouts = function() { clearTimeout(this._visibilityStateTimeoutId); this._clearShowTimeout(); return this._clearHideTimeout(); }; Opentip.prototype._triggerElementExists = function() { var el; el = this.adapter.unwrap(this.triggerElement); while (el.parentNode) { if (el.parentNode.tagName === "BODY") { return true; } el = el.parentNode; } return false; }; Opentip.prototype._loadAjax = function() { var _this = this; if (this.loading) { return; } this.loaded = false; this.loading = true; this.adapter.addClass(this.container, this["class"].loading); this.setContent(""); this.debug("Loading content from " + this.options.ajax); return this.adapter.ajax({ url: this.options.ajax, method: this.options.ajaxMethod, onSuccess: function(responseText) { _this.debug("Loading successful."); _this.adapter.removeClass(_this.container, _this["class"].loading); return _this.setContent(responseText); }, onError: function(error) { var message; message = _this.options.ajaxErrorMessage; _this.debug(message, error); _this.setContent(message); return _this.adapter.addClass(_this.container, _this["class"].ajaxError); }, onComplete: function() { _this.adapter.removeClass(_this.container, _this["class"].loading); _this.loading = false; _this.loaded = true; _this._searchAndActivateCloseButtons(); _this._activateFirstInput(); return _this.reposition(); } }); }; Opentip.prototype._ensureTriggerElement = function() { if (!this._triggerElementExists()) { this.deactivate(); return this._stopEnsureTriggerElement(); } }; Opentip.prototype._ensureTriggerElementInterval = 1000; Opentip.prototype._startEnsureTriggerElement = function() { var _this = this; return this._ensureTriggerElementTimeoutId = setInterval((function() { return _this._ensureTriggerElement(); }), this._ensureTriggerElementInterval); }; Opentip.prototype._stopEnsureTriggerElement = function() { return clearInterval(this._ensureTriggerElementTimeoutId); }; return Opentip; })(); vendors = ["khtml", "ms", "o", "moz", "webkit"]; Opentip.prototype.setCss3Style = function(element, styles) { var prop, value, vendor, vendorProp, _results; element = this.adapter.unwrap(element); _results = []; for (prop in styles) { if (!__hasProp.call(styles, prop)) continue; value = styles[prop]; if (element.style[prop] != null) { _results.push(element.style[prop] = value); } else { _results.push((function() { var _i, _len, _results1; _results1 = []; for (_i = 0, _len = vendors.length; _i < _len; _i++) { vendor = vendors[_i]; vendorProp = "" + (this.ucfirst(vendor)) + (this.ucfirst(prop)); if (element.style[vendorProp] != null) { _results1.push(element.style[vendorProp] = value); } else { _results1.push(void 0); } } return _results1; }).call(this)); } } return _results; }; Opentip.prototype.defer = function(func) { return setTimeout(func, 0); }; Opentip.prototype.setTimeout = function(func, seconds) { return setTimeout(func, seconds ? seconds * 1000 : 0); }; Opentip.prototype.ucfirst = function(string) { if (string == null) { return ""; } return string.charAt(0).toUpperCase() + string.slice(1); }; Opentip.prototype.dasherize = function(string) { return string.replace(/([A-Z])/g, function(_, character) { return "-" + (character.toLowerCase()); }); }; mousePositionObservers = []; mousePosition = { x: 0, y: 0 }; mouseMoved = function(e) { var observer, _i, _len, _results; mousePosition = Opentip.adapter.mousePosition(e); _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; _results.push(observer()); } return _results; }; Opentip.followMousePosition = function() { return Opentip.adapter.observe(document.body, "mousemove", mouseMoved); }; Opentip._observeMousePosition = function(observer) { return mousePositionObservers.push(observer); }; Opentip._stopObservingMousePosition = function(removeObserver) { var observer; return mousePositionObservers = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; if (observer !== removeObserver) { _results.push(observer); } } return _results; })(); }; Opentip.Joint = (function() { function Joint(pointerString) { if (pointerString == null) { return; } if (pointerString instanceof Opentip.Joint) { pointerString = pointerString.toString(); } this.set(pointerString); this; } Joint.prototype.set = function(string) { string = string.toLowerCase(); this.setHorizontal(string); this.setVertical(string); return this; }; Joint.prototype.setHorizontal = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["left", "center", "right"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.horizontal = i.toLowerCase(); } } if (this.horizontal == null) { this.horizontal = "center"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.horizontal === i ? i : void 0); } return _results; }; Joint.prototype.setVertical = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["top", "middle", "bottom"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.vertical = i.toLowerCase(); } } if (this.vertical == null) { this.vertical = "middle"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.vertical === i ? i : void 0); } return _results; }; Joint.prototype.eql = function(pointer) { return (pointer != null) && this.horizontal === pointer.horizontal && this.vertical === pointer.vertical; }; Joint.prototype.flip = function() { var flippedIndex, positionIdx; positionIdx = Opentip.position[this.toString(true)]; flippedIndex = (positionIdx + 4) % 8; this.set(Opentip.positions[flippedIndex]); return this; }; Joint.prototype.toString = function(camelized) { var horizontal, vertical; if (camelized == null) { camelized = false; } vertical = this.vertical === "middle" ? "" : this.vertical; horizontal = this.horizontal === "center" ? "" : this.horizontal; if (vertical && horizontal) { if (camelized) { horizontal = Opentip.prototype.ucfirst(horizontal); } else { horizontal = " " + horizontal; } } return "" + vertical + horizontal; }; return Joint; })(); Opentip.prototype._positionsEqual = function(posA, posB) { return (posA != null) && (posB != null) && posA.left === posB.left && posA.top === posB.top; }; Opentip.prototype._dimensionsEqual = function(dimA, dimB) { return (dimA != null) && (dimB != null) && dimA.width === dimB.width && dimA.height === dimB.height; }; Opentip.prototype.debug = function() { var args; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (Opentip.debug && ((typeof console !== "undefined" && console !== null ? console.debug : void 0) != null)) { args.unshift("#" + this.id + " |"); return console.debug.apply(console, args); } }; Opentip.findElements = function() { var adapter, content, element, optionName, optionValue, options, _i, _len, _ref, _results; adapter = Opentip.adapter; _ref = adapter.findAll(document.body, "[data-ot]"); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; options = {}; content = adapter.data(element, "ot"); if (content === "" || content === "true" || content === "yes") { content = adapter.attr(element, "title"); adapter.attr(element, "title", ""); } content = content || ""; for (optionName in Opentip.styles.standard) { optionValue = adapter.data(element, "ot" + (Opentip.prototype.ucfirst(optionName))); if (optionValue != null) { if (optionValue === "yes" || optionValue === "true" || optionValue === "on") { optionValue = true; } else if (optionValue === "no" || optionValue === "false" || optionValue === "off") { optionValue = false; } options[optionName] = optionValue; } } _results.push(new Opentip(element, content, options)); } return _results; }; Opentip.version = "2.4.6"; Opentip.debug = false; Opentip.lastId = 0; Opentip.lastZIndex = 100; Opentip.tips = []; Opentip._abortShowingGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip._abortShowing()); } else { _results.push(void 0); } } return _results; }; Opentip._hideGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip.hide()); } else { _results.push(void 0); } } return _results; }; Opentip.adapters = {}; Opentip.adapter = null; firstAdapter = true; Opentip.addAdapter = function(adapter) { Opentip.adapters[adapter.name] = adapter; if (firstAdapter) { Opentip.adapter = adapter; adapter.domReady(Opentip.findElements); adapter.domReady(Opentip.followMousePosition); return firstAdapter = false; } }; Opentip.positions = ["top", "topRight", "right", "bottomRight", "bottom", "bottomLeft", "left", "topLeft"]; Opentip.position = {}; _ref = Opentip.positions; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { position = _ref[i]; Opentip.position[position] = i; } Opentip.styles = { standard: { "extends": null, title: void 0, escapeTitle: true, escapeContent: false, className: "standard", stem: true, delay: null, hideDelay: 0.1, fixed: false, showOn: "mouseover", hideTrigger: "trigger", hideTriggers: [], hideOn: null, removeElementsOnHide: false, offset: [0, 0], containInViewport: true, autoOffset: true, showEffect: "appear", hideEffect: "fade", showEffectDuration: 0.3, hideEffectDuration: 0.2, stemLength: 5, stemBase: 8, tipJoint: "top left", target: null, targetJoint: null, cache: true, ajax: false, ajaxMethod: "GET", ajaxErrorMessage: "There was a problem downloading the content.", group: null, style: null, background: "#fff18f", backgroundGradientHorizontal: false, closeButtonOffset: [5, 5], closeButtonRadius: 7, closeButtonCrossSize: 4, closeButtonCrossColor: "#d2c35b", closeButtonCrossLineWidth: 1.5, closeButtonLinkOverscan: 6, borderRadius: 5, borderWidth: 1, borderColor: "#f2e37b", shadow: true, shadowBlur: 10, shadowOffset: [3, 3], shadowColor: "rgba(0, 0, 0, 0.1)" }, glass: { "extends": "standard", className: "glass", background: [[0, "rgba(252, 252, 252, 0.8)"], [0.5, "rgba(255, 255, 255, 0.8)"], [0.5, "rgba(250, 250, 250, 0.9)"], [1, "rgba(245, 245, 245, 0.9)"]], borderColor: "#eee", closeButtonCrossColor: "rgba(0, 0, 0, 0.2)", borderRadius: 15, closeButtonRadius: 10, closeButtonOffset: [8, 8] }, dark: { "extends": "standard", className: "dark", borderRadius: 13, borderColor: "#444", closeButtonCrossColor: "rgba(240, 240, 240, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(30, 30, 30, 0.7)"], [0.5, "rgba(30, 30, 30, 0.8)"], [0.5, "rgba(10, 10, 10, 0.8)"], [1, "rgba(10, 10, 10, 0.9)"]] }, alert: { "extends": "standard", className: "alert", borderRadius: 1, borderColor: "#AE0D11", closeButtonCrossColor: "rgba(255, 255, 255, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(203, 15, 19, 0.7)"], [0.5, "rgba(203, 15, 19, 0.8)"], [0.5, "rgba(189, 14, 18, 0.8)"], [1, "rgba(179, 14, 17, 0.9)"]] } }; Opentip.defaultStyle = "standard"; if (typeof module !== "undefined" && module !== null) { module.exports = Opentip; } else { window.Opentip = Opentip; } // Generated by CoffeeScript 1.4.0 var Adapter, __hasProp = {}.hasOwnProperty, __slice = [].slice; Adapter = (function() { var dataValues, lastDataId; function Adapter() {} Adapter.prototype.name = "native"; Adapter.prototype.domReady = function(callback) { var add, doc, done, init, poll, pre, rem, root, top, win, _ref; done = false; top = true; win = window; doc = document; if ((_ref = doc.readyState) === "complete" || _ref === "loaded") { return callback(); } root = doc.documentElement; add = (doc.addEventListener ? "addEventListener" : "attachEvent"); rem = (doc.addEventListener ? "removeEventListener" : "detachEvent"); pre = (doc.addEventListener ? "" : "on"); init = function(e) { if (e.type === "readystatechange" && doc.readyState !== "complete") { return; } (e.type === "load" ? win : doc)[rem](pre + e.type, init, false); if (!done) { done = true; return callback(); } }; poll = function() { try { root.doScroll("left"); } catch (e) { setTimeout(poll, 50); return; } return init("poll"); }; if (doc.readyState !== "complete") { if (doc.createEventObject && root.doScroll) { try { top = !win.frameElement; } catch (_error) {} if (top) { poll(); } } doc[add](pre + "DOMContentLoaded", init, false); doc[add](pre + "readystatechange", init, false); return win[add](pre + "load", init, false); } }; Adapter.prototype.create = function(htmlString) { var div; div = document.createElement("div"); div.innerHTML = htmlString; return this.wrap(div.childNodes); }; Adapter.prototype.wrap = function(element) { var el; if (!element) { element = []; } else if (typeof element === "string") { element = this.find(document.body, element); element = element ? [element] : []; } else if (element instanceof NodeList) { element = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = element.length; _i < _len; _i++) { el = element[_i]; _results.push(el); } return _results; })(); } else if (!(element instanceof Array)) { element = [element]; } return element; }; Adapter.prototype.unwrap = function(element) { return this.wrap(element)[0]; }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function(element, attr, value) { if (arguments.length === 3) { return this.unwrap(element).setAttribute(attr, value); } else { return this.unwrap(element).getAttribute(attr); } }; lastDataId = 0; dataValues = {}; Adapter.prototype.data = function(element, name, value) { var dataId; dataId = this.attr(element, "data-id"); if (!dataId) { dataId = ++lastDataId; this.attr(element, "data-id", dataId); dataValues[dataId] = {}; } if (arguments.length === 3) { return dataValues[dataId][name] = value; } else { value = dataValues[dataId][name]; if (value != null) { return value; } value = this.attr(element, "data-" + (Opentip.prototype.dasherize(name))); if (value) { dataValues[dataId][name] = value; } return value; } }; Adapter.prototype.find = function(element, selector) { return this.unwrap(element).querySelector(selector); }; Adapter.prototype.findAll = function(element, selector) { return this.unwrap(element).querySelectorAll(selector); }; Adapter.prototype.update = function(element, content, escape) { element = this.unwrap(element); if (escape) { element.innerHTML = ""; return element.appendChild(document.createTextNode(content)); } else { return element.innerHTML = content; } }; Adapter.prototype.append = function(element, child) { var unwrappedChild, unwrappedElement; unwrappedChild = this.unwrap(child); unwrappedElement = this.unwrap(element); return unwrappedElement.appendChild(unwrappedChild); }; Adapter.prototype.remove = function(element) { var parentNode; element = this.unwrap(element); parentNode = element.parentNode; if (parentNode != null) { return parentNode.removeChild(element); } }; Adapter.prototype.addClass = function(element, className) { return this.unwrap(element).classList.add(className); }; Adapter.prototype.removeClass = function(element, className) { return this.unwrap(element).classList.remove(className); }; Adapter.prototype.css = function(element, properties) { var key, value, _results; element = this.unwrap(this.wrap(element)); _results = []; for (key in properties) { if (!__hasProp.call(properties, key)) continue; value = properties[key]; _results.push(element.style[key] = value); } return _results; }; Adapter.prototype.dimensions = function(element) { var dimensions, revert; element = this.unwrap(this.wrap(element)); dimensions = { width: element.offsetWidth, height: element.offsetHeight }; if (!(dimensions.width && dimensions.height)) { revert = { position: element.style.position || '', visibility: element.style.visibility || '', display: element.style.display || '' }; this.css(element, { position: "absolute", visibility: "hidden", display: "block" }); dimensions = { width: element.offsetWidth, height: element.offsetHeight }; this.css(element, revert); } return dimensions; }; Adapter.prototype.scrollOffset = function() { return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; }; Adapter.prototype.viewportDimensions = function() { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; }; Adapter.prototype.mousePosition = function(e) { var pos; pos = { x: 0, y: 0 }; if (e == null) { e = window.event; } if (e == null) { return; } try { if (e.pageX || e.pageY) { pos.x = e.pageX; pos.y = e.pageY; } else if (e.clientX || e.clientY) { pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; } } catch (e) { } return pos; }; Adapter.prototype.offset = function(element) { var offset; element = this.unwrap(element); offset = { top: element.offsetTop, left: element.offsetLeft }; while (element = element.offsetParent) { offset.top += element.offsetTop; offset.left += element.offsetLeft; if (element !== document.body) { offset.top -= element.scrollTop; offset.left -= element.scrollLeft; } } return offset; }; Adapter.prototype.observe = function(element, eventName, observer) { return this.unwrap(element).addEventListener(eventName, observer, false); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return this.unwrap(element).removeEventListener(eventName, observer, false); }; Adapter.prototype.ajax = function(options) { var request, _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } if (window.XMLHttpRequest) { request = new XMLHttpRequest; } else if (window.ActiveXObject) { try { request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } } } if (!request) { throw new Error("Can't create XMLHttpRequest"); } request.onreadystatechange = function() { if (request.readyState === 4) { try { if (request.status === 200) { if (typeof options.onSuccess === "function") { options.onSuccess(request.responseText); } } else { if (typeof options.onError === "function") { options.onError("Server responded with status " + request.status); } } } catch (e) { if (typeof options.onError === "function") { options.onError(e.message); } } return typeof options.onComplete === "function" ? options.onComplete() : void 0; } }; request.open((_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET", options.url); return request.send(); }; Adapter.prototype.clone = function(object) { var key, newObject, val; newObject = {}; for (key in object) { if (!__hasProp.call(object, key)) continue; val = object[key]; newObject[key] = val; } return newObject; }; Adapter.prototype.extend = function() { var key, source, sources, target, val, _i, _len; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; for (_i = 0, _len = sources.length; _i < _len; _i++) { source = sources[_i]; for (key in source) { if (!__hasProp.call(source, key)) continue; val = source[key]; target[key] = val; } } return target; }; return Adapter; })(); Opentip.addAdapter(new Adapter); // Modified by Matias Meno to work in IE8. // I removed the line 312, as proposed by someone on the google forum. // Copyright 2006 Google 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. // Known Issues: // // * Patterns are not implemented. // * Radial gradient are not implemented. The VML version of these look very // different from the canvas one. // * Clipping paths are not implemented. // * Coordsize. The width and height attribute have higher priority than the // width and height style values which isn't correct. // * Painting mode isn't implemented. // * Canvas width/height should is using content-box by default. IE in // Quirks mode will draw the canvas using border-box. Either change your // doctype to HTML5 // (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) // or use Box Sizing Behavior from WebFX // (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) // * Non uniform scaling does not correctly scale strokes. // * Optimize. There is always room for speed improvements. // Only add this code if we do not already have a canvas implementation if (!document.createElement('canvas').getContext) { (function() { // alias some functions to make (compiled) code shorter var m = Math; var mr = m.round; var ms = m.sin; var mc = m.cos; var abs = m.abs; var sqrt = m.sqrt; // this is used for sub pixel precision var Z = 10; var Z2 = Z / 2; /** * This funtion is assigned to the elements as element.getContext(). * @this {HTMLElement} * @return {CanvasRenderingContext2D_} */ function getContext() { return this.context_ || (this.context_ = new CanvasRenderingContext2D_(this)); } var slice = Array.prototype.slice; /** * Binds a function to an object. The returned function will always use the * passed in {@code obj} as {@code this}. * * Example: * * g = bind(f, obj, a, b) * g(c, d) // will do f.call(obj, a, b, c, d) * * @param {Function} f The function to bind the object to * @param {Object} obj The object that should act as this when the function * is called * @param {*} var_args Rest arguments that will be used as the initial * arguments when the function is called * @return {Function} A new function that has bound this */ function bind(f, obj, var_args) { var a = slice.call(arguments, 2); return function() { return f.apply(obj, a.concat(slice.call(arguments))); }; } var G_vmlCanvasManager_ = { init: function(opt_doc) { if (/MSIE/.test(navigator.userAgent) && !window.opera) { var doc = opt_doc || document; // Create a dummy element so that IE will allow canvas elements to be // recognized. doc.createElement('canvas'); doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); } }, init_: function(doc) { // create xmlns if (!doc.namespaces['g_vml_']) { doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', '#default#VML'); } if (!doc.namespaces['g_o_']) { doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', '#default#VML'); } // Setup default CSS. Only add one style sheet per document if (!doc.styleSheets['ex_canvas_']) { var ss = doc.createStyleSheet(); ss.owningElement.id = 'ex_canvas_'; ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + // default size is 300x150 in Gecko and Opera 'text-align:left;width:300px;height:150px}' + 'g_vml_\\:*{behavior:url(#default#VML)}' + 'g_o_\\:*{behavior:url(#default#VML)}'; } // find all canvas elements var els = doc.getElementsByTagName('canvas'); for (var i = 0; i < els.length; i++) { this.initElement(els[i]); } }, /** * Public initializes a canvas element so that it can be used as canvas * element from now on. This is called automatically before the page is * loaded but if you are creating elements using createElement you need to * make sure this is called on the element. * @param {HTMLElement} el The canvas element to initialize. * @return {HTMLElement} the element that was created. */ initElement: function(el) { if (!el.getContext) { el.getContext = getContext; // Remove fallback content. There is no way to hide text nodes so we // just remove all childNodes. We could hide all elements and remove // text nodes but who really cares about the fallback content. el.innerHTML = ''; // do not use inline function because that will leak memory el.attachEvent('onpropertychange', onPropertyChange); el.attachEvent('onresize', onResize); var attrs = el.attributes; if (attrs.width && attrs.width.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setWidth_(attrs.width.nodeValue); el.style.width = attrs.width.nodeValue + 'px'; } else { el.width = el.clientWidth; } if (attrs.height && attrs.height.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setHeight_(attrs.height.nodeValue); el.style.height = attrs.height.nodeValue + 'px'; } else { el.height = el.clientHeight; } //el.getContext().setCoordsize_() } return el; } }; function onPropertyChange(e) { var el = e.srcElement; switch (e.propertyName) { case 'width': el.style.width = el.attributes.width.nodeValue + 'px'; el.getContext().clearRect(); break; case 'height': el.style.height = el.attributes.height.nodeValue + 'px'; el.getContext().clearRect(); break; } } function onResize(e) { var el = e.srcElement; if (el.firstChild) { el.firstChild.style.width = el.clientWidth + 'px'; el.firstChild.style.height = el.clientHeight + 'px'; } } G_vmlCanvasManager_.init(); // precompute "00" to "FF" var dec2hex = []; for (var i = 0; i < 16; i++) { for (var j = 0; j < 16; j++) { dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); } } function createMatrixIdentity() { return [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]; } function matrixMultiply(m1, m2) { var result = createMatrixIdentity(); for (var x = 0; x < 3; x++) { for (var y = 0; y < 3; y++) { var sum = 0; for (var z = 0; z < 3; z++) { sum += m1[x][z] * m2[z][y]; } result[x][y] = sum; } } return result; } function copyState(o1, o2) { o2.fillStyle = o1.fillStyle; o2.lineCap = o1.lineCap; o2.lineJoin = o1.lineJoin; o2.lineWidth = o1.lineWidth; o2.miterLimit = o1.miterLimit; o2.shadowBlur = o1.shadowBlur; o2.shadowColor = o1.shadowColor; o2.shadowOffsetX = o1.shadowOffsetX; o2.shadowOffsetY = o1.shadowOffsetY; o2.strokeStyle = o1.strokeStyle; o2.globalAlpha = o1.globalAlpha; o2.arcScaleX_ = o1.arcScaleX_; o2.arcScaleY_ = o1.arcScaleY_; o2.lineScale_ = o1.lineScale_; } function processStyle(styleString) { var str, alpha = 1; styleString = String(styleString); if (styleString.substring(0, 3) == 'rgb') { var start = styleString.indexOf('(', 3); var end = styleString.indexOf(')', start + 1); var guts = styleString.substring(start + 1, end).split(','); str = '#'; for (var i = 0; i < 3; i++) { str += dec2hex[Number(guts[i])]; } if (guts.length == 4 && styleString.substr(3, 1) == 'a') { alpha = guts[3]; } } else { str = styleString; } return {color: str, alpha: alpha}; } function processLineCap(lineCap) { switch (lineCap) { case 'butt': return 'flat'; case 'round': return 'round'; case 'square': default: return 'square'; } } /** * This class implements CanvasRenderingContext2D interface as described by * the WHATWG. * @param {HTMLElement} surfaceElement The element that the 2D context should * be associated with */ function CanvasRenderingContext2D_(surfaceElement) { this.m_ = createMatrixIdentity(); this.mStack_ = []; this.aStack_ = []; this.currentPath_ = []; // Canvas context properties this.strokeStyle = '#000'; this.fillStyle = '#000'; this.lineWidth = 1; this.lineJoin = 'miter'; this.lineCap = 'butt'; this.miterLimit = Z * 1; this.globalAlpha = 1; this.canvas = surfaceElement; var el = surfaceElement.ownerDocument.createElement('div'); el.style.width = surfaceElement.clientWidth + 'px'; el.style.height = surfaceElement.clientHeight + 'px'; // el.style.overflow = 'hidden'; el.style.position = 'absolute'; surfaceElement.appendChild(el); this.element_ = el; this.arcScaleX_ = 1; this.arcScaleY_ = 1; this.lineScale_ = 1; } var contextPrototype = CanvasRenderingContext2D_.prototype; contextPrototype.clearRect = function() { this.element_.innerHTML = ''; }; contextPrototype.beginPath = function() { // TODO: Branch current matrix so that save/restore has no effect // as per safari docs. this.currentPath_ = []; }; contextPrototype.moveTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.lineTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { var p = this.getCoords_(aX, aY); var cp1 = this.getCoords_(aCP1x, aCP1y); var cp2 = this.getCoords_(aCP2x, aCP2y); bezierCurveTo(this, cp1, cp2, p); }; // Helper function that takes the already fixed cordinates. function bezierCurveTo(self, cp1, cp2, p) { self.currentPath_.push({ type: 'bezierCurveTo', cp1x: cp1.x, cp1y: cp1.y, cp2x: cp2.x, cp2y: cp2.y, x: p.x, y: p.y }); self.currentX_ = p.x; self.currentY_ = p.y; } contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { // the following is lifted almost directly from // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes var cp = this.getCoords_(aCPx, aCPy); var p = this.getCoords_(aX, aY); var cp1 = { x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) }; var cp2 = { x: cp1.x + (p.x - this.currentX_) / 3.0, y: cp1.y + (p.y - this.currentY_) / 3.0 }; bezierCurveTo(this, cp1, cp2, p); }; contextPrototype.arc = function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { aRadius *= Z; var arcType = aClockwise ? 'at' : 'wa'; var xStart = aX + mc(aStartAngle) * aRadius - Z2; var yStart = aY + ms(aStartAngle) * aRadius - Z2; var xEnd = aX + mc(aEndAngle) * aRadius - Z2; var yEnd = aY + ms(aEndAngle) * aRadius - Z2; // IE won't render arches drawn counter clockwise if xStart == xEnd. if (xStart == xEnd && !aClockwise) { xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something // that can be represented in binary } var p = this.getCoords_(aX, aY); var pStart = this.getCoords_(xStart, yStart); var pEnd = this.getCoords_(xEnd, yEnd); this.currentPath_.push({type: arcType, x: p.x, y: p.y, radius: aRadius, xStart: pStart.x, yStart: pStart.y, xEnd: pEnd.x, yEnd: pEnd.y}); }; contextPrototype.rect = function(aX, aY, aWidth, aHeight) { this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); }; contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.stroke(); this.currentPath_ = oldPath; }; contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.fill(); this.currentPath_ = oldPath; }; contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { var gradient = new CanvasGradient_('gradient'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.x1_ = aX1; gradient.y1_ = aY1; return gradient; }; contextPrototype.createRadialGradient = function(aX0, aY0, aR0, aX1, aY1, aR1) { var gradient = new CanvasGradient_('gradientradial'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.r0_ = aR0; gradient.x1_ = aX1; gradient.y1_ = aY1; gradient.r1_ = aR1; return gradient; }; contextPrototype.drawImage = function(image, var_args) { var dx, dy, dw, dh, sx, sy, sw, sh; // to find the original width we overide the width and height var oldRuntimeWidth = image.runtimeStyle.width; var oldRuntimeHeight = image.runtimeStyle.height; image.runtimeStyle.width = 'auto'; image.runtimeStyle.height = 'auto'; // get the original size var w = image.width; var h = image.height; // and remove overides image.runtimeStyle.width = oldRuntimeWidth; image.runtimeStyle.height = oldRuntimeHeight; if (arguments.length == 3) { dx = arguments[1]; dy = arguments[2]; sx = sy = 0; sw = dw = w; sh = dh = h; } else if (arguments.length == 5) { dx = arguments[1]; dy = arguments[2]; dw = arguments[3]; dh = arguments[4]; sx = sy = 0; sw = w; sh = h; } else if (arguments.length == 9) { sx = arguments[1]; sy = arguments[2]; sw = arguments[3]; sh = arguments[4]; dx = arguments[5]; dy = arguments[6]; dw = arguments[7]; dh = arguments[8]; } else { throw Error('Invalid number of arguments'); } var d = this.getCoords_(dx, dy); var w2 = sw / 2; var h2 = sh / 2; var vmlStr = []; var W = 10; var H = 10; // For some reason that I've now forgotten, using divs didn't work vmlStr.push(' ' , '', ''); this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); }; contextPrototype.stroke = function(aFill) { var lineStr = []; var lineOpen = false; var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); var color = a.color; var opacity = a.alpha * this.globalAlpha; var W = 10; var H = 10; lineStr.push(''); if (!aFill) { var lineWidth = this.lineScale_ * this.lineWidth; // VML cannot correctly render a line if the width is less than 1px. // In that case, we dilute the color to make the line look thinner. if (lineWidth < 1) { opacity *= lineWidth; } lineStr.push( '' ); } else if (typeof this.fillStyle == 'object') { var fillStyle = this.fillStyle; var angle = 0; var focus = {x: 0, y: 0}; // additional offset var shift = 0; // scale factor for offset var expansion = 1; if (fillStyle.type_ == 'gradient') { var x0 = fillStyle.x0_ / this.arcScaleX_; var y0 = fillStyle.y0_ / this.arcScaleY_; var x1 = fillStyle.x1_ / this.arcScaleX_; var y1 = fillStyle.y1_ / this.arcScaleY_; var p0 = this.getCoords_(x0, y0); var p1 = this.getCoords_(x1, y1); var dx = p1.x - p0.x; var dy = p1.y - p0.y; angle = Math.atan2(dx, dy) * 180 / Math.PI; // The angle should be a non-negative number. if (angle < 0) { angle += 360; } // Very small angles produce an unexpected result because they are // converted to a scientific notation string. if (angle < 1e-6) { angle = 0; } } else { var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); var width = max.x - min.x; var height = max.y - min.y; focus = { x: (p0.x - min.x) / width, y: (p0.y - min.y) / height }; width /= this.arcScaleX_ * Z; height /= this.arcScaleY_ * Z; var dimension = m.max(width, height); shift = 2 * fillStyle.r0_ / dimension; expansion = 2 * fillStyle.r1_ / dimension - shift; } // We need to sort the color stops in ascending order by offset, // otherwise IE won't interpret it correctly. var stops = fillStyle.colors_; stops.sort(function(cs1, cs2) { return cs1.offset - cs2.offset; }); var length = stops.length; var color1 = stops[0].color; var color2 = stops[length - 1].color; var opacity1 = stops[0].alpha * this.globalAlpha; var opacity2 = stops[length - 1].alpha * this.globalAlpha; var colors = []; for (var i = 0; i < length; i++) { var stop = stops[i]; colors.push(stop.offset * expansion + shift + ' ' + stop.color); } // When colors attribute is used, the meanings of opacity and o:opacity2 // are reversed. lineStr.push(''); } else { lineStr.push(''); } lineStr.push(''); this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); }; contextPrototype.fill = function() { this.stroke(true); } contextPrototype.closePath = function() { this.currentPath_.push({type: 'close'}); }; /** * @private */ contextPrototype.getCoords_ = function(aX, aY) { var m = this.m_; return { x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 } }; contextPrototype.save = function() { var o = {}; copyState(this, o); this.aStack_.push(o); this.mStack_.push(this.m_); this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); }; contextPrototype.restore = function() { copyState(this.aStack_.pop(), this); this.m_ = this.mStack_.pop(); }; function matrixIsFinite(m) { for (var j = 0; j < 3; j++) { for (var k = 0; k < 2; k++) { if (!isFinite(m[j][k]) || isNaN(m[j][k])) { return false; } } } return true; } function setM(ctx, m, updateLineScale) { if (!matrixIsFinite(m)) { return; } ctx.m_ = m; if (updateLineScale) { // Get the line scale. // Determinant of this.m_ means how much the area is enlarged by the // transformation. So its square root can be used as a scale factor // for width. var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; ctx.lineScale_ = sqrt(abs(det)); } } contextPrototype.translate = function(aX, aY) { var m1 = [ [1, 0, 0], [0, 1, 0], [aX, aY, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.rotate = function(aRot) { var c = mc(aRot); var s = ms(aRot); var m1 = [ [c, s, 0], [-s, c, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.scale = function(aX, aY) { this.arcScaleX_ *= aX; this.arcScaleY_ *= aY; var m1 = [ [aX, 0, 0], [0, aY, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { var m1 = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { var m = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, m, true); }; /******** STUBS ********/ contextPrototype.clip = function() { // TODO: Implement }; contextPrototype.arcTo = function() { // TODO: Implement }; contextPrototype.createPattern = function() { return new CanvasPattern_; }; // Gradient / Pattern Stubs function CanvasGradient_(aType) { this.type_ = aType; this.x0_ = 0; this.y0_ = 0; this.r0_ = 0; this.x1_ = 0; this.y1_ = 0; this.r1_ = 0; this.colors_ = []; } CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { aColor = processStyle(aColor); this.colors_.push({offset: aOffset, color: aColor.color, alpha: aColor.alpha}); }; function CanvasPattern_() {} // set up externs G_vmlCanvasManager = G_vmlCanvasManager_; CanvasRenderingContext2D = CanvasRenderingContext2D_; CanvasGradient = CanvasGradient_; CanvasPattern = CanvasPattern_; })(); } // if /* * classList.js: Cross-browser full element.classList implementation. * 2012-11-15 * * By Eli Grey, http://eligrey.com * Public Domain. * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. */ /*global self, document, DOMException */ /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) { (function (view) { "use strict"; if (!('HTMLElement' in view) && !('Element' in view)) return; var classListProp = "classList" , protoProp = "prototype" , elemCtrProto = (view.HTMLElement || view.Element)[protoProp] , objCtr = Object , strTrim = String[protoProp].trim || function () { return this.replace(/^\s+|\s+$/g, ""); } , arrIndexOf = Array[protoProp].indexOf || function (item) { var i = 0 , len = this.length ; for (; i < len; i++) { if (i in this && this[i] === item) { return i; } } return -1; } // Vendors: please allow content code to instantiate DOMExceptions , DOMEx = function (type, message) { this.name = type; this.code = DOMException[type]; this.message = message; } , checkTokenAndGetIndex = function (classList, token) { if (token === "") { throw new DOMEx( "SYNTAX_ERR" , "An invalid or illegal string was specified" ); } if (/\s/.test(token)) { throw new DOMEx( "INVALID_CHARACTER_ERR" , "String contains an invalid character" ); } return arrIndexOf.call(classList, token); } , ClassList = function (elem) { var trimmedClasses = strTrim.call(elem.className) , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [] , i = 0 , len = classes.length ; for (; i < len; i++) { this.push(classes[i]); } this._updateClassName = function () { elem.className = this.toString(); }; } , classListProto = ClassList[protoProp] = [] , classListGetter = function () { return new ClassList(this); } ; // Most DOMException implementations don't allow calling DOMException's toString() // on non-DOMExceptions. Error's toString() is sufficient here. DOMEx[protoProp] = Error[protoProp]; classListProto.item = function (i) { return this[i] || null; }; classListProto.contains = function (token) { token += ""; return checkTokenAndGetIndex(this, token) !== -1; }; classListProto.add = function () { var tokens = arguments , i = 0 , l = tokens.length , token , updated = false ; do { token = tokens[i] + ""; if (checkTokenAndGetIndex(this, token) === -1) { this.push(token); updated = true; } } while (++i < l); if (updated) { this._updateClassName(); } }; classListProto.remove = function () { var tokens = arguments , i = 0 , l = tokens.length , token , updated = false ; do { token = tokens[i] + ""; var index = checkTokenAndGetIndex(this, token); if (index !== -1) { this.splice(index, 1); updated = true; } } while (++i < l); if (updated) { this._updateClassName(); } }; classListProto.toggle = function (token, forse) { token += ""; var result = this.contains(token) , method = result ? forse !== true && "remove" : forse !== false && "add" ; if (method) { this[method](token); } return result; }; classListProto.toString = function () { return this.join(" "); }; if (objCtr.defineProperty) { var classListPropDesc = { get: classListGetter , enumerable: true , configurable: true }; try { objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); } catch (ex) { // IE 8 doesn't support enumerable:true if (ex.number === -0x7FF5EC54) { classListPropDesc.enumerable = false; objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); } } } else if (objCtr[protoProp].__defineGetter__) { elemCtrProto.__defineGetter__(classListProp, classListGetter); } }(self)); } !window.addEventListener && (function (WindowPrototype, DocumentPrototype, ElementPrototype, addEventListener, removeEventListener, dispatchEvent, registry) { WindowPrototype[addEventListener] = DocumentPrototype[addEventListener] = ElementPrototype[addEventListener] = function (type, listener) { var target = this; registry.unshift([target, type, listener, function (event) { event.currentTarget = target; event.preventDefault = function () { event.returnValue = false }; event.stopPropagation = function () { event.cancelBubble = true }; event.target = event.srcElement || target; listener.call(target, event); }]); this.attachEvent("on" + type, registry[0][3]); }; WindowPrototype[removeEventListener] = DocumentPrototype[removeEventListener] = ElementPrototype[removeEventListener] = function (type, listener) { for (var index = 0, register; register = registry[index]; ++index) { if (register[0] == this && register[1] == type && register[2] == listener) { return this.detachEvent("on" + type, registry.splice(index, 1)[0][3]); } } }; WindowPrototype[dispatchEvent] = DocumentPrototype[dispatchEvent] = ElementPrototype[dispatchEvent] = function (eventObject) { return this.fireEvent("on" + eventObject.type, eventObject); }; })(Window.prototype, HTMLDocument.prototype, Element.prototype, "addEventListener", "removeEventListener", "dispatchEvent", []);opentip-2.4.6/downloads/opentip-native-excanvas.min.js000066400000000000000000001411351213277401600230730ustar00rootroot00000000000000// Opentip v2.4.6 // Copyright (c) 2009-2012 // www.opentip.org // MIT Licensed var Opentip,firstAdapter,i,mouseMoved,mousePosition,mousePositionObservers,position,vendors,_i,_len,_ref,__slice=[].slice,__indexOf=[].indexOf||function(t){for(var e=0,i=this.length;i>e;e++)if(e in this&&this[e]===t)return e;return-1},__hasProp={}.hasOwnProperty;for(Opentip=function(){function t(e,i,o,s){var n,r,a,h,p,l,d,u,c,f,g,m,v,w,_=this;if(this.id=++t.lastId,this.debug("Creating Opentip."),t.tips.push(this),this.adapter=t.adapter,n=this.adapter.data(e,"opentips")||[],n.push(this),this.adapter.data(e,"opentips",n),this.triggerElement=this.adapter.wrap(e),this.triggerElement.length>1)throw Error("You can't call Opentip on multiple elements.");if(1>this.triggerElement.length)throw Error("Invalid element.");this.loaded=!1,this.loading=!1,this.visible=!1,this.waitingToShow=!1,this.waitingToHide=!1,this.currentPosition={left:0,top:0},this.dimensions={width:100,height:50},this.content="",this.redraw=!0,this.currentObservers={showing:!1,visible:!1,hiding:!1,hidden:!1},s=this.adapter.clone(s),typeof i=="object"?(s=i,i=o=void 0):typeof o=="object"&&(s=o,o=void 0),o!=null&&(s.title=o),i!=null&&this.setContent(i),s["extends"]==null&&(s["extends"]=s.style!=null?s.style:t.defaultStyle),h=[s],w=s;while(w["extends"]){if(l=w["extends"],w=t.styles[l],w==null)throw Error("Invalid style: "+l);h.unshift(w),w["extends"]==null&&l!=="standard"&&(w["extends"]="standard")}for(s=(g=this.adapter).extend.apply(g,[{}].concat(__slice.call(h))),s.hideTriggers=function(){var t,e,i,o;for(i=s.hideTriggers,o=[],t=0,e=i.length;e>t;t++)r=i[t],o.push(r);return o}(),s.hideTrigger&&s.hideTriggers.length===0&&s.hideTriggers.push(s.hideTrigger),m=["tipJoint","targetJoint","stem"],d=0,c=m.length;c>d;d++)p=m[d],s[p]&&typeof s[p]=="string"&&(s[p]=new t.Joint(s[p]));for(!s.ajax||s.ajax!==!0&&s.ajax||(s.ajax=this.adapter.tagName(this.triggerElement)==="A"?this.adapter.attr(this.triggerElement,"href"):!1),s.showOn==="click"&&this.adapter.tagName(this.triggerElement)==="A"&&this.adapter.observe(this.triggerElement,"click",function(t){return t.preventDefault(),t.stopPropagation(),t.stopped=!0}),s.target&&(s.fixed=!0),s.stem===!0&&(s.stem=new t.Joint(s.tipJoint)),s.target===!0?s.target=this.triggerElement:s.target&&(s.target=this.adapter.wrap(s.target)),this.currentStem=s.stem,s.delay==null&&(s.delay=s.showOn==="mouseover"?.2:0),s.targetJoint==null&&(s.targetJoint=new t.Joint(s.tipJoint).flip()),this.showTriggers=[],this.showTriggersWhenVisible=[],this.hideTriggers=[],s.showOn&&s.showOn!=="creation"&&this.showTriggers.push({element:this.triggerElement,event:s.showOn}),s.ajaxCache!=null&&(s.cache=s.ajaxCache,delete s.ajaxCache),this.options=s,this.bound={},v=["prepareToShow","prepareToHide","show","hide","reposition"],u=0,f=v.length;f>u;u++)a=v[u],this.bound[a]=function(t){return function(){return _[t].apply(_,arguments)}}(a);this.adapter.domReady(function(){return _.activate(),_.options.showOn==="creation"?_.prepareToShow():void 0})}return t.prototype.STICKS_OUT_TOP=1,t.prototype.STICKS_OUT_BOTTOM=2,t.prototype.STICKS_OUT_LEFT=1,t.prototype.STICKS_OUT_RIGHT=2,t.prototype["class"]={container:"opentip-container",opentip:"opentip",header:"ot-header",content:"ot-content",loadingIndicator:"ot-loading-indicator",close:"ot-close",goingToHide:"ot-going-to-hide",hidden:"ot-hidden",hiding:"ot-hiding",goingToShow:"ot-going-to-show",showing:"ot-showing",visible:"ot-visible",loading:"ot-loading",ajaxError:"ot-ajax-error",fixed:"ot-fixed",showEffectPrefix:"ot-show-effect-",hideEffectPrefix:"ot-hide-effect-",stylePrefix:"style-"},t.prototype._setup=function(){var t,e,i,o,s,n,r,a,h,p,l;for(this.debug("Setting up the tooltip."),this._buildContainer(),this.hideTriggers=[],h=this.options.hideTriggers,o=s=0,r=h.length;r>s;o=++s){if(e=h[o],i=null,t=this.options.hideOn instanceof Array?this.options.hideOn[o]:this.options.hideOn,typeof e=="string")switch(e){case"trigger":t=t||"mouseout",i=this.triggerElement;break;case"tip":t=t||"mouseover",i=this.container;break;case"target":t=t||"mouseover",i=this.options.target;break;case"closeButton":break;default:throw Error("Unknown hide trigger: "+e+".")}else t=t||"mouseover",i=this.adapter.wrap(e);i&&this.hideTriggers.push({element:i,event:t,original:e})}for(p=this.hideTriggers,l=[],n=0,a=p.length;a>n;n++)e=p[n],l.push(this.showTriggersWhenVisible.push({element:e.element,event:"mouseover"}));return l},t.prototype._buildContainer=function(){return this.container=this.adapter.create('
'),this.adapter.css(this.container,{position:"absolute"}),this.options.ajax&&this.adapter.addClass(this.container,this["class"].loading),this.options.fixed&&this.adapter.addClass(this.container,this["class"].fixed),this.options.showEffect&&this.adapter.addClass(this.container,""+this["class"].showEffectPrefix+this.options.showEffect),this.options.hideEffect?this.adapter.addClass(this.container,""+this["class"].hideEffectPrefix+this.options.hideEffect):void 0},t.prototype._buildElements=function(){var t,e;return this.tooltipElement=this.adapter.create('
'),this.backgroundCanvas=this.adapter.wrap(document.createElement("canvas")),this.adapter.css(this.backgroundCanvas,{position:"absolute"}),typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager!==null&&G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)),t=this.adapter.find(this.tooltipElement,"."+this["class"].header),this.options.title&&(e=this.adapter.create("

"),this.adapter.update(e,this.options.title,this.options.escapeTitle),this.adapter.append(t,e)),this.options.ajax&&!this.loaded&&this.adapter.append(this.tooltipElement,this.adapter.create('
↻
')),__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(this.closeButtonElement=this.adapter.create('Close'),this.adapter.append(t,this.closeButtonElement)),this.adapter.append(this.container,this.backgroundCanvas),this.adapter.append(this.container,this.tooltipElement),this.adapter.append(document.body,this.container),this._newContent=!0,this.redraw=!0},t.prototype.setContent=function(t){return this.content=t,this._newContent=!0,typeof this.content=="function"?(this._contentFunction=this.content,this.content=""):this._contentFunction=null,this.visible?this._updateElementContent():void 0},t.prototype._updateElementContent=function(){var t;return(this._newContent||!this.options.cache&&this._contentFunction)&&(t=this.adapter.find(this.container,"."+this["class"].content),t!=null&&(this._contentFunction&&(this.debug("Executing content function."),this.content=this._contentFunction(this)),this.adapter.update(t,this.content,this.options.escapeContent)),this._newContent=!1),this._storeAndLockDimensions(),this.reposition()},t.prototype._storeAndLockDimensions=function(){var t;if(this.container)return t=this.dimensions,this.adapter.css(this.container,{width:"auto",left:"0px",top:"0px"}),this.dimensions=this.adapter.dimensions(this.container),this.dimensions.width+=1,this.adapter.css(this.container,{width:""+this.dimensions.width+"px",top:""+this.currentPosition.top+"px",left:""+this.currentPosition.left+"px"}),this._dimensionsEqual(this.dimensions,t)?void 0:(this.redraw=!0,this._draw())},t.prototype.activate=function(){return this._setupObservers("hidden","hiding")},t.prototype.deactivate=function(){return this.debug("Deactivating tooltip."),this.hide(),this._setupObservers("-showing","-visible","-hidden","-hiding")},t.prototype._setupObservers=function(){var t,e,i,o,s,n,r,a,h,p,l,d,u,c,f,g,m=this;for(o=arguments.length>=1?__slice.call(arguments,0):[],n=0,p=o.length;p>n;n++)if(i=o[n],e=!1,i.charAt(0)==="-"&&(e=!0,i=i.substr(1)),this.currentObservers[i]!==!e)switch(this.currentObservers[i]=!e,t=function(){var t,i,o;return t=arguments.length>=1?__slice.call(arguments,0):[],e?(i=m.adapter).stopObserving.apply(i,t):(o=m.adapter).observe.apply(o,t)},i){case"showing":for(c=this.hideTriggers,r=0,l=c.length;l>r;r++)s=c[r],t(s.element,s.event,this.bound.prepareToHide);t(document.onresize!=null?document:window,"resize",this.bound.reposition),t(window,"scroll",this.bound.reposition);break;case"visible":for(f=this.showTriggersWhenVisible,a=0,d=f.length;d>a;a++)s=f[a],t(s.element,s.event,this.bound.prepareToShow);break;case"hiding":for(g=this.showTriggers,h=0,u=g.length;u>h;h++)s=g[h],t(s.element,s.event,this.bound.prepareToShow);break;case"hidden":break;default:throw Error("Unknown state: "+i)}return null},t.prototype.prepareToShow=function(){return this._abortHiding(),this._abortShowing(),this.visible?void 0:(this.debug("Showing in "+this.options.delay+"s."),this.container==null&&this._setup(),this.options.group&&t._abortShowingGroup(this.options.group,this),this.preparingToShow=!0,this._setupObservers("-hidden","-hiding","showing"),this._followMousePosition(),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this._showTimeoutId=this.setTimeout(this.bound.show,this.options.delay||0))},t.prototype.show=function(){var e=this;return this._abortHiding(),this.visible?void 0:(this._clearTimeouts(),this._triggerElementExists()?(this.debug("Showing now."),this.container==null&&this._setup(),this.options.group&&t._hideGroup(this.options.group,this),this.visible=!0,this.preparingToShow=!1,this.tooltipElement==null&&this._buildElements(),this._updateElementContent(),!this.options.ajax||this.loaded&&this.options.cache||this._loadAjax(),this._searchAndActivateCloseButtons(),this._startEnsureTriggerElement(),this.adapter.css(this.container,{zIndex:t.lastZIndex++}),this._setupObservers("-hidden","-hiding","-showing","-visible","showing","visible"),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this.adapter.removeClass(this.container,this["class"].hiding),this.adapter.removeClass(this.container,this["class"].hidden),this.adapter.addClass(this.container,this["class"].goingToShow),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var t;if(e.visible&&!e.preparingToHide)return e.adapter.removeClass(e.container,e["class"].goingToShow),e.adapter.addClass(e.container,e["class"].showing),t=0,e.options.showEffect&&e.options.showEffectDuration&&(t=e.options.showEffectDuration),e.setCss3Style(e.container,{transitionDuration:""+t+"s"}),e._visibilityStateTimeoutId=e.setTimeout(function(){return e.adapter.removeClass(e.container,e["class"].showing),e.adapter.addClass(e.container,e["class"].visible)},t),e._activateFirstInput()}),this._draw()):this.deactivate())},t.prototype._abortShowing=function(){return this.preparingToShow?(this.debug("Aborting showing."),this._clearTimeouts(),this._stopFollowingMousePosition(),this.preparingToShow=!1,this._setupObservers("-showing","-visible","hiding","hidden")):void 0},t.prototype.prepareToHide=function(){return this._abortShowing(),this._abortHiding(),this.visible?(this.debug("Hiding in "+this.options.hideDelay+"s"),this.preparingToHide=!0,this._setupObservers("-showing","visible","-hidden","hiding"),this._hideTimeoutId=this.setTimeout(this.bound.hide,this.options.hideDelay)):void 0},t.prototype.hide=function(){var t=this;return this._abortShowing(),this.visible&&(this._clearTimeouts(),this.debug("Hiding!"),this.visible=!1,this.preparingToHide=!1,this._stopEnsureTriggerElement(),this._setupObservers("-showing","-visible","-hiding","-hidden","hiding","hidden"),this.options.fixed||this._stopFollowingMousePosition(),this.container)?(this.adapter.removeClass(this.container,this["class"].visible),this.adapter.removeClass(this.container,this["class"].showing),this.adapter.addClass(this.container,this["class"].goingToHide),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var e;return t.adapter.removeClass(t.container,t["class"].goingToHide),t.adapter.addClass(t.container,t["class"].hiding),e=0,t.options.hideEffect&&t.options.hideEffectDuration&&(e=t.options.hideEffectDuration),t.setCss3Style(t.container,{transitionDuration:""+e+"s"}),t._visibilityStateTimeoutId=t.setTimeout(function(){return t.adapter.removeClass(t.container,t["class"].hiding),t.adapter.addClass(t.container,t["class"].hidden),t.setCss3Style(t.container,{transitionDuration:"0s"}),t.options.removeElementsOnHide?(t.debug("Removing HTML elements."),t.adapter.remove(t.container),delete t.container,delete t.tooltipElement):void 0},e)})):void 0},t.prototype._abortHiding=function(){return this.preparingToHide?(this.debug("Aborting hiding."),this._clearTimeouts(),this.preparingToHide=!1,this._setupObservers("-hiding","showing","visible")):void 0},t.prototype.reposition=function(){var t,e,i,o=this;return t=this.getPosition(),t==null||(e=this.options.stem,this.options.containInViewport&&(i=this._ensureViewportContainment(t),t=i.position,e=i.stem),this._positionsEqual(t,this.currentPosition))?void 0:(this.options.stem&&!e.eql(this.currentStem)&&(this.redraw=!0),this.currentPosition=t,this.currentStem=e,this._draw(),this.adapter.css(this.container,{left:""+t.left+"px",top:""+t.top+"px"}),this.defer(function(){var t,e;return t=o.adapter.unwrap(o.container),t.style.visibility="hidden",e=t.offsetHeight,t.style.visibility="visible"}))},t.prototype.getPosition=function(t,e,i){var o,s,n,r,a,h,p,l,d;if(this.container)return t==null&&(t=this.options.tipJoint),e==null&&(e=this.options.targetJoint),r={},this.options.target?(p=this.adapter.offset(this.options.target),h=this.adapter.dimensions(this.options.target),r=p,e.right?(l=this.adapter.unwrap(this.options.target),l.getBoundingClientRect!=null?r.left=l.getBoundingClientRect().right+((d=window.pageXOffset)!=null?d:document.body.scrollLeft):r.left+=h.width):e.center&&(r.left+=Math.round(h.width/2)),e.bottom?r.top+=h.height:e.middle&&(r.top+=Math.round(h.height/2)),this.options.borderWidth&&(this.options.tipJoint.left&&(r.left+=this.options.borderWidth),this.options.tipJoint.right&&(r.left-=this.options.borderWidth),this.options.tipJoint.top?r.top+=this.options.borderWidth:this.options.tipJoint.bottom&&(r.top-=this.options.borderWidth))):r=this.initialMousePosition?{top:this.initialMousePosition.y,left:this.initialMousePosition.x}:{top:mousePosition.y,left:mousePosition.x},this.options.autoOffset&&(a=this.options.stem?this.options.stemLength:0,n=a&&this.options.fixed?2:10,o=t.middle&&!this.options.fixed?15:0,s=t.center&&!this.options.fixed?15:0,t.right?r.left-=n+o:t.left&&(r.left+=n+o),t.bottom?r.top-=n+s:t.top&&(r.top+=n+s),a&&(i==null&&(i=this.options.stem),i.right?r.left-=a:i.left&&(r.left+=a),i.bottom?r.top-=a:i.top&&(r.top+=a))),r.left+=this.options.offset[0],r.top+=this.options.offset[1],t.right?r.left-=this.dimensions.width:t.center&&(r.left-=Math.round(this.dimensions.width/2)),t.bottom?r.top-=this.dimensions.height:t.middle&&(r.top-=Math.round(this.dimensions.height/2)),r},t.prototype._ensureViewportContainment=function(e){var i,o,s,n,r,a,h,p,l,d,u,c;if(h=this.options.stem,s={position:e,stem:h},!this.visible||!e)return s;if(p=this._sticksOut(e),!p[0]&&!p[1])return s;if(d=new t.Joint(this.options.tipJoint),this.options.targetJoint&&(l=new t.Joint(this.options.targetJoint)),a=this.adapter.scrollOffset(),u=this.adapter.viewportDimensions(),c=[e.left-a[0],e.top-a[1]],i=!1,u.width>=this.dimensions.width&&p[0])switch(i=!0,p[0]){case this.STICKS_OUT_LEFT:d.setHorizontal("left"),this.options.targetJoint&&l.setHorizontal("right");break;case this.STICKS_OUT_RIGHT:d.setHorizontal("right"),this.options.targetJoint&&l.setHorizontal("left")}if(u.height>=this.dimensions.height&&p[1])switch(i=!0,p[1]){case this.STICKS_OUT_TOP:d.setVertical("top"),this.options.targetJoint&&l.setVertical("bottom");break;case this.STICKS_OUT_BOTTOM:d.setVertical("bottom"),this.options.targetJoint&&l.setVertical("top")}return i?(this.options.stem&&(h=d),e=this.getPosition(d,l,h),o=this._sticksOut(e),n=!1,r=!1,o[0]&&o[0]!==p[0]&&(n=!0,d.setHorizontal(this.options.tipJoint.horizontal),this.options.targetJoint&&l.setHorizontal(this.options.targetJoint.horizontal)),o[1]&&o[1]!==p[1]&&(r=!0,d.setVertical(this.options.tipJoint.vertical),this.options.targetJoint&&l.setVertical(this.options.targetJoint.vertical)),n&&r?s:((n||r)&&(this.options.stem&&(h=d),e=this.getPosition(d,l,h)),{position:e,stem:h})):s},t.prototype._sticksOut=function(t){var e,i,o,s;return i=this.adapter.scrollOffset(),s=this.adapter.viewportDimensions(),e=[t.left-i[0],t.top-i[1]],o=[!1,!1],0>e[0]?o[0]=this.STICKS_OUT_LEFT:e[0]+this.dimensions.width>s.width&&(o[0]=this.STICKS_OUT_RIGHT),0>e[1]?o[1]=this.STICKS_OUT_TOP:e[1]+this.dimensions.height>s.height&&(o[1]=this.STICKS_OUT_BOTTOM),o},t.prototype._draw=function(){var e,i,o,s,n,r,a,h,p,l,d,u,c,f,g,m,v,w,_,b=this;if(this.backgroundCanvas&&this.redraw){if(this.debug("Drawing background."),this.redraw=!1,this.currentStem){for(v=["top","right","bottom","left"],g=0,m=v.length;m>g;g++)u=v[g],this.adapter.removeClass(this.container,"stem-"+u);this.adapter.addClass(this.container,"stem-"+this.currentStem.horizontal),this.adapter.addClass(this.container,"stem-"+this.currentStem.vertical)}return r=[0,0],a=[0,0],__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(n=new t.Joint(((w=this.currentStem)!=null?w+"":void 0)==="top right"?"top left":"top right"),r=[this.options.closeButtonRadius+this.options.closeButtonOffset[0],this.options.closeButtonRadius+this.options.closeButtonOffset[1]],a=[this.options.closeButtonRadius-this.options.closeButtonOffset[0],this.options.closeButtonRadius-this.options.closeButtonOffset[1]]),o=this.adapter.clone(this.dimensions),s=[0,0],this.options.borderWidth&&(o.width+=this.options.borderWidth*2,o.height+=this.options.borderWidth*2,s[0]-=this.options.borderWidth,s[1]-=this.options.borderWidth),this.options.shadow&&(o.width+=this.options.shadowBlur*2,o.width+=Math.max(0,this.options.shadowOffset[0]-this.options.shadowBlur*2),o.height+=this.options.shadowBlur*2,o.height+=Math.max(0,this.options.shadowOffset[1]-this.options.shadowBlur*2),s[0]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[0]),s[1]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[1])),i={left:0,right:0,top:0,bottom:0},this.currentStem&&(this.currentStem.left?i.left=this.options.stemLength:this.currentStem.right&&(i.right=this.options.stemLength),this.currentStem.top?i.top=this.options.stemLength:this.currentStem.bottom&&(i.bottom=this.options.stemLength)),n&&(n.left?i.left=Math.max(i.left,a[0]):n.right&&(i.right=Math.max(i.right,a[0])),n.top?i.top=Math.max(i.top,a[1]):n.bottom&&(i.bottom=Math.max(i.bottom,a[1]))),o.width+=i.left+i.right,o.height+=i.top+i.bottom,s[0]-=i.left,s[1]-=i.top,this.currentStem&&this.options.borderWidth&&(_=this._getPathStemMeasures(this.options.stemBase,this.options.stemLength,this.options.borderWidth),f=_.stemLength,c=_.stemBase),e=this.adapter.unwrap(this.backgroundCanvas),e.width=o.width,e.height=o.height,this.adapter.css(this.backgroundCanvas,{width:""+e.width+"px",height:""+e.height+"px",left:""+s[0]+"px",top:""+s[1]+"px"}),h=e.getContext("2d"),h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,e.width,e.height),h.beginPath(),h.fillStyle=this._getColor(h,this.dimensions,this.options.background,this.options.backgroundGradientHorizontal),h.lineJoin="miter",h.miterLimit=500,d=this.options.borderWidth/2,this.options.borderWidth?(h.strokeStyle=this.options.borderColor,h.lineWidth=this.options.borderWidth):(f=this.options.stemLength,c=this.options.stemBase),c==null&&(c=0),l=function(t,e,i){return i&&h.moveTo(Math.max(c,b.options.borderRadius,r[0])+1-d,-d),e?(h.lineTo(t/2-c/2,-d),h.lineTo(t/2,-f-d),h.lineTo(t/2+c/2,-d)):void 0},p=function(t,e,i){var o,s,n,a;return t?(h.lineTo(-c+d,0-d),h.lineTo(f+d,-f-d),h.lineTo(d,c-d)):e?(a=b.options.closeButtonOffset,n=r[0],i%2!==0&&(a=[a[1],a[0]],n=r[1]),o=Math.acos(a[1]/b.options.closeButtonRadius),s=Math.acos(a[0]/b.options.closeButtonRadius),h.lineTo(-n+d,-d),h.arc(d-a[0],-d+a[1],b.options.closeButtonRadius,-(Math.PI/2+o),s,!1)):(h.lineTo(-b.options.borderRadius+d,-d),h.quadraticCurveTo(d,-d,d,b.options.borderRadius-d))},h.translate(-s[0],-s[1]),h.save(),function(){var e,i,o,s,r,a,d,u,c,f,g;for(g=[],i=c=0,f=t.positions.length/2;f>=0?f>c:c>f;i=f>=0?++c:--c)r=i*2,a=i===0||i===3?0:b.dimensions.width,d=2>i?0:b.dimensions.height,u=Math.PI/2*i,o=i%2===0?b.dimensions.width:b.dimensions.height,s=new t.Joint(t.positions[r]),e=new t.Joint(t.positions[r+1]),h.save(),h.translate(a,d),h.rotate(u),l(o,s.eql(b.currentStem),i===0),h.translate(o,0),p(e.eql(b.currentStem),e.eql(n),i),g.push(h.restore());return g}(),h.closePath(),h.save(),this.options.shadow&&(h.shadowColor=this.options.shadowColor,h.shadowBlur=this.options.shadowBlur,h.shadowOffsetX=this.options.shadowOffset[0],h.shadowOffsetY=this.options.shadowOffset[1]),h.fill(),h.restore(),this.options.borderWidth&&h.stroke(),h.restore(),n?function(){var t,e,i,o,s;return i=e=b.options.closeButtonRadius*2,n+""=="top right"?(s=[b.dimensions.width-b.options.closeButtonOffset[0],b.options.closeButtonOffset[1]],t=[s[0]+d,s[1]-d]):(s=[b.options.closeButtonOffset[0],b.options.closeButtonOffset[1]],t=[s[0]-d,s[1]-d]),h.translate(t[0],t[1]),o=b.options.closeButtonCrossSize/2,h.save(),h.beginPath(),h.strokeStyle=b.options.closeButtonCrossColor,h.lineWidth=b.options.closeButtonCrossLineWidth,h.lineCap="round",h.moveTo(-o,-o),h.lineTo(o,o),h.stroke(),h.beginPath(),h.moveTo(o,-o),h.lineTo(-o,o),h.stroke(),h.restore(),b.adapter.css(b.closeButtonElement,{left:""+(s[0]-o-b.options.closeButtonLinkOverscan)+"px",top:""+(s[1]-o-b.options.closeButtonLinkOverscan)+"px",width:""+(b.options.closeButtonCrossSize+b.options.closeButtonLinkOverscan*2)+"px",height:""+(b.options.closeButtonCrossSize+b.options.closeButtonLinkOverscan*2)+"px"})}():void 0}},t.prototype._getPathStemMeasures=function(t,e,i){var o,s,n,r,a,h,p;if(r=i/2,n=Math.atan(t/2/e),o=n*2,a=r/Math.sin(o),s=2*a*Math.cos(n),p=r+e-s,0>p)throw Error("Sorry but your stemLength / stemBase ratio is strange.");return h=Math.tan(n)*p*2,{stemLength:p,stemBase:h}},t.prototype._getColor=function(t,e,i,o){var s,n,r,a,h;if(o==null&&(o=!1),typeof i=="string")return i;for(n=o?t.createLinearGradient(0,0,e.width,0):t.createLinearGradient(0,0,0,e.height),r=a=0,h=i.length;h>a;r=++a)s=i[r],n.addColorStop(s[0],s[1]);return n},t.prototype._searchAndActivateCloseButtons=function(){var t,e,i,o;for(o=this.adapter.findAll(this.container,"."+this["class"].close),e=0,i=o.length;i>e;e++)t=o[e],this.hideTriggers.push({element:this.adapter.wrap(t),event:"click"});return this.currentObservers.showing&&this._setupObservers("-showing","showing"),this.currentObservers.visible?this._setupObservers("-visible","visible"):void 0},t.prototype._activateFirstInput=function(){var t;return t=this.adapter.unwrap(this.adapter.find(this.container,"input, textarea")),t!=null?typeof t.focus=="function"?t.focus():void 0:void 0},t.prototype._followMousePosition=function(){return this.options.fixed?void 0:t._observeMousePosition(this.bound.reposition)},t.prototype._stopFollowingMousePosition=function(){return this.options.fixed?void 0:t._stopObservingMousePosition(this.bound.reposition)},t.prototype._clearShowTimeout=function(){return clearTimeout(this._showTimeoutId)},t.prototype._clearHideTimeout=function(){return clearTimeout(this._hideTimeoutId)},t.prototype._clearTimeouts=function(){return clearTimeout(this._visibilityStateTimeoutId),this._clearShowTimeout(),this._clearHideTimeout()},t.prototype._triggerElementExists=function(){var t;t=this.adapter.unwrap(this.triggerElement);while(t.parentNode){if(t.parentNode.tagName==="BODY")return!0;t=t.parentNode}return!1},t.prototype._loadAjax=function(){var t=this;if(!this.loading)return this.loaded=!1,this.loading=!0,this.adapter.addClass(this.container,this["class"].loading),this.setContent(""),this.debug("Loading content from "+this.options.ajax),this.adapter.ajax({url:this.options.ajax,method:this.options.ajaxMethod,onSuccess:function(e){return t.debug("Loading successful."),t.adapter.removeClass(t.container,t["class"].loading),t.setContent(e)},onError:function(e){var i;return i=t.options.ajaxErrorMessage,t.debug(i,e),t.setContent(i),t.adapter.addClass(t.container,t["class"].ajaxError)},onComplete:function(){return t.adapter.removeClass(t.container,t["class"].loading),t.loading=!1,t.loaded=!0,t._searchAndActivateCloseButtons(),t._activateFirstInput(),t.reposition()}})},t.prototype._ensureTriggerElement=function(){return this._triggerElementExists()?void 0:(this.deactivate(),this._stopEnsureTriggerElement())},t.prototype._ensureTriggerElementInterval=1e3,t.prototype._startEnsureTriggerElement=function(){var t=this;return this._ensureTriggerElementTimeoutId=setInterval(function(){return t._ensureTriggerElement()},this._ensureTriggerElementInterval)},t.prototype._stopEnsureTriggerElement=function(){return clearInterval(this._ensureTriggerElementTimeoutId)},t}(),vendors=["khtml","ms","o","moz","webkit"],Opentip.prototype.setCss3Style=function(t,e){var i,o,s,n,r;t=this.adapter.unwrap(t),r=[];for(i in e)__hasProp.call(e,i)&&(o=e[i],t.style[i]!=null?r.push(t.style[i]=o):r.push(function(){var e,r,a;for(a=[],e=0,r=vendors.length;r>e;e++)s=vendors[e],n=""+this.ucfirst(s)+this.ucfirst(i),t.style[n]!=null?a.push(t.style[n]=o):a.push(void 0);return a}.call(this)));return r},Opentip.prototype.defer=function(t){return setTimeout(t,0)},Opentip.prototype.setTimeout=function(t,e){return setTimeout(t,e?e*1e3:0)},Opentip.prototype.ucfirst=function(t){return t==null?"":t.charAt(0).toUpperCase()+t.slice(1)},Opentip.prototype.dasherize=function(t){return t.replace(/([A-Z])/g,function(t,e){return"-"+e.toLowerCase()})},mousePositionObservers=[],mousePosition={x:0,y:0},mouseMoved=function(t){var e,i,o,s;for(mousePosition=Opentip.adapter.mousePosition(t),s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],s.push(e());return s},Opentip.followMousePosition=function(){return Opentip.adapter.observe(document.body,"mousemove",mouseMoved)},Opentip._observeMousePosition=function(t){return mousePositionObservers.push(t)},Opentip._stopObservingMousePosition=function(t){var e;return mousePositionObservers=function(){var i,o,s;for(s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],e!==t&&s.push(e);return s}()},Opentip.Joint=function(){function t(t){t!=null&&(t instanceof Opentip.Joint&&(t+=""),this.set(t))}return t.prototype.set=function(t){return t=t.toLowerCase(),this.setHorizontal(t),this.setVertical(t),this},t.prototype.setHorizontal=function(t){var e,i,o,s,n,r,a;for(i=["left","center","right"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.horizontal=e.toLowerCase());for(this.horizontal==null&&(this.horizontal="center"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.horizontal===e?e:void 0);return a},t.prototype.setVertical=function(t){var e,i,o,s,n,r,a;for(i=["top","middle","bottom"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.vertical=e.toLowerCase());for(this.vertical==null&&(this.vertical="middle"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.vertical===e?e:void 0);return a},t.prototype.eql=function(t){return t!=null&&this.horizontal===t.horizontal&&this.vertical===t.vertical},t.prototype.flip=function(){var t,e;return e=Opentip.position[this.toString(!0)],t=(e+4)%8,this.set(Opentip.positions[t]),this},t.prototype.toString=function(t){var e,i;return t==null&&(t=!1),i=this.vertical==="middle"?"":this.vertical,e=this.horizontal==="center"?"":this.horizontal,i&&e&&(e=t?Opentip.prototype.ucfirst(e):" "+e),""+i+e},t}(),Opentip.prototype._positionsEqual=function(t,e){return t!=null&&e!=null&&t.left===e.left&&t.top===e.top},Opentip.prototype._dimensionsEqual=function(t,e){return t!=null&&e!=null&&t.width===e.width&&t.height===e.height},Opentip.prototype.debug=function(){var t;return t=arguments.length>=1?__slice.call(arguments,0):[],Opentip.debug&&(typeof console!="undefined"&&console!==null?console.debug:void 0)!=null?(t.unshift("#"+this.id+" |"),console.debug.apply(console,t)):void 0},Opentip.findElements=function(){var t,e,i,o,s,n,r,a,h,p;for(t=Opentip.adapter,h=t.findAll(document.body,"[data-ot]"),p=[],r=0,a=h.length;a>r;r++){i=h[r],n={},e=t.data(i,"ot"),(e===""||e==="true"||e==="yes")&&(e=t.attr(i,"title"),t.attr(i,"title","")),e=e||"";for(o in Opentip.styles.standard)s=t.data(i,"ot"+Opentip.prototype.ucfirst(o)),s!=null&&(s==="yes"||s==="true"||s==="on"?s=!0:(s==="no"||s==="false"||s==="off")&&(s=!1),n[o]=s);p.push(new Opentip(i,e,n))}return p},Opentip.version="2.4.6",Opentip.debug=!1,Opentip.lastId=0,Opentip.lastZIndex=100,Opentip.tips=[],Opentip._abortShowingGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i._abortShowing()):r.push(void 0);return r},Opentip._hideGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i.hide()):r.push(void 0);return r},Opentip.adapters={},Opentip.adapter=null,firstAdapter=!0,Opentip.addAdapter=function(t){return Opentip.adapters[t.name]=t,firstAdapter?(Opentip.adapter=t,t.domReady(Opentip.findElements),t.domReady(Opentip.followMousePosition),firstAdapter=!1):void 0},Opentip.positions=["top","topRight","right","bottomRight","bottom","bottomLeft","left","topLeft"],Opentip.position={},_ref=Opentip.positions,i=_i=0,_len=_ref.length;_len>_i;i=++_i)position=_ref[i],Opentip.position[position]=i;Opentip.styles={standard:{"extends":null,title:void 0,escapeTitle:!0,escapeContent:!1,className:"standard",stem:!0,delay:null,hideDelay:.1,fixed:!1,showOn:"mouseover",hideTrigger:"trigger",hideTriggers:[],hideOn:null,removeElementsOnHide:!1,offset:[0,0],containInViewport:!0,autoOffset:!0,showEffect:"appear",hideEffect:"fade",showEffectDuration:.3,hideEffectDuration:.2,stemLength:5,stemBase:8,tipJoint:"top left",target:null,targetJoint:null,cache:!0,ajax:!1,ajaxMethod:"GET",ajaxErrorMessage:"There was a problem downloading the content.",group:null,style:null,background:"#fff18f",backgroundGradientHorizontal:!1,closeButtonOffset:[5,5],closeButtonRadius:7,closeButtonCrossSize:4,closeButtonCrossColor:"#d2c35b",closeButtonCrossLineWidth:1.5,closeButtonLinkOverscan:6,borderRadius:5,borderWidth:1,borderColor:"#f2e37b",shadow:!0,shadowBlur:10,shadowOffset:[3,3],shadowColor:"rgba(0, 0, 0, 0.1)"},glass:{"extends":"standard",className:"glass",background:[[0,"rgba(252, 252, 252, 0.8)"],[.5,"rgba(255, 255, 255, 0.8)"],[.5,"rgba(250, 250, 250, 0.9)"],[1,"rgba(245, 245, 245, 0.9)"]],borderColor:"#eee",closeButtonCrossColor:"rgba(0, 0, 0, 0.2)",borderRadius:15,closeButtonRadius:10,closeButtonOffset:[8,8]},dark:{"extends":"standard",className:"dark",borderRadius:13,borderColor:"#444",closeButtonCrossColor:"rgba(240, 240, 240, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(30, 30, 30, 0.7)"],[.5,"rgba(30, 30, 30, 0.8)"],[.5,"rgba(10, 10, 10, 0.8)"],[1,"rgba(10, 10, 10, 0.9)"]]},alert:{"extends":"standard",className:"alert",borderRadius:1,borderColor:"#AE0D11",closeButtonCrossColor:"rgba(255, 255, 255, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(203, 15, 19, 0.7)"],[.5,"rgba(203, 15, 19, 0.8)"],[.5,"rgba(189, 14, 18, 0.8)"],[1,"rgba(179, 14, 17, 0.9)"]]}},Opentip.defaultStyle="standard",typeof module!="undefined"&&module!==null?module.exports=Opentip:window.Opentip=Opentip;var Adapter,__hasProp={}.hasOwnProperty,__slice=[].slice;Adapter=function(){function t(){}var e,i;return t.prototype.name="native",t.prototype.domReady=function(t){var e,i,o,s,n,r,a,h,p,l,d;if(o=!1,p=!0,l=window,i=document,(d=i.readyState)==="complete"||d==="loaded")return t();if(h=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",a=i.addEventListener?"removeEventListener":"detachEvent",r=i.addEventListener?"":"on",s=function(e){return e.type!=="readystatechange"||i.readyState==="complete"?((e.type==="load"?l:i)[a](r+e.type,s,!1),o?void 0:(o=!0,t())):void 0 },n=function(){try{h.doScroll("left")}catch(t){return setTimeout(n,50),void 0}return s("poll")},i.readyState!=="complete"){if(i.createEventObject&&h.doScroll){try{p=!l.frameElement}catch(u){}p&&n()}return i[e](r+"DOMContentLoaded",s,!1),i[e](r+"readystatechange",s,!1),l[e](r+"load",s,!1)}},t.prototype.create=function(t){var e;return e=document.createElement("div"),e.innerHTML=t,this.wrap(e.childNodes)},t.prototype.wrap=function(t){var e;return t?typeof t=="string"?(t=this.find(document.body,t),t=t?[t]:[]):t instanceof NodeList?t=function(){var i,o,s;for(s=[],i=0,o=t.length;o>i;i++)e=t[i],s.push(e);return s}():t instanceof Array||(t=[t]):t=[],t},t.prototype.unwrap=function(t){return this.wrap(t)[0]},t.prototype.tagName=function(t){return this.unwrap(t).tagName},t.prototype.attr=function(t,e,i){return arguments.length===3?this.unwrap(t).setAttribute(e,i):this.unwrap(t).getAttribute(e)},i=0,e={},t.prototype.data=function(t,o,s){var n;return n=this.attr(t,"data-id"),n||(n=++i,this.attr(t,"data-id",n),e[n]={}),arguments.length===3?e[n][o]=s:(s=e[n][o],s!=null?s:(s=this.attr(t,"data-"+Opentip.prototype.dasherize(o)),s&&(e[n][o]=s),s))},t.prototype.find=function(t,e){return this.unwrap(t).querySelector(e)},t.prototype.findAll=function(t,e){return this.unwrap(t).querySelectorAll(e)},t.prototype.update=function(t,e,i){return t=this.unwrap(t),i?(t.innerHTML="",t.appendChild(document.createTextNode(e))):t.innerHTML=e},t.prototype.append=function(t,e){var i,o;return i=this.unwrap(e),o=this.unwrap(t),o.appendChild(i)},t.prototype.remove=function(t){var e;return t=this.unwrap(t),e=t.parentNode,e!=null?e.removeChild(t):void 0},t.prototype.addClass=function(t,e){return this.unwrap(t).classList.add(e)},t.prototype.removeClass=function(t,e){return this.unwrap(t).classList.remove(e)},t.prototype.css=function(t,e){var i,o,s;t=this.unwrap(this.wrap(t)),s=[];for(i in e)__hasProp.call(e,i)&&(o=e[i],s.push(t.style[i]=o));return s},t.prototype.dimensions=function(t){var e,i;return t=this.unwrap(this.wrap(t)),e={width:t.offsetWidth,height:t.offsetHeight},e.width&&e.height||(i={position:t.style.position||"",visibility:t.style.visibility||"",display:t.style.display||""},this.css(t,{position:"absolute",visibility:"hidden",display:"block"}),e={width:t.offsetWidth,height:t.offsetHeight},this.css(t,i)),e},t.prototype.scrollOffset=function(){return[window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop]},t.prototype.viewportDimensions=function(){return{width:document.documentElement.clientWidth,height:document.documentElement.clientHeight}},t.prototype.mousePosition=function(t){var e;if(e={x:0,y:0},t==null&&(t=window.event),t!=null){try{t.pageX||t.pageY?(e.x=t.pageX,e.y=t.pageY):(t.clientX||t.clientY)&&(e.x=t.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,e.y=t.clientY+document.body.scrollTop+document.documentElement.scrollTop)}catch(t){}return e}},t.prototype.offset=function(t){var e;t=this.unwrap(t),e={top:t.offsetTop,left:t.offsetLeft};while(t=t.offsetParent)e.top+=t.offsetTop,e.left+=t.offsetLeft,t!==document.body&&(e.top-=t.scrollTop,e.left-=t.scrollLeft);return e},t.prototype.observe=function(t,e,i){return this.unwrap(t).addEventListener(e,i,!1)},t.prototype.stopObserving=function(t,e,i){return this.unwrap(t).removeEventListener(e,i,!1)},t.prototype.ajax=function(t){var e,i,o;if(t.url==null)throw Error("No url provided");if(window.XMLHttpRequest)e=new XMLHttpRequest;else if(window.ActiveXObject)try{e=new ActiveXObject("Msxml2.XMLHTTP")}catch(s){try{e=new ActiveXObject("Microsoft.XMLHTTP")}catch(s){}}if(!e)throw Error("Can't create XMLHttpRequest");return e.onreadystatechange=function(){if(e.readyState===4){try{e.status===200?typeof t.onSuccess=="function"&&t.onSuccess(e.responseText):typeof t.onError=="function"&&t.onError("Server responded with status "+e.status)}catch(i){typeof t.onError=="function"&&t.onError(i.message)}return typeof t.onComplete=="function"?t.onComplete():void 0}},e.open((i=(o=t.method)!=null?o.toUpperCase():void 0)!=null?i:"GET",t.url),e.send()},t.prototype.clone=function(t){var e,i,o;i={};for(e in t)__hasProp.call(t,e)&&(o=t[e],i[e]=o);return i},t.prototype.extend=function(){var t,e,i,o,s,n,r;for(o=arguments[0],i=arguments.length>=2?__slice.call(arguments,1):[],n=0,r=i.length;r>n;n++){e=i[n];for(t in e)__hasProp.call(e,t)&&(s=e[t],o[t]=s)}return o},t}(),Opentip.addAdapter(new Adapter),document.createElement("canvas").getContext||function(){function t(){return this.context_||(this.context_=new p(this))}function e(t,e){var i=O.call(arguments,2);return function(){return t.apply(e,i.concat(O.call(arguments)))}}function i(t){var e=t.srcElement;switch(t.propertyName){case"width":e.style.width=e.attributes.width.nodeValue+"px",e.getContext().clearRect();break;case"height":e.style.height=e.attributes.height.nodeValue+"px",e.getContext().clearRect()}}function o(t){var e=t.srcElement;e.firstChild&&(e.firstChild.style.width=e.clientWidth+"px",e.firstChild.style.height=e.clientHeight+"px")}function s(){return[[1,0,0],[0,1,0],[0,0,1]]}function n(t,e){for(var i=s(),o=0;3>o;o++)for(var n=0;3>n;n++){for(var r=0,a=0;3>a;a++)r+=t[o][a]*e[a][n];i[o][n]=r}return i}function r(t,e){e.fillStyle=t.fillStyle,e.lineCap=t.lineCap,e.lineJoin=t.lineJoin,e.lineWidth=t.lineWidth,e.miterLimit=t.miterLimit,e.shadowBlur=t.shadowBlur,e.shadowColor=t.shadowColor,e.shadowOffsetX=t.shadowOffsetX,e.shadowOffsetY=t.shadowOffsetY,e.strokeStyle=t.strokeStyle,e.globalAlpha=t.globalAlpha,e.arcScaleX_=t.arcScaleX_,e.arcScaleY_=t.arcScaleY_,e.lineScale_=t.lineScale_}function a(t){var e,i=1;if(t+="",t.substring(0,3)=="rgb"){var o=t.indexOf("(",3),s=t.indexOf(")",o+1),n=t.substring(o+1,s).split(",");e="#";for(var r=0;3>r;r++)e+=C[Number(n[r])];n.length==4&&t.substr(3,1)=="a"&&(i=n[3])}else e=t;return{color:e,alpha:i}}function h(t){switch(t){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function p(t){this.m_=s(),this.mStack_=[],this.aStack_=[],this.currentPath_=[],this.strokeStyle="#000",this.fillStyle="#000",this.lineWidth=1,this.lineJoin="miter",this.lineCap="butt",this.miterLimit=y*1,this.globalAlpha=1,this.canvas=t;var e=t.ownerDocument.createElement("div");e.style.width=t.clientWidth+"px",e.style.height=t.clientHeight+"px",e.style.position="absolute",t.appendChild(e),this.element_=e,this.arcScaleX_=1,this.arcScaleY_=1,this.lineScale_=1}function l(t,e,i,o){t.currentPath_.push({type:"bezierCurveTo",cp1x:e.x,cp1y:e.y,cp2x:i.x,cp2y:i.y,x:o.x,y:o.y}),t.currentX_=o.x,t.currentY_=o.y}function d(t){for(var e=0;3>e;e++)for(var i=0;2>i;i++)if(!isFinite(t[e][i])||isNaN(t[e][i]))return!1;return!0}function u(t,e,i){if(d(e)&&(t.m_=e,i)){var o=e[0][0]*e[1][1]-e[0][1]*e[1][0];t.lineScale_=b(_(o))}}function c(t){this.type_=t,this.x0_=0,this.y0_=0,this.r0_=0,this.x1_=0,this.y1_=0,this.r1_=0,this.colors_=[]}function f(){}var g=Math,m=g.round,v=g.sin,w=g.cos,_=g.abs,b=g.sqrt,y=10,T=y/2,O=Array.prototype.slice,x={init:function(t){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=t||document;i.createElement("canvas"),i.attachEvent("onreadystatechange",e(this.init_,this,i))}},init_:function(t){if(t.namespaces.g_vml_||t.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML"),t.namespaces.g_o_||t.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML"),!t.styleSheets.ex_canvas_){var e=t.createStyleSheet();e.owningElement.id="ex_canvas_",e.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}for(var i=t.getElementsByTagName("canvas"),o=0;i.length>o;o++)this.initElement(i[o])},initElement:function(e){if(!e.getContext){e.getContext=t,e.innerHTML="",e.attachEvent("onpropertychange",i),e.attachEvent("onresize",o);var s=e.attributes;s.width&&s.width.specified?e.style.width=s.width.nodeValue+"px":e.width=e.clientWidth,s.height&&s.height.specified?e.style.height=s.height.nodeValue+"px":e.height=e.clientHeight}return e}};x.init();for(var C=[],S=0;16>S;S++)for(var E=0;16>E;E++)C[S*16+E]=S.toString(16)+E.toString(16);var P=p.prototype;P.clearRect=function(){this.element_.innerHTML=""},P.beginPath=function(){this.currentPath_=[]},P.moveTo=function(t,e){var i=this.getCoords_(t,e);this.currentPath_.push({type:"moveTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},P.lineTo=function(t,e){var i=this.getCoords_(t,e);this.currentPath_.push({type:"lineTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},P.bezierCurveTo=function(t,e,i,o,s,n){var r=this.getCoords_(s,n),a=this.getCoords_(t,e),h=this.getCoords_(i,o);l(this,a,h,r)},P.quadraticCurveTo=function(t,e,i,o){var s=this.getCoords_(t,e),n=this.getCoords_(i,o),r={x:this.currentX_+2/3*(s.x-this.currentX_),y:this.currentY_+2/3*(s.y-this.currentY_)},a={x:r.x+(n.x-this.currentX_)/3,y:r.y+(n.y-this.currentY_)/3};l(this,r,a,n)},P.arc=function(t,e,i,o,s,n){i*=y;var r=n?"at":"wa",a=t+w(o)*i-T,h=e+v(o)*i-T,p=t+w(s)*i-T,l=e+v(s)*i-T;a!=p||n||(a+=.125);var d=this.getCoords_(t,e),u=this.getCoords_(a,h),c=this.getCoords_(p,l);this.currentPath_.push({type:r,x:d.x,y:d.y,radius:i,xStart:u.x,yStart:u.y,xEnd:c.x,yEnd:c.y})},P.rect=function(t,e,i,o){this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath()},P.strokeRect=function(t,e,i,o){var s=this.currentPath_;this.beginPath(),this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath(),this.stroke(),this.currentPath_=s},P.fillRect=function(t,e,i,o){var s=this.currentPath_;this.beginPath(),this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath(),this.fill(),this.currentPath_=s},P.createLinearGradient=function(t,e,i,o){var s=new c("gradient");return s.x0_=t,s.y0_=e,s.x1_=i,s.y1_=o,s},P.createRadialGradient=function(t,e,i,o,s,n){var r=new c("gradientradial");return r.x0_=t,r.y0_=e,r.r0_=i,r.x1_=o,r.y1_=s,r.r1_=n,r},P.drawImage=function(t){var e,i,o,s,n,r,a,h,p=t.runtimeStyle.width,l=t.runtimeStyle.height;t.runtimeStyle.width="auto",t.runtimeStyle.height="auto";var d=t.width,u=t.height;if(t.runtimeStyle.width=p,t.runtimeStyle.height=l,arguments.length==3)e=arguments[1],i=arguments[2],n=r=0,a=o=d,h=s=u;else if(arguments.length==5)e=arguments[1],i=arguments[2],o=arguments[3],s=arguments[4],n=r=0,a=d,h=u;else{if(arguments.length!=9)throw Error("Invalid number of arguments");n=arguments[1],r=arguments[2],a=arguments[3],h=arguments[4],e=arguments[5],i=arguments[6],o=arguments[7],s=arguments[8]}var c=this.getCoords_(e,i),f=[],v=10,w=10;if(f.push(" ','",""),this.element_.insertAdjacentHTML("BeforeEnd",f.join(""))},P.stroke=function(t){var e=[],i=a(t?this.fillStyle:this.strokeStyle),o=i.color,s=i.alpha*this.globalAlpha,n=10,r=10;e.push("c.x)&&(p.x=c.x),(l.x==null||c.x>l.x)&&(l.x=c.x),(p.y==null||p.y>c.y)&&(p.y=c.y),(l.y==null||c.y>l.y)&&(l.y=c.y))}if(e.push(' ">'),t)if(typeof this.fillStyle=="object"){var f=this.fillStyle,v=0,w={x:0,y:0},_=0,b=1;if(f.type_=="gradient"){var T=f.x0_/this.arcScaleX_,O=f.y0_/this.arcScaleY_,x=f.x1_/this.arcScaleX_,C=f.y1_/this.arcScaleY_,S=this.getCoords_(T,O),E=this.getCoords_(x,C),P=E.x-S.x,B=E.y-S.y;v=Math.atan2(P,B)*180/Math.PI,0>v&&(v+=360),1e-6>v&&(v=0)}else{var S=this.getCoords_(f.x0_,f.y0_),M=l.x-p.x,k=l.y-p.y;w={x:(S.x-p.x)/M,y:(S.y-p.y)/k},M/=this.arcScaleX_*y,k/=this.arcScaleY_*y;var L=g.max(M,k);_=2*f.r0_/L,b=2*f.r1_/L-_}var I=f.colors_;I.sort(function(t,e){return t.offset-e.offset});for(var H=I.length,J=I[0].color,A=I[H-1].color,R=I[0].alpha*this.globalAlpha,j=I[H-1].alpha*this.globalAlpha,z=[],d=0;H>d;d++){var W=I[d];z.push(W.offset*b+_+" "+W.color)}e.push('')}else e.push('');else{var D=this.lineScale_*this.lineWidth;1>D&&(s*=D),e.push("')}e.push(""),this.element_.insertAdjacentHTML("beforeEnd",e.join(""))},P.fill=function(){this.stroke(!0)},P.closePath=function(){this.currentPath_.push({type:"close"})},P.getCoords_=function(t,e){var i=this.m_;return{x:y*(t*i[0][0]+e*i[1][0]+i[2][0])-T,y:y*(t*i[0][1]+e*i[1][1]+i[2][1])-T}},P.save=function(){var t={};r(this,t),this.aStack_.push(t),this.mStack_.push(this.m_),this.m_=n(s(),this.m_)},P.restore=function(){r(this.aStack_.pop(),this),this.m_=this.mStack_.pop()},P.translate=function(t,e){var i=[[1,0,0],[0,1,0],[t,e,1]];u(this,n(i,this.m_),!1)},P.rotate=function(t){var e=w(t),i=v(t),o=[[e,i,0],[-i,e,0],[0,0,1]];u(this,n(o,this.m_),!1)},P.scale=function(t,e){this.arcScaleX_*=t,this.arcScaleY_*=e;var i=[[t,0,0],[0,e,0],[0,0,1]];u(this,n(i,this.m_),!0)},P.transform=function(t,e,i,o,s,r){var a=[[t,e,0],[i,o,0],[s,r,1]];u(this,n(a,this.m_),!0)},P.setTransform=function(t,e,i,o,s,n){var r=[[t,e,0],[i,o,0],[s,n,1]];u(this,r,!0)},P.clip=function(){},P.arcTo=function(){},P.createPattern=function(){return new f},c.prototype.addColorStop=function(t,e){e=a(e),this.colors_.push({offset:t,color:e.color,alpha:e.alpha})},G_vmlCanvasManager=x,CanvasRenderingContext2D=p,CanvasGradient=c,CanvasPattern=f}(),typeof document=="undefined"||"classList"in document.createElement("a")||function(t){"use strict";if("HTMLElement"in t||"Element"in t){var e="classList",i="prototype",o=(t.HTMLElement||t.Element)[i],s=Object,n=String[i].trim||function(){return this.replace(/^\s+|\s+$/g,"")},r=Array[i].indexOf||function(t){for(var e=0,i=this.length;i>e;e++)if(e in this&&this[e]===t)return e;return-1},a=function(t,e){this.name=t,this.code=DOMException[t],this.message=e},h=function(t,e){if(e==="")throw new a("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(e))throw new a("INVALID_CHARACTER_ERR","String contains an invalid character");return r.call(t,e)},p=function(t){for(var e=n.call(t.className),i=e?e.split(/\s+/):[],o=0,s=i.length;s>o;o++)this.push(i[o]);this._updateClassName=function(){t.className=this+""}},l=p[i]=[],d=function(){return new p(this)};if(a[i]=Error[i],l.item=function(t){return this[t]||null},l.contains=function(t){return t+="",h(this,t)!==-1},l.add=function(){var t,e=arguments,i=0,o=e.length,s=!1;do t=e[i]+"",h(this,t)===-1&&(this.push(t),s=!0);while(o>++i);s&&this._updateClassName()},l.remove=function(){var t,e=arguments,i=0,o=e.length,s=!1;do{t=e[i]+"";var n=h(this,t);n!==-1&&(this.splice(n,1),s=!0)}while(o>++i);s&&this._updateClassName()},l.toggle=function(t,e){t+="";var i=this.contains(t),o=i?e!==!0&&"remove":e!==!1&&"add";return o&&this[o](t),i},l.toString=function(){return this.join(" ")},s.defineProperty){var u={get:d,enumerable:!0,configurable:!0};try{s.defineProperty(o,e,u)}catch(c){c.number===-2146823252&&(u.enumerable=!1,s.defineProperty(o,e,u))}}else s[i].__defineGetter__&&o.__defineGetter__(e,d)}}(self),!window.addEventListener&&function(t,e,i,o,s,n,r){t[o]=e[o]=i[o]=function(t,e){var i=this;r.unshift([i,t,e,function(t){t.currentTarget=i,t.preventDefault=function(){t.returnValue=!1},t.stopPropagation=function(){t.cancelBubble=!0},t.target=t.srcElement||i,e.call(i,t)}]),this.attachEvent("on"+t,r[0][3])},t[s]=e[s]=i[s]=function(t,e){for(var i,o=0;i=r[o];++o)if(i[0]==this&&i[1]==t&&i[2]==e)return this.detachEvent("on"+t,r.splice(o,1)[0][3])},t[n]=e[n]=i[n]=function(t){return this.fireEvent("on"+t.type,t)}}(Window.prototype,HTMLDocument.prototype,Element.prototype,"addEventListener","removeEventListener","dispatchEvent",[])opentip-2.4.6/downloads/opentip-native.js000066400000000000000000002120541213277401600205020ustar00rootroot00000000000000// Generated by CoffeeScript 1.4.0 /* # # Opentip v2.4.6 # # More info at [www.opentip.org](http://www.opentip.org) # # Copyright (c) 2012, Matias Meno # Graphics by Tjandra Mayerhold # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # */ var Opentip, firstAdapter, i, mouseMoved, mousePosition, mousePositionObservers, position, vendors, _i, _len, _ref, __slice = [].slice, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __hasProp = {}.hasOwnProperty; Opentip = (function() { Opentip.prototype.STICKS_OUT_TOP = 1; Opentip.prototype.STICKS_OUT_BOTTOM = 2; Opentip.prototype.STICKS_OUT_LEFT = 1; Opentip.prototype.STICKS_OUT_RIGHT = 2; Opentip.prototype["class"] = { container: "opentip-container", opentip: "opentip", header: "ot-header", content: "ot-content", loadingIndicator: "ot-loading-indicator", close: "ot-close", goingToHide: "ot-going-to-hide", hidden: "ot-hidden", hiding: "ot-hiding", goingToShow: "ot-going-to-show", showing: "ot-showing", visible: "ot-visible", loading: "ot-loading", ajaxError: "ot-ajax-error", fixed: "ot-fixed", showEffectPrefix: "ot-show-effect-", hideEffectPrefix: "ot-hide-effect-", stylePrefix: "style-" }; function Opentip(element, content, title, options) { var elementsOpentips, hideTrigger, methodToBind, optionSources, prop, styleName, _i, _j, _len, _len1, _ref, _ref1, _ref2, _tmpStyle, _this = this; this.id = ++Opentip.lastId; this.debug("Creating Opentip."); Opentip.tips.push(this); this.adapter = Opentip.adapter; elementsOpentips = this.adapter.data(element, "opentips") || []; elementsOpentips.push(this); this.adapter.data(element, "opentips", elementsOpentips); this.triggerElement = this.adapter.wrap(element); if (this.triggerElement.length > 1) { throw new Error("You can't call Opentip on multiple elements."); } if (this.triggerElement.length < 1) { throw new Error("Invalid element."); } this.loaded = false; this.loading = false; this.visible = false; this.waitingToShow = false; this.waitingToHide = false; this.currentPosition = { left: 0, top: 0 }; this.dimensions = { width: 100, height: 50 }; this.content = ""; this.redraw = true; this.currentObservers = { showing: false, visible: false, hiding: false, hidden: false }; options = this.adapter.clone(options); if (typeof content === "object") { options = content; content = title = void 0; } else if (typeof title === "object") { options = title; title = void 0; } if (title != null) { options.title = title; } if (content != null) { this.setContent(content); } if (options["extends"] == null) { if (options.style != null) { options["extends"] = options.style; } else { options["extends"] = Opentip.defaultStyle; } } optionSources = [options]; _tmpStyle = options; while (_tmpStyle["extends"]) { styleName = _tmpStyle["extends"]; _tmpStyle = Opentip.styles[styleName]; if (_tmpStyle == null) { throw new Error("Invalid style: " + styleName); } optionSources.unshift(_tmpStyle); if (!((_tmpStyle["extends"] != null) || styleName === "standard")) { _tmpStyle["extends"] = "standard"; } } options = (_ref = this.adapter).extend.apply(_ref, [{}].concat(__slice.call(optionSources))); options.hideTriggers = (function() { var _i, _len, _ref1, _results; _ref1 = options.hideTriggers; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { hideTrigger = _ref1[_i]; _results.push(hideTrigger); } return _results; })(); if (options.hideTrigger && options.hideTriggers.length === 0) { options.hideTriggers.push(options.hideTrigger); } _ref1 = ["tipJoint", "targetJoint", "stem"]; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { prop = _ref1[_i]; if (options[prop] && typeof options[prop] === "string") { options[prop] = new Opentip.Joint(options[prop]); } } if (options.ajax && (options.ajax === true || !options.ajax)) { if (this.adapter.tagName(this.triggerElement) === "A") { options.ajax = this.adapter.attr(this.triggerElement, "href"); } else { options.ajax = false; } } if (options.showOn === "click" && this.adapter.tagName(this.triggerElement) === "A") { this.adapter.observe(this.triggerElement, "click", function(e) { e.preventDefault(); e.stopPropagation(); return e.stopped = true; }); } if (options.target) { options.fixed = true; } if (options.stem === true) { options.stem = new Opentip.Joint(options.tipJoint); } if (options.target === true) { options.target = this.triggerElement; } else if (options.target) { options.target = this.adapter.wrap(options.target); } this.currentStem = options.stem; if (options.delay == null) { options.delay = options.showOn === "mouseover" ? 0.2 : 0; } if (options.targetJoint == null) { options.targetJoint = new Opentip.Joint(options.tipJoint).flip(); } this.showTriggers = []; this.showTriggersWhenVisible = []; this.hideTriggers = []; if (options.showOn && options.showOn !== "creation") { this.showTriggers.push({ element: this.triggerElement, event: options.showOn }); } if (options.ajaxCache != null) { options.cache = options.ajaxCache; delete options.ajaxCache; } this.options = options; this.bound = {}; _ref2 = ["prepareToShow", "prepareToHide", "show", "hide", "reposition"]; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { methodToBind = _ref2[_j]; this.bound[methodToBind] = (function(methodToBind) { return function() { return _this[methodToBind].apply(_this, arguments); }; })(methodToBind); } this.adapter.domReady(function() { _this.activate(); if (_this.options.showOn === "creation") { return _this.prepareToShow(); } }); } Opentip.prototype._setup = function() { var hideOn, hideTrigger, hideTriggerElement, i, _i, _j, _len, _len1, _ref, _ref1, _results; this.debug("Setting up the tooltip."); this._buildContainer(); this.hideTriggers = []; _ref = this.options.hideTriggers; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { hideTrigger = _ref[i]; hideTriggerElement = null; hideOn = this.options.hideOn instanceof Array ? this.options.hideOn[i] : this.options.hideOn; if (typeof hideTrigger === "string") { switch (hideTrigger) { case "trigger": hideOn = hideOn || "mouseout"; hideTriggerElement = this.triggerElement; break; case "tip": hideOn = hideOn || "mouseover"; hideTriggerElement = this.container; break; case "target": hideOn = hideOn || "mouseover"; hideTriggerElement = this.options.target; break; case "closeButton": break; default: throw new Error("Unknown hide trigger: " + hideTrigger + "."); } } else { hideOn = hideOn || "mouseover"; hideTriggerElement = this.adapter.wrap(hideTrigger); } if (hideTriggerElement) { this.hideTriggers.push({ element: hideTriggerElement, event: hideOn, original: hideTrigger }); } } _ref1 = this.hideTriggers; _results = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { hideTrigger = _ref1[_j]; _results.push(this.showTriggersWhenVisible.push({ element: hideTrigger.element, event: "mouseover" })); } return _results; }; Opentip.prototype._buildContainer = function() { this.container = this.adapter.create("
"); this.adapter.css(this.container, { position: "absolute" }); if (this.options.ajax) { this.adapter.addClass(this.container, this["class"].loading); } if (this.options.fixed) { this.adapter.addClass(this.container, this["class"].fixed); } if (this.options.showEffect) { this.adapter.addClass(this.container, "" + this["class"].showEffectPrefix + this.options.showEffect); } if (this.options.hideEffect) { return this.adapter.addClass(this.container, "" + this["class"].hideEffectPrefix + this.options.hideEffect); } }; Opentip.prototype._buildElements = function() { var headerElement, titleElement; this.tooltipElement = this.adapter.create("
"); this.backgroundCanvas = this.adapter.wrap(document.createElement("canvas")); this.adapter.css(this.backgroundCanvas, { position: "absolute" }); if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)); } headerElement = this.adapter.find(this.tooltipElement, "." + this["class"].header); if (this.options.title) { titleElement = this.adapter.create("

"); this.adapter.update(titleElement, this.options.title, this.options.escapeTitle); this.adapter.append(headerElement, titleElement); } if (this.options.ajax && !this.loaded) { this.adapter.append(this.tooltipElement, this.adapter.create("
↻
")); } if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { this.closeButtonElement = this.adapter.create("Close"); this.adapter.append(headerElement, this.closeButtonElement); } this.adapter.append(this.container, this.backgroundCanvas); this.adapter.append(this.container, this.tooltipElement); this.adapter.append(document.body, this.container); this._newContent = true; return this.redraw = true; }; Opentip.prototype.setContent = function(content) { this.content = content; this._newContent = true; if (typeof this.content === "function") { this._contentFunction = this.content; this.content = ""; } else { this._contentFunction = null; } if (this.visible) { return this._updateElementContent(); } }; Opentip.prototype._updateElementContent = function() { var contentDiv; if (this._newContent || (!this.options.cache && this._contentFunction)) { contentDiv = this.adapter.find(this.container, "." + this["class"].content); if (contentDiv != null) { if (this._contentFunction) { this.debug("Executing content function."); this.content = this._contentFunction(this); } this.adapter.update(contentDiv, this.content, this.options.escapeContent); } this._newContent = false; } this._storeAndLockDimensions(); return this.reposition(); }; Opentip.prototype._storeAndLockDimensions = function() { var prevDimension; if (!this.container) { return; } prevDimension = this.dimensions; this.adapter.css(this.container, { width: "auto", left: "0px", top: "0px" }); this.dimensions = this.adapter.dimensions(this.container); this.dimensions.width += 1; this.adapter.css(this.container, { width: "" + this.dimensions.width + "px", top: "" + this.currentPosition.top + "px", left: "" + this.currentPosition.left + "px" }); if (!this._dimensionsEqual(this.dimensions, prevDimension)) { this.redraw = true; return this._draw(); } }; Opentip.prototype.activate = function() { return this._setupObservers("hidden", "hiding"); }; Opentip.prototype.deactivate = function() { this.debug("Deactivating tooltip."); this.hide(); return this._setupObservers("-showing", "-visible", "-hidden", "-hiding"); }; Opentip.prototype._setupObservers = function() { var observeOrStop, removeObserver, state, states, trigger, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _this = this; states = 1 <= arguments.length ? __slice.call(arguments, 0) : []; for (_i = 0, _len = states.length; _i < _len; _i++) { state = states[_i]; removeObserver = false; if (state.charAt(0) === "-") { removeObserver = true; state = state.substr(1); } if (this.currentObservers[state] === !removeObserver) { continue; } this.currentObservers[state] = !removeObserver; observeOrStop = function() { var args, _ref, _ref1; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (removeObserver) { return (_ref = _this.adapter).stopObserving.apply(_ref, args); } else { return (_ref1 = _this.adapter).observe.apply(_ref1, args); } }; switch (state) { case "showing": _ref = this.hideTriggers; for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { trigger = _ref[_j]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToHide); } observeOrStop((document.onresize != null ? document : window), "resize", this.bound.reposition); observeOrStop(window, "scroll", this.bound.reposition); break; case "visible": _ref1 = this.showTriggersWhenVisible; for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { trigger = _ref1[_k]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hiding": _ref2 = this.showTriggers; for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { trigger = _ref2[_l]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hidden": break; default: throw new Error("Unknown state: " + state); } } return null; }; Opentip.prototype.prepareToShow = function() { this._abortHiding(); this._abortShowing(); if (this.visible) { return; } this.debug("Showing in " + this.options.delay + "s."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._abortShowingGroup(this.options.group, this); } this.preparingToShow = true; this._setupObservers("-hidden", "-hiding", "showing"); this._followMousePosition(); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); return this._showTimeoutId = this.setTimeout(this.bound.show, this.options.delay || 0); }; Opentip.prototype.show = function() { var _this = this; this._abortHiding(); if (this.visible) { return; } this._clearTimeouts(); if (!this._triggerElementExists()) { return this.deactivate(); } this.debug("Showing now."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._hideGroup(this.options.group, this); } this.visible = true; this.preparingToShow = false; if (this.tooltipElement == null) { this._buildElements(); } this._updateElementContent(); if (this.options.ajax && (!this.loaded || !this.options.cache)) { this._loadAjax(); } this._searchAndActivateCloseButtons(); this._startEnsureTriggerElement(); this.adapter.css(this.container, { zIndex: Opentip.lastZIndex++ }); this._setupObservers("-hidden", "-hiding", "-showing", "-visible", "showing", "visible"); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); this.adapter.removeClass(this.container, this["class"].hiding); this.adapter.removeClass(this.container, this["class"].hidden); this.adapter.addClass(this.container, this["class"].goingToShow); this.setCss3Style(this.container, { transitionDuration: "0s" }); this.defer(function() { var delay; if (!_this.visible || _this.preparingToHide) { return; } _this.adapter.removeClass(_this.container, _this["class"].goingToShow); _this.adapter.addClass(_this.container, _this["class"].showing); delay = 0; if (_this.options.showEffect && _this.options.showEffectDuration) { delay = _this.options.showEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + delay + "s" }); _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].showing); return _this.adapter.addClass(_this.container, _this["class"].visible); }, delay); return _this._activateFirstInput(); }); return this._draw(); }; Opentip.prototype._abortShowing = function() { if (this.preparingToShow) { this.debug("Aborting showing."); this._clearTimeouts(); this._stopFollowingMousePosition(); this.preparingToShow = false; return this._setupObservers("-showing", "-visible", "hiding", "hidden"); } }; Opentip.prototype.prepareToHide = function() { this._abortShowing(); this._abortHiding(); if (!this.visible) { return; } this.debug("Hiding in " + this.options.hideDelay + "s"); this.preparingToHide = true; this._setupObservers("-showing", "visible", "-hidden", "hiding"); return this._hideTimeoutId = this.setTimeout(this.bound.hide, this.options.hideDelay); }; Opentip.prototype.hide = function() { var _this = this; this._abortShowing(); if (!this.visible) { return; } this._clearTimeouts(); this.debug("Hiding!"); this.visible = false; this.preparingToHide = false; this._stopEnsureTriggerElement(); this._setupObservers("-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden"); if (!this.options.fixed) { this._stopFollowingMousePosition(); } if (!this.container) { return; } this.adapter.removeClass(this.container, this["class"].visible); this.adapter.removeClass(this.container, this["class"].showing); this.adapter.addClass(this.container, this["class"].goingToHide); this.setCss3Style(this.container, { transitionDuration: "0s" }); return this.defer(function() { var hideDelay; _this.adapter.removeClass(_this.container, _this["class"].goingToHide); _this.adapter.addClass(_this.container, _this["class"].hiding); hideDelay = 0; if (_this.options.hideEffect && _this.options.hideEffectDuration) { hideDelay = _this.options.hideEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + hideDelay + "s" }); return _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].hiding); _this.adapter.addClass(_this.container, _this["class"].hidden); _this.setCss3Style(_this.container, { transitionDuration: "0s" }); if (_this.options.removeElementsOnHide) { _this.debug("Removing HTML elements."); _this.adapter.remove(_this.container); delete _this.container; return delete _this.tooltipElement; } }, hideDelay); }); }; Opentip.prototype._abortHiding = function() { if (this.preparingToHide) { this.debug("Aborting hiding."); this._clearTimeouts(); this.preparingToHide = false; return this._setupObservers("-hiding", "showing", "visible"); } }; Opentip.prototype.reposition = function() { var position, stem, _ref, _this = this; position = this.getPosition(); if (position == null) { return; } stem = this.options.stem; if (this.options.containInViewport) { _ref = this._ensureViewportContainment(position), position = _ref.position, stem = _ref.stem; } if (this._positionsEqual(position, this.currentPosition)) { return; } if (!(!this.options.stem || stem.eql(this.currentStem))) { this.redraw = true; } this.currentPosition = position; this.currentStem = stem; this._draw(); this.adapter.css(this.container, { left: "" + position.left + "px", top: "" + position.top + "px" }); return this.defer(function() { var rawContainer, redrawFix; rawContainer = _this.adapter.unwrap(_this.container); rawContainer.style.visibility = "hidden"; redrawFix = rawContainer.offsetHeight; return rawContainer.style.visibility = "visible"; }); }; Opentip.prototype.getPosition = function(tipJoint, targetJoint, stem) { var additionalHorizontal, additionalVertical, offsetDistance, position, stemLength, targetDimensions, targetPosition, unwrappedTarget, _ref; if (!this.container) { return; } if (tipJoint == null) { tipJoint = this.options.tipJoint; } if (targetJoint == null) { targetJoint = this.options.targetJoint; } position = {}; if (this.options.target) { targetPosition = this.adapter.offset(this.options.target); targetDimensions = this.adapter.dimensions(this.options.target); position = targetPosition; if (targetJoint.right) { unwrappedTarget = this.adapter.unwrap(this.options.target); if (unwrappedTarget.getBoundingClientRect != null) { position.left = unwrappedTarget.getBoundingClientRect().right + ((_ref = window.pageXOffset) != null ? _ref : document.body.scrollLeft); } else { position.left += targetDimensions.width; } } else if (targetJoint.center) { position.left += Math.round(targetDimensions.width / 2); } if (targetJoint.bottom) { position.top += targetDimensions.height; } else if (targetJoint.middle) { position.top += Math.round(targetDimensions.height / 2); } if (this.options.borderWidth) { if (this.options.tipJoint.left) { position.left += this.options.borderWidth; } if (this.options.tipJoint.right) { position.left -= this.options.borderWidth; } if (this.options.tipJoint.top) { position.top += this.options.borderWidth; } else if (this.options.tipJoint.bottom) { position.top -= this.options.borderWidth; } } } else { if (this.initialMousePosition) { position = { top: this.initialMousePosition.y, left: this.initialMousePosition.x }; } else { position = { top: mousePosition.y, left: mousePosition.x }; } } if (this.options.autoOffset) { stemLength = this.options.stem ? this.options.stemLength : 0; offsetDistance = stemLength && this.options.fixed ? 2 : 10; additionalHorizontal = tipJoint.middle && !this.options.fixed ? 15 : 0; additionalVertical = tipJoint.center && !this.options.fixed ? 15 : 0; if (tipJoint.right) { position.left -= offsetDistance + additionalHorizontal; } else if (tipJoint.left) { position.left += offsetDistance + additionalHorizontal; } if (tipJoint.bottom) { position.top -= offsetDistance + additionalVertical; } else if (tipJoint.top) { position.top += offsetDistance + additionalVertical; } if (stemLength) { if (stem == null) { stem = this.options.stem; } if (stem.right) { position.left -= stemLength; } else if (stem.left) { position.left += stemLength; } if (stem.bottom) { position.top -= stemLength; } else if (stem.top) { position.top += stemLength; } } } position.left += this.options.offset[0]; position.top += this.options.offset[1]; if (tipJoint.right) { position.left -= this.dimensions.width; } else if (tipJoint.center) { position.left -= Math.round(this.dimensions.width / 2); } if (tipJoint.bottom) { position.top -= this.dimensions.height; } else if (tipJoint.middle) { position.top -= Math.round(this.dimensions.height / 2); } return position; }; Opentip.prototype._ensureViewportContainment = function(position) { var needsRepositioning, newSticksOut, originals, revertedX, revertedY, scrollOffset, stem, sticksOut, targetJoint, tipJoint, viewportDimensions, viewportPosition; stem = this.options.stem; originals = { position: position, stem: stem }; if (!(this.visible && position)) { return originals; } sticksOut = this._sticksOut(position); if (!(sticksOut[0] || sticksOut[1])) { return originals; } tipJoint = new Opentip.Joint(this.options.tipJoint); if (this.options.targetJoint) { targetJoint = new Opentip.Joint(this.options.targetJoint); } scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); viewportPosition = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; needsRepositioning = false; if (viewportDimensions.width >= this.dimensions.width) { if (sticksOut[0]) { needsRepositioning = true; switch (sticksOut[0]) { case this.STICKS_OUT_LEFT: tipJoint.setHorizontal("left"); if (this.options.targetJoint) { targetJoint.setHorizontal("right"); } break; case this.STICKS_OUT_RIGHT: tipJoint.setHorizontal("right"); if (this.options.targetJoint) { targetJoint.setHorizontal("left"); } } } } if (viewportDimensions.height >= this.dimensions.height) { if (sticksOut[1]) { needsRepositioning = true; switch (sticksOut[1]) { case this.STICKS_OUT_TOP: tipJoint.setVertical("top"); if (this.options.targetJoint) { targetJoint.setVertical("bottom"); } break; case this.STICKS_OUT_BOTTOM: tipJoint.setVertical("bottom"); if (this.options.targetJoint) { targetJoint.setVertical("top"); } } } } if (!needsRepositioning) { return originals; } if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); newSticksOut = this._sticksOut(position); revertedX = false; revertedY = false; if (newSticksOut[0] && (newSticksOut[0] !== sticksOut[0])) { revertedX = true; tipJoint.setHorizontal(this.options.tipJoint.horizontal); if (this.options.targetJoint) { targetJoint.setHorizontal(this.options.targetJoint.horizontal); } } if (newSticksOut[1] && (newSticksOut[1] !== sticksOut[1])) { revertedY = true; tipJoint.setVertical(this.options.tipJoint.vertical); if (this.options.targetJoint) { targetJoint.setVertical(this.options.targetJoint.vertical); } } if (revertedX && revertedY) { return originals; } if (revertedX || revertedY) { if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); } return { position: position, stem: stem }; }; Opentip.prototype._sticksOut = function(position) { var positionOffset, scrollOffset, sticksOut, viewportDimensions; scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); positionOffset = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; sticksOut = [false, false]; if (positionOffset[0] < 0) { sticksOut[0] = this.STICKS_OUT_LEFT; } else if (positionOffset[0] + this.dimensions.width > viewportDimensions.width) { sticksOut[0] = this.STICKS_OUT_RIGHT; } if (positionOffset[1] < 0) { sticksOut[1] = this.STICKS_OUT_TOP; } else if (positionOffset[1] + this.dimensions.height > viewportDimensions.height) { sticksOut[1] = this.STICKS_OUT_BOTTOM; } return sticksOut; }; Opentip.prototype._draw = function() { var backgroundCanvas, bulge, canvasDimensions, canvasPosition, closeButton, closeButtonInner, closeButtonOuter, ctx, drawCorner, drawLine, hb, position, stemBase, stemLength, _i, _len, _ref, _ref1, _ref2, _this = this; if (!(this.backgroundCanvas && this.redraw)) { return; } this.debug("Drawing background."); this.redraw = false; if (this.currentStem) { _ref = ["top", "right", "bottom", "left"]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { position = _ref[_i]; this.adapter.removeClass(this.container, "stem-" + position); } this.adapter.addClass(this.container, "stem-" + this.currentStem.horizontal); this.adapter.addClass(this.container, "stem-" + this.currentStem.vertical); } closeButtonInner = [0, 0]; closeButtonOuter = [0, 0]; if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { closeButton = new Opentip.Joint(((_ref1 = this.currentStem) != null ? _ref1.toString() : void 0) === "top right" ? "top left" : "top right"); closeButtonInner = [this.options.closeButtonRadius + this.options.closeButtonOffset[0], this.options.closeButtonRadius + this.options.closeButtonOffset[1]]; closeButtonOuter = [this.options.closeButtonRadius - this.options.closeButtonOffset[0], this.options.closeButtonRadius - this.options.closeButtonOffset[1]]; } canvasDimensions = this.adapter.clone(this.dimensions); canvasPosition = [0, 0]; if (this.options.borderWidth) { canvasDimensions.width += this.options.borderWidth * 2; canvasDimensions.height += this.options.borderWidth * 2; canvasPosition[0] -= this.options.borderWidth; canvasPosition[1] -= this.options.borderWidth; } if (this.options.shadow) { canvasDimensions.width += this.options.shadowBlur * 2; canvasDimensions.width += Math.max(0, this.options.shadowOffset[0] - this.options.shadowBlur * 2); canvasDimensions.height += this.options.shadowBlur * 2; canvasDimensions.height += Math.max(0, this.options.shadowOffset[1] - this.options.shadowBlur * 2); canvasPosition[0] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[0]); canvasPosition[1] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[1]); } bulge = { left: 0, right: 0, top: 0, bottom: 0 }; if (this.currentStem) { if (this.currentStem.left) { bulge.left = this.options.stemLength; } else if (this.currentStem.right) { bulge.right = this.options.stemLength; } if (this.currentStem.top) { bulge.top = this.options.stemLength; } else if (this.currentStem.bottom) { bulge.bottom = this.options.stemLength; } } if (closeButton) { if (closeButton.left) { bulge.left = Math.max(bulge.left, closeButtonOuter[0]); } else if (closeButton.right) { bulge.right = Math.max(bulge.right, closeButtonOuter[0]); } if (closeButton.top) { bulge.top = Math.max(bulge.top, closeButtonOuter[1]); } else if (closeButton.bottom) { bulge.bottom = Math.max(bulge.bottom, closeButtonOuter[1]); } } canvasDimensions.width += bulge.left + bulge.right; canvasDimensions.height += bulge.top + bulge.bottom; canvasPosition[0] -= bulge.left; canvasPosition[1] -= bulge.top; if (this.currentStem && this.options.borderWidth) { _ref2 = this._getPathStemMeasures(this.options.stemBase, this.options.stemLength, this.options.borderWidth), stemLength = _ref2.stemLength, stemBase = _ref2.stemBase; } backgroundCanvas = this.adapter.unwrap(this.backgroundCanvas); backgroundCanvas.width = canvasDimensions.width; backgroundCanvas.height = canvasDimensions.height; this.adapter.css(this.backgroundCanvas, { width: "" + backgroundCanvas.width + "px", height: "" + backgroundCanvas.height + "px", left: "" + canvasPosition[0] + "px", top: "" + canvasPosition[1] + "px" }); ctx = backgroundCanvas.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height); ctx.beginPath(); ctx.fillStyle = this._getColor(ctx, this.dimensions, this.options.background, this.options.backgroundGradientHorizontal); ctx.lineJoin = "miter"; ctx.miterLimit = 500; hb = this.options.borderWidth / 2; if (this.options.borderWidth) { ctx.strokeStyle = this.options.borderColor; ctx.lineWidth = this.options.borderWidth; } else { stemLength = this.options.stemLength; stemBase = this.options.stemBase; } if (stemBase == null) { stemBase = 0; } drawLine = function(length, stem, first) { if (first) { ctx.moveTo(Math.max(stemBase, _this.options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb); } if (stem) { ctx.lineTo(length / 2 - stemBase / 2, -hb); ctx.lineTo(length / 2, -stemLength - hb); return ctx.lineTo(length / 2 + stemBase / 2, -hb); } }; drawCorner = function(stem, closeButton, i) { var angle1, angle2, innerWidth, offset; if (stem) { ctx.lineTo(-stemBase + hb, 0 - hb); ctx.lineTo(stemLength + hb, -stemLength - hb); return ctx.lineTo(hb, stemBase - hb); } else if (closeButton) { offset = _this.options.closeButtonOffset; innerWidth = closeButtonInner[0]; if (i % 2 !== 0) { offset = [offset[1], offset[0]]; innerWidth = closeButtonInner[1]; } angle1 = Math.acos(offset[1] / _this.options.closeButtonRadius); angle2 = Math.acos(offset[0] / _this.options.closeButtonRadius); ctx.lineTo(-innerWidth + hb, -hb); return ctx.arc(hb - offset[0], -hb + offset[1], _this.options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, false); } else { ctx.lineTo(-_this.options.borderRadius + hb, -hb); return ctx.quadraticCurveTo(hb, -hb, hb, _this.options.borderRadius - hb); } }; ctx.translate(-canvasPosition[0], -canvasPosition[1]); ctx.save(); (function() { var cornerStem, i, lineLength, lineStem, positionIdx, positionX, positionY, rotation, _j, _ref3, _results; _results = []; for (i = _j = 0, _ref3 = Opentip.positions.length / 2; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) { positionIdx = i * 2; positionX = i === 0 || i === 3 ? 0 : _this.dimensions.width; positionY = i < 2 ? 0 : _this.dimensions.height; rotation = (Math.PI / 2) * i; lineLength = i % 2 === 0 ? _this.dimensions.width : _this.dimensions.height; lineStem = new Opentip.Joint(Opentip.positions[positionIdx]); cornerStem = new Opentip.Joint(Opentip.positions[positionIdx + 1]); ctx.save(); ctx.translate(positionX, positionY); ctx.rotate(rotation); drawLine(lineLength, lineStem.eql(_this.currentStem), i === 0); ctx.translate(lineLength, 0); drawCorner(cornerStem.eql(_this.currentStem), cornerStem.eql(closeButton), i); _results.push(ctx.restore()); } return _results; })(); ctx.closePath(); ctx.save(); if (this.options.shadow) { ctx.shadowColor = this.options.shadowColor; ctx.shadowBlur = this.options.shadowBlur; ctx.shadowOffsetX = this.options.shadowOffset[0]; ctx.shadowOffsetY = this.options.shadowOffset[1]; } ctx.fill(); ctx.restore(); if (this.options.borderWidth) { ctx.stroke(); } ctx.restore(); if (closeButton) { return (function() { var crossCenter, crossHeight, crossWidth, hcs, linkCenter; crossWidth = crossHeight = _this.options.closeButtonRadius * 2; if (closeButton.toString() === "top right") { linkCenter = [_this.dimensions.width - _this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] + hb, linkCenter[1] - hb]; } else { linkCenter = [_this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] - hb, linkCenter[1] - hb]; } ctx.translate(crossCenter[0], crossCenter[1]); hcs = _this.options.closeButtonCrossSize / 2; ctx.save(); ctx.beginPath(); ctx.strokeStyle = _this.options.closeButtonCrossColor; ctx.lineWidth = _this.options.closeButtonCrossLineWidth; ctx.lineCap = "round"; ctx.moveTo(-hcs, -hcs); ctx.lineTo(hcs, hcs); ctx.stroke(); ctx.beginPath(); ctx.moveTo(hcs, -hcs); ctx.lineTo(-hcs, hcs); ctx.stroke(); ctx.restore(); return _this.adapter.css(_this.closeButtonElement, { left: "" + (linkCenter[0] - hcs - _this.options.closeButtonLinkOverscan) + "px", top: "" + (linkCenter[1] - hcs - _this.options.closeButtonLinkOverscan) + "px", width: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px", height: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px" }); })(); } }; Opentip.prototype._getPathStemMeasures = function(outerStemBase, outerStemLength, borderWidth) { var angle, distanceBetweenTips, halfAngle, hb, rhombusSide, stemBase, stemLength; hb = borderWidth / 2; halfAngle = Math.atan((outerStemBase / 2) / outerStemLength); angle = halfAngle * 2; rhombusSide = hb / Math.sin(angle); distanceBetweenTips = 2 * rhombusSide * Math.cos(halfAngle); stemLength = hb + outerStemLength - distanceBetweenTips; if (stemLength < 0) { throw new Error("Sorry but your stemLength / stemBase ratio is strange."); } stemBase = (Math.tan(halfAngle) * stemLength) * 2; return { stemLength: stemLength, stemBase: stemBase }; }; Opentip.prototype._getColor = function(ctx, dimensions, color, horizontal) { var colorStop, gradient, i, _i, _len; if (horizontal == null) { horizontal = false; } if (typeof color === "string") { return color; } if (horizontal) { gradient = ctx.createLinearGradient(0, 0, dimensions.width, 0); } else { gradient = ctx.createLinearGradient(0, 0, 0, dimensions.height); } for (i = _i = 0, _len = color.length; _i < _len; i = ++_i) { colorStop = color[i]; gradient.addColorStop(colorStop[0], colorStop[1]); } return gradient; }; Opentip.prototype._searchAndActivateCloseButtons = function() { var element, _i, _len, _ref; _ref = this.adapter.findAll(this.container, "." + this["class"].close); for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; this.hideTriggers.push({ element: this.adapter.wrap(element), event: "click" }); } if (this.currentObservers.showing) { this._setupObservers("-showing", "showing"); } if (this.currentObservers.visible) { return this._setupObservers("-visible", "visible"); } }; Opentip.prototype._activateFirstInput = function() { var input; input = this.adapter.unwrap(this.adapter.find(this.container, "input, textarea")); return input != null ? typeof input.focus === "function" ? input.focus() : void 0 : void 0; }; Opentip.prototype._followMousePosition = function() { if (!this.options.fixed) { return Opentip._observeMousePosition(this.bound.reposition); } }; Opentip.prototype._stopFollowingMousePosition = function() { if (!this.options.fixed) { return Opentip._stopObservingMousePosition(this.bound.reposition); } }; Opentip.prototype._clearShowTimeout = function() { return clearTimeout(this._showTimeoutId); }; Opentip.prototype._clearHideTimeout = function() { return clearTimeout(this._hideTimeoutId); }; Opentip.prototype._clearTimeouts = function() { clearTimeout(this._visibilityStateTimeoutId); this._clearShowTimeout(); return this._clearHideTimeout(); }; Opentip.prototype._triggerElementExists = function() { var el; el = this.adapter.unwrap(this.triggerElement); while (el.parentNode) { if (el.parentNode.tagName === "BODY") { return true; } el = el.parentNode; } return false; }; Opentip.prototype._loadAjax = function() { var _this = this; if (this.loading) { return; } this.loaded = false; this.loading = true; this.adapter.addClass(this.container, this["class"].loading); this.setContent(""); this.debug("Loading content from " + this.options.ajax); return this.adapter.ajax({ url: this.options.ajax, method: this.options.ajaxMethod, onSuccess: function(responseText) { _this.debug("Loading successful."); _this.adapter.removeClass(_this.container, _this["class"].loading); return _this.setContent(responseText); }, onError: function(error) { var message; message = _this.options.ajaxErrorMessage; _this.debug(message, error); _this.setContent(message); return _this.adapter.addClass(_this.container, _this["class"].ajaxError); }, onComplete: function() { _this.adapter.removeClass(_this.container, _this["class"].loading); _this.loading = false; _this.loaded = true; _this._searchAndActivateCloseButtons(); _this._activateFirstInput(); return _this.reposition(); } }); }; Opentip.prototype._ensureTriggerElement = function() { if (!this._triggerElementExists()) { this.deactivate(); return this._stopEnsureTriggerElement(); } }; Opentip.prototype._ensureTriggerElementInterval = 1000; Opentip.prototype._startEnsureTriggerElement = function() { var _this = this; return this._ensureTriggerElementTimeoutId = setInterval((function() { return _this._ensureTriggerElement(); }), this._ensureTriggerElementInterval); }; Opentip.prototype._stopEnsureTriggerElement = function() { return clearInterval(this._ensureTriggerElementTimeoutId); }; return Opentip; })(); vendors = ["khtml", "ms", "o", "moz", "webkit"]; Opentip.prototype.setCss3Style = function(element, styles) { var prop, value, vendor, vendorProp, _results; element = this.adapter.unwrap(element); _results = []; for (prop in styles) { if (!__hasProp.call(styles, prop)) continue; value = styles[prop]; if (element.style[prop] != null) { _results.push(element.style[prop] = value); } else { _results.push((function() { var _i, _len, _results1; _results1 = []; for (_i = 0, _len = vendors.length; _i < _len; _i++) { vendor = vendors[_i]; vendorProp = "" + (this.ucfirst(vendor)) + (this.ucfirst(prop)); if (element.style[vendorProp] != null) { _results1.push(element.style[vendorProp] = value); } else { _results1.push(void 0); } } return _results1; }).call(this)); } } return _results; }; Opentip.prototype.defer = function(func) { return setTimeout(func, 0); }; Opentip.prototype.setTimeout = function(func, seconds) { return setTimeout(func, seconds ? seconds * 1000 : 0); }; Opentip.prototype.ucfirst = function(string) { if (string == null) { return ""; } return string.charAt(0).toUpperCase() + string.slice(1); }; Opentip.prototype.dasherize = function(string) { return string.replace(/([A-Z])/g, function(_, character) { return "-" + (character.toLowerCase()); }); }; mousePositionObservers = []; mousePosition = { x: 0, y: 0 }; mouseMoved = function(e) { var observer, _i, _len, _results; mousePosition = Opentip.adapter.mousePosition(e); _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; _results.push(observer()); } return _results; }; Opentip.followMousePosition = function() { return Opentip.adapter.observe(document.body, "mousemove", mouseMoved); }; Opentip._observeMousePosition = function(observer) { return mousePositionObservers.push(observer); }; Opentip._stopObservingMousePosition = function(removeObserver) { var observer; return mousePositionObservers = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; if (observer !== removeObserver) { _results.push(observer); } } return _results; })(); }; Opentip.Joint = (function() { function Joint(pointerString) { if (pointerString == null) { return; } if (pointerString instanceof Opentip.Joint) { pointerString = pointerString.toString(); } this.set(pointerString); this; } Joint.prototype.set = function(string) { string = string.toLowerCase(); this.setHorizontal(string); this.setVertical(string); return this; }; Joint.prototype.setHorizontal = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["left", "center", "right"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.horizontal = i.toLowerCase(); } } if (this.horizontal == null) { this.horizontal = "center"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.horizontal === i ? i : void 0); } return _results; }; Joint.prototype.setVertical = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["top", "middle", "bottom"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.vertical = i.toLowerCase(); } } if (this.vertical == null) { this.vertical = "middle"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.vertical === i ? i : void 0); } return _results; }; Joint.prototype.eql = function(pointer) { return (pointer != null) && this.horizontal === pointer.horizontal && this.vertical === pointer.vertical; }; Joint.prototype.flip = function() { var flippedIndex, positionIdx; positionIdx = Opentip.position[this.toString(true)]; flippedIndex = (positionIdx + 4) % 8; this.set(Opentip.positions[flippedIndex]); return this; }; Joint.prototype.toString = function(camelized) { var horizontal, vertical; if (camelized == null) { camelized = false; } vertical = this.vertical === "middle" ? "" : this.vertical; horizontal = this.horizontal === "center" ? "" : this.horizontal; if (vertical && horizontal) { if (camelized) { horizontal = Opentip.prototype.ucfirst(horizontal); } else { horizontal = " " + horizontal; } } return "" + vertical + horizontal; }; return Joint; })(); Opentip.prototype._positionsEqual = function(posA, posB) { return (posA != null) && (posB != null) && posA.left === posB.left && posA.top === posB.top; }; Opentip.prototype._dimensionsEqual = function(dimA, dimB) { return (dimA != null) && (dimB != null) && dimA.width === dimB.width && dimA.height === dimB.height; }; Opentip.prototype.debug = function() { var args; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (Opentip.debug && ((typeof console !== "undefined" && console !== null ? console.debug : void 0) != null)) { args.unshift("#" + this.id + " |"); return console.debug.apply(console, args); } }; Opentip.findElements = function() { var adapter, content, element, optionName, optionValue, options, _i, _len, _ref, _results; adapter = Opentip.adapter; _ref = adapter.findAll(document.body, "[data-ot]"); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; options = {}; content = adapter.data(element, "ot"); if (content === "" || content === "true" || content === "yes") { content = adapter.attr(element, "title"); adapter.attr(element, "title", ""); } content = content || ""; for (optionName in Opentip.styles.standard) { optionValue = adapter.data(element, "ot" + (Opentip.prototype.ucfirst(optionName))); if (optionValue != null) { if (optionValue === "yes" || optionValue === "true" || optionValue === "on") { optionValue = true; } else if (optionValue === "no" || optionValue === "false" || optionValue === "off") { optionValue = false; } options[optionName] = optionValue; } } _results.push(new Opentip(element, content, options)); } return _results; }; Opentip.version = "2.4.6"; Opentip.debug = false; Opentip.lastId = 0; Opentip.lastZIndex = 100; Opentip.tips = []; Opentip._abortShowingGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip._abortShowing()); } else { _results.push(void 0); } } return _results; }; Opentip._hideGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip.hide()); } else { _results.push(void 0); } } return _results; }; Opentip.adapters = {}; Opentip.adapter = null; firstAdapter = true; Opentip.addAdapter = function(adapter) { Opentip.adapters[adapter.name] = adapter; if (firstAdapter) { Opentip.adapter = adapter; adapter.domReady(Opentip.findElements); adapter.domReady(Opentip.followMousePosition); return firstAdapter = false; } }; Opentip.positions = ["top", "topRight", "right", "bottomRight", "bottom", "bottomLeft", "left", "topLeft"]; Opentip.position = {}; _ref = Opentip.positions; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { position = _ref[i]; Opentip.position[position] = i; } Opentip.styles = { standard: { "extends": null, title: void 0, escapeTitle: true, escapeContent: false, className: "standard", stem: true, delay: null, hideDelay: 0.1, fixed: false, showOn: "mouseover", hideTrigger: "trigger", hideTriggers: [], hideOn: null, removeElementsOnHide: false, offset: [0, 0], containInViewport: true, autoOffset: true, showEffect: "appear", hideEffect: "fade", showEffectDuration: 0.3, hideEffectDuration: 0.2, stemLength: 5, stemBase: 8, tipJoint: "top left", target: null, targetJoint: null, cache: true, ajax: false, ajaxMethod: "GET", ajaxErrorMessage: "There was a problem downloading the content.", group: null, style: null, background: "#fff18f", backgroundGradientHorizontal: false, closeButtonOffset: [5, 5], closeButtonRadius: 7, closeButtonCrossSize: 4, closeButtonCrossColor: "#d2c35b", closeButtonCrossLineWidth: 1.5, closeButtonLinkOverscan: 6, borderRadius: 5, borderWidth: 1, borderColor: "#f2e37b", shadow: true, shadowBlur: 10, shadowOffset: [3, 3], shadowColor: "rgba(0, 0, 0, 0.1)" }, glass: { "extends": "standard", className: "glass", background: [[0, "rgba(252, 252, 252, 0.8)"], [0.5, "rgba(255, 255, 255, 0.8)"], [0.5, "rgba(250, 250, 250, 0.9)"], [1, "rgba(245, 245, 245, 0.9)"]], borderColor: "#eee", closeButtonCrossColor: "rgba(0, 0, 0, 0.2)", borderRadius: 15, closeButtonRadius: 10, closeButtonOffset: [8, 8] }, dark: { "extends": "standard", className: "dark", borderRadius: 13, borderColor: "#444", closeButtonCrossColor: "rgba(240, 240, 240, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(30, 30, 30, 0.7)"], [0.5, "rgba(30, 30, 30, 0.8)"], [0.5, "rgba(10, 10, 10, 0.8)"], [1, "rgba(10, 10, 10, 0.9)"]] }, alert: { "extends": "standard", className: "alert", borderRadius: 1, borderColor: "#AE0D11", closeButtonCrossColor: "rgba(255, 255, 255, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(203, 15, 19, 0.7)"], [0.5, "rgba(203, 15, 19, 0.8)"], [0.5, "rgba(189, 14, 18, 0.8)"], [1, "rgba(179, 14, 17, 0.9)"]] } }; Opentip.defaultStyle = "standard"; if (typeof module !== "undefined" && module !== null) { module.exports = Opentip; } else { window.Opentip = Opentip; } // Generated by CoffeeScript 1.4.0 var Adapter, __hasProp = {}.hasOwnProperty, __slice = [].slice; Adapter = (function() { var dataValues, lastDataId; function Adapter() {} Adapter.prototype.name = "native"; Adapter.prototype.domReady = function(callback) { var add, doc, done, init, poll, pre, rem, root, top, win, _ref; done = false; top = true; win = window; doc = document; if ((_ref = doc.readyState) === "complete" || _ref === "loaded") { return callback(); } root = doc.documentElement; add = (doc.addEventListener ? "addEventListener" : "attachEvent"); rem = (doc.addEventListener ? "removeEventListener" : "detachEvent"); pre = (doc.addEventListener ? "" : "on"); init = function(e) { if (e.type === "readystatechange" && doc.readyState !== "complete") { return; } (e.type === "load" ? win : doc)[rem](pre + e.type, init, false); if (!done) { done = true; return callback(); } }; poll = function() { try { root.doScroll("left"); } catch (e) { setTimeout(poll, 50); return; } return init("poll"); }; if (doc.readyState !== "complete") { if (doc.createEventObject && root.doScroll) { try { top = !win.frameElement; } catch (_error) {} if (top) { poll(); } } doc[add](pre + "DOMContentLoaded", init, false); doc[add](pre + "readystatechange", init, false); return win[add](pre + "load", init, false); } }; Adapter.prototype.create = function(htmlString) { var div; div = document.createElement("div"); div.innerHTML = htmlString; return this.wrap(div.childNodes); }; Adapter.prototype.wrap = function(element) { var el; if (!element) { element = []; } else if (typeof element === "string") { element = this.find(document.body, element); element = element ? [element] : []; } else if (element instanceof NodeList) { element = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = element.length; _i < _len; _i++) { el = element[_i]; _results.push(el); } return _results; })(); } else if (!(element instanceof Array)) { element = [element]; } return element; }; Adapter.prototype.unwrap = function(element) { return this.wrap(element)[0]; }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function(element, attr, value) { if (arguments.length === 3) { return this.unwrap(element).setAttribute(attr, value); } else { return this.unwrap(element).getAttribute(attr); } }; lastDataId = 0; dataValues = {}; Adapter.prototype.data = function(element, name, value) { var dataId; dataId = this.attr(element, "data-id"); if (!dataId) { dataId = ++lastDataId; this.attr(element, "data-id", dataId); dataValues[dataId] = {}; } if (arguments.length === 3) { return dataValues[dataId][name] = value; } else { value = dataValues[dataId][name]; if (value != null) { return value; } value = this.attr(element, "data-" + (Opentip.prototype.dasherize(name))); if (value) { dataValues[dataId][name] = value; } return value; } }; Adapter.prototype.find = function(element, selector) { return this.unwrap(element).querySelector(selector); }; Adapter.prototype.findAll = function(element, selector) { return this.unwrap(element).querySelectorAll(selector); }; Adapter.prototype.update = function(element, content, escape) { element = this.unwrap(element); if (escape) { element.innerHTML = ""; return element.appendChild(document.createTextNode(content)); } else { return element.innerHTML = content; } }; Adapter.prototype.append = function(element, child) { var unwrappedChild, unwrappedElement; unwrappedChild = this.unwrap(child); unwrappedElement = this.unwrap(element); return unwrappedElement.appendChild(unwrappedChild); }; Adapter.prototype.remove = function(element) { var parentNode; element = this.unwrap(element); parentNode = element.parentNode; if (parentNode != null) { return parentNode.removeChild(element); } }; Adapter.prototype.addClass = function(element, className) { return this.unwrap(element).classList.add(className); }; Adapter.prototype.removeClass = function(element, className) { return this.unwrap(element).classList.remove(className); }; Adapter.prototype.css = function(element, properties) { var key, value, _results; element = this.unwrap(this.wrap(element)); _results = []; for (key in properties) { if (!__hasProp.call(properties, key)) continue; value = properties[key]; _results.push(element.style[key] = value); } return _results; }; Adapter.prototype.dimensions = function(element) { var dimensions, revert; element = this.unwrap(this.wrap(element)); dimensions = { width: element.offsetWidth, height: element.offsetHeight }; if (!(dimensions.width && dimensions.height)) { revert = { position: element.style.position || '', visibility: element.style.visibility || '', display: element.style.display || '' }; this.css(element, { position: "absolute", visibility: "hidden", display: "block" }); dimensions = { width: element.offsetWidth, height: element.offsetHeight }; this.css(element, revert); } return dimensions; }; Adapter.prototype.scrollOffset = function() { return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; }; Adapter.prototype.viewportDimensions = function() { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; }; Adapter.prototype.mousePosition = function(e) { var pos; pos = { x: 0, y: 0 }; if (e == null) { e = window.event; } if (e == null) { return; } try { if (e.pageX || e.pageY) { pos.x = e.pageX; pos.y = e.pageY; } else if (e.clientX || e.clientY) { pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; } } catch (e) { } return pos; }; Adapter.prototype.offset = function(element) { var offset; element = this.unwrap(element); offset = { top: element.offsetTop, left: element.offsetLeft }; while (element = element.offsetParent) { offset.top += element.offsetTop; offset.left += element.offsetLeft; if (element !== document.body) { offset.top -= element.scrollTop; offset.left -= element.scrollLeft; } } return offset; }; Adapter.prototype.observe = function(element, eventName, observer) { return this.unwrap(element).addEventListener(eventName, observer, false); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return this.unwrap(element).removeEventListener(eventName, observer, false); }; Adapter.prototype.ajax = function(options) { var request, _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } if (window.XMLHttpRequest) { request = new XMLHttpRequest; } else if (window.ActiveXObject) { try { request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } } } if (!request) { throw new Error("Can't create XMLHttpRequest"); } request.onreadystatechange = function() { if (request.readyState === 4) { try { if (request.status === 200) { if (typeof options.onSuccess === "function") { options.onSuccess(request.responseText); } } else { if (typeof options.onError === "function") { options.onError("Server responded with status " + request.status); } } } catch (e) { if (typeof options.onError === "function") { options.onError(e.message); } } return typeof options.onComplete === "function" ? options.onComplete() : void 0; } }; request.open((_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET", options.url); return request.send(); }; Adapter.prototype.clone = function(object) { var key, newObject, val; newObject = {}; for (key in object) { if (!__hasProp.call(object, key)) continue; val = object[key]; newObject[key] = val; } return newObject; }; Adapter.prototype.extend = function() { var key, source, sources, target, val, _i, _len; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; for (_i = 0, _len = sources.length; _i < _len; _i++) { source = sources[_i]; for (key in source) { if (!__hasProp.call(source, key)) continue; val = source[key]; target[key] = val; } } return target; }; return Adapter; })(); Opentip.addAdapter(new Adapter); /* * classList.js: Cross-browser full element.classList implementation. * 2012-11-15 * * By Eli Grey, http://eligrey.com * Public Domain. * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. */ /*global self, document, DOMException */ /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) { (function (view) { "use strict"; if (!('HTMLElement' in view) && !('Element' in view)) return; var classListProp = "classList" , protoProp = "prototype" , elemCtrProto = (view.HTMLElement || view.Element)[protoProp] , objCtr = Object , strTrim = String[protoProp].trim || function () { return this.replace(/^\s+|\s+$/g, ""); } , arrIndexOf = Array[protoProp].indexOf || function (item) { var i = 0 , len = this.length ; for (; i < len; i++) { if (i in this && this[i] === item) { return i; } } return -1; } // Vendors: please allow content code to instantiate DOMExceptions , DOMEx = function (type, message) { this.name = type; this.code = DOMException[type]; this.message = message; } , checkTokenAndGetIndex = function (classList, token) { if (token === "") { throw new DOMEx( "SYNTAX_ERR" , "An invalid or illegal string was specified" ); } if (/\s/.test(token)) { throw new DOMEx( "INVALID_CHARACTER_ERR" , "String contains an invalid character" ); } return arrIndexOf.call(classList, token); } , ClassList = function (elem) { var trimmedClasses = strTrim.call(elem.className) , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [] , i = 0 , len = classes.length ; for (; i < len; i++) { this.push(classes[i]); } this._updateClassName = function () { elem.className = this.toString(); }; } , classListProto = ClassList[protoProp] = [] , classListGetter = function () { return new ClassList(this); } ; // Most DOMException implementations don't allow calling DOMException's toString() // on non-DOMExceptions. Error's toString() is sufficient here. DOMEx[protoProp] = Error[protoProp]; classListProto.item = function (i) { return this[i] || null; }; classListProto.contains = function (token) { token += ""; return checkTokenAndGetIndex(this, token) !== -1; }; classListProto.add = function () { var tokens = arguments , i = 0 , l = tokens.length , token , updated = false ; do { token = tokens[i] + ""; if (checkTokenAndGetIndex(this, token) === -1) { this.push(token); updated = true; } } while (++i < l); if (updated) { this._updateClassName(); } }; classListProto.remove = function () { var tokens = arguments , i = 0 , l = tokens.length , token , updated = false ; do { token = tokens[i] + ""; var index = checkTokenAndGetIndex(this, token); if (index !== -1) { this.splice(index, 1); updated = true; } } while (++i < l); if (updated) { this._updateClassName(); } }; classListProto.toggle = function (token, forse) { token += ""; var result = this.contains(token) , method = result ? forse !== true && "remove" : forse !== false && "add" ; if (method) { this[method](token); } return result; }; classListProto.toString = function () { return this.join(" "); }; if (objCtr.defineProperty) { var classListPropDesc = { get: classListGetter , enumerable: true , configurable: true }; try { objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); } catch (ex) { // IE 8 doesn't support enumerable:true if (ex.number === -0x7FF5EC54) { classListPropDesc.enumerable = false; objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); } } } else if (objCtr[protoProp].__defineGetter__) { elemCtrProto.__defineGetter__(classListProp, classListGetter); } }(self)); } !window.addEventListener && (function (WindowPrototype, DocumentPrototype, ElementPrototype, addEventListener, removeEventListener, dispatchEvent, registry) { WindowPrototype[addEventListener] = DocumentPrototype[addEventListener] = ElementPrototype[addEventListener] = function (type, listener) { var target = this; registry.unshift([target, type, listener, function (event) { event.currentTarget = target; event.preventDefault = function () { event.returnValue = false }; event.stopPropagation = function () { event.cancelBubble = true }; event.target = event.srcElement || target; listener.call(target, event); }]); this.attachEvent("on" + type, registry[0][3]); }; WindowPrototype[removeEventListener] = DocumentPrototype[removeEventListener] = ElementPrototype[removeEventListener] = function (type, listener) { for (var index = 0, register; register = registry[index]; ++index) { if (register[0] == this && register[1] == type && register[2] == listener) { return this.detachEvent("on" + type, registry.splice(index, 1)[0][3]); } } }; WindowPrototype[dispatchEvent] = DocumentPrototype[dispatchEvent] = ElementPrototype[dispatchEvent] = function (eventObject) { return this.fireEvent("on" + eventObject.type, eventObject); }; })(Window.prototype, HTMLDocument.prototype, Element.prototype, "addEventListener", "removeEventListener", "dispatchEvent", []);opentip-2.4.6/downloads/opentip-native.min.js000066400000000000000000001142401213277401600212620ustar00rootroot00000000000000// Opentip v2.4.6 // Copyright (c) 2009-2012 // www.opentip.org // MIT Licensed var Opentip,firstAdapter,i,mouseMoved,mousePosition,mousePositionObservers,position,vendors,_i,_len,_ref,__slice=[].slice,__indexOf=[].indexOf||function(t){for(var e=0,i=this.length;i>e;e++)if(e in this&&this[e]===t)return e;return-1},__hasProp={}.hasOwnProperty;for(Opentip=function(){function t(e,i,o,s){var n,r,a,h,p,l,d,u,c,g,f,m,v,w,b=this;if(this.id=++t.lastId,this.debug("Creating Opentip."),t.tips.push(this),this.adapter=t.adapter,n=this.adapter.data(e,"opentips")||[],n.push(this),this.adapter.data(e,"opentips",n),this.triggerElement=this.adapter.wrap(e),this.triggerElement.length>1)throw Error("You can't call Opentip on multiple elements.");if(1>this.triggerElement.length)throw Error("Invalid element.");this.loaded=!1,this.loading=!1,this.visible=!1,this.waitingToShow=!1,this.waitingToHide=!1,this.currentPosition={left:0,top:0},this.dimensions={width:100,height:50},this.content="",this.redraw=!0,this.currentObservers={showing:!1,visible:!1,hiding:!1,hidden:!1},s=this.adapter.clone(s),typeof i=="object"?(s=i,i=o=void 0):typeof o=="object"&&(s=o,o=void 0),o!=null&&(s.title=o),i!=null&&this.setContent(i),s["extends"]==null&&(s["extends"]=s.style!=null?s.style:t.defaultStyle),h=[s],w=s;while(w["extends"]){if(l=w["extends"],w=t.styles[l],w==null)throw Error("Invalid style: "+l);h.unshift(w),w["extends"]==null&&l!=="standard"&&(w["extends"]="standard")}for(s=(f=this.adapter).extend.apply(f,[{}].concat(__slice.call(h))),s.hideTriggers=function(){var t,e,i,o;for(i=s.hideTriggers,o=[],t=0,e=i.length;e>t;t++)r=i[t],o.push(r);return o}(),s.hideTrigger&&s.hideTriggers.length===0&&s.hideTriggers.push(s.hideTrigger),m=["tipJoint","targetJoint","stem"],d=0,c=m.length;c>d;d++)p=m[d],s[p]&&typeof s[p]=="string"&&(s[p]=new t.Joint(s[p]));for(!s.ajax||s.ajax!==!0&&s.ajax||(s.ajax=this.adapter.tagName(this.triggerElement)==="A"?this.adapter.attr(this.triggerElement,"href"):!1),s.showOn==="click"&&this.adapter.tagName(this.triggerElement)==="A"&&this.adapter.observe(this.triggerElement,"click",function(t){return t.preventDefault(),t.stopPropagation(),t.stopped=!0}),s.target&&(s.fixed=!0),s.stem===!0&&(s.stem=new t.Joint(s.tipJoint)),s.target===!0?s.target=this.triggerElement:s.target&&(s.target=this.adapter.wrap(s.target)),this.currentStem=s.stem,s.delay==null&&(s.delay=s.showOn==="mouseover"?.2:0),s.targetJoint==null&&(s.targetJoint=new t.Joint(s.tipJoint).flip()),this.showTriggers=[],this.showTriggersWhenVisible=[],this.hideTriggers=[],s.showOn&&s.showOn!=="creation"&&this.showTriggers.push({element:this.triggerElement,event:s.showOn}),s.ajaxCache!=null&&(s.cache=s.ajaxCache,delete s.ajaxCache),this.options=s,this.bound={},v=["prepareToShow","prepareToHide","show","hide","reposition"],u=0,g=v.length;g>u;u++)a=v[u],this.bound[a]=function(t){return function(){return b[t].apply(b,arguments)}}(a);this.adapter.domReady(function(){return b.activate(),b.options.showOn==="creation"?b.prepareToShow():void 0})}return t.prototype.STICKS_OUT_TOP=1,t.prototype.STICKS_OUT_BOTTOM=2,t.prototype.STICKS_OUT_LEFT=1,t.prototype.STICKS_OUT_RIGHT=2,t.prototype["class"]={container:"opentip-container",opentip:"opentip",header:"ot-header",content:"ot-content",loadingIndicator:"ot-loading-indicator",close:"ot-close",goingToHide:"ot-going-to-hide",hidden:"ot-hidden",hiding:"ot-hiding",goingToShow:"ot-going-to-show",showing:"ot-showing",visible:"ot-visible",loading:"ot-loading",ajaxError:"ot-ajax-error",fixed:"ot-fixed",showEffectPrefix:"ot-show-effect-",hideEffectPrefix:"ot-hide-effect-",stylePrefix:"style-"},t.prototype._setup=function(){var t,e,i,o,s,n,r,a,h,p,l;for(this.debug("Setting up the tooltip."),this._buildContainer(),this.hideTriggers=[],h=this.options.hideTriggers,o=s=0,r=h.length;r>s;o=++s){if(e=h[o],i=null,t=this.options.hideOn instanceof Array?this.options.hideOn[o]:this.options.hideOn,typeof e=="string")switch(e){case"trigger":t=t||"mouseout",i=this.triggerElement;break;case"tip":t=t||"mouseover",i=this.container;break;case"target":t=t||"mouseover",i=this.options.target;break;case"closeButton":break;default:throw Error("Unknown hide trigger: "+e+".")}else t=t||"mouseover",i=this.adapter.wrap(e);i&&this.hideTriggers.push({element:i,event:t,original:e})}for(p=this.hideTriggers,l=[],n=0,a=p.length;a>n;n++)e=p[n],l.push(this.showTriggersWhenVisible.push({element:e.element,event:"mouseover"}));return l},t.prototype._buildContainer=function(){return this.container=this.adapter.create('
'),this.adapter.css(this.container,{position:"absolute"}),this.options.ajax&&this.adapter.addClass(this.container,this["class"].loading),this.options.fixed&&this.adapter.addClass(this.container,this["class"].fixed),this.options.showEffect&&this.adapter.addClass(this.container,""+this["class"].showEffectPrefix+this.options.showEffect),this.options.hideEffect?this.adapter.addClass(this.container,""+this["class"].hideEffectPrefix+this.options.hideEffect):void 0},t.prototype._buildElements=function(){var t,e;return this.tooltipElement=this.adapter.create('
'),this.backgroundCanvas=this.adapter.wrap(document.createElement("canvas")),this.adapter.css(this.backgroundCanvas,{position:"absolute"}),typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager!==null&&G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)),t=this.adapter.find(this.tooltipElement,"."+this["class"].header),this.options.title&&(e=this.adapter.create("

"),this.adapter.update(e,this.options.title,this.options.escapeTitle),this.adapter.append(t,e)),this.options.ajax&&!this.loaded&&this.adapter.append(this.tooltipElement,this.adapter.create('
↻
')),__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(this.closeButtonElement=this.adapter.create('Close'),this.adapter.append(t,this.closeButtonElement)),this.adapter.append(this.container,this.backgroundCanvas),this.adapter.append(this.container,this.tooltipElement),this.adapter.append(document.body,this.container),this._newContent=!0,this.redraw=!0},t.prototype.setContent=function(t){return this.content=t,this._newContent=!0,typeof this.content=="function"?(this._contentFunction=this.content,this.content=""):this._contentFunction=null,this.visible?this._updateElementContent():void 0},t.prototype._updateElementContent=function(){var t;return(this._newContent||!this.options.cache&&this._contentFunction)&&(t=this.adapter.find(this.container,"."+this["class"].content),t!=null&&(this._contentFunction&&(this.debug("Executing content function."),this.content=this._contentFunction(this)),this.adapter.update(t,this.content,this.options.escapeContent)),this._newContent=!1),this._storeAndLockDimensions(),this.reposition()},t.prototype._storeAndLockDimensions=function(){var t;if(this.container)return t=this.dimensions,this.adapter.css(this.container,{width:"auto",left:"0px",top:"0px"}),this.dimensions=this.adapter.dimensions(this.container),this.dimensions.width+=1,this.adapter.css(this.container,{width:""+this.dimensions.width+"px",top:""+this.currentPosition.top+"px",left:""+this.currentPosition.left+"px"}),this._dimensionsEqual(this.dimensions,t)?void 0:(this.redraw=!0,this._draw())},t.prototype.activate=function(){return this._setupObservers("hidden","hiding")},t.prototype.deactivate=function(){return this.debug("Deactivating tooltip."),this.hide(),this._setupObservers("-showing","-visible","-hidden","-hiding")},t.prototype._setupObservers=function(){var t,e,i,o,s,n,r,a,h,p,l,d,u,c,g,f,m=this;for(o=arguments.length>=1?__slice.call(arguments,0):[],n=0,p=o.length;p>n;n++)if(i=o[n],e=!1,i.charAt(0)==="-"&&(e=!0,i=i.substr(1)),this.currentObservers[i]!==!e)switch(this.currentObservers[i]=!e,t=function(){var t,i,o;return t=arguments.length>=1?__slice.call(arguments,0):[],e?(i=m.adapter).stopObserving.apply(i,t):(o=m.adapter).observe.apply(o,t)},i){case"showing":for(c=this.hideTriggers,r=0,l=c.length;l>r;r++)s=c[r],t(s.element,s.event,this.bound.prepareToHide);t(document.onresize!=null?document:window,"resize",this.bound.reposition),t(window,"scroll",this.bound.reposition);break;case"visible":for(g=this.showTriggersWhenVisible,a=0,d=g.length;d>a;a++)s=g[a],t(s.element,s.event,this.bound.prepareToShow);break;case"hiding":for(f=this.showTriggers,h=0,u=f.length;u>h;h++)s=f[h],t(s.element,s.event,this.bound.prepareToShow);break;case"hidden":break;default:throw Error("Unknown state: "+i)}return null},t.prototype.prepareToShow=function(){return this._abortHiding(),this._abortShowing(),this.visible?void 0:(this.debug("Showing in "+this.options.delay+"s."),this.container==null&&this._setup(),this.options.group&&t._abortShowingGroup(this.options.group,this),this.preparingToShow=!0,this._setupObservers("-hidden","-hiding","showing"),this._followMousePosition(),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this._showTimeoutId=this.setTimeout(this.bound.show,this.options.delay||0))},t.prototype.show=function(){var e=this;return this._abortHiding(),this.visible?void 0:(this._clearTimeouts(),this._triggerElementExists()?(this.debug("Showing now."),this.container==null&&this._setup(),this.options.group&&t._hideGroup(this.options.group,this),this.visible=!0,this.preparingToShow=!1,this.tooltipElement==null&&this._buildElements(),this._updateElementContent(),!this.options.ajax||this.loaded&&this.options.cache||this._loadAjax(),this._searchAndActivateCloseButtons(),this._startEnsureTriggerElement(),this.adapter.css(this.container,{zIndex:t.lastZIndex++}),this._setupObservers("-hidden","-hiding","-showing","-visible","showing","visible"),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this.adapter.removeClass(this.container,this["class"].hiding),this.adapter.removeClass(this.container,this["class"].hidden),this.adapter.addClass(this.container,this["class"].goingToShow),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var t;if(e.visible&&!e.preparingToHide)return e.adapter.removeClass(e.container,e["class"].goingToShow),e.adapter.addClass(e.container,e["class"].showing),t=0,e.options.showEffect&&e.options.showEffectDuration&&(t=e.options.showEffectDuration),e.setCss3Style(e.container,{transitionDuration:""+t+"s"}),e._visibilityStateTimeoutId=e.setTimeout(function(){return e.adapter.removeClass(e.container,e["class"].showing),e.adapter.addClass(e.container,e["class"].visible)},t),e._activateFirstInput()}),this._draw()):this.deactivate())},t.prototype._abortShowing=function(){return this.preparingToShow?(this.debug("Aborting showing."),this._clearTimeouts(),this._stopFollowingMousePosition(),this.preparingToShow=!1,this._setupObservers("-showing","-visible","hiding","hidden")):void 0},t.prototype.prepareToHide=function(){return this._abortShowing(),this._abortHiding(),this.visible?(this.debug("Hiding in "+this.options.hideDelay+"s"),this.preparingToHide=!0,this._setupObservers("-showing","visible","-hidden","hiding"),this._hideTimeoutId=this.setTimeout(this.bound.hide,this.options.hideDelay)):void 0},t.prototype.hide=function(){var t=this;return this._abortShowing(),this.visible&&(this._clearTimeouts(),this.debug("Hiding!"),this.visible=!1,this.preparingToHide=!1,this._stopEnsureTriggerElement(),this._setupObservers("-showing","-visible","-hiding","-hidden","hiding","hidden"),this.options.fixed||this._stopFollowingMousePosition(),this.container)?(this.adapter.removeClass(this.container,this["class"].visible),this.adapter.removeClass(this.container,this["class"].showing),this.adapter.addClass(this.container,this["class"].goingToHide),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var e;return t.adapter.removeClass(t.container,t["class"].goingToHide),t.adapter.addClass(t.container,t["class"].hiding),e=0,t.options.hideEffect&&t.options.hideEffectDuration&&(e=t.options.hideEffectDuration),t.setCss3Style(t.container,{transitionDuration:""+e+"s"}),t._visibilityStateTimeoutId=t.setTimeout(function(){return t.adapter.removeClass(t.container,t["class"].hiding),t.adapter.addClass(t.container,t["class"].hidden),t.setCss3Style(t.container,{transitionDuration:"0s"}),t.options.removeElementsOnHide?(t.debug("Removing HTML elements."),t.adapter.remove(t.container),delete t.container,delete t.tooltipElement):void 0},e)})):void 0},t.prototype._abortHiding=function(){return this.preparingToHide?(this.debug("Aborting hiding."),this._clearTimeouts(),this.preparingToHide=!1,this._setupObservers("-hiding","showing","visible")):void 0},t.prototype.reposition=function(){var t,e,i,o=this;return t=this.getPosition(),t==null||(e=this.options.stem,this.options.containInViewport&&(i=this._ensureViewportContainment(t),t=i.position,e=i.stem),this._positionsEqual(t,this.currentPosition))?void 0:(this.options.stem&&!e.eql(this.currentStem)&&(this.redraw=!0),this.currentPosition=t,this.currentStem=e,this._draw(),this.adapter.css(this.container,{left:""+t.left+"px",top:""+t.top+"px"}),this.defer(function(){var t,e;return t=o.adapter.unwrap(o.container),t.style.visibility="hidden",e=t.offsetHeight,t.style.visibility="visible"}))},t.prototype.getPosition=function(t,e,i){var o,s,n,r,a,h,p,l,d;if(this.container)return t==null&&(t=this.options.tipJoint),e==null&&(e=this.options.targetJoint),r={},this.options.target?(p=this.adapter.offset(this.options.target),h=this.adapter.dimensions(this.options.target),r=p,e.right?(l=this.adapter.unwrap(this.options.target),l.getBoundingClientRect!=null?r.left=l.getBoundingClientRect().right+((d=window.pageXOffset)!=null?d:document.body.scrollLeft):r.left+=h.width):e.center&&(r.left+=Math.round(h.width/2)),e.bottom?r.top+=h.height:e.middle&&(r.top+=Math.round(h.height/2)),this.options.borderWidth&&(this.options.tipJoint.left&&(r.left+=this.options.borderWidth),this.options.tipJoint.right&&(r.left-=this.options.borderWidth),this.options.tipJoint.top?r.top+=this.options.borderWidth:this.options.tipJoint.bottom&&(r.top-=this.options.borderWidth))):r=this.initialMousePosition?{top:this.initialMousePosition.y,left:this.initialMousePosition.x}:{top:mousePosition.y,left:mousePosition.x},this.options.autoOffset&&(a=this.options.stem?this.options.stemLength:0,n=a&&this.options.fixed?2:10,o=t.middle&&!this.options.fixed?15:0,s=t.center&&!this.options.fixed?15:0,t.right?r.left-=n+o:t.left&&(r.left+=n+o),t.bottom?r.top-=n+s:t.top&&(r.top+=n+s),a&&(i==null&&(i=this.options.stem),i.right?r.left-=a:i.left&&(r.left+=a),i.bottom?r.top-=a:i.top&&(r.top+=a))),r.left+=this.options.offset[0],r.top+=this.options.offset[1],t.right?r.left-=this.dimensions.width:t.center&&(r.left-=Math.round(this.dimensions.width/2)),t.bottom?r.top-=this.dimensions.height:t.middle&&(r.top-=Math.round(this.dimensions.height/2)),r},t.prototype._ensureViewportContainment=function(e){var i,o,s,n,r,a,h,p,l,d,u,c;if(h=this.options.stem,s={position:e,stem:h},!this.visible||!e)return s;if(p=this._sticksOut(e),!p[0]&&!p[1])return s;if(d=new t.Joint(this.options.tipJoint),this.options.targetJoint&&(l=new t.Joint(this.options.targetJoint)),a=this.adapter.scrollOffset(),u=this.adapter.viewportDimensions(),c=[e.left-a[0],e.top-a[1]],i=!1,u.width>=this.dimensions.width&&p[0])switch(i=!0,p[0]){case this.STICKS_OUT_LEFT:d.setHorizontal("left"),this.options.targetJoint&&l.setHorizontal("right");break;case this.STICKS_OUT_RIGHT:d.setHorizontal("right"),this.options.targetJoint&&l.setHorizontal("left")}if(u.height>=this.dimensions.height&&p[1])switch(i=!0,p[1]){case this.STICKS_OUT_TOP:d.setVertical("top"),this.options.targetJoint&&l.setVertical("bottom");break;case this.STICKS_OUT_BOTTOM:d.setVertical("bottom"),this.options.targetJoint&&l.setVertical("top")}return i?(this.options.stem&&(h=d),e=this.getPosition(d,l,h),o=this._sticksOut(e),n=!1,r=!1,o[0]&&o[0]!==p[0]&&(n=!0,d.setHorizontal(this.options.tipJoint.horizontal),this.options.targetJoint&&l.setHorizontal(this.options.targetJoint.horizontal)),o[1]&&o[1]!==p[1]&&(r=!0,d.setVertical(this.options.tipJoint.vertical),this.options.targetJoint&&l.setVertical(this.options.targetJoint.vertical)),n&&r?s:((n||r)&&(this.options.stem&&(h=d),e=this.getPosition(d,l,h)),{position:e,stem:h})):s},t.prototype._sticksOut=function(t){var e,i,o,s;return i=this.adapter.scrollOffset(),s=this.adapter.viewportDimensions(),e=[t.left-i[0],t.top-i[1]],o=[!1,!1],0>e[0]?o[0]=this.STICKS_OUT_LEFT:e[0]+this.dimensions.width>s.width&&(o[0]=this.STICKS_OUT_RIGHT),0>e[1]?o[1]=this.STICKS_OUT_TOP:e[1]+this.dimensions.height>s.height&&(o[1]=this.STICKS_OUT_BOTTOM),o},t.prototype._draw=function(){var e,i,o,s,n,r,a,h,p,l,d,u,c,g,f,m,v,w,b,_=this;if(this.backgroundCanvas&&this.redraw){if(this.debug("Drawing background."),this.redraw=!1,this.currentStem){for(v=["top","right","bottom","left"],f=0,m=v.length;m>f;f++)u=v[f],this.adapter.removeClass(this.container,"stem-"+u);this.adapter.addClass(this.container,"stem-"+this.currentStem.horizontal),this.adapter.addClass(this.container,"stem-"+this.currentStem.vertical)}return r=[0,0],a=[0,0],__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(n=new t.Joint(((w=this.currentStem)!=null?w+"":void 0)==="top right"?"top left":"top right"),r=[this.options.closeButtonRadius+this.options.closeButtonOffset[0],this.options.closeButtonRadius+this.options.closeButtonOffset[1]],a=[this.options.closeButtonRadius-this.options.closeButtonOffset[0],this.options.closeButtonRadius-this.options.closeButtonOffset[1]]),o=this.adapter.clone(this.dimensions),s=[0,0],this.options.borderWidth&&(o.width+=this.options.borderWidth*2,o.height+=this.options.borderWidth*2,s[0]-=this.options.borderWidth,s[1]-=this.options.borderWidth),this.options.shadow&&(o.width+=this.options.shadowBlur*2,o.width+=Math.max(0,this.options.shadowOffset[0]-this.options.shadowBlur*2),o.height+=this.options.shadowBlur*2,o.height+=Math.max(0,this.options.shadowOffset[1]-this.options.shadowBlur*2),s[0]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[0]),s[1]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[1])),i={left:0,right:0,top:0,bottom:0},this.currentStem&&(this.currentStem.left?i.left=this.options.stemLength:this.currentStem.right&&(i.right=this.options.stemLength),this.currentStem.top?i.top=this.options.stemLength:this.currentStem.bottom&&(i.bottom=this.options.stemLength)),n&&(n.left?i.left=Math.max(i.left,a[0]):n.right&&(i.right=Math.max(i.right,a[0])),n.top?i.top=Math.max(i.top,a[1]):n.bottom&&(i.bottom=Math.max(i.bottom,a[1]))),o.width+=i.left+i.right,o.height+=i.top+i.bottom,s[0]-=i.left,s[1]-=i.top,this.currentStem&&this.options.borderWidth&&(b=this._getPathStemMeasures(this.options.stemBase,this.options.stemLength,this.options.borderWidth),g=b.stemLength,c=b.stemBase),e=this.adapter.unwrap(this.backgroundCanvas),e.width=o.width,e.height=o.height,this.adapter.css(this.backgroundCanvas,{width:""+e.width+"px",height:""+e.height+"px",left:""+s[0]+"px",top:""+s[1]+"px"}),h=e.getContext("2d"),h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,e.width,e.height),h.beginPath(),h.fillStyle=this._getColor(h,this.dimensions,this.options.background,this.options.backgroundGradientHorizontal),h.lineJoin="miter",h.miterLimit=500,d=this.options.borderWidth/2,this.options.borderWidth?(h.strokeStyle=this.options.borderColor,h.lineWidth=this.options.borderWidth):(g=this.options.stemLength,c=this.options.stemBase),c==null&&(c=0),l=function(t,e,i){return i&&h.moveTo(Math.max(c,_.options.borderRadius,r[0])+1-d,-d),e?(h.lineTo(t/2-c/2,-d),h.lineTo(t/2,-g-d),h.lineTo(t/2+c/2,-d)):void 0},p=function(t,e,i){var o,s,n,a;return t?(h.lineTo(-c+d,0-d),h.lineTo(g+d,-g-d),h.lineTo(d,c-d)):e?(a=_.options.closeButtonOffset,n=r[0],i%2!==0&&(a=[a[1],a[0]],n=r[1]),o=Math.acos(a[1]/_.options.closeButtonRadius),s=Math.acos(a[0]/_.options.closeButtonRadius),h.lineTo(-n+d,-d),h.arc(d-a[0],-d+a[1],_.options.closeButtonRadius,-(Math.PI/2+o),s,!1)):(h.lineTo(-_.options.borderRadius+d,-d),h.quadraticCurveTo(d,-d,d,_.options.borderRadius-d))},h.translate(-s[0],-s[1]),h.save(),function(){var e,i,o,s,r,a,d,u,c,g,f;for(f=[],i=c=0,g=t.positions.length/2;g>=0?g>c:c>g;i=g>=0?++c:--c)r=i*2,a=i===0||i===3?0:_.dimensions.width,d=2>i?0:_.dimensions.height,u=Math.PI/2*i,o=i%2===0?_.dimensions.width:_.dimensions.height,s=new t.Joint(t.positions[r]),e=new t.Joint(t.positions[r+1]),h.save(),h.translate(a,d),h.rotate(u),l(o,s.eql(_.currentStem),i===0),h.translate(o,0),p(e.eql(_.currentStem),e.eql(n),i),f.push(h.restore());return f}(),h.closePath(),h.save(),this.options.shadow&&(h.shadowColor=this.options.shadowColor,h.shadowBlur=this.options.shadowBlur,h.shadowOffsetX=this.options.shadowOffset[0],h.shadowOffsetY=this.options.shadowOffset[1]),h.fill(),h.restore(),this.options.borderWidth&&h.stroke(),h.restore(),n?function(){var t,e,i,o,s;return i=e=_.options.closeButtonRadius*2,n+""=="top right"?(s=[_.dimensions.width-_.options.closeButtonOffset[0],_.options.closeButtonOffset[1]],t=[s[0]+d,s[1]-d]):(s=[_.options.closeButtonOffset[0],_.options.closeButtonOffset[1]],t=[s[0]-d,s[1]-d]),h.translate(t[0],t[1]),o=_.options.closeButtonCrossSize/2,h.save(),h.beginPath(),h.strokeStyle=_.options.closeButtonCrossColor,h.lineWidth=_.options.closeButtonCrossLineWidth,h.lineCap="round",h.moveTo(-o,-o),h.lineTo(o,o),h.stroke(),h.beginPath(),h.moveTo(o,-o),h.lineTo(-o,o),h.stroke(),h.restore(),_.adapter.css(_.closeButtonElement,{left:""+(s[0]-o-_.options.closeButtonLinkOverscan)+"px",top:""+(s[1]-o-_.options.closeButtonLinkOverscan)+"px",width:""+(_.options.closeButtonCrossSize+_.options.closeButtonLinkOverscan*2)+"px",height:""+(_.options.closeButtonCrossSize+_.options.closeButtonLinkOverscan*2)+"px"})}():void 0}},t.prototype._getPathStemMeasures=function(t,e,i){var o,s,n,r,a,h,p;if(r=i/2,n=Math.atan(t/2/e),o=n*2,a=r/Math.sin(o),s=2*a*Math.cos(n),p=r+e-s,0>p)throw Error("Sorry but your stemLength / stemBase ratio is strange.");return h=Math.tan(n)*p*2,{stemLength:p,stemBase:h}},t.prototype._getColor=function(t,e,i,o){var s,n,r,a,h;if(o==null&&(o=!1),typeof i=="string")return i;for(n=o?t.createLinearGradient(0,0,e.width,0):t.createLinearGradient(0,0,0,e.height),r=a=0,h=i.length;h>a;r=++a)s=i[r],n.addColorStop(s[0],s[1]);return n},t.prototype._searchAndActivateCloseButtons=function(){var t,e,i,o;for(o=this.adapter.findAll(this.container,"."+this["class"].close),e=0,i=o.length;i>e;e++)t=o[e],this.hideTriggers.push({element:this.adapter.wrap(t),event:"click"});return this.currentObservers.showing&&this._setupObservers("-showing","showing"),this.currentObservers.visible?this._setupObservers("-visible","visible"):void 0},t.prototype._activateFirstInput=function(){var t;return t=this.adapter.unwrap(this.adapter.find(this.container,"input, textarea")),t!=null?typeof t.focus=="function"?t.focus():void 0:void 0},t.prototype._followMousePosition=function(){return this.options.fixed?void 0:t._observeMousePosition(this.bound.reposition)},t.prototype._stopFollowingMousePosition=function(){return this.options.fixed?void 0:t._stopObservingMousePosition(this.bound.reposition)},t.prototype._clearShowTimeout=function(){return clearTimeout(this._showTimeoutId)},t.prototype._clearHideTimeout=function(){return clearTimeout(this._hideTimeoutId)},t.prototype._clearTimeouts=function(){return clearTimeout(this._visibilityStateTimeoutId),this._clearShowTimeout(),this._clearHideTimeout()},t.prototype._triggerElementExists=function(){var t;t=this.adapter.unwrap(this.triggerElement);while(t.parentNode){if(t.parentNode.tagName==="BODY")return!0;t=t.parentNode}return!1},t.prototype._loadAjax=function(){var t=this;if(!this.loading)return this.loaded=!1,this.loading=!0,this.adapter.addClass(this.container,this["class"].loading),this.setContent(""),this.debug("Loading content from "+this.options.ajax),this.adapter.ajax({url:this.options.ajax,method:this.options.ajaxMethod,onSuccess:function(e){return t.debug("Loading successful."),t.adapter.removeClass(t.container,t["class"].loading),t.setContent(e)},onError:function(e){var i;return i=t.options.ajaxErrorMessage,t.debug(i,e),t.setContent(i),t.adapter.addClass(t.container,t["class"].ajaxError)},onComplete:function(){return t.adapter.removeClass(t.container,t["class"].loading),t.loading=!1,t.loaded=!0,t._searchAndActivateCloseButtons(),t._activateFirstInput(),t.reposition()}})},t.prototype._ensureTriggerElement=function(){return this._triggerElementExists()?void 0:(this.deactivate(),this._stopEnsureTriggerElement())},t.prototype._ensureTriggerElementInterval=1e3,t.prototype._startEnsureTriggerElement=function(){var t=this;return this._ensureTriggerElementTimeoutId=setInterval(function(){return t._ensureTriggerElement()},this._ensureTriggerElementInterval)},t.prototype._stopEnsureTriggerElement=function(){return clearInterval(this._ensureTriggerElementTimeoutId)},t}(),vendors=["khtml","ms","o","moz","webkit"],Opentip.prototype.setCss3Style=function(t,e){var i,o,s,n,r;t=this.adapter.unwrap(t),r=[];for(i in e)__hasProp.call(e,i)&&(o=e[i],t.style[i]!=null?r.push(t.style[i]=o):r.push(function(){var e,r,a;for(a=[],e=0,r=vendors.length;r>e;e++)s=vendors[e],n=""+this.ucfirst(s)+this.ucfirst(i),t.style[n]!=null?a.push(t.style[n]=o):a.push(void 0);return a}.call(this)));return r},Opentip.prototype.defer=function(t){return setTimeout(t,0)},Opentip.prototype.setTimeout=function(t,e){return setTimeout(t,e?e*1e3:0)},Opentip.prototype.ucfirst=function(t){return t==null?"":t.charAt(0).toUpperCase()+t.slice(1)},Opentip.prototype.dasherize=function(t){return t.replace(/([A-Z])/g,function(t,e){return"-"+e.toLowerCase()})},mousePositionObservers=[],mousePosition={x:0,y:0},mouseMoved=function(t){var e,i,o,s;for(mousePosition=Opentip.adapter.mousePosition(t),s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],s.push(e());return s},Opentip.followMousePosition=function(){return Opentip.adapter.observe(document.body,"mousemove",mouseMoved)},Opentip._observeMousePosition=function(t){return mousePositionObservers.push(t)},Opentip._stopObservingMousePosition=function(t){var e;return mousePositionObservers=function(){var i,o,s;for(s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],e!==t&&s.push(e);return s}()},Opentip.Joint=function(){function t(t){t!=null&&(t instanceof Opentip.Joint&&(t+=""),this.set(t))}return t.prototype.set=function(t){return t=t.toLowerCase(),this.setHorizontal(t),this.setVertical(t),this},t.prototype.setHorizontal=function(t){var e,i,o,s,n,r,a;for(i=["left","center","right"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.horizontal=e.toLowerCase());for(this.horizontal==null&&(this.horizontal="center"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.horizontal===e?e:void 0);return a},t.prototype.setVertical=function(t){var e,i,o,s,n,r,a;for(i=["top","middle","bottom"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.vertical=e.toLowerCase());for(this.vertical==null&&(this.vertical="middle"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.vertical===e?e:void 0);return a},t.prototype.eql=function(t){return t!=null&&this.horizontal===t.horizontal&&this.vertical===t.vertical},t.prototype.flip=function(){var t,e;return e=Opentip.position[this.toString(!0)],t=(e+4)%8,this.set(Opentip.positions[t]),this},t.prototype.toString=function(t){var e,i;return t==null&&(t=!1),i=this.vertical==="middle"?"":this.vertical,e=this.horizontal==="center"?"":this.horizontal,i&&e&&(e=t?Opentip.prototype.ucfirst(e):" "+e),""+i+e},t}(),Opentip.prototype._positionsEqual=function(t,e){return t!=null&&e!=null&&t.left===e.left&&t.top===e.top},Opentip.prototype._dimensionsEqual=function(t,e){return t!=null&&e!=null&&t.width===e.width&&t.height===e.height},Opentip.prototype.debug=function(){var t;return t=arguments.length>=1?__slice.call(arguments,0):[],Opentip.debug&&(typeof console!="undefined"&&console!==null?console.debug:void 0)!=null?(t.unshift("#"+this.id+" |"),console.debug.apply(console,t)):void 0},Opentip.findElements=function(){var t,e,i,o,s,n,r,a,h,p;for(t=Opentip.adapter,h=t.findAll(document.body,"[data-ot]"),p=[],r=0,a=h.length;a>r;r++){i=h[r],n={},e=t.data(i,"ot"),(e===""||e==="true"||e==="yes")&&(e=t.attr(i,"title"),t.attr(i,"title","")),e=e||"";for(o in Opentip.styles.standard)s=t.data(i,"ot"+Opentip.prototype.ucfirst(o)),s!=null&&(s==="yes"||s==="true"||s==="on"?s=!0:(s==="no"||s==="false"||s==="off")&&(s=!1),n[o]=s);p.push(new Opentip(i,e,n))}return p},Opentip.version="2.4.6",Opentip.debug=!1,Opentip.lastId=0,Opentip.lastZIndex=100,Opentip.tips=[],Opentip._abortShowingGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i._abortShowing()):r.push(void 0);return r},Opentip._hideGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i.hide()):r.push(void 0);return r},Opentip.adapters={},Opentip.adapter=null,firstAdapter=!0,Opentip.addAdapter=function(t){return Opentip.adapters[t.name]=t,firstAdapter?(Opentip.adapter=t,t.domReady(Opentip.findElements),t.domReady(Opentip.followMousePosition),firstAdapter=!1):void 0},Opentip.positions=["top","topRight","right","bottomRight","bottom","bottomLeft","left","topLeft"],Opentip.position={},_ref=Opentip.positions,i=_i=0,_len=_ref.length;_len>_i;i=++_i)position=_ref[i],Opentip.position[position]=i;Opentip.styles={standard:{"extends":null,title:void 0,escapeTitle:!0,escapeContent:!1,className:"standard",stem:!0,delay:null,hideDelay:.1,fixed:!1,showOn:"mouseover",hideTrigger:"trigger",hideTriggers:[],hideOn:null,removeElementsOnHide:!1,offset:[0,0],containInViewport:!0,autoOffset:!0,showEffect:"appear",hideEffect:"fade",showEffectDuration:.3,hideEffectDuration:.2,stemLength:5,stemBase:8,tipJoint:"top left",target:null,targetJoint:null,cache:!0,ajax:!1,ajaxMethod:"GET",ajaxErrorMessage:"There was a problem downloading the content.",group:null,style:null,background:"#fff18f",backgroundGradientHorizontal:!1,closeButtonOffset:[5,5],closeButtonRadius:7,closeButtonCrossSize:4,closeButtonCrossColor:"#d2c35b",closeButtonCrossLineWidth:1.5,closeButtonLinkOverscan:6,borderRadius:5,borderWidth:1,borderColor:"#f2e37b",shadow:!0,shadowBlur:10,shadowOffset:[3,3],shadowColor:"rgba(0, 0, 0, 0.1)"},glass:{"extends":"standard",className:"glass",background:[[0,"rgba(252, 252, 252, 0.8)"],[.5,"rgba(255, 255, 255, 0.8)"],[.5,"rgba(250, 250, 250, 0.9)"],[1,"rgba(245, 245, 245, 0.9)"]],borderColor:"#eee",closeButtonCrossColor:"rgba(0, 0, 0, 0.2)",borderRadius:15,closeButtonRadius:10,closeButtonOffset:[8,8]},dark:{"extends":"standard",className:"dark",borderRadius:13,borderColor:"#444",closeButtonCrossColor:"rgba(240, 240, 240, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(30, 30, 30, 0.7)"],[.5,"rgba(30, 30, 30, 0.8)"],[.5,"rgba(10, 10, 10, 0.8)"],[1,"rgba(10, 10, 10, 0.9)"]]},alert:{"extends":"standard",className:"alert",borderRadius:1,borderColor:"#AE0D11",closeButtonCrossColor:"rgba(255, 255, 255, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(203, 15, 19, 0.7)"],[.5,"rgba(203, 15, 19, 0.8)"],[.5,"rgba(189, 14, 18, 0.8)"],[1,"rgba(179, 14, 17, 0.9)"]]}},Opentip.defaultStyle="standard",typeof module!="undefined"&&module!==null?module.exports=Opentip:window.Opentip=Opentip;var Adapter,__hasProp={}.hasOwnProperty,__slice=[].slice;Adapter=function(){function t(){}var e,i;return t.prototype.name="native",t.prototype.domReady=function(t){var e,i,o,s,n,r,a,h,p,l,d;if(o=!1,p=!0,l=window,i=document,(d=i.readyState)==="complete"||d==="loaded")return t();if(h=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",a=i.addEventListener?"removeEventListener":"detachEvent",r=i.addEventListener?"":"on",s=function(e){return e.type!=="readystatechange"||i.readyState==="complete"?((e.type==="load"?l:i)[a](r+e.type,s,!1),o?void 0:(o=!0,t())):void 0 },n=function(){try{h.doScroll("left")}catch(t){return setTimeout(n,50),void 0}return s("poll")},i.readyState!=="complete"){if(i.createEventObject&&h.doScroll){try{p=!l.frameElement}catch(u){}p&&n()}return i[e](r+"DOMContentLoaded",s,!1),i[e](r+"readystatechange",s,!1),l[e](r+"load",s,!1)}},t.prototype.create=function(t){var e;return e=document.createElement("div"),e.innerHTML=t,this.wrap(e.childNodes)},t.prototype.wrap=function(t){var e;return t?typeof t=="string"?(t=this.find(document.body,t),t=t?[t]:[]):t instanceof NodeList?t=function(){var i,o,s;for(s=[],i=0,o=t.length;o>i;i++)e=t[i],s.push(e);return s}():t instanceof Array||(t=[t]):t=[],t},t.prototype.unwrap=function(t){return this.wrap(t)[0]},t.prototype.tagName=function(t){return this.unwrap(t).tagName},t.prototype.attr=function(t,e,i){return arguments.length===3?this.unwrap(t).setAttribute(e,i):this.unwrap(t).getAttribute(e)},i=0,e={},t.prototype.data=function(t,o,s){var n;return n=this.attr(t,"data-id"),n||(n=++i,this.attr(t,"data-id",n),e[n]={}),arguments.length===3?e[n][o]=s:(s=e[n][o],s!=null?s:(s=this.attr(t,"data-"+Opentip.prototype.dasherize(o)),s&&(e[n][o]=s),s))},t.prototype.find=function(t,e){return this.unwrap(t).querySelector(e)},t.prototype.findAll=function(t,e){return this.unwrap(t).querySelectorAll(e)},t.prototype.update=function(t,e,i){return t=this.unwrap(t),i?(t.innerHTML="",t.appendChild(document.createTextNode(e))):t.innerHTML=e},t.prototype.append=function(t,e){var i,o;return i=this.unwrap(e),o=this.unwrap(t),o.appendChild(i)},t.prototype.remove=function(t){var e;return t=this.unwrap(t),e=t.parentNode,e!=null?e.removeChild(t):void 0},t.prototype.addClass=function(t,e){return this.unwrap(t).classList.add(e)},t.prototype.removeClass=function(t,e){return this.unwrap(t).classList.remove(e)},t.prototype.css=function(t,e){var i,o,s;t=this.unwrap(this.wrap(t)),s=[];for(i in e)__hasProp.call(e,i)&&(o=e[i],s.push(t.style[i]=o));return s},t.prototype.dimensions=function(t){var e,i;return t=this.unwrap(this.wrap(t)),e={width:t.offsetWidth,height:t.offsetHeight},e.width&&e.height||(i={position:t.style.position||"",visibility:t.style.visibility||"",display:t.style.display||""},this.css(t,{position:"absolute",visibility:"hidden",display:"block"}),e={width:t.offsetWidth,height:t.offsetHeight},this.css(t,i)),e},t.prototype.scrollOffset=function(){return[window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop]},t.prototype.viewportDimensions=function(){return{width:document.documentElement.clientWidth,height:document.documentElement.clientHeight}},t.prototype.mousePosition=function(t){var e;if(e={x:0,y:0},t==null&&(t=window.event),t!=null){try{t.pageX||t.pageY?(e.x=t.pageX,e.y=t.pageY):(t.clientX||t.clientY)&&(e.x=t.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,e.y=t.clientY+document.body.scrollTop+document.documentElement.scrollTop)}catch(t){}return e}},t.prototype.offset=function(t){var e;t=this.unwrap(t),e={top:t.offsetTop,left:t.offsetLeft};while(t=t.offsetParent)e.top+=t.offsetTop,e.left+=t.offsetLeft,t!==document.body&&(e.top-=t.scrollTop,e.left-=t.scrollLeft);return e},t.prototype.observe=function(t,e,i){return this.unwrap(t).addEventListener(e,i,!1)},t.prototype.stopObserving=function(t,e,i){return this.unwrap(t).removeEventListener(e,i,!1)},t.prototype.ajax=function(t){var e,i,o;if(t.url==null)throw Error("No url provided");if(window.XMLHttpRequest)e=new XMLHttpRequest;else if(window.ActiveXObject)try{e=new ActiveXObject("Msxml2.XMLHTTP")}catch(s){try{e=new ActiveXObject("Microsoft.XMLHTTP")}catch(s){}}if(!e)throw Error("Can't create XMLHttpRequest");return e.onreadystatechange=function(){if(e.readyState===4){try{e.status===200?typeof t.onSuccess=="function"&&t.onSuccess(e.responseText):typeof t.onError=="function"&&t.onError("Server responded with status "+e.status)}catch(i){typeof t.onError=="function"&&t.onError(i.message)}return typeof t.onComplete=="function"?t.onComplete():void 0}},e.open((i=(o=t.method)!=null?o.toUpperCase():void 0)!=null?i:"GET",t.url),e.send()},t.prototype.clone=function(t){var e,i,o;i={};for(e in t)__hasProp.call(t,e)&&(o=t[e],i[e]=o);return i},t.prototype.extend=function(){var t,e,i,o,s,n,r;for(o=arguments[0],i=arguments.length>=2?__slice.call(arguments,1):[],n=0,r=i.length;r>n;n++){e=i[n];for(t in e)__hasProp.call(e,t)&&(s=e[t],o[t]=s)}return o},t}(),Opentip.addAdapter(new Adapter),typeof document=="undefined"||"classList"in document.createElement("a")||function(t){"use strict";if("HTMLElement"in t||"Element"in t){var e="classList",i="prototype",o=(t.HTMLElement||t.Element)[i],s=Object,n=String[i].trim||function(){return this.replace(/^\s+|\s+$/g,"")},r=Array[i].indexOf||function(t){for(var e=0,i=this.length;i>e;e++)if(e in this&&this[e]===t)return e;return-1},a=function(t,e){this.name=t,this.code=DOMException[t],this.message=e},h=function(t,e){if(e==="")throw new a("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(e))throw new a("INVALID_CHARACTER_ERR","String contains an invalid character");return r.call(t,e)},p=function(t){for(var e=n.call(t.className),i=e?e.split(/\s+/):[],o=0,s=i.length;s>o;o++)this.push(i[o]);this._updateClassName=function(){t.className=this+""}},l=p[i]=[],d=function(){return new p(this)};if(a[i]=Error[i],l.item=function(t){return this[t]||null},l.contains=function(t){return t+="",h(this,t)!==-1},l.add=function(){var t,e=arguments,i=0,o=e.length,s=!1;do t=e[i]+"",h(this,t)===-1&&(this.push(t),s=!0);while(o>++i);s&&this._updateClassName()},l.remove=function(){var t,e=arguments,i=0,o=e.length,s=!1;do{t=e[i]+"";var n=h(this,t);n!==-1&&(this.splice(n,1),s=!0)}while(o>++i);s&&this._updateClassName()},l.toggle=function(t,e){t+="";var i=this.contains(t),o=i?e!==!0&&"remove":e!==!1&&"add";return o&&this[o](t),i},l.toString=function(){return this.join(" ")},s.defineProperty){var u={get:d,enumerable:!0,configurable:!0};try{s.defineProperty(o,e,u)}catch(c){c.number===-2146823252&&(u.enumerable=!1,s.defineProperty(o,e,u))}}else s[i].__defineGetter__&&o.__defineGetter__(e,d)}}(self),!window.addEventListener&&function(t,e,i,o,s,n,r){t[o]=e[o]=i[o]=function(t,e){var i=this;r.unshift([i,t,e,function(t){t.currentTarget=i,t.preventDefault=function(){t.returnValue=!1},t.stopPropagation=function(){t.cancelBubble=!0},t.target=t.srcElement||i,e.call(i,t)}]),this.attachEvent("on"+t,r[0][3])},t[s]=e[s]=i[s]=function(t,e){for(var i,o=0;i=r[o];++o)if(i[0]==this&&i[1]==t&&i[2]==e)return this.detachEvent("on"+t,r.splice(o,1)[0][3])},t[n]=e[n]=i[n]=function(t){return this.fireEvent("on"+t.type,t)}}(Window.prototype,HTMLDocument.prototype,Element.prototype,"addEventListener","removeEventListener","dispatchEvent",[])opentip-2.4.6/downloads/opentip-prototype-excanvas.js000066400000000000000000002550071213277401600230740ustar00rootroot00000000000000// Generated by CoffeeScript 1.4.0 /* # # Opentip v2.4.6 # # More info at [www.opentip.org](http://www.opentip.org) # # Copyright (c) 2012, Matias Meno # Graphics by Tjandra Mayerhold # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # */ var Opentip, firstAdapter, i, mouseMoved, mousePosition, mousePositionObservers, position, vendors, _i, _len, _ref, __slice = [].slice, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __hasProp = {}.hasOwnProperty; Opentip = (function() { Opentip.prototype.STICKS_OUT_TOP = 1; Opentip.prototype.STICKS_OUT_BOTTOM = 2; Opentip.prototype.STICKS_OUT_LEFT = 1; Opentip.prototype.STICKS_OUT_RIGHT = 2; Opentip.prototype["class"] = { container: "opentip-container", opentip: "opentip", header: "ot-header", content: "ot-content", loadingIndicator: "ot-loading-indicator", close: "ot-close", goingToHide: "ot-going-to-hide", hidden: "ot-hidden", hiding: "ot-hiding", goingToShow: "ot-going-to-show", showing: "ot-showing", visible: "ot-visible", loading: "ot-loading", ajaxError: "ot-ajax-error", fixed: "ot-fixed", showEffectPrefix: "ot-show-effect-", hideEffectPrefix: "ot-hide-effect-", stylePrefix: "style-" }; function Opentip(element, content, title, options) { var elementsOpentips, hideTrigger, methodToBind, optionSources, prop, styleName, _i, _j, _len, _len1, _ref, _ref1, _ref2, _tmpStyle, _this = this; this.id = ++Opentip.lastId; this.debug("Creating Opentip."); Opentip.tips.push(this); this.adapter = Opentip.adapter; elementsOpentips = this.adapter.data(element, "opentips") || []; elementsOpentips.push(this); this.adapter.data(element, "opentips", elementsOpentips); this.triggerElement = this.adapter.wrap(element); if (this.triggerElement.length > 1) { throw new Error("You can't call Opentip on multiple elements."); } if (this.triggerElement.length < 1) { throw new Error("Invalid element."); } this.loaded = false; this.loading = false; this.visible = false; this.waitingToShow = false; this.waitingToHide = false; this.currentPosition = { left: 0, top: 0 }; this.dimensions = { width: 100, height: 50 }; this.content = ""; this.redraw = true; this.currentObservers = { showing: false, visible: false, hiding: false, hidden: false }; options = this.adapter.clone(options); if (typeof content === "object") { options = content; content = title = void 0; } else if (typeof title === "object") { options = title; title = void 0; } if (title != null) { options.title = title; } if (content != null) { this.setContent(content); } if (options["extends"] == null) { if (options.style != null) { options["extends"] = options.style; } else { options["extends"] = Opentip.defaultStyle; } } optionSources = [options]; _tmpStyle = options; while (_tmpStyle["extends"]) { styleName = _tmpStyle["extends"]; _tmpStyle = Opentip.styles[styleName]; if (_tmpStyle == null) { throw new Error("Invalid style: " + styleName); } optionSources.unshift(_tmpStyle); if (!((_tmpStyle["extends"] != null) || styleName === "standard")) { _tmpStyle["extends"] = "standard"; } } options = (_ref = this.adapter).extend.apply(_ref, [{}].concat(__slice.call(optionSources))); options.hideTriggers = (function() { var _i, _len, _ref1, _results; _ref1 = options.hideTriggers; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { hideTrigger = _ref1[_i]; _results.push(hideTrigger); } return _results; })(); if (options.hideTrigger && options.hideTriggers.length === 0) { options.hideTriggers.push(options.hideTrigger); } _ref1 = ["tipJoint", "targetJoint", "stem"]; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { prop = _ref1[_i]; if (options[prop] && typeof options[prop] === "string") { options[prop] = new Opentip.Joint(options[prop]); } } if (options.ajax && (options.ajax === true || !options.ajax)) { if (this.adapter.tagName(this.triggerElement) === "A") { options.ajax = this.adapter.attr(this.triggerElement, "href"); } else { options.ajax = false; } } if (options.showOn === "click" && this.adapter.tagName(this.triggerElement) === "A") { this.adapter.observe(this.triggerElement, "click", function(e) { e.preventDefault(); e.stopPropagation(); return e.stopped = true; }); } if (options.target) { options.fixed = true; } if (options.stem === true) { options.stem = new Opentip.Joint(options.tipJoint); } if (options.target === true) { options.target = this.triggerElement; } else if (options.target) { options.target = this.adapter.wrap(options.target); } this.currentStem = options.stem; if (options.delay == null) { options.delay = options.showOn === "mouseover" ? 0.2 : 0; } if (options.targetJoint == null) { options.targetJoint = new Opentip.Joint(options.tipJoint).flip(); } this.showTriggers = []; this.showTriggersWhenVisible = []; this.hideTriggers = []; if (options.showOn && options.showOn !== "creation") { this.showTriggers.push({ element: this.triggerElement, event: options.showOn }); } if (options.ajaxCache != null) { options.cache = options.ajaxCache; delete options.ajaxCache; } this.options = options; this.bound = {}; _ref2 = ["prepareToShow", "prepareToHide", "show", "hide", "reposition"]; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { methodToBind = _ref2[_j]; this.bound[methodToBind] = (function(methodToBind) { return function() { return _this[methodToBind].apply(_this, arguments); }; })(methodToBind); } this.adapter.domReady(function() { _this.activate(); if (_this.options.showOn === "creation") { return _this.prepareToShow(); } }); } Opentip.prototype._setup = function() { var hideOn, hideTrigger, hideTriggerElement, i, _i, _j, _len, _len1, _ref, _ref1, _results; this.debug("Setting up the tooltip."); this._buildContainer(); this.hideTriggers = []; _ref = this.options.hideTriggers; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { hideTrigger = _ref[i]; hideTriggerElement = null; hideOn = this.options.hideOn instanceof Array ? this.options.hideOn[i] : this.options.hideOn; if (typeof hideTrigger === "string") { switch (hideTrigger) { case "trigger": hideOn = hideOn || "mouseout"; hideTriggerElement = this.triggerElement; break; case "tip": hideOn = hideOn || "mouseover"; hideTriggerElement = this.container; break; case "target": hideOn = hideOn || "mouseover"; hideTriggerElement = this.options.target; break; case "closeButton": break; default: throw new Error("Unknown hide trigger: " + hideTrigger + "."); } } else { hideOn = hideOn || "mouseover"; hideTriggerElement = this.adapter.wrap(hideTrigger); } if (hideTriggerElement) { this.hideTriggers.push({ element: hideTriggerElement, event: hideOn, original: hideTrigger }); } } _ref1 = this.hideTriggers; _results = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { hideTrigger = _ref1[_j]; _results.push(this.showTriggersWhenVisible.push({ element: hideTrigger.element, event: "mouseover" })); } return _results; }; Opentip.prototype._buildContainer = function() { this.container = this.adapter.create("
"); this.adapter.css(this.container, { position: "absolute" }); if (this.options.ajax) { this.adapter.addClass(this.container, this["class"].loading); } if (this.options.fixed) { this.adapter.addClass(this.container, this["class"].fixed); } if (this.options.showEffect) { this.adapter.addClass(this.container, "" + this["class"].showEffectPrefix + this.options.showEffect); } if (this.options.hideEffect) { return this.adapter.addClass(this.container, "" + this["class"].hideEffectPrefix + this.options.hideEffect); } }; Opentip.prototype._buildElements = function() { var headerElement, titleElement; this.tooltipElement = this.adapter.create("
"); this.backgroundCanvas = this.adapter.wrap(document.createElement("canvas")); this.adapter.css(this.backgroundCanvas, { position: "absolute" }); if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)); } headerElement = this.adapter.find(this.tooltipElement, "." + this["class"].header); if (this.options.title) { titleElement = this.adapter.create("

"); this.adapter.update(titleElement, this.options.title, this.options.escapeTitle); this.adapter.append(headerElement, titleElement); } if (this.options.ajax && !this.loaded) { this.adapter.append(this.tooltipElement, this.adapter.create("
↻
")); } if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { this.closeButtonElement = this.adapter.create("Close"); this.adapter.append(headerElement, this.closeButtonElement); } this.adapter.append(this.container, this.backgroundCanvas); this.adapter.append(this.container, this.tooltipElement); this.adapter.append(document.body, this.container); this._newContent = true; return this.redraw = true; }; Opentip.prototype.setContent = function(content) { this.content = content; this._newContent = true; if (typeof this.content === "function") { this._contentFunction = this.content; this.content = ""; } else { this._contentFunction = null; } if (this.visible) { return this._updateElementContent(); } }; Opentip.prototype._updateElementContent = function() { var contentDiv; if (this._newContent || (!this.options.cache && this._contentFunction)) { contentDiv = this.adapter.find(this.container, "." + this["class"].content); if (contentDiv != null) { if (this._contentFunction) { this.debug("Executing content function."); this.content = this._contentFunction(this); } this.adapter.update(contentDiv, this.content, this.options.escapeContent); } this._newContent = false; } this._storeAndLockDimensions(); return this.reposition(); }; Opentip.prototype._storeAndLockDimensions = function() { var prevDimension; if (!this.container) { return; } prevDimension = this.dimensions; this.adapter.css(this.container, { width: "auto", left: "0px", top: "0px" }); this.dimensions = this.adapter.dimensions(this.container); this.dimensions.width += 1; this.adapter.css(this.container, { width: "" + this.dimensions.width + "px", top: "" + this.currentPosition.top + "px", left: "" + this.currentPosition.left + "px" }); if (!this._dimensionsEqual(this.dimensions, prevDimension)) { this.redraw = true; return this._draw(); } }; Opentip.prototype.activate = function() { return this._setupObservers("hidden", "hiding"); }; Opentip.prototype.deactivate = function() { this.debug("Deactivating tooltip."); this.hide(); return this._setupObservers("-showing", "-visible", "-hidden", "-hiding"); }; Opentip.prototype._setupObservers = function() { var observeOrStop, removeObserver, state, states, trigger, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _this = this; states = 1 <= arguments.length ? __slice.call(arguments, 0) : []; for (_i = 0, _len = states.length; _i < _len; _i++) { state = states[_i]; removeObserver = false; if (state.charAt(0) === "-") { removeObserver = true; state = state.substr(1); } if (this.currentObservers[state] === !removeObserver) { continue; } this.currentObservers[state] = !removeObserver; observeOrStop = function() { var args, _ref, _ref1; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (removeObserver) { return (_ref = _this.adapter).stopObserving.apply(_ref, args); } else { return (_ref1 = _this.adapter).observe.apply(_ref1, args); } }; switch (state) { case "showing": _ref = this.hideTriggers; for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { trigger = _ref[_j]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToHide); } observeOrStop((document.onresize != null ? document : window), "resize", this.bound.reposition); observeOrStop(window, "scroll", this.bound.reposition); break; case "visible": _ref1 = this.showTriggersWhenVisible; for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { trigger = _ref1[_k]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hiding": _ref2 = this.showTriggers; for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { trigger = _ref2[_l]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hidden": break; default: throw new Error("Unknown state: " + state); } } return null; }; Opentip.prototype.prepareToShow = function() { this._abortHiding(); this._abortShowing(); if (this.visible) { return; } this.debug("Showing in " + this.options.delay + "s."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._abortShowingGroup(this.options.group, this); } this.preparingToShow = true; this._setupObservers("-hidden", "-hiding", "showing"); this._followMousePosition(); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); return this._showTimeoutId = this.setTimeout(this.bound.show, this.options.delay || 0); }; Opentip.prototype.show = function() { var _this = this; this._abortHiding(); if (this.visible) { return; } this._clearTimeouts(); if (!this._triggerElementExists()) { return this.deactivate(); } this.debug("Showing now."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._hideGroup(this.options.group, this); } this.visible = true; this.preparingToShow = false; if (this.tooltipElement == null) { this._buildElements(); } this._updateElementContent(); if (this.options.ajax && (!this.loaded || !this.options.cache)) { this._loadAjax(); } this._searchAndActivateCloseButtons(); this._startEnsureTriggerElement(); this.adapter.css(this.container, { zIndex: Opentip.lastZIndex++ }); this._setupObservers("-hidden", "-hiding", "-showing", "-visible", "showing", "visible"); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); this.adapter.removeClass(this.container, this["class"].hiding); this.adapter.removeClass(this.container, this["class"].hidden); this.adapter.addClass(this.container, this["class"].goingToShow); this.setCss3Style(this.container, { transitionDuration: "0s" }); this.defer(function() { var delay; if (!_this.visible || _this.preparingToHide) { return; } _this.adapter.removeClass(_this.container, _this["class"].goingToShow); _this.adapter.addClass(_this.container, _this["class"].showing); delay = 0; if (_this.options.showEffect && _this.options.showEffectDuration) { delay = _this.options.showEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + delay + "s" }); _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].showing); return _this.adapter.addClass(_this.container, _this["class"].visible); }, delay); return _this._activateFirstInput(); }); return this._draw(); }; Opentip.prototype._abortShowing = function() { if (this.preparingToShow) { this.debug("Aborting showing."); this._clearTimeouts(); this._stopFollowingMousePosition(); this.preparingToShow = false; return this._setupObservers("-showing", "-visible", "hiding", "hidden"); } }; Opentip.prototype.prepareToHide = function() { this._abortShowing(); this._abortHiding(); if (!this.visible) { return; } this.debug("Hiding in " + this.options.hideDelay + "s"); this.preparingToHide = true; this._setupObservers("-showing", "visible", "-hidden", "hiding"); return this._hideTimeoutId = this.setTimeout(this.bound.hide, this.options.hideDelay); }; Opentip.prototype.hide = function() { var _this = this; this._abortShowing(); if (!this.visible) { return; } this._clearTimeouts(); this.debug("Hiding!"); this.visible = false; this.preparingToHide = false; this._stopEnsureTriggerElement(); this._setupObservers("-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden"); if (!this.options.fixed) { this._stopFollowingMousePosition(); } if (!this.container) { return; } this.adapter.removeClass(this.container, this["class"].visible); this.adapter.removeClass(this.container, this["class"].showing); this.adapter.addClass(this.container, this["class"].goingToHide); this.setCss3Style(this.container, { transitionDuration: "0s" }); return this.defer(function() { var hideDelay; _this.adapter.removeClass(_this.container, _this["class"].goingToHide); _this.adapter.addClass(_this.container, _this["class"].hiding); hideDelay = 0; if (_this.options.hideEffect && _this.options.hideEffectDuration) { hideDelay = _this.options.hideEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + hideDelay + "s" }); return _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].hiding); _this.adapter.addClass(_this.container, _this["class"].hidden); _this.setCss3Style(_this.container, { transitionDuration: "0s" }); if (_this.options.removeElementsOnHide) { _this.debug("Removing HTML elements."); _this.adapter.remove(_this.container); delete _this.container; return delete _this.tooltipElement; } }, hideDelay); }); }; Opentip.prototype._abortHiding = function() { if (this.preparingToHide) { this.debug("Aborting hiding."); this._clearTimeouts(); this.preparingToHide = false; return this._setupObservers("-hiding", "showing", "visible"); } }; Opentip.prototype.reposition = function() { var position, stem, _ref, _this = this; position = this.getPosition(); if (position == null) { return; } stem = this.options.stem; if (this.options.containInViewport) { _ref = this._ensureViewportContainment(position), position = _ref.position, stem = _ref.stem; } if (this._positionsEqual(position, this.currentPosition)) { return; } if (!(!this.options.stem || stem.eql(this.currentStem))) { this.redraw = true; } this.currentPosition = position; this.currentStem = stem; this._draw(); this.adapter.css(this.container, { left: "" + position.left + "px", top: "" + position.top + "px" }); return this.defer(function() { var rawContainer, redrawFix; rawContainer = _this.adapter.unwrap(_this.container); rawContainer.style.visibility = "hidden"; redrawFix = rawContainer.offsetHeight; return rawContainer.style.visibility = "visible"; }); }; Opentip.prototype.getPosition = function(tipJoint, targetJoint, stem) { var additionalHorizontal, additionalVertical, offsetDistance, position, stemLength, targetDimensions, targetPosition, unwrappedTarget, _ref; if (!this.container) { return; } if (tipJoint == null) { tipJoint = this.options.tipJoint; } if (targetJoint == null) { targetJoint = this.options.targetJoint; } position = {}; if (this.options.target) { targetPosition = this.adapter.offset(this.options.target); targetDimensions = this.adapter.dimensions(this.options.target); position = targetPosition; if (targetJoint.right) { unwrappedTarget = this.adapter.unwrap(this.options.target); if (unwrappedTarget.getBoundingClientRect != null) { position.left = unwrappedTarget.getBoundingClientRect().right + ((_ref = window.pageXOffset) != null ? _ref : document.body.scrollLeft); } else { position.left += targetDimensions.width; } } else if (targetJoint.center) { position.left += Math.round(targetDimensions.width / 2); } if (targetJoint.bottom) { position.top += targetDimensions.height; } else if (targetJoint.middle) { position.top += Math.round(targetDimensions.height / 2); } if (this.options.borderWidth) { if (this.options.tipJoint.left) { position.left += this.options.borderWidth; } if (this.options.tipJoint.right) { position.left -= this.options.borderWidth; } if (this.options.tipJoint.top) { position.top += this.options.borderWidth; } else if (this.options.tipJoint.bottom) { position.top -= this.options.borderWidth; } } } else { if (this.initialMousePosition) { position = { top: this.initialMousePosition.y, left: this.initialMousePosition.x }; } else { position = { top: mousePosition.y, left: mousePosition.x }; } } if (this.options.autoOffset) { stemLength = this.options.stem ? this.options.stemLength : 0; offsetDistance = stemLength && this.options.fixed ? 2 : 10; additionalHorizontal = tipJoint.middle && !this.options.fixed ? 15 : 0; additionalVertical = tipJoint.center && !this.options.fixed ? 15 : 0; if (tipJoint.right) { position.left -= offsetDistance + additionalHorizontal; } else if (tipJoint.left) { position.left += offsetDistance + additionalHorizontal; } if (tipJoint.bottom) { position.top -= offsetDistance + additionalVertical; } else if (tipJoint.top) { position.top += offsetDistance + additionalVertical; } if (stemLength) { if (stem == null) { stem = this.options.stem; } if (stem.right) { position.left -= stemLength; } else if (stem.left) { position.left += stemLength; } if (stem.bottom) { position.top -= stemLength; } else if (stem.top) { position.top += stemLength; } } } position.left += this.options.offset[0]; position.top += this.options.offset[1]; if (tipJoint.right) { position.left -= this.dimensions.width; } else if (tipJoint.center) { position.left -= Math.round(this.dimensions.width / 2); } if (tipJoint.bottom) { position.top -= this.dimensions.height; } else if (tipJoint.middle) { position.top -= Math.round(this.dimensions.height / 2); } return position; }; Opentip.prototype._ensureViewportContainment = function(position) { var needsRepositioning, newSticksOut, originals, revertedX, revertedY, scrollOffset, stem, sticksOut, targetJoint, tipJoint, viewportDimensions, viewportPosition; stem = this.options.stem; originals = { position: position, stem: stem }; if (!(this.visible && position)) { return originals; } sticksOut = this._sticksOut(position); if (!(sticksOut[0] || sticksOut[1])) { return originals; } tipJoint = new Opentip.Joint(this.options.tipJoint); if (this.options.targetJoint) { targetJoint = new Opentip.Joint(this.options.targetJoint); } scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); viewportPosition = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; needsRepositioning = false; if (viewportDimensions.width >= this.dimensions.width) { if (sticksOut[0]) { needsRepositioning = true; switch (sticksOut[0]) { case this.STICKS_OUT_LEFT: tipJoint.setHorizontal("left"); if (this.options.targetJoint) { targetJoint.setHorizontal("right"); } break; case this.STICKS_OUT_RIGHT: tipJoint.setHorizontal("right"); if (this.options.targetJoint) { targetJoint.setHorizontal("left"); } } } } if (viewportDimensions.height >= this.dimensions.height) { if (sticksOut[1]) { needsRepositioning = true; switch (sticksOut[1]) { case this.STICKS_OUT_TOP: tipJoint.setVertical("top"); if (this.options.targetJoint) { targetJoint.setVertical("bottom"); } break; case this.STICKS_OUT_BOTTOM: tipJoint.setVertical("bottom"); if (this.options.targetJoint) { targetJoint.setVertical("top"); } } } } if (!needsRepositioning) { return originals; } if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); newSticksOut = this._sticksOut(position); revertedX = false; revertedY = false; if (newSticksOut[0] && (newSticksOut[0] !== sticksOut[0])) { revertedX = true; tipJoint.setHorizontal(this.options.tipJoint.horizontal); if (this.options.targetJoint) { targetJoint.setHorizontal(this.options.targetJoint.horizontal); } } if (newSticksOut[1] && (newSticksOut[1] !== sticksOut[1])) { revertedY = true; tipJoint.setVertical(this.options.tipJoint.vertical); if (this.options.targetJoint) { targetJoint.setVertical(this.options.targetJoint.vertical); } } if (revertedX && revertedY) { return originals; } if (revertedX || revertedY) { if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); } return { position: position, stem: stem }; }; Opentip.prototype._sticksOut = function(position) { var positionOffset, scrollOffset, sticksOut, viewportDimensions; scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); positionOffset = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; sticksOut = [false, false]; if (positionOffset[0] < 0) { sticksOut[0] = this.STICKS_OUT_LEFT; } else if (positionOffset[0] + this.dimensions.width > viewportDimensions.width) { sticksOut[0] = this.STICKS_OUT_RIGHT; } if (positionOffset[1] < 0) { sticksOut[1] = this.STICKS_OUT_TOP; } else if (positionOffset[1] + this.dimensions.height > viewportDimensions.height) { sticksOut[1] = this.STICKS_OUT_BOTTOM; } return sticksOut; }; Opentip.prototype._draw = function() { var backgroundCanvas, bulge, canvasDimensions, canvasPosition, closeButton, closeButtonInner, closeButtonOuter, ctx, drawCorner, drawLine, hb, position, stemBase, stemLength, _i, _len, _ref, _ref1, _ref2, _this = this; if (!(this.backgroundCanvas && this.redraw)) { return; } this.debug("Drawing background."); this.redraw = false; if (this.currentStem) { _ref = ["top", "right", "bottom", "left"]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { position = _ref[_i]; this.adapter.removeClass(this.container, "stem-" + position); } this.adapter.addClass(this.container, "stem-" + this.currentStem.horizontal); this.adapter.addClass(this.container, "stem-" + this.currentStem.vertical); } closeButtonInner = [0, 0]; closeButtonOuter = [0, 0]; if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { closeButton = new Opentip.Joint(((_ref1 = this.currentStem) != null ? _ref1.toString() : void 0) === "top right" ? "top left" : "top right"); closeButtonInner = [this.options.closeButtonRadius + this.options.closeButtonOffset[0], this.options.closeButtonRadius + this.options.closeButtonOffset[1]]; closeButtonOuter = [this.options.closeButtonRadius - this.options.closeButtonOffset[0], this.options.closeButtonRadius - this.options.closeButtonOffset[1]]; } canvasDimensions = this.adapter.clone(this.dimensions); canvasPosition = [0, 0]; if (this.options.borderWidth) { canvasDimensions.width += this.options.borderWidth * 2; canvasDimensions.height += this.options.borderWidth * 2; canvasPosition[0] -= this.options.borderWidth; canvasPosition[1] -= this.options.borderWidth; } if (this.options.shadow) { canvasDimensions.width += this.options.shadowBlur * 2; canvasDimensions.width += Math.max(0, this.options.shadowOffset[0] - this.options.shadowBlur * 2); canvasDimensions.height += this.options.shadowBlur * 2; canvasDimensions.height += Math.max(0, this.options.shadowOffset[1] - this.options.shadowBlur * 2); canvasPosition[0] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[0]); canvasPosition[1] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[1]); } bulge = { left: 0, right: 0, top: 0, bottom: 0 }; if (this.currentStem) { if (this.currentStem.left) { bulge.left = this.options.stemLength; } else if (this.currentStem.right) { bulge.right = this.options.stemLength; } if (this.currentStem.top) { bulge.top = this.options.stemLength; } else if (this.currentStem.bottom) { bulge.bottom = this.options.stemLength; } } if (closeButton) { if (closeButton.left) { bulge.left = Math.max(bulge.left, closeButtonOuter[0]); } else if (closeButton.right) { bulge.right = Math.max(bulge.right, closeButtonOuter[0]); } if (closeButton.top) { bulge.top = Math.max(bulge.top, closeButtonOuter[1]); } else if (closeButton.bottom) { bulge.bottom = Math.max(bulge.bottom, closeButtonOuter[1]); } } canvasDimensions.width += bulge.left + bulge.right; canvasDimensions.height += bulge.top + bulge.bottom; canvasPosition[0] -= bulge.left; canvasPosition[1] -= bulge.top; if (this.currentStem && this.options.borderWidth) { _ref2 = this._getPathStemMeasures(this.options.stemBase, this.options.stemLength, this.options.borderWidth), stemLength = _ref2.stemLength, stemBase = _ref2.stemBase; } backgroundCanvas = this.adapter.unwrap(this.backgroundCanvas); backgroundCanvas.width = canvasDimensions.width; backgroundCanvas.height = canvasDimensions.height; this.adapter.css(this.backgroundCanvas, { width: "" + backgroundCanvas.width + "px", height: "" + backgroundCanvas.height + "px", left: "" + canvasPosition[0] + "px", top: "" + canvasPosition[1] + "px" }); ctx = backgroundCanvas.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height); ctx.beginPath(); ctx.fillStyle = this._getColor(ctx, this.dimensions, this.options.background, this.options.backgroundGradientHorizontal); ctx.lineJoin = "miter"; ctx.miterLimit = 500; hb = this.options.borderWidth / 2; if (this.options.borderWidth) { ctx.strokeStyle = this.options.borderColor; ctx.lineWidth = this.options.borderWidth; } else { stemLength = this.options.stemLength; stemBase = this.options.stemBase; } if (stemBase == null) { stemBase = 0; } drawLine = function(length, stem, first) { if (first) { ctx.moveTo(Math.max(stemBase, _this.options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb); } if (stem) { ctx.lineTo(length / 2 - stemBase / 2, -hb); ctx.lineTo(length / 2, -stemLength - hb); return ctx.lineTo(length / 2 + stemBase / 2, -hb); } }; drawCorner = function(stem, closeButton, i) { var angle1, angle2, innerWidth, offset; if (stem) { ctx.lineTo(-stemBase + hb, 0 - hb); ctx.lineTo(stemLength + hb, -stemLength - hb); return ctx.lineTo(hb, stemBase - hb); } else if (closeButton) { offset = _this.options.closeButtonOffset; innerWidth = closeButtonInner[0]; if (i % 2 !== 0) { offset = [offset[1], offset[0]]; innerWidth = closeButtonInner[1]; } angle1 = Math.acos(offset[1] / _this.options.closeButtonRadius); angle2 = Math.acos(offset[0] / _this.options.closeButtonRadius); ctx.lineTo(-innerWidth + hb, -hb); return ctx.arc(hb - offset[0], -hb + offset[1], _this.options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, false); } else { ctx.lineTo(-_this.options.borderRadius + hb, -hb); return ctx.quadraticCurveTo(hb, -hb, hb, _this.options.borderRadius - hb); } }; ctx.translate(-canvasPosition[0], -canvasPosition[1]); ctx.save(); (function() { var cornerStem, i, lineLength, lineStem, positionIdx, positionX, positionY, rotation, _j, _ref3, _results; _results = []; for (i = _j = 0, _ref3 = Opentip.positions.length / 2; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) { positionIdx = i * 2; positionX = i === 0 || i === 3 ? 0 : _this.dimensions.width; positionY = i < 2 ? 0 : _this.dimensions.height; rotation = (Math.PI / 2) * i; lineLength = i % 2 === 0 ? _this.dimensions.width : _this.dimensions.height; lineStem = new Opentip.Joint(Opentip.positions[positionIdx]); cornerStem = new Opentip.Joint(Opentip.positions[positionIdx + 1]); ctx.save(); ctx.translate(positionX, positionY); ctx.rotate(rotation); drawLine(lineLength, lineStem.eql(_this.currentStem), i === 0); ctx.translate(lineLength, 0); drawCorner(cornerStem.eql(_this.currentStem), cornerStem.eql(closeButton), i); _results.push(ctx.restore()); } return _results; })(); ctx.closePath(); ctx.save(); if (this.options.shadow) { ctx.shadowColor = this.options.shadowColor; ctx.shadowBlur = this.options.shadowBlur; ctx.shadowOffsetX = this.options.shadowOffset[0]; ctx.shadowOffsetY = this.options.shadowOffset[1]; } ctx.fill(); ctx.restore(); if (this.options.borderWidth) { ctx.stroke(); } ctx.restore(); if (closeButton) { return (function() { var crossCenter, crossHeight, crossWidth, hcs, linkCenter; crossWidth = crossHeight = _this.options.closeButtonRadius * 2; if (closeButton.toString() === "top right") { linkCenter = [_this.dimensions.width - _this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] + hb, linkCenter[1] - hb]; } else { linkCenter = [_this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] - hb, linkCenter[1] - hb]; } ctx.translate(crossCenter[0], crossCenter[1]); hcs = _this.options.closeButtonCrossSize / 2; ctx.save(); ctx.beginPath(); ctx.strokeStyle = _this.options.closeButtonCrossColor; ctx.lineWidth = _this.options.closeButtonCrossLineWidth; ctx.lineCap = "round"; ctx.moveTo(-hcs, -hcs); ctx.lineTo(hcs, hcs); ctx.stroke(); ctx.beginPath(); ctx.moveTo(hcs, -hcs); ctx.lineTo(-hcs, hcs); ctx.stroke(); ctx.restore(); return _this.adapter.css(_this.closeButtonElement, { left: "" + (linkCenter[0] - hcs - _this.options.closeButtonLinkOverscan) + "px", top: "" + (linkCenter[1] - hcs - _this.options.closeButtonLinkOverscan) + "px", width: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px", height: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px" }); })(); } }; Opentip.prototype._getPathStemMeasures = function(outerStemBase, outerStemLength, borderWidth) { var angle, distanceBetweenTips, halfAngle, hb, rhombusSide, stemBase, stemLength; hb = borderWidth / 2; halfAngle = Math.atan((outerStemBase / 2) / outerStemLength); angle = halfAngle * 2; rhombusSide = hb / Math.sin(angle); distanceBetweenTips = 2 * rhombusSide * Math.cos(halfAngle); stemLength = hb + outerStemLength - distanceBetweenTips; if (stemLength < 0) { throw new Error("Sorry but your stemLength / stemBase ratio is strange."); } stemBase = (Math.tan(halfAngle) * stemLength) * 2; return { stemLength: stemLength, stemBase: stemBase }; }; Opentip.prototype._getColor = function(ctx, dimensions, color, horizontal) { var colorStop, gradient, i, _i, _len; if (horizontal == null) { horizontal = false; } if (typeof color === "string") { return color; } if (horizontal) { gradient = ctx.createLinearGradient(0, 0, dimensions.width, 0); } else { gradient = ctx.createLinearGradient(0, 0, 0, dimensions.height); } for (i = _i = 0, _len = color.length; _i < _len; i = ++_i) { colorStop = color[i]; gradient.addColorStop(colorStop[0], colorStop[1]); } return gradient; }; Opentip.prototype._searchAndActivateCloseButtons = function() { var element, _i, _len, _ref; _ref = this.adapter.findAll(this.container, "." + this["class"].close); for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; this.hideTriggers.push({ element: this.adapter.wrap(element), event: "click" }); } if (this.currentObservers.showing) { this._setupObservers("-showing", "showing"); } if (this.currentObservers.visible) { return this._setupObservers("-visible", "visible"); } }; Opentip.prototype._activateFirstInput = function() { var input; input = this.adapter.unwrap(this.adapter.find(this.container, "input, textarea")); return input != null ? typeof input.focus === "function" ? input.focus() : void 0 : void 0; }; Opentip.prototype._followMousePosition = function() { if (!this.options.fixed) { return Opentip._observeMousePosition(this.bound.reposition); } }; Opentip.prototype._stopFollowingMousePosition = function() { if (!this.options.fixed) { return Opentip._stopObservingMousePosition(this.bound.reposition); } }; Opentip.prototype._clearShowTimeout = function() { return clearTimeout(this._showTimeoutId); }; Opentip.prototype._clearHideTimeout = function() { return clearTimeout(this._hideTimeoutId); }; Opentip.prototype._clearTimeouts = function() { clearTimeout(this._visibilityStateTimeoutId); this._clearShowTimeout(); return this._clearHideTimeout(); }; Opentip.prototype._triggerElementExists = function() { var el; el = this.adapter.unwrap(this.triggerElement); while (el.parentNode) { if (el.parentNode.tagName === "BODY") { return true; } el = el.parentNode; } return false; }; Opentip.prototype._loadAjax = function() { var _this = this; if (this.loading) { return; } this.loaded = false; this.loading = true; this.adapter.addClass(this.container, this["class"].loading); this.setContent(""); this.debug("Loading content from " + this.options.ajax); return this.adapter.ajax({ url: this.options.ajax, method: this.options.ajaxMethod, onSuccess: function(responseText) { _this.debug("Loading successful."); _this.adapter.removeClass(_this.container, _this["class"].loading); return _this.setContent(responseText); }, onError: function(error) { var message; message = _this.options.ajaxErrorMessage; _this.debug(message, error); _this.setContent(message); return _this.adapter.addClass(_this.container, _this["class"].ajaxError); }, onComplete: function() { _this.adapter.removeClass(_this.container, _this["class"].loading); _this.loading = false; _this.loaded = true; _this._searchAndActivateCloseButtons(); _this._activateFirstInput(); return _this.reposition(); } }); }; Opentip.prototype._ensureTriggerElement = function() { if (!this._triggerElementExists()) { this.deactivate(); return this._stopEnsureTriggerElement(); } }; Opentip.prototype._ensureTriggerElementInterval = 1000; Opentip.prototype._startEnsureTriggerElement = function() { var _this = this; return this._ensureTriggerElementTimeoutId = setInterval((function() { return _this._ensureTriggerElement(); }), this._ensureTriggerElementInterval); }; Opentip.prototype._stopEnsureTriggerElement = function() { return clearInterval(this._ensureTriggerElementTimeoutId); }; return Opentip; })(); vendors = ["khtml", "ms", "o", "moz", "webkit"]; Opentip.prototype.setCss3Style = function(element, styles) { var prop, value, vendor, vendorProp, _results; element = this.adapter.unwrap(element); _results = []; for (prop in styles) { if (!__hasProp.call(styles, prop)) continue; value = styles[prop]; if (element.style[prop] != null) { _results.push(element.style[prop] = value); } else { _results.push((function() { var _i, _len, _results1; _results1 = []; for (_i = 0, _len = vendors.length; _i < _len; _i++) { vendor = vendors[_i]; vendorProp = "" + (this.ucfirst(vendor)) + (this.ucfirst(prop)); if (element.style[vendorProp] != null) { _results1.push(element.style[vendorProp] = value); } else { _results1.push(void 0); } } return _results1; }).call(this)); } } return _results; }; Opentip.prototype.defer = function(func) { return setTimeout(func, 0); }; Opentip.prototype.setTimeout = function(func, seconds) { return setTimeout(func, seconds ? seconds * 1000 : 0); }; Opentip.prototype.ucfirst = function(string) { if (string == null) { return ""; } return string.charAt(0).toUpperCase() + string.slice(1); }; Opentip.prototype.dasherize = function(string) { return string.replace(/([A-Z])/g, function(_, character) { return "-" + (character.toLowerCase()); }); }; mousePositionObservers = []; mousePosition = { x: 0, y: 0 }; mouseMoved = function(e) { var observer, _i, _len, _results; mousePosition = Opentip.adapter.mousePosition(e); _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; _results.push(observer()); } return _results; }; Opentip.followMousePosition = function() { return Opentip.adapter.observe(document.body, "mousemove", mouseMoved); }; Opentip._observeMousePosition = function(observer) { return mousePositionObservers.push(observer); }; Opentip._stopObservingMousePosition = function(removeObserver) { var observer; return mousePositionObservers = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; if (observer !== removeObserver) { _results.push(observer); } } return _results; })(); }; Opentip.Joint = (function() { function Joint(pointerString) { if (pointerString == null) { return; } if (pointerString instanceof Opentip.Joint) { pointerString = pointerString.toString(); } this.set(pointerString); this; } Joint.prototype.set = function(string) { string = string.toLowerCase(); this.setHorizontal(string); this.setVertical(string); return this; }; Joint.prototype.setHorizontal = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["left", "center", "right"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.horizontal = i.toLowerCase(); } } if (this.horizontal == null) { this.horizontal = "center"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.horizontal === i ? i : void 0); } return _results; }; Joint.prototype.setVertical = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["top", "middle", "bottom"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.vertical = i.toLowerCase(); } } if (this.vertical == null) { this.vertical = "middle"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.vertical === i ? i : void 0); } return _results; }; Joint.prototype.eql = function(pointer) { return (pointer != null) && this.horizontal === pointer.horizontal && this.vertical === pointer.vertical; }; Joint.prototype.flip = function() { var flippedIndex, positionIdx; positionIdx = Opentip.position[this.toString(true)]; flippedIndex = (positionIdx + 4) % 8; this.set(Opentip.positions[flippedIndex]); return this; }; Joint.prototype.toString = function(camelized) { var horizontal, vertical; if (camelized == null) { camelized = false; } vertical = this.vertical === "middle" ? "" : this.vertical; horizontal = this.horizontal === "center" ? "" : this.horizontal; if (vertical && horizontal) { if (camelized) { horizontal = Opentip.prototype.ucfirst(horizontal); } else { horizontal = " " + horizontal; } } return "" + vertical + horizontal; }; return Joint; })(); Opentip.prototype._positionsEqual = function(posA, posB) { return (posA != null) && (posB != null) && posA.left === posB.left && posA.top === posB.top; }; Opentip.prototype._dimensionsEqual = function(dimA, dimB) { return (dimA != null) && (dimB != null) && dimA.width === dimB.width && dimA.height === dimB.height; }; Opentip.prototype.debug = function() { var args; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (Opentip.debug && ((typeof console !== "undefined" && console !== null ? console.debug : void 0) != null)) { args.unshift("#" + this.id + " |"); return console.debug.apply(console, args); } }; Opentip.findElements = function() { var adapter, content, element, optionName, optionValue, options, _i, _len, _ref, _results; adapter = Opentip.adapter; _ref = adapter.findAll(document.body, "[data-ot]"); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; options = {}; content = adapter.data(element, "ot"); if (content === "" || content === "true" || content === "yes") { content = adapter.attr(element, "title"); adapter.attr(element, "title", ""); } content = content || ""; for (optionName in Opentip.styles.standard) { optionValue = adapter.data(element, "ot" + (Opentip.prototype.ucfirst(optionName))); if (optionValue != null) { if (optionValue === "yes" || optionValue === "true" || optionValue === "on") { optionValue = true; } else if (optionValue === "no" || optionValue === "false" || optionValue === "off") { optionValue = false; } options[optionName] = optionValue; } } _results.push(new Opentip(element, content, options)); } return _results; }; Opentip.version = "2.4.6"; Opentip.debug = false; Opentip.lastId = 0; Opentip.lastZIndex = 100; Opentip.tips = []; Opentip._abortShowingGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip._abortShowing()); } else { _results.push(void 0); } } return _results; }; Opentip._hideGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip.hide()); } else { _results.push(void 0); } } return _results; }; Opentip.adapters = {}; Opentip.adapter = null; firstAdapter = true; Opentip.addAdapter = function(adapter) { Opentip.adapters[adapter.name] = adapter; if (firstAdapter) { Opentip.adapter = adapter; adapter.domReady(Opentip.findElements); adapter.domReady(Opentip.followMousePosition); return firstAdapter = false; } }; Opentip.positions = ["top", "topRight", "right", "bottomRight", "bottom", "bottomLeft", "left", "topLeft"]; Opentip.position = {}; _ref = Opentip.positions; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { position = _ref[i]; Opentip.position[position] = i; } Opentip.styles = { standard: { "extends": null, title: void 0, escapeTitle: true, escapeContent: false, className: "standard", stem: true, delay: null, hideDelay: 0.1, fixed: false, showOn: "mouseover", hideTrigger: "trigger", hideTriggers: [], hideOn: null, removeElementsOnHide: false, offset: [0, 0], containInViewport: true, autoOffset: true, showEffect: "appear", hideEffect: "fade", showEffectDuration: 0.3, hideEffectDuration: 0.2, stemLength: 5, stemBase: 8, tipJoint: "top left", target: null, targetJoint: null, cache: true, ajax: false, ajaxMethod: "GET", ajaxErrorMessage: "There was a problem downloading the content.", group: null, style: null, background: "#fff18f", backgroundGradientHorizontal: false, closeButtonOffset: [5, 5], closeButtonRadius: 7, closeButtonCrossSize: 4, closeButtonCrossColor: "#d2c35b", closeButtonCrossLineWidth: 1.5, closeButtonLinkOverscan: 6, borderRadius: 5, borderWidth: 1, borderColor: "#f2e37b", shadow: true, shadowBlur: 10, shadowOffset: [3, 3], shadowColor: "rgba(0, 0, 0, 0.1)" }, glass: { "extends": "standard", className: "glass", background: [[0, "rgba(252, 252, 252, 0.8)"], [0.5, "rgba(255, 255, 255, 0.8)"], [0.5, "rgba(250, 250, 250, 0.9)"], [1, "rgba(245, 245, 245, 0.9)"]], borderColor: "#eee", closeButtonCrossColor: "rgba(0, 0, 0, 0.2)", borderRadius: 15, closeButtonRadius: 10, closeButtonOffset: [8, 8] }, dark: { "extends": "standard", className: "dark", borderRadius: 13, borderColor: "#444", closeButtonCrossColor: "rgba(240, 240, 240, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(30, 30, 30, 0.7)"], [0.5, "rgba(30, 30, 30, 0.8)"], [0.5, "rgba(10, 10, 10, 0.8)"], [1, "rgba(10, 10, 10, 0.9)"]] }, alert: { "extends": "standard", className: "alert", borderRadius: 1, borderColor: "#AE0D11", closeButtonCrossColor: "rgba(255, 255, 255, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(203, 15, 19, 0.7)"], [0.5, "rgba(203, 15, 19, 0.8)"], [0.5, "rgba(189, 14, 18, 0.8)"], [1, "rgba(179, 14, 17, 0.9)"]] } }; Opentip.defaultStyle = "standard"; if (typeof module !== "undefined" && module !== null) { module.exports = Opentip; } else { window.Opentip = Opentip; } // Generated by CoffeeScript 1.4.0 var __slice = [].slice; (function() { var Adapter, isArrayOrNodeList; Element.addMethods({ addTip: function(element, content, title, options) { return new Opentip(element, content, title, options); } }); isArrayOrNodeList = function(element) { if ((element instanceof Array) || ((element != null) && typeof element.length === 'number' && typeof element.item === 'function' && typeof element.nextNode === 'function' && typeof element.reset === 'function')) { return true; } return false; }; Adapter = (function() { function Adapter() {} Adapter.prototype.name = "prototype"; Adapter.prototype.domReady = function(callback) { if (document.loaded) { return callback(); } else { return $(document).observe("dom:loaded", callback); } }; Adapter.prototype.create = function(html) { return new Element('div').update(html).childElements(); }; Adapter.prototype.wrap = function(element) { if (isArrayOrNodeList(element)) { if (element.length > 1) { throw new Error("Multiple elements provided."); } element = this.unwrap(element); } else if (typeof element === "string") { element = $$(element)[0]; } return $(element); }; Adapter.prototype.unwrap = function(element) { if (isArrayOrNodeList(element)) { return element[0]; } else { return element; } }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; if (args.length === 1) { return this.wrap(element).readAttribute(args[0]); } else { return (_ref = this.wrap(element)).writeAttribute.apply(_ref, args); } }; Adapter.prototype.data = function(element, name, value) { var arg; this.wrap(element); if (arguments.length > 2) { return element.store(name, value); } else { arg = element.readAttribute("data-" + (name.underscore().dasherize())); if (arg != null) { return arg; } return element.retrieve(name); } }; Adapter.prototype.find = function(element, selector) { return this.wrap(element).select(selector)[0]; }; Adapter.prototype.findAll = function(element, selector) { return this.wrap(element).select(selector); }; Adapter.prototype.update = function(element, content, escape) { return this.wrap(element).update(escape ? content.escapeHTML() : content); }; Adapter.prototype.append = function(element, child) { return this.wrap(element).insert(this.wrap(child)); }; Adapter.prototype.remove = function(element) { return this.wrap(element).remove(); }; Adapter.prototype.addClass = function(element, className) { return this.wrap(element).addClassName(className); }; Adapter.prototype.removeClass = function(element, className) { return this.wrap(element).removeClassName(className); }; Adapter.prototype.css = function(element, properties) { return this.wrap(element).setStyle(properties); }; Adapter.prototype.dimensions = function(element) { return this.wrap(element).getDimensions(); }; Adapter.prototype.scrollOffset = function() { var offsets; offsets = document.viewport.getScrollOffsets(); return [offsets.left, offsets.top]; }; Adapter.prototype.viewportDimensions = function() { return document.viewport.getDimensions(); }; Adapter.prototype.mousePosition = function(e) { if (e == null) { return null; } return { x: Event.pointerX(e), y: Event.pointerY(e) }; }; Adapter.prototype.offset = function(element) { var offset; offset = this.wrap(element).cumulativeOffset(); return { left: offset.left, top: offset.top }; }; Adapter.prototype.observe = function(element, eventName, observer) { return Event.observe(this.wrap(element), eventName, observer); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return Event.stopObserving(this.wrap(element), eventName, observer); }; Adapter.prototype.ajax = function(options) { var _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } return new Ajax.Request(options.url, { method: (_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET", onSuccess: function(response) { return typeof options.onSuccess === "function" ? options.onSuccess(response.responseText) : void 0; }, onFailure: function(response) { return typeof options.onError === "function" ? options.onError("Server responded with status " + response.status) : void 0; }, onComplete: function() { return typeof options.onComplete === "function" ? options.onComplete() : void 0; } }); }; Adapter.prototype.clone = function(object) { return Object.clone(object); }; Adapter.prototype.extend = function() { var source, sources, target, _i, _len; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; for (_i = 0, _len = sources.length; _i < _len; _i++) { source = sources[_i]; Object.extend(target, source); } return target; }; return Adapter; })(); return Opentip.addAdapter(new Adapter); })(); // Modified by Matias Meno to work in IE8. // I removed the line 312, as proposed by someone on the google forum. // Copyright 2006 Google 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. // Known Issues: // // * Patterns are not implemented. // * Radial gradient are not implemented. The VML version of these look very // different from the canvas one. // * Clipping paths are not implemented. // * Coordsize. The width and height attribute have higher priority than the // width and height style values which isn't correct. // * Painting mode isn't implemented. // * Canvas width/height should is using content-box by default. IE in // Quirks mode will draw the canvas using border-box. Either change your // doctype to HTML5 // (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) // or use Box Sizing Behavior from WebFX // (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) // * Non uniform scaling does not correctly scale strokes. // * Optimize. There is always room for speed improvements. // Only add this code if we do not already have a canvas implementation if (!document.createElement('canvas').getContext) { (function() { // alias some functions to make (compiled) code shorter var m = Math; var mr = m.round; var ms = m.sin; var mc = m.cos; var abs = m.abs; var sqrt = m.sqrt; // this is used for sub pixel precision var Z = 10; var Z2 = Z / 2; /** * This funtion is assigned to the elements as element.getContext(). * @this {HTMLElement} * @return {CanvasRenderingContext2D_} */ function getContext() { return this.context_ || (this.context_ = new CanvasRenderingContext2D_(this)); } var slice = Array.prototype.slice; /** * Binds a function to an object. The returned function will always use the * passed in {@code obj} as {@code this}. * * Example: * * g = bind(f, obj, a, b) * g(c, d) // will do f.call(obj, a, b, c, d) * * @param {Function} f The function to bind the object to * @param {Object} obj The object that should act as this when the function * is called * @param {*} var_args Rest arguments that will be used as the initial * arguments when the function is called * @return {Function} A new function that has bound this */ function bind(f, obj, var_args) { var a = slice.call(arguments, 2); return function() { return f.apply(obj, a.concat(slice.call(arguments))); }; } var G_vmlCanvasManager_ = { init: function(opt_doc) { if (/MSIE/.test(navigator.userAgent) && !window.opera) { var doc = opt_doc || document; // Create a dummy element so that IE will allow canvas elements to be // recognized. doc.createElement('canvas'); doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); } }, init_: function(doc) { // create xmlns if (!doc.namespaces['g_vml_']) { doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', '#default#VML'); } if (!doc.namespaces['g_o_']) { doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', '#default#VML'); } // Setup default CSS. Only add one style sheet per document if (!doc.styleSheets['ex_canvas_']) { var ss = doc.createStyleSheet(); ss.owningElement.id = 'ex_canvas_'; ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + // default size is 300x150 in Gecko and Opera 'text-align:left;width:300px;height:150px}' + 'g_vml_\\:*{behavior:url(#default#VML)}' + 'g_o_\\:*{behavior:url(#default#VML)}'; } // find all canvas elements var els = doc.getElementsByTagName('canvas'); for (var i = 0; i < els.length; i++) { this.initElement(els[i]); } }, /** * Public initializes a canvas element so that it can be used as canvas * element from now on. This is called automatically before the page is * loaded but if you are creating elements using createElement you need to * make sure this is called on the element. * @param {HTMLElement} el The canvas element to initialize. * @return {HTMLElement} the element that was created. */ initElement: function(el) { if (!el.getContext) { el.getContext = getContext; // Remove fallback content. There is no way to hide text nodes so we // just remove all childNodes. We could hide all elements and remove // text nodes but who really cares about the fallback content. el.innerHTML = ''; // do not use inline function because that will leak memory el.attachEvent('onpropertychange', onPropertyChange); el.attachEvent('onresize', onResize); var attrs = el.attributes; if (attrs.width && attrs.width.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setWidth_(attrs.width.nodeValue); el.style.width = attrs.width.nodeValue + 'px'; } else { el.width = el.clientWidth; } if (attrs.height && attrs.height.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setHeight_(attrs.height.nodeValue); el.style.height = attrs.height.nodeValue + 'px'; } else { el.height = el.clientHeight; } //el.getContext().setCoordsize_() } return el; } }; function onPropertyChange(e) { var el = e.srcElement; switch (e.propertyName) { case 'width': el.style.width = el.attributes.width.nodeValue + 'px'; el.getContext().clearRect(); break; case 'height': el.style.height = el.attributes.height.nodeValue + 'px'; el.getContext().clearRect(); break; } } function onResize(e) { var el = e.srcElement; if (el.firstChild) { el.firstChild.style.width = el.clientWidth + 'px'; el.firstChild.style.height = el.clientHeight + 'px'; } } G_vmlCanvasManager_.init(); // precompute "00" to "FF" var dec2hex = []; for (var i = 0; i < 16; i++) { for (var j = 0; j < 16; j++) { dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); } } function createMatrixIdentity() { return [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]; } function matrixMultiply(m1, m2) { var result = createMatrixIdentity(); for (var x = 0; x < 3; x++) { for (var y = 0; y < 3; y++) { var sum = 0; for (var z = 0; z < 3; z++) { sum += m1[x][z] * m2[z][y]; } result[x][y] = sum; } } return result; } function copyState(o1, o2) { o2.fillStyle = o1.fillStyle; o2.lineCap = o1.lineCap; o2.lineJoin = o1.lineJoin; o2.lineWidth = o1.lineWidth; o2.miterLimit = o1.miterLimit; o2.shadowBlur = o1.shadowBlur; o2.shadowColor = o1.shadowColor; o2.shadowOffsetX = o1.shadowOffsetX; o2.shadowOffsetY = o1.shadowOffsetY; o2.strokeStyle = o1.strokeStyle; o2.globalAlpha = o1.globalAlpha; o2.arcScaleX_ = o1.arcScaleX_; o2.arcScaleY_ = o1.arcScaleY_; o2.lineScale_ = o1.lineScale_; } function processStyle(styleString) { var str, alpha = 1; styleString = String(styleString); if (styleString.substring(0, 3) == 'rgb') { var start = styleString.indexOf('(', 3); var end = styleString.indexOf(')', start + 1); var guts = styleString.substring(start + 1, end).split(','); str = '#'; for (var i = 0; i < 3; i++) { str += dec2hex[Number(guts[i])]; } if (guts.length == 4 && styleString.substr(3, 1) == 'a') { alpha = guts[3]; } } else { str = styleString; } return {color: str, alpha: alpha}; } function processLineCap(lineCap) { switch (lineCap) { case 'butt': return 'flat'; case 'round': return 'round'; case 'square': default: return 'square'; } } /** * This class implements CanvasRenderingContext2D interface as described by * the WHATWG. * @param {HTMLElement} surfaceElement The element that the 2D context should * be associated with */ function CanvasRenderingContext2D_(surfaceElement) { this.m_ = createMatrixIdentity(); this.mStack_ = []; this.aStack_ = []; this.currentPath_ = []; // Canvas context properties this.strokeStyle = '#000'; this.fillStyle = '#000'; this.lineWidth = 1; this.lineJoin = 'miter'; this.lineCap = 'butt'; this.miterLimit = Z * 1; this.globalAlpha = 1; this.canvas = surfaceElement; var el = surfaceElement.ownerDocument.createElement('div'); el.style.width = surfaceElement.clientWidth + 'px'; el.style.height = surfaceElement.clientHeight + 'px'; // el.style.overflow = 'hidden'; el.style.position = 'absolute'; surfaceElement.appendChild(el); this.element_ = el; this.arcScaleX_ = 1; this.arcScaleY_ = 1; this.lineScale_ = 1; } var contextPrototype = CanvasRenderingContext2D_.prototype; contextPrototype.clearRect = function() { this.element_.innerHTML = ''; }; contextPrototype.beginPath = function() { // TODO: Branch current matrix so that save/restore has no effect // as per safari docs. this.currentPath_ = []; }; contextPrototype.moveTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.lineTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { var p = this.getCoords_(aX, aY); var cp1 = this.getCoords_(aCP1x, aCP1y); var cp2 = this.getCoords_(aCP2x, aCP2y); bezierCurveTo(this, cp1, cp2, p); }; // Helper function that takes the already fixed cordinates. function bezierCurveTo(self, cp1, cp2, p) { self.currentPath_.push({ type: 'bezierCurveTo', cp1x: cp1.x, cp1y: cp1.y, cp2x: cp2.x, cp2y: cp2.y, x: p.x, y: p.y }); self.currentX_ = p.x; self.currentY_ = p.y; } contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { // the following is lifted almost directly from // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes var cp = this.getCoords_(aCPx, aCPy); var p = this.getCoords_(aX, aY); var cp1 = { x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) }; var cp2 = { x: cp1.x + (p.x - this.currentX_) / 3.0, y: cp1.y + (p.y - this.currentY_) / 3.0 }; bezierCurveTo(this, cp1, cp2, p); }; contextPrototype.arc = function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { aRadius *= Z; var arcType = aClockwise ? 'at' : 'wa'; var xStart = aX + mc(aStartAngle) * aRadius - Z2; var yStart = aY + ms(aStartAngle) * aRadius - Z2; var xEnd = aX + mc(aEndAngle) * aRadius - Z2; var yEnd = aY + ms(aEndAngle) * aRadius - Z2; // IE won't render arches drawn counter clockwise if xStart == xEnd. if (xStart == xEnd && !aClockwise) { xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something // that can be represented in binary } var p = this.getCoords_(aX, aY); var pStart = this.getCoords_(xStart, yStart); var pEnd = this.getCoords_(xEnd, yEnd); this.currentPath_.push({type: arcType, x: p.x, y: p.y, radius: aRadius, xStart: pStart.x, yStart: pStart.y, xEnd: pEnd.x, yEnd: pEnd.y}); }; contextPrototype.rect = function(aX, aY, aWidth, aHeight) { this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); }; contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.stroke(); this.currentPath_ = oldPath; }; contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.fill(); this.currentPath_ = oldPath; }; contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { var gradient = new CanvasGradient_('gradient'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.x1_ = aX1; gradient.y1_ = aY1; return gradient; }; contextPrototype.createRadialGradient = function(aX0, aY0, aR0, aX1, aY1, aR1) { var gradient = new CanvasGradient_('gradientradial'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.r0_ = aR0; gradient.x1_ = aX1; gradient.y1_ = aY1; gradient.r1_ = aR1; return gradient; }; contextPrototype.drawImage = function(image, var_args) { var dx, dy, dw, dh, sx, sy, sw, sh; // to find the original width we overide the width and height var oldRuntimeWidth = image.runtimeStyle.width; var oldRuntimeHeight = image.runtimeStyle.height; image.runtimeStyle.width = 'auto'; image.runtimeStyle.height = 'auto'; // get the original size var w = image.width; var h = image.height; // and remove overides image.runtimeStyle.width = oldRuntimeWidth; image.runtimeStyle.height = oldRuntimeHeight; if (arguments.length == 3) { dx = arguments[1]; dy = arguments[2]; sx = sy = 0; sw = dw = w; sh = dh = h; } else if (arguments.length == 5) { dx = arguments[1]; dy = arguments[2]; dw = arguments[3]; dh = arguments[4]; sx = sy = 0; sw = w; sh = h; } else if (arguments.length == 9) { sx = arguments[1]; sy = arguments[2]; sw = arguments[3]; sh = arguments[4]; dx = arguments[5]; dy = arguments[6]; dw = arguments[7]; dh = arguments[8]; } else { throw Error('Invalid number of arguments'); } var d = this.getCoords_(dx, dy); var w2 = sw / 2; var h2 = sh / 2; var vmlStr = []; var W = 10; var H = 10; // For some reason that I've now forgotten, using divs didn't work vmlStr.push(' ' , '', ''); this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); }; contextPrototype.stroke = function(aFill) { var lineStr = []; var lineOpen = false; var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); var color = a.color; var opacity = a.alpha * this.globalAlpha; var W = 10; var H = 10; lineStr.push(''); if (!aFill) { var lineWidth = this.lineScale_ * this.lineWidth; // VML cannot correctly render a line if the width is less than 1px. // In that case, we dilute the color to make the line look thinner. if (lineWidth < 1) { opacity *= lineWidth; } lineStr.push( '' ); } else if (typeof this.fillStyle == 'object') { var fillStyle = this.fillStyle; var angle = 0; var focus = {x: 0, y: 0}; // additional offset var shift = 0; // scale factor for offset var expansion = 1; if (fillStyle.type_ == 'gradient') { var x0 = fillStyle.x0_ / this.arcScaleX_; var y0 = fillStyle.y0_ / this.arcScaleY_; var x1 = fillStyle.x1_ / this.arcScaleX_; var y1 = fillStyle.y1_ / this.arcScaleY_; var p0 = this.getCoords_(x0, y0); var p1 = this.getCoords_(x1, y1); var dx = p1.x - p0.x; var dy = p1.y - p0.y; angle = Math.atan2(dx, dy) * 180 / Math.PI; // The angle should be a non-negative number. if (angle < 0) { angle += 360; } // Very small angles produce an unexpected result because they are // converted to a scientific notation string. if (angle < 1e-6) { angle = 0; } } else { var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); var width = max.x - min.x; var height = max.y - min.y; focus = { x: (p0.x - min.x) / width, y: (p0.y - min.y) / height }; width /= this.arcScaleX_ * Z; height /= this.arcScaleY_ * Z; var dimension = m.max(width, height); shift = 2 * fillStyle.r0_ / dimension; expansion = 2 * fillStyle.r1_ / dimension - shift; } // We need to sort the color stops in ascending order by offset, // otherwise IE won't interpret it correctly. var stops = fillStyle.colors_; stops.sort(function(cs1, cs2) { return cs1.offset - cs2.offset; }); var length = stops.length; var color1 = stops[0].color; var color2 = stops[length - 1].color; var opacity1 = stops[0].alpha * this.globalAlpha; var opacity2 = stops[length - 1].alpha * this.globalAlpha; var colors = []; for (var i = 0; i < length; i++) { var stop = stops[i]; colors.push(stop.offset * expansion + shift + ' ' + stop.color); } // When colors attribute is used, the meanings of opacity and o:opacity2 // are reversed. lineStr.push(''); } else { lineStr.push(''); } lineStr.push(''); this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); }; contextPrototype.fill = function() { this.stroke(true); } contextPrototype.closePath = function() { this.currentPath_.push({type: 'close'}); }; /** * @private */ contextPrototype.getCoords_ = function(aX, aY) { var m = this.m_; return { x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 } }; contextPrototype.save = function() { var o = {}; copyState(this, o); this.aStack_.push(o); this.mStack_.push(this.m_); this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); }; contextPrototype.restore = function() { copyState(this.aStack_.pop(), this); this.m_ = this.mStack_.pop(); }; function matrixIsFinite(m) { for (var j = 0; j < 3; j++) { for (var k = 0; k < 2; k++) { if (!isFinite(m[j][k]) || isNaN(m[j][k])) { return false; } } } return true; } function setM(ctx, m, updateLineScale) { if (!matrixIsFinite(m)) { return; } ctx.m_ = m; if (updateLineScale) { // Get the line scale. // Determinant of this.m_ means how much the area is enlarged by the // transformation. So its square root can be used as a scale factor // for width. var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; ctx.lineScale_ = sqrt(abs(det)); } } contextPrototype.translate = function(aX, aY) { var m1 = [ [1, 0, 0], [0, 1, 0], [aX, aY, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.rotate = function(aRot) { var c = mc(aRot); var s = ms(aRot); var m1 = [ [c, s, 0], [-s, c, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.scale = function(aX, aY) { this.arcScaleX_ *= aX; this.arcScaleY_ *= aY; var m1 = [ [aX, 0, 0], [0, aY, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { var m1 = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { var m = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, m, true); }; /******** STUBS ********/ contextPrototype.clip = function() { // TODO: Implement }; contextPrototype.arcTo = function() { // TODO: Implement }; contextPrototype.createPattern = function() { return new CanvasPattern_; }; // Gradient / Pattern Stubs function CanvasGradient_(aType) { this.type_ = aType; this.x0_ = 0; this.y0_ = 0; this.r0_ = 0; this.x1_ = 0; this.y1_ = 0; this.r1_ = 0; this.colors_ = []; } CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { aColor = processStyle(aColor); this.colors_.push({offset: aOffset, color: aColor.color, alpha: aColor.alpha}); }; function CanvasPattern_() {} // set up externs G_vmlCanvasManager = G_vmlCanvasManager_; CanvasRenderingContext2D = CanvasRenderingContext2D_; CanvasGradient = CanvasGradient_; CanvasPattern = CanvasPattern_; })(); } // if opentip-2.4.6/downloads/opentip-prototype-excanvas.min.js000066400000000000000000001307041213277401600236520ustar00rootroot00000000000000// Opentip v2.4.6 // Copyright (c) 2009-2012 // www.opentip.org // MIT Licensed var Opentip,firstAdapter,i,mouseMoved,mousePosition,mousePositionObservers,position,vendors,_i,_len,_ref,__slice=[].slice,__indexOf=[].indexOf||function(t){for(var e=0,i=this.length;i>e;e++)if(e in this&&this[e]===t)return e;return-1},__hasProp={}.hasOwnProperty;for(Opentip=function(){function t(e,i,o,s){var n,r,a,h,p,l,d,u,c,g,f,m,v,w,_=this;if(this.id=++t.lastId,this.debug("Creating Opentip."),t.tips.push(this),this.adapter=t.adapter,n=this.adapter.data(e,"opentips")||[],n.push(this),this.adapter.data(e,"opentips",n),this.triggerElement=this.adapter.wrap(e),this.triggerElement.length>1)throw Error("You can't call Opentip on multiple elements.");if(1>this.triggerElement.length)throw Error("Invalid element.");this.loaded=!1,this.loading=!1,this.visible=!1,this.waitingToShow=!1,this.waitingToHide=!1,this.currentPosition={left:0,top:0},this.dimensions={width:100,height:50},this.content="",this.redraw=!0,this.currentObservers={showing:!1,visible:!1,hiding:!1,hidden:!1},s=this.adapter.clone(s),typeof i=="object"?(s=i,i=o=void 0):typeof o=="object"&&(s=o,o=void 0),o!=null&&(s.title=o),i!=null&&this.setContent(i),s["extends"]==null&&(s["extends"]=s.style!=null?s.style:t.defaultStyle),h=[s],w=s;while(w["extends"]){if(l=w["extends"],w=t.styles[l],w==null)throw Error("Invalid style: "+l);h.unshift(w),w["extends"]==null&&l!=="standard"&&(w["extends"]="standard")}for(s=(f=this.adapter).extend.apply(f,[{}].concat(__slice.call(h))),s.hideTriggers=function(){var t,e,i,o;for(i=s.hideTriggers,o=[],t=0,e=i.length;e>t;t++)r=i[t],o.push(r);return o}(),s.hideTrigger&&s.hideTriggers.length===0&&s.hideTriggers.push(s.hideTrigger),m=["tipJoint","targetJoint","stem"],d=0,c=m.length;c>d;d++)p=m[d],s[p]&&typeof s[p]=="string"&&(s[p]=new t.Joint(s[p]));for(!s.ajax||s.ajax!==!0&&s.ajax||(s.ajax=this.adapter.tagName(this.triggerElement)==="A"?this.adapter.attr(this.triggerElement,"href"):!1),s.showOn==="click"&&this.adapter.tagName(this.triggerElement)==="A"&&this.adapter.observe(this.triggerElement,"click",function(t){return t.preventDefault(),t.stopPropagation(),t.stopped=!0}),s.target&&(s.fixed=!0),s.stem===!0&&(s.stem=new t.Joint(s.tipJoint)),s.target===!0?s.target=this.triggerElement:s.target&&(s.target=this.adapter.wrap(s.target)),this.currentStem=s.stem,s.delay==null&&(s.delay=s.showOn==="mouseover"?.2:0),s.targetJoint==null&&(s.targetJoint=new t.Joint(s.tipJoint).flip()),this.showTriggers=[],this.showTriggersWhenVisible=[],this.hideTriggers=[],s.showOn&&s.showOn!=="creation"&&this.showTriggers.push({element:this.triggerElement,event:s.showOn}),s.ajaxCache!=null&&(s.cache=s.ajaxCache,delete s.ajaxCache),this.options=s,this.bound={},v=["prepareToShow","prepareToHide","show","hide","reposition"],u=0,g=v.length;g>u;u++)a=v[u],this.bound[a]=function(t){return function(){return _[t].apply(_,arguments)}}(a);this.adapter.domReady(function(){return _.activate(),_.options.showOn==="creation"?_.prepareToShow():void 0})}return t.prototype.STICKS_OUT_TOP=1,t.prototype.STICKS_OUT_BOTTOM=2,t.prototype.STICKS_OUT_LEFT=1,t.prototype.STICKS_OUT_RIGHT=2,t.prototype["class"]={container:"opentip-container",opentip:"opentip",header:"ot-header",content:"ot-content",loadingIndicator:"ot-loading-indicator",close:"ot-close",goingToHide:"ot-going-to-hide",hidden:"ot-hidden",hiding:"ot-hiding",goingToShow:"ot-going-to-show",showing:"ot-showing",visible:"ot-visible",loading:"ot-loading",ajaxError:"ot-ajax-error",fixed:"ot-fixed",showEffectPrefix:"ot-show-effect-",hideEffectPrefix:"ot-hide-effect-",stylePrefix:"style-"},t.prototype._setup=function(){var t,e,i,o,s,n,r,a,h,p,l;for(this.debug("Setting up the tooltip."),this._buildContainer(),this.hideTriggers=[],h=this.options.hideTriggers,o=s=0,r=h.length;r>s;o=++s){if(e=h[o],i=null,t=this.options.hideOn instanceof Array?this.options.hideOn[o]:this.options.hideOn,typeof e=="string")switch(e){case"trigger":t=t||"mouseout",i=this.triggerElement;break;case"tip":t=t||"mouseover",i=this.container;break;case"target":t=t||"mouseover",i=this.options.target;break;case"closeButton":break;default:throw Error("Unknown hide trigger: "+e+".")}else t=t||"mouseover",i=this.adapter.wrap(e);i&&this.hideTriggers.push({element:i,event:t,original:e})}for(p=this.hideTriggers,l=[],n=0,a=p.length;a>n;n++)e=p[n],l.push(this.showTriggersWhenVisible.push({element:e.element,event:"mouseover"}));return l},t.prototype._buildContainer=function(){return this.container=this.adapter.create('
'),this.adapter.css(this.container,{position:"absolute"}),this.options.ajax&&this.adapter.addClass(this.container,this["class"].loading),this.options.fixed&&this.adapter.addClass(this.container,this["class"].fixed),this.options.showEffect&&this.adapter.addClass(this.container,""+this["class"].showEffectPrefix+this.options.showEffect),this.options.hideEffect?this.adapter.addClass(this.container,""+this["class"].hideEffectPrefix+this.options.hideEffect):void 0},t.prototype._buildElements=function(){var t,e;return this.tooltipElement=this.adapter.create('
'),this.backgroundCanvas=this.adapter.wrap(document.createElement("canvas")),this.adapter.css(this.backgroundCanvas,{position:"absolute"}),typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager!==null&&G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)),t=this.adapter.find(this.tooltipElement,"."+this["class"].header),this.options.title&&(e=this.adapter.create("

"),this.adapter.update(e,this.options.title,this.options.escapeTitle),this.adapter.append(t,e)),this.options.ajax&&!this.loaded&&this.adapter.append(this.tooltipElement,this.adapter.create('
↻
')),__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(this.closeButtonElement=this.adapter.create('Close'),this.adapter.append(t,this.closeButtonElement)),this.adapter.append(this.container,this.backgroundCanvas),this.adapter.append(this.container,this.tooltipElement),this.adapter.append(document.body,this.container),this._newContent=!0,this.redraw=!0},t.prototype.setContent=function(t){return this.content=t,this._newContent=!0,typeof this.content=="function"?(this._contentFunction=this.content,this.content=""):this._contentFunction=null,this.visible?this._updateElementContent():void 0},t.prototype._updateElementContent=function(){var t;return(this._newContent||!this.options.cache&&this._contentFunction)&&(t=this.adapter.find(this.container,"."+this["class"].content),t!=null&&(this._contentFunction&&(this.debug("Executing content function."),this.content=this._contentFunction(this)),this.adapter.update(t,this.content,this.options.escapeContent)),this._newContent=!1),this._storeAndLockDimensions(),this.reposition()},t.prototype._storeAndLockDimensions=function(){var t;if(this.container)return t=this.dimensions,this.adapter.css(this.container,{width:"auto",left:"0px",top:"0px"}),this.dimensions=this.adapter.dimensions(this.container),this.dimensions.width+=1,this.adapter.css(this.container,{width:""+this.dimensions.width+"px",top:""+this.currentPosition.top+"px",left:""+this.currentPosition.left+"px"}),this._dimensionsEqual(this.dimensions,t)?void 0:(this.redraw=!0,this._draw())},t.prototype.activate=function(){return this._setupObservers("hidden","hiding")},t.prototype.deactivate=function(){return this.debug("Deactivating tooltip."),this.hide(),this._setupObservers("-showing","-visible","-hidden","-hiding")},t.prototype._setupObservers=function(){var t,e,i,o,s,n,r,a,h,p,l,d,u,c,g,f,m=this;for(o=arguments.length>=1?__slice.call(arguments,0):[],n=0,p=o.length;p>n;n++)if(i=o[n],e=!1,i.charAt(0)==="-"&&(e=!0,i=i.substr(1)),this.currentObservers[i]!==!e)switch(this.currentObservers[i]=!e,t=function(){var t,i,o;return t=arguments.length>=1?__slice.call(arguments,0):[],e?(i=m.adapter).stopObserving.apply(i,t):(o=m.adapter).observe.apply(o,t)},i){case"showing":for(c=this.hideTriggers,r=0,l=c.length;l>r;r++)s=c[r],t(s.element,s.event,this.bound.prepareToHide);t(document.onresize!=null?document:window,"resize",this.bound.reposition),t(window,"scroll",this.bound.reposition);break;case"visible":for(g=this.showTriggersWhenVisible,a=0,d=g.length;d>a;a++)s=g[a],t(s.element,s.event,this.bound.prepareToShow);break;case"hiding":for(f=this.showTriggers,h=0,u=f.length;u>h;h++)s=f[h],t(s.element,s.event,this.bound.prepareToShow);break;case"hidden":break;default:throw Error("Unknown state: "+i)}return null},t.prototype.prepareToShow=function(){return this._abortHiding(),this._abortShowing(),this.visible?void 0:(this.debug("Showing in "+this.options.delay+"s."),this.container==null&&this._setup(),this.options.group&&t._abortShowingGroup(this.options.group,this),this.preparingToShow=!0,this._setupObservers("-hidden","-hiding","showing"),this._followMousePosition(),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this._showTimeoutId=this.setTimeout(this.bound.show,this.options.delay||0))},t.prototype.show=function(){var e=this;return this._abortHiding(),this.visible?void 0:(this._clearTimeouts(),this._triggerElementExists()?(this.debug("Showing now."),this.container==null&&this._setup(),this.options.group&&t._hideGroup(this.options.group,this),this.visible=!0,this.preparingToShow=!1,this.tooltipElement==null&&this._buildElements(),this._updateElementContent(),!this.options.ajax||this.loaded&&this.options.cache||this._loadAjax(),this._searchAndActivateCloseButtons(),this._startEnsureTriggerElement(),this.adapter.css(this.container,{zIndex:t.lastZIndex++}),this._setupObservers("-hidden","-hiding","-showing","-visible","showing","visible"),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this.adapter.removeClass(this.container,this["class"].hiding),this.adapter.removeClass(this.container,this["class"].hidden),this.adapter.addClass(this.container,this["class"].goingToShow),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var t;if(e.visible&&!e.preparingToHide)return e.adapter.removeClass(e.container,e["class"].goingToShow),e.adapter.addClass(e.container,e["class"].showing),t=0,e.options.showEffect&&e.options.showEffectDuration&&(t=e.options.showEffectDuration),e.setCss3Style(e.container,{transitionDuration:""+t+"s"}),e._visibilityStateTimeoutId=e.setTimeout(function(){return e.adapter.removeClass(e.container,e["class"].showing),e.adapter.addClass(e.container,e["class"].visible)},t),e._activateFirstInput()}),this._draw()):this.deactivate())},t.prototype._abortShowing=function(){return this.preparingToShow?(this.debug("Aborting showing."),this._clearTimeouts(),this._stopFollowingMousePosition(),this.preparingToShow=!1,this._setupObservers("-showing","-visible","hiding","hidden")):void 0},t.prototype.prepareToHide=function(){return this._abortShowing(),this._abortHiding(),this.visible?(this.debug("Hiding in "+this.options.hideDelay+"s"),this.preparingToHide=!0,this._setupObservers("-showing","visible","-hidden","hiding"),this._hideTimeoutId=this.setTimeout(this.bound.hide,this.options.hideDelay)):void 0},t.prototype.hide=function(){var t=this;return this._abortShowing(),this.visible&&(this._clearTimeouts(),this.debug("Hiding!"),this.visible=!1,this.preparingToHide=!1,this._stopEnsureTriggerElement(),this._setupObservers("-showing","-visible","-hiding","-hidden","hiding","hidden"),this.options.fixed||this._stopFollowingMousePosition(),this.container)?(this.adapter.removeClass(this.container,this["class"].visible),this.adapter.removeClass(this.container,this["class"].showing),this.adapter.addClass(this.container,this["class"].goingToHide),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var e;return t.adapter.removeClass(t.container,t["class"].goingToHide),t.adapter.addClass(t.container,t["class"].hiding),e=0,t.options.hideEffect&&t.options.hideEffectDuration&&(e=t.options.hideEffectDuration),t.setCss3Style(t.container,{transitionDuration:""+e+"s"}),t._visibilityStateTimeoutId=t.setTimeout(function(){return t.adapter.removeClass(t.container,t["class"].hiding),t.adapter.addClass(t.container,t["class"].hidden),t.setCss3Style(t.container,{transitionDuration:"0s"}),t.options.removeElementsOnHide?(t.debug("Removing HTML elements."),t.adapter.remove(t.container),delete t.container,delete t.tooltipElement):void 0},e)})):void 0},t.prototype._abortHiding=function(){return this.preparingToHide?(this.debug("Aborting hiding."),this._clearTimeouts(),this.preparingToHide=!1,this._setupObservers("-hiding","showing","visible")):void 0},t.prototype.reposition=function(){var t,e,i,o=this;return t=this.getPosition(),t==null||(e=this.options.stem,this.options.containInViewport&&(i=this._ensureViewportContainment(t),t=i.position,e=i.stem),this._positionsEqual(t,this.currentPosition))?void 0:(this.options.stem&&!e.eql(this.currentStem)&&(this.redraw=!0),this.currentPosition=t,this.currentStem=e,this._draw(),this.adapter.css(this.container,{left:""+t.left+"px",top:""+t.top+"px"}),this.defer(function(){var t,e;return t=o.adapter.unwrap(o.container),t.style.visibility="hidden",e=t.offsetHeight,t.style.visibility="visible"}))},t.prototype.getPosition=function(t,e,i){var o,s,n,r,a,h,p,l,d;if(this.container)return t==null&&(t=this.options.tipJoint),e==null&&(e=this.options.targetJoint),r={},this.options.target?(p=this.adapter.offset(this.options.target),h=this.adapter.dimensions(this.options.target),r=p,e.right?(l=this.adapter.unwrap(this.options.target),l.getBoundingClientRect!=null?r.left=l.getBoundingClientRect().right+((d=window.pageXOffset)!=null?d:document.body.scrollLeft):r.left+=h.width):e.center&&(r.left+=Math.round(h.width/2)),e.bottom?r.top+=h.height:e.middle&&(r.top+=Math.round(h.height/2)),this.options.borderWidth&&(this.options.tipJoint.left&&(r.left+=this.options.borderWidth),this.options.tipJoint.right&&(r.left-=this.options.borderWidth),this.options.tipJoint.top?r.top+=this.options.borderWidth:this.options.tipJoint.bottom&&(r.top-=this.options.borderWidth))):r=this.initialMousePosition?{top:this.initialMousePosition.y,left:this.initialMousePosition.x}:{top:mousePosition.y,left:mousePosition.x},this.options.autoOffset&&(a=this.options.stem?this.options.stemLength:0,n=a&&this.options.fixed?2:10,o=t.middle&&!this.options.fixed?15:0,s=t.center&&!this.options.fixed?15:0,t.right?r.left-=n+o:t.left&&(r.left+=n+o),t.bottom?r.top-=n+s:t.top&&(r.top+=n+s),a&&(i==null&&(i=this.options.stem),i.right?r.left-=a:i.left&&(r.left+=a),i.bottom?r.top-=a:i.top&&(r.top+=a))),r.left+=this.options.offset[0],r.top+=this.options.offset[1],t.right?r.left-=this.dimensions.width:t.center&&(r.left-=Math.round(this.dimensions.width/2)),t.bottom?r.top-=this.dimensions.height:t.middle&&(r.top-=Math.round(this.dimensions.height/2)),r},t.prototype._ensureViewportContainment=function(e){var i,o,s,n,r,a,h,p,l,d,u,c;if(h=this.options.stem,s={position:e,stem:h},!this.visible||!e)return s;if(p=this._sticksOut(e),!p[0]&&!p[1])return s;if(d=new t.Joint(this.options.tipJoint),this.options.targetJoint&&(l=new t.Joint(this.options.targetJoint)),a=this.adapter.scrollOffset(),u=this.adapter.viewportDimensions(),c=[e.left-a[0],e.top-a[1]],i=!1,u.width>=this.dimensions.width&&p[0])switch(i=!0,p[0]){case this.STICKS_OUT_LEFT:d.setHorizontal("left"),this.options.targetJoint&&l.setHorizontal("right");break;case this.STICKS_OUT_RIGHT:d.setHorizontal("right"),this.options.targetJoint&&l.setHorizontal("left")}if(u.height>=this.dimensions.height&&p[1])switch(i=!0,p[1]){case this.STICKS_OUT_TOP:d.setVertical("top"),this.options.targetJoint&&l.setVertical("bottom");break;case this.STICKS_OUT_BOTTOM:d.setVertical("bottom"),this.options.targetJoint&&l.setVertical("top")}return i?(this.options.stem&&(h=d),e=this.getPosition(d,l,h),o=this._sticksOut(e),n=!1,r=!1,o[0]&&o[0]!==p[0]&&(n=!0,d.setHorizontal(this.options.tipJoint.horizontal),this.options.targetJoint&&l.setHorizontal(this.options.targetJoint.horizontal)),o[1]&&o[1]!==p[1]&&(r=!0,d.setVertical(this.options.tipJoint.vertical),this.options.targetJoint&&l.setVertical(this.options.targetJoint.vertical)),n&&r?s:((n||r)&&(this.options.stem&&(h=d),e=this.getPosition(d,l,h)),{position:e,stem:h})):s},t.prototype._sticksOut=function(t){var e,i,o,s;return i=this.adapter.scrollOffset(),s=this.adapter.viewportDimensions(),e=[t.left-i[0],t.top-i[1]],o=[!1,!1],0>e[0]?o[0]=this.STICKS_OUT_LEFT:e[0]+this.dimensions.width>s.width&&(o[0]=this.STICKS_OUT_RIGHT),0>e[1]?o[1]=this.STICKS_OUT_TOP:e[1]+this.dimensions.height>s.height&&(o[1]=this.STICKS_OUT_BOTTOM),o},t.prototype._draw=function(){var e,i,o,s,n,r,a,h,p,l,d,u,c,g,f,m,v,w,_,b=this;if(this.backgroundCanvas&&this.redraw){if(this.debug("Drawing background."),this.redraw=!1,this.currentStem){for(v=["top","right","bottom","left"],f=0,m=v.length;m>f;f++)u=v[f],this.adapter.removeClass(this.container,"stem-"+u);this.adapter.addClass(this.container,"stem-"+this.currentStem.horizontal),this.adapter.addClass(this.container,"stem-"+this.currentStem.vertical)}return r=[0,0],a=[0,0],__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(n=new t.Joint(((w=this.currentStem)!=null?w+"":void 0)==="top right"?"top left":"top right"),r=[this.options.closeButtonRadius+this.options.closeButtonOffset[0],this.options.closeButtonRadius+this.options.closeButtonOffset[1]],a=[this.options.closeButtonRadius-this.options.closeButtonOffset[0],this.options.closeButtonRadius-this.options.closeButtonOffset[1]]),o=this.adapter.clone(this.dimensions),s=[0,0],this.options.borderWidth&&(o.width+=this.options.borderWidth*2,o.height+=this.options.borderWidth*2,s[0]-=this.options.borderWidth,s[1]-=this.options.borderWidth),this.options.shadow&&(o.width+=this.options.shadowBlur*2,o.width+=Math.max(0,this.options.shadowOffset[0]-this.options.shadowBlur*2),o.height+=this.options.shadowBlur*2,o.height+=Math.max(0,this.options.shadowOffset[1]-this.options.shadowBlur*2),s[0]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[0]),s[1]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[1])),i={left:0,right:0,top:0,bottom:0},this.currentStem&&(this.currentStem.left?i.left=this.options.stemLength:this.currentStem.right&&(i.right=this.options.stemLength),this.currentStem.top?i.top=this.options.stemLength:this.currentStem.bottom&&(i.bottom=this.options.stemLength)),n&&(n.left?i.left=Math.max(i.left,a[0]):n.right&&(i.right=Math.max(i.right,a[0])),n.top?i.top=Math.max(i.top,a[1]):n.bottom&&(i.bottom=Math.max(i.bottom,a[1]))),o.width+=i.left+i.right,o.height+=i.top+i.bottom,s[0]-=i.left,s[1]-=i.top,this.currentStem&&this.options.borderWidth&&(_=this._getPathStemMeasures(this.options.stemBase,this.options.stemLength,this.options.borderWidth),g=_.stemLength,c=_.stemBase),e=this.adapter.unwrap(this.backgroundCanvas),e.width=o.width,e.height=o.height,this.adapter.css(this.backgroundCanvas,{width:""+e.width+"px",height:""+e.height+"px",left:""+s[0]+"px",top:""+s[1]+"px"}),h=e.getContext("2d"),h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,e.width,e.height),h.beginPath(),h.fillStyle=this._getColor(h,this.dimensions,this.options.background,this.options.backgroundGradientHorizontal),h.lineJoin="miter",h.miterLimit=500,d=this.options.borderWidth/2,this.options.borderWidth?(h.strokeStyle=this.options.borderColor,h.lineWidth=this.options.borderWidth):(g=this.options.stemLength,c=this.options.stemBase),c==null&&(c=0),l=function(t,e,i){return i&&h.moveTo(Math.max(c,b.options.borderRadius,r[0])+1-d,-d),e?(h.lineTo(t/2-c/2,-d),h.lineTo(t/2,-g-d),h.lineTo(t/2+c/2,-d)):void 0},p=function(t,e,i){var o,s,n,a;return t?(h.lineTo(-c+d,0-d),h.lineTo(g+d,-g-d),h.lineTo(d,c-d)):e?(a=b.options.closeButtonOffset,n=r[0],i%2!==0&&(a=[a[1],a[0]],n=r[1]),o=Math.acos(a[1]/b.options.closeButtonRadius),s=Math.acos(a[0]/b.options.closeButtonRadius),h.lineTo(-n+d,-d),h.arc(d-a[0],-d+a[1],b.options.closeButtonRadius,-(Math.PI/2+o),s,!1)):(h.lineTo(-b.options.borderRadius+d,-d),h.quadraticCurveTo(d,-d,d,b.options.borderRadius-d))},h.translate(-s[0],-s[1]),h.save(),function(){var e,i,o,s,r,a,d,u,c,g,f;for(f=[],i=c=0,g=t.positions.length/2;g>=0?g>c:c>g;i=g>=0?++c:--c)r=i*2,a=i===0||i===3?0:b.dimensions.width,d=2>i?0:b.dimensions.height,u=Math.PI/2*i,o=i%2===0?b.dimensions.width:b.dimensions.height,s=new t.Joint(t.positions[r]),e=new t.Joint(t.positions[r+1]),h.save(),h.translate(a,d),h.rotate(u),l(o,s.eql(b.currentStem),i===0),h.translate(o,0),p(e.eql(b.currentStem),e.eql(n),i),f.push(h.restore());return f}(),h.closePath(),h.save(),this.options.shadow&&(h.shadowColor=this.options.shadowColor,h.shadowBlur=this.options.shadowBlur,h.shadowOffsetX=this.options.shadowOffset[0],h.shadowOffsetY=this.options.shadowOffset[1]),h.fill(),h.restore(),this.options.borderWidth&&h.stroke(),h.restore(),n?function(){var t,e,i,o,s;return i=e=b.options.closeButtonRadius*2,n+""=="top right"?(s=[b.dimensions.width-b.options.closeButtonOffset[0],b.options.closeButtonOffset[1]],t=[s[0]+d,s[1]-d]):(s=[b.options.closeButtonOffset[0],b.options.closeButtonOffset[1]],t=[s[0]-d,s[1]-d]),h.translate(t[0],t[1]),o=b.options.closeButtonCrossSize/2,h.save(),h.beginPath(),h.strokeStyle=b.options.closeButtonCrossColor,h.lineWidth=b.options.closeButtonCrossLineWidth,h.lineCap="round",h.moveTo(-o,-o),h.lineTo(o,o),h.stroke(),h.beginPath(),h.moveTo(o,-o),h.lineTo(-o,o),h.stroke(),h.restore(),b.adapter.css(b.closeButtonElement,{left:""+(s[0]-o-b.options.closeButtonLinkOverscan)+"px",top:""+(s[1]-o-b.options.closeButtonLinkOverscan)+"px",width:""+(b.options.closeButtonCrossSize+b.options.closeButtonLinkOverscan*2)+"px",height:""+(b.options.closeButtonCrossSize+b.options.closeButtonLinkOverscan*2)+"px"})}():void 0}},t.prototype._getPathStemMeasures=function(t,e,i){var o,s,n,r,a,h,p;if(r=i/2,n=Math.atan(t/2/e),o=n*2,a=r/Math.sin(o),s=2*a*Math.cos(n),p=r+e-s,0>p)throw Error("Sorry but your stemLength / stemBase ratio is strange.");return h=Math.tan(n)*p*2,{stemLength:p,stemBase:h}},t.prototype._getColor=function(t,e,i,o){var s,n,r,a,h;if(o==null&&(o=!1),typeof i=="string")return i;for(n=o?t.createLinearGradient(0,0,e.width,0):t.createLinearGradient(0,0,0,e.height),r=a=0,h=i.length;h>a;r=++a)s=i[r],n.addColorStop(s[0],s[1]);return n},t.prototype._searchAndActivateCloseButtons=function(){var t,e,i,o;for(o=this.adapter.findAll(this.container,"."+this["class"].close),e=0,i=o.length;i>e;e++)t=o[e],this.hideTriggers.push({element:this.adapter.wrap(t),event:"click"});return this.currentObservers.showing&&this._setupObservers("-showing","showing"),this.currentObservers.visible?this._setupObservers("-visible","visible"):void 0},t.prototype._activateFirstInput=function(){var t;return t=this.adapter.unwrap(this.adapter.find(this.container,"input, textarea")),t!=null?typeof t.focus=="function"?t.focus():void 0:void 0},t.prototype._followMousePosition=function(){return this.options.fixed?void 0:t._observeMousePosition(this.bound.reposition)},t.prototype._stopFollowingMousePosition=function(){return this.options.fixed?void 0:t._stopObservingMousePosition(this.bound.reposition)},t.prototype._clearShowTimeout=function(){return clearTimeout(this._showTimeoutId)},t.prototype._clearHideTimeout=function(){return clearTimeout(this._hideTimeoutId)},t.prototype._clearTimeouts=function(){return clearTimeout(this._visibilityStateTimeoutId),this._clearShowTimeout(),this._clearHideTimeout()},t.prototype._triggerElementExists=function(){var t;t=this.adapter.unwrap(this.triggerElement);while(t.parentNode){if(t.parentNode.tagName==="BODY")return!0;t=t.parentNode}return!1},t.prototype._loadAjax=function(){var t=this;if(!this.loading)return this.loaded=!1,this.loading=!0,this.adapter.addClass(this.container,this["class"].loading),this.setContent(""),this.debug("Loading content from "+this.options.ajax),this.adapter.ajax({url:this.options.ajax,method:this.options.ajaxMethod,onSuccess:function(e){return t.debug("Loading successful."),t.adapter.removeClass(t.container,t["class"].loading),t.setContent(e)},onError:function(e){var i;return i=t.options.ajaxErrorMessage,t.debug(i,e),t.setContent(i),t.adapter.addClass(t.container,t["class"].ajaxError)},onComplete:function(){return t.adapter.removeClass(t.container,t["class"].loading),t.loading=!1,t.loaded=!0,t._searchAndActivateCloseButtons(),t._activateFirstInput(),t.reposition()}})},t.prototype._ensureTriggerElement=function(){return this._triggerElementExists()?void 0:(this.deactivate(),this._stopEnsureTriggerElement())},t.prototype._ensureTriggerElementInterval=1e3,t.prototype._startEnsureTriggerElement=function(){var t=this;return this._ensureTriggerElementTimeoutId=setInterval(function(){return t._ensureTriggerElement()},this._ensureTriggerElementInterval)},t.prototype._stopEnsureTriggerElement=function(){return clearInterval(this._ensureTriggerElementTimeoutId)},t}(),vendors=["khtml","ms","o","moz","webkit"],Opentip.prototype.setCss3Style=function(t,e){var i,o,s,n,r;t=this.adapter.unwrap(t),r=[];for(i in e)__hasProp.call(e,i)&&(o=e[i],t.style[i]!=null?r.push(t.style[i]=o):r.push(function(){var e,r,a;for(a=[],e=0,r=vendors.length;r>e;e++)s=vendors[e],n=""+this.ucfirst(s)+this.ucfirst(i),t.style[n]!=null?a.push(t.style[n]=o):a.push(void 0);return a}.call(this)));return r},Opentip.prototype.defer=function(t){return setTimeout(t,0)},Opentip.prototype.setTimeout=function(t,e){return setTimeout(t,e?e*1e3:0)},Opentip.prototype.ucfirst=function(t){return t==null?"":t.charAt(0).toUpperCase()+t.slice(1)},Opentip.prototype.dasherize=function(t){return t.replace(/([A-Z])/g,function(t,e){return"-"+e.toLowerCase()})},mousePositionObservers=[],mousePosition={x:0,y:0},mouseMoved=function(t){var e,i,o,s;for(mousePosition=Opentip.adapter.mousePosition(t),s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],s.push(e());return s},Opentip.followMousePosition=function(){return Opentip.adapter.observe(document.body,"mousemove",mouseMoved)},Opentip._observeMousePosition=function(t){return mousePositionObservers.push(t)},Opentip._stopObservingMousePosition=function(t){var e;return mousePositionObservers=function(){var i,o,s;for(s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],e!==t&&s.push(e);return s}()},Opentip.Joint=function(){function t(t){t!=null&&(t instanceof Opentip.Joint&&(t+=""),this.set(t))}return t.prototype.set=function(t){return t=t.toLowerCase(),this.setHorizontal(t),this.setVertical(t),this},t.prototype.setHorizontal=function(t){var e,i,o,s,n,r,a;for(i=["left","center","right"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.horizontal=e.toLowerCase());for(this.horizontal==null&&(this.horizontal="center"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.horizontal===e?e:void 0);return a},t.prototype.setVertical=function(t){var e,i,o,s,n,r,a;for(i=["top","middle","bottom"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.vertical=e.toLowerCase());for(this.vertical==null&&(this.vertical="middle"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.vertical===e?e:void 0);return a},t.prototype.eql=function(t){return t!=null&&this.horizontal===t.horizontal&&this.vertical===t.vertical},t.prototype.flip=function(){var t,e;return e=Opentip.position[this.toString(!0)],t=(e+4)%8,this.set(Opentip.positions[t]),this},t.prototype.toString=function(t){var e,i;return t==null&&(t=!1),i=this.vertical==="middle"?"":this.vertical,e=this.horizontal==="center"?"":this.horizontal,i&&e&&(e=t?Opentip.prototype.ucfirst(e):" "+e),""+i+e},t}(),Opentip.prototype._positionsEqual=function(t,e){return t!=null&&e!=null&&t.left===e.left&&t.top===e.top},Opentip.prototype._dimensionsEqual=function(t,e){return t!=null&&e!=null&&t.width===e.width&&t.height===e.height},Opentip.prototype.debug=function(){var t;return t=arguments.length>=1?__slice.call(arguments,0):[],Opentip.debug&&(typeof console!="undefined"&&console!==null?console.debug:void 0)!=null?(t.unshift("#"+this.id+" |"),console.debug.apply(console,t)):void 0},Opentip.findElements=function(){var t,e,i,o,s,n,r,a,h,p;for(t=Opentip.adapter,h=t.findAll(document.body,"[data-ot]"),p=[],r=0,a=h.length;a>r;r++){i=h[r],n={},e=t.data(i,"ot"),(e===""||e==="true"||e==="yes")&&(e=t.attr(i,"title"),t.attr(i,"title","")),e=e||"";for(o in Opentip.styles.standard)s=t.data(i,"ot"+Opentip.prototype.ucfirst(o)),s!=null&&(s==="yes"||s==="true"||s==="on"?s=!0:(s==="no"||s==="false"||s==="off")&&(s=!1),n[o]=s);p.push(new Opentip(i,e,n))}return p},Opentip.version="2.4.6",Opentip.debug=!1,Opentip.lastId=0,Opentip.lastZIndex=100,Opentip.tips=[],Opentip._abortShowingGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i._abortShowing()):r.push(void 0);return r},Opentip._hideGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i.hide()):r.push(void 0);return r},Opentip.adapters={},Opentip.adapter=null,firstAdapter=!0,Opentip.addAdapter=function(t){return Opentip.adapters[t.name]=t,firstAdapter?(Opentip.adapter=t,t.domReady(Opentip.findElements),t.domReady(Opentip.followMousePosition),firstAdapter=!1):void 0},Opentip.positions=["top","topRight","right","bottomRight","bottom","bottomLeft","left","topLeft"],Opentip.position={},_ref=Opentip.positions,i=_i=0,_len=_ref.length;_len>_i;i=++_i)position=_ref[i],Opentip.position[position]=i;Opentip.styles={standard:{"extends":null,title:void 0,escapeTitle:!0,escapeContent:!1,className:"standard",stem:!0,delay:null,hideDelay:.1,fixed:!1,showOn:"mouseover",hideTrigger:"trigger",hideTriggers:[],hideOn:null,removeElementsOnHide:!1,offset:[0,0],containInViewport:!0,autoOffset:!0,showEffect:"appear",hideEffect:"fade",showEffectDuration:.3,hideEffectDuration:.2,stemLength:5,stemBase:8,tipJoint:"top left",target:null,targetJoint:null,cache:!0,ajax:!1,ajaxMethod:"GET",ajaxErrorMessage:"There was a problem downloading the content.",group:null,style:null,background:"#fff18f",backgroundGradientHorizontal:!1,closeButtonOffset:[5,5],closeButtonRadius:7,closeButtonCrossSize:4,closeButtonCrossColor:"#d2c35b",closeButtonCrossLineWidth:1.5,closeButtonLinkOverscan:6,borderRadius:5,borderWidth:1,borderColor:"#f2e37b",shadow:!0,shadowBlur:10,shadowOffset:[3,3],shadowColor:"rgba(0, 0, 0, 0.1)"},glass:{"extends":"standard",className:"glass",background:[[0,"rgba(252, 252, 252, 0.8)"],[.5,"rgba(255, 255, 255, 0.8)"],[.5,"rgba(250, 250, 250, 0.9)"],[1,"rgba(245, 245, 245, 0.9)"]],borderColor:"#eee",closeButtonCrossColor:"rgba(0, 0, 0, 0.2)",borderRadius:15,closeButtonRadius:10,closeButtonOffset:[8,8]},dark:{"extends":"standard",className:"dark",borderRadius:13,borderColor:"#444",closeButtonCrossColor:"rgba(240, 240, 240, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(30, 30, 30, 0.7)"],[.5,"rgba(30, 30, 30, 0.8)"],[.5,"rgba(10, 10, 10, 0.8)"],[1,"rgba(10, 10, 10, 0.9)"]]},alert:{"extends":"standard",className:"alert",borderRadius:1,borderColor:"#AE0D11",closeButtonCrossColor:"rgba(255, 255, 255, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(203, 15, 19, 0.7)"],[.5,"rgba(203, 15, 19, 0.8)"],[.5,"rgba(189, 14, 18, 0.8)"],[1,"rgba(179, 14, 17, 0.9)"]]}},Opentip.defaultStyle="standard",typeof module!="undefined"&&module!==null?module.exports=Opentip:window.Opentip=Opentip;var __slice=[].slice;(function(){var t,e;return Element.addMethods({addTip:function(t,e,i,o){return new Opentip(t,e,i,o)}}),e=function(t){return t instanceof Array||t!=null&&typeof t.length=="number"&&typeof t.item=="function"&&typeof t.nextNode=="function"&&typeof t.reset=="function"?!0:!1},t=function(){function t(){}return t.prototype.name="prototype",t.prototype.domReady=function(t){return document.loaded?t():$(document).observe("dom:loaded",t) },t.prototype.create=function(t){return new Element("div").update(t).childElements()},t.prototype.wrap=function(t){if(e(t)){if(t.length>1)throw Error("Multiple elements provided.");t=this.unwrap(t)}else typeof t=="string"&&(t=$$(t)[0]);return $(t)},t.prototype.unwrap=function(t){return e(t)?t[0]:t},t.prototype.tagName=function(t){return this.unwrap(t).tagName},t.prototype.attr=function(){var t,e,i;return e=arguments[0],t=arguments.length>=2?__slice.call(arguments,1):[],t.length===1?this.wrap(e).readAttribute(t[0]):(i=this.wrap(e)).writeAttribute.apply(i,t)},t.prototype.data=function(t,e,i){var o;return this.wrap(t),arguments.length>2?t.store(e,i):(o=t.readAttribute("data-"+e.underscore().dasherize()),o!=null?o:t.retrieve(e))},t.prototype.find=function(t,e){return this.wrap(t).select(e)[0]},t.prototype.findAll=function(t,e){return this.wrap(t).select(e)},t.prototype.update=function(t,e,i){return this.wrap(t).update(i?e.escapeHTML():e)},t.prototype.append=function(t,e){return this.wrap(t).insert(this.wrap(e))},t.prototype.remove=function(t){return this.wrap(t).remove()},t.prototype.addClass=function(t,e){return this.wrap(t).addClassName(e)},t.prototype.removeClass=function(t,e){return this.wrap(t).removeClassName(e)},t.prototype.css=function(t,e){return this.wrap(t).setStyle(e)},t.prototype.dimensions=function(t){return this.wrap(t).getDimensions()},t.prototype.scrollOffset=function(){var t;return t=document.viewport.getScrollOffsets(),[t.left,t.top]},t.prototype.viewportDimensions=function(){return document.viewport.getDimensions()},t.prototype.mousePosition=function(t){return t==null?null:{x:Event.pointerX(t),y:Event.pointerY(t)}},t.prototype.offset=function(t){var e;return e=this.wrap(t).cumulativeOffset(),{left:e.left,top:e.top}},t.prototype.observe=function(t,e,i){return Event.observe(this.wrap(t),e,i)},t.prototype.stopObserving=function(t,e,i){return Event.stopObserving(this.wrap(t),e,i)},t.prototype.ajax=function(t){var e,i;if(t.url==null)throw Error("No url provided");return new Ajax.Request(t.url,{method:(e=(i=t.method)!=null?i.toUpperCase():void 0)!=null?e:"GET",onSuccess:function(e){return typeof t.onSuccess=="function"?t.onSuccess(e.responseText):void 0},onFailure:function(e){return typeof t.onError=="function"?t.onError("Server responded with status "+e.status):void 0},onComplete:function(){return typeof t.onComplete=="function"?t.onComplete():void 0}})},t.prototype.clone=function(t){return Object.clone(t)},t.prototype.extend=function(){var t,e,i,o,s;for(i=arguments[0],e=arguments.length>=2?__slice.call(arguments,1):[],o=0,s=e.length;s>o;o++)t=e[o],Object.extend(i,t);return i},t}(),Opentip.addAdapter(new t)})(),document.createElement("canvas").getContext||function(){function t(){return this.context_||(this.context_=new p(this))}function e(t,e){var i=T.call(arguments,2);return function(){return t.apply(e,i.concat(T.call(arguments)))}}function i(t){var e=t.srcElement;switch(t.propertyName){case"width":e.style.width=e.attributes.width.nodeValue+"px",e.getContext().clearRect();break;case"height":e.style.height=e.attributes.height.nodeValue+"px",e.getContext().clearRect()}}function o(t){var e=t.srcElement;e.firstChild&&(e.firstChild.style.width=e.clientWidth+"px",e.firstChild.style.height=e.clientHeight+"px")}function s(){return[[1,0,0],[0,1,0],[0,0,1]]}function n(t,e){for(var i=s(),o=0;3>o;o++)for(var n=0;3>n;n++){for(var r=0,a=0;3>a;a++)r+=t[o][a]*e[a][n];i[o][n]=r}return i}function r(t,e){e.fillStyle=t.fillStyle,e.lineCap=t.lineCap,e.lineJoin=t.lineJoin,e.lineWidth=t.lineWidth,e.miterLimit=t.miterLimit,e.shadowBlur=t.shadowBlur,e.shadowColor=t.shadowColor,e.shadowOffsetX=t.shadowOffsetX,e.shadowOffsetY=t.shadowOffsetY,e.strokeStyle=t.strokeStyle,e.globalAlpha=t.globalAlpha,e.arcScaleX_=t.arcScaleX_,e.arcScaleY_=t.arcScaleY_,e.lineScale_=t.lineScale_}function a(t){var e,i=1;if(t+="",t.substring(0,3)=="rgb"){var o=t.indexOf("(",3),s=t.indexOf(")",o+1),n=t.substring(o+1,s).split(",");e="#";for(var r=0;3>r;r++)e+=C[Number(n[r])];n.length==4&&t.substr(3,1)=="a"&&(i=n[3])}else e=t;return{color:e,alpha:i}}function h(t){switch(t){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function p(t){this.m_=s(),this.mStack_=[],this.aStack_=[],this.currentPath_=[],this.strokeStyle="#000",this.fillStyle="#000",this.lineWidth=1,this.lineJoin="miter",this.lineCap="butt",this.miterLimit=y*1,this.globalAlpha=1,this.canvas=t;var e=t.ownerDocument.createElement("div");e.style.width=t.clientWidth+"px",e.style.height=t.clientHeight+"px",e.style.position="absolute",t.appendChild(e),this.element_=e,this.arcScaleX_=1,this.arcScaleY_=1,this.lineScale_=1}function l(t,e,i,o){t.currentPath_.push({type:"bezierCurveTo",cp1x:e.x,cp1y:e.y,cp2x:i.x,cp2y:i.y,x:o.x,y:o.y}),t.currentX_=o.x,t.currentY_=o.y}function d(t){for(var e=0;3>e;e++)for(var i=0;2>i;i++)if(!isFinite(t[e][i])||isNaN(t[e][i]))return!1;return!0}function u(t,e,i){if(d(e)&&(t.m_=e,i)){var o=e[0][0]*e[1][1]-e[0][1]*e[1][0];t.lineScale_=b(_(o))}}function c(t){this.type_=t,this.x0_=0,this.y0_=0,this.r0_=0,this.x1_=0,this.y1_=0,this.r1_=0,this.colors_=[]}function g(){}var f=Math,m=f.round,v=f.sin,w=f.cos,_=f.abs,b=f.sqrt,y=10,O=y/2,T=Array.prototype.slice,x={init:function(t){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=t||document;i.createElement("canvas"),i.attachEvent("onreadystatechange",e(this.init_,this,i))}},init_:function(t){if(t.namespaces.g_vml_||t.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML"),t.namespaces.g_o_||t.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML"),!t.styleSheets.ex_canvas_){var e=t.createStyleSheet();e.owningElement.id="ex_canvas_",e.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}for(var i=t.getElementsByTagName("canvas"),o=0;i.length>o;o++)this.initElement(i[o])},initElement:function(e){if(!e.getContext){e.getContext=t,e.innerHTML="",e.attachEvent("onpropertychange",i),e.attachEvent("onresize",o);var s=e.attributes;s.width&&s.width.specified?e.style.width=s.width.nodeValue+"px":e.width=e.clientWidth,s.height&&s.height.specified?e.style.height=s.height.nodeValue+"px":e.height=e.clientHeight}return e}};x.init();for(var C=[],S=0;16>S;S++)for(var E=0;16>E;E++)C[S*16+E]=S.toString(16)+E.toString(16);var P=p.prototype;P.clearRect=function(){this.element_.innerHTML=""},P.beginPath=function(){this.currentPath_=[]},P.moveTo=function(t,e){var i=this.getCoords_(t,e);this.currentPath_.push({type:"moveTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},P.lineTo=function(t,e){var i=this.getCoords_(t,e);this.currentPath_.push({type:"lineTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},P.bezierCurveTo=function(t,e,i,o,s,n){var r=this.getCoords_(s,n),a=this.getCoords_(t,e),h=this.getCoords_(i,o);l(this,a,h,r)},P.quadraticCurveTo=function(t,e,i,o){var s=this.getCoords_(t,e),n=this.getCoords_(i,o),r={x:this.currentX_+2/3*(s.x-this.currentX_),y:this.currentY_+2/3*(s.y-this.currentY_)},a={x:r.x+(n.x-this.currentX_)/3,y:r.y+(n.y-this.currentY_)/3};l(this,r,a,n)},P.arc=function(t,e,i,o,s,n){i*=y;var r=n?"at":"wa",a=t+w(o)*i-O,h=e+v(o)*i-O,p=t+w(s)*i-O,l=e+v(s)*i-O;a!=p||n||(a+=.125);var d=this.getCoords_(t,e),u=this.getCoords_(a,h),c=this.getCoords_(p,l);this.currentPath_.push({type:r,x:d.x,y:d.y,radius:i,xStart:u.x,yStart:u.y,xEnd:c.x,yEnd:c.y})},P.rect=function(t,e,i,o){this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath()},P.strokeRect=function(t,e,i,o){var s=this.currentPath_;this.beginPath(),this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath(),this.stroke(),this.currentPath_=s},P.fillRect=function(t,e,i,o){var s=this.currentPath_;this.beginPath(),this.moveTo(t,e),this.lineTo(t+i,e),this.lineTo(t+i,e+o),this.lineTo(t,e+o),this.closePath(),this.fill(),this.currentPath_=s},P.createLinearGradient=function(t,e,i,o){var s=new c("gradient");return s.x0_=t,s.y0_=e,s.x1_=i,s.y1_=o,s},P.createRadialGradient=function(t,e,i,o,s,n){var r=new c("gradientradial");return r.x0_=t,r.y0_=e,r.r0_=i,r.x1_=o,r.y1_=s,r.r1_=n,r},P.drawImage=function(t){var e,i,o,s,n,r,a,h,p=t.runtimeStyle.width,l=t.runtimeStyle.height;t.runtimeStyle.width="auto",t.runtimeStyle.height="auto";var d=t.width,u=t.height;if(t.runtimeStyle.width=p,t.runtimeStyle.height=l,arguments.length==3)e=arguments[1],i=arguments[2],n=r=0,a=o=d,h=s=u;else if(arguments.length==5)e=arguments[1],i=arguments[2],o=arguments[3],s=arguments[4],n=r=0,a=d,h=u;else{if(arguments.length!=9)throw Error("Invalid number of arguments");n=arguments[1],r=arguments[2],a=arguments[3],h=arguments[4],e=arguments[5],i=arguments[6],o=arguments[7],s=arguments[8]}var c=this.getCoords_(e,i),g=[],v=10,w=10;if(g.push(" ','",""),this.element_.insertAdjacentHTML("BeforeEnd",g.join(""))},P.stroke=function(t){var e=[],i=a(t?this.fillStyle:this.strokeStyle),o=i.color,s=i.alpha*this.globalAlpha,n=10,r=10;e.push("c.x)&&(p.x=c.x),(l.x==null||c.x>l.x)&&(l.x=c.x),(p.y==null||p.y>c.y)&&(p.y=c.y),(l.y==null||c.y>l.y)&&(l.y=c.y))}if(e.push(' ">'),t)if(typeof this.fillStyle=="object"){var g=this.fillStyle,v=0,w={x:0,y:0},_=0,b=1;if(g.type_=="gradient"){var O=g.x0_/this.arcScaleX_,T=g.y0_/this.arcScaleY_,x=g.x1_/this.arcScaleX_,C=g.y1_/this.arcScaleY_,S=this.getCoords_(O,T),E=this.getCoords_(x,C),P=E.x-S.x,B=E.y-S.y;v=Math.atan2(P,B)*180/Math.PI,0>v&&(v+=360),1e-6>v&&(v=0)}else{var S=this.getCoords_(g.x0_,g.y0_),M=l.x-p.x,k=l.y-p.y;w={x:(S.x-p.x)/M,y:(S.y-p.y)/k},M/=this.arcScaleX_*y,k/=this.arcScaleY_*y;var I=f.max(M,k);_=2*g.r0_/I,b=2*g.r1_/I-_}var L=g.colors_;L.sort(function(t,e){return t.offset-e.offset});for(var H=L.length,J=L[0].color,A=L[H-1].color,j=L[0].alpha*this.globalAlpha,z=L[H-1].alpha*this.globalAlpha,R=[],d=0;H>d;d++){var W=L[d];R.push(W.offset*b+_+" "+W.color)}e.push('')}else e.push('');else{var D=this.lineScale_*this.lineWidth;1>D&&(s*=D),e.push("')}e.push(""),this.element_.insertAdjacentHTML("beforeEnd",e.join(""))},P.fill=function(){this.stroke(!0)},P.closePath=function(){this.currentPath_.push({type:"close"})},P.getCoords_=function(t,e){var i=this.m_;return{x:y*(t*i[0][0]+e*i[1][0]+i[2][0])-O,y:y*(t*i[0][1]+e*i[1][1]+i[2][1])-O}},P.save=function(){var t={};r(this,t),this.aStack_.push(t),this.mStack_.push(this.m_),this.m_=n(s(),this.m_)},P.restore=function(){r(this.aStack_.pop(),this),this.m_=this.mStack_.pop()},P.translate=function(t,e){var i=[[1,0,0],[0,1,0],[t,e,1]];u(this,n(i,this.m_),!1)},P.rotate=function(t){var e=w(t),i=v(t),o=[[e,i,0],[-i,e,0],[0,0,1]];u(this,n(o,this.m_),!1)},P.scale=function(t,e){this.arcScaleX_*=t,this.arcScaleY_*=e;var i=[[t,0,0],[0,e,0],[0,0,1]];u(this,n(i,this.m_),!0)},P.transform=function(t,e,i,o,s,r){var a=[[t,e,0],[i,o,0],[s,r,1]];u(this,n(a,this.m_),!0)},P.setTransform=function(t,e,i,o,s,n){var r=[[t,e,0],[i,o,0],[s,n,1]];u(this,r,!0)},P.clip=function(){},P.arcTo=function(){},P.createPattern=function(){return new g},c.prototype.addColorStop=function(t,e){e=a(e),this.colors_.push({offset:t,color:e.color,alpha:e.alpha})},G_vmlCanvasManager=x,CanvasRenderingContext2D=p,CanvasGradient=c,CanvasPattern=g}()opentip-2.4.6/downloads/opentip-prototype.js000066400000000000000000001677521213277401600212770ustar00rootroot00000000000000// Generated by CoffeeScript 1.4.0 /* # # Opentip v2.4.6 # # More info at [www.opentip.org](http://www.opentip.org) # # Copyright (c) 2012, Matias Meno # Graphics by Tjandra Mayerhold # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # */ var Opentip, firstAdapter, i, mouseMoved, mousePosition, mousePositionObservers, position, vendors, _i, _len, _ref, __slice = [].slice, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __hasProp = {}.hasOwnProperty; Opentip = (function() { Opentip.prototype.STICKS_OUT_TOP = 1; Opentip.prototype.STICKS_OUT_BOTTOM = 2; Opentip.prototype.STICKS_OUT_LEFT = 1; Opentip.prototype.STICKS_OUT_RIGHT = 2; Opentip.prototype["class"] = { container: "opentip-container", opentip: "opentip", header: "ot-header", content: "ot-content", loadingIndicator: "ot-loading-indicator", close: "ot-close", goingToHide: "ot-going-to-hide", hidden: "ot-hidden", hiding: "ot-hiding", goingToShow: "ot-going-to-show", showing: "ot-showing", visible: "ot-visible", loading: "ot-loading", ajaxError: "ot-ajax-error", fixed: "ot-fixed", showEffectPrefix: "ot-show-effect-", hideEffectPrefix: "ot-hide-effect-", stylePrefix: "style-" }; function Opentip(element, content, title, options) { var elementsOpentips, hideTrigger, methodToBind, optionSources, prop, styleName, _i, _j, _len, _len1, _ref, _ref1, _ref2, _tmpStyle, _this = this; this.id = ++Opentip.lastId; this.debug("Creating Opentip."); Opentip.tips.push(this); this.adapter = Opentip.adapter; elementsOpentips = this.adapter.data(element, "opentips") || []; elementsOpentips.push(this); this.adapter.data(element, "opentips", elementsOpentips); this.triggerElement = this.adapter.wrap(element); if (this.triggerElement.length > 1) { throw new Error("You can't call Opentip on multiple elements."); } if (this.triggerElement.length < 1) { throw new Error("Invalid element."); } this.loaded = false; this.loading = false; this.visible = false; this.waitingToShow = false; this.waitingToHide = false; this.currentPosition = { left: 0, top: 0 }; this.dimensions = { width: 100, height: 50 }; this.content = ""; this.redraw = true; this.currentObservers = { showing: false, visible: false, hiding: false, hidden: false }; options = this.adapter.clone(options); if (typeof content === "object") { options = content; content = title = void 0; } else if (typeof title === "object") { options = title; title = void 0; } if (title != null) { options.title = title; } if (content != null) { this.setContent(content); } if (options["extends"] == null) { if (options.style != null) { options["extends"] = options.style; } else { options["extends"] = Opentip.defaultStyle; } } optionSources = [options]; _tmpStyle = options; while (_tmpStyle["extends"]) { styleName = _tmpStyle["extends"]; _tmpStyle = Opentip.styles[styleName]; if (_tmpStyle == null) { throw new Error("Invalid style: " + styleName); } optionSources.unshift(_tmpStyle); if (!((_tmpStyle["extends"] != null) || styleName === "standard")) { _tmpStyle["extends"] = "standard"; } } options = (_ref = this.adapter).extend.apply(_ref, [{}].concat(__slice.call(optionSources))); options.hideTriggers = (function() { var _i, _len, _ref1, _results; _ref1 = options.hideTriggers; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { hideTrigger = _ref1[_i]; _results.push(hideTrigger); } return _results; })(); if (options.hideTrigger && options.hideTriggers.length === 0) { options.hideTriggers.push(options.hideTrigger); } _ref1 = ["tipJoint", "targetJoint", "stem"]; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { prop = _ref1[_i]; if (options[prop] && typeof options[prop] === "string") { options[prop] = new Opentip.Joint(options[prop]); } } if (options.ajax && (options.ajax === true || !options.ajax)) { if (this.adapter.tagName(this.triggerElement) === "A") { options.ajax = this.adapter.attr(this.triggerElement, "href"); } else { options.ajax = false; } } if (options.showOn === "click" && this.adapter.tagName(this.triggerElement) === "A") { this.adapter.observe(this.triggerElement, "click", function(e) { e.preventDefault(); e.stopPropagation(); return e.stopped = true; }); } if (options.target) { options.fixed = true; } if (options.stem === true) { options.stem = new Opentip.Joint(options.tipJoint); } if (options.target === true) { options.target = this.triggerElement; } else if (options.target) { options.target = this.adapter.wrap(options.target); } this.currentStem = options.stem; if (options.delay == null) { options.delay = options.showOn === "mouseover" ? 0.2 : 0; } if (options.targetJoint == null) { options.targetJoint = new Opentip.Joint(options.tipJoint).flip(); } this.showTriggers = []; this.showTriggersWhenVisible = []; this.hideTriggers = []; if (options.showOn && options.showOn !== "creation") { this.showTriggers.push({ element: this.triggerElement, event: options.showOn }); } if (options.ajaxCache != null) { options.cache = options.ajaxCache; delete options.ajaxCache; } this.options = options; this.bound = {}; _ref2 = ["prepareToShow", "prepareToHide", "show", "hide", "reposition"]; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { methodToBind = _ref2[_j]; this.bound[methodToBind] = (function(methodToBind) { return function() { return _this[methodToBind].apply(_this, arguments); }; })(methodToBind); } this.adapter.domReady(function() { _this.activate(); if (_this.options.showOn === "creation") { return _this.prepareToShow(); } }); } Opentip.prototype._setup = function() { var hideOn, hideTrigger, hideTriggerElement, i, _i, _j, _len, _len1, _ref, _ref1, _results; this.debug("Setting up the tooltip."); this._buildContainer(); this.hideTriggers = []; _ref = this.options.hideTriggers; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { hideTrigger = _ref[i]; hideTriggerElement = null; hideOn = this.options.hideOn instanceof Array ? this.options.hideOn[i] : this.options.hideOn; if (typeof hideTrigger === "string") { switch (hideTrigger) { case "trigger": hideOn = hideOn || "mouseout"; hideTriggerElement = this.triggerElement; break; case "tip": hideOn = hideOn || "mouseover"; hideTriggerElement = this.container; break; case "target": hideOn = hideOn || "mouseover"; hideTriggerElement = this.options.target; break; case "closeButton": break; default: throw new Error("Unknown hide trigger: " + hideTrigger + "."); } } else { hideOn = hideOn || "mouseover"; hideTriggerElement = this.adapter.wrap(hideTrigger); } if (hideTriggerElement) { this.hideTriggers.push({ element: hideTriggerElement, event: hideOn, original: hideTrigger }); } } _ref1 = this.hideTriggers; _results = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { hideTrigger = _ref1[_j]; _results.push(this.showTriggersWhenVisible.push({ element: hideTrigger.element, event: "mouseover" })); } return _results; }; Opentip.prototype._buildContainer = function() { this.container = this.adapter.create("
"); this.adapter.css(this.container, { position: "absolute" }); if (this.options.ajax) { this.adapter.addClass(this.container, this["class"].loading); } if (this.options.fixed) { this.adapter.addClass(this.container, this["class"].fixed); } if (this.options.showEffect) { this.adapter.addClass(this.container, "" + this["class"].showEffectPrefix + this.options.showEffect); } if (this.options.hideEffect) { return this.adapter.addClass(this.container, "" + this["class"].hideEffectPrefix + this.options.hideEffect); } }; Opentip.prototype._buildElements = function() { var headerElement, titleElement; this.tooltipElement = this.adapter.create("
"); this.backgroundCanvas = this.adapter.wrap(document.createElement("canvas")); this.adapter.css(this.backgroundCanvas, { position: "absolute" }); if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)); } headerElement = this.adapter.find(this.tooltipElement, "." + this["class"].header); if (this.options.title) { titleElement = this.adapter.create("

"); this.adapter.update(titleElement, this.options.title, this.options.escapeTitle); this.adapter.append(headerElement, titleElement); } if (this.options.ajax && !this.loaded) { this.adapter.append(this.tooltipElement, this.adapter.create("
↻
")); } if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { this.closeButtonElement = this.adapter.create("Close"); this.adapter.append(headerElement, this.closeButtonElement); } this.adapter.append(this.container, this.backgroundCanvas); this.adapter.append(this.container, this.tooltipElement); this.adapter.append(document.body, this.container); this._newContent = true; return this.redraw = true; }; Opentip.prototype.setContent = function(content) { this.content = content; this._newContent = true; if (typeof this.content === "function") { this._contentFunction = this.content; this.content = ""; } else { this._contentFunction = null; } if (this.visible) { return this._updateElementContent(); } }; Opentip.prototype._updateElementContent = function() { var contentDiv; if (this._newContent || (!this.options.cache && this._contentFunction)) { contentDiv = this.adapter.find(this.container, "." + this["class"].content); if (contentDiv != null) { if (this._contentFunction) { this.debug("Executing content function."); this.content = this._contentFunction(this); } this.adapter.update(contentDiv, this.content, this.options.escapeContent); } this._newContent = false; } this._storeAndLockDimensions(); return this.reposition(); }; Opentip.prototype._storeAndLockDimensions = function() { var prevDimension; if (!this.container) { return; } prevDimension = this.dimensions; this.adapter.css(this.container, { width: "auto", left: "0px", top: "0px" }); this.dimensions = this.adapter.dimensions(this.container); this.dimensions.width += 1; this.adapter.css(this.container, { width: "" + this.dimensions.width + "px", top: "" + this.currentPosition.top + "px", left: "" + this.currentPosition.left + "px" }); if (!this._dimensionsEqual(this.dimensions, prevDimension)) { this.redraw = true; return this._draw(); } }; Opentip.prototype.activate = function() { return this._setupObservers("hidden", "hiding"); }; Opentip.prototype.deactivate = function() { this.debug("Deactivating tooltip."); this.hide(); return this._setupObservers("-showing", "-visible", "-hidden", "-hiding"); }; Opentip.prototype._setupObservers = function() { var observeOrStop, removeObserver, state, states, trigger, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _this = this; states = 1 <= arguments.length ? __slice.call(arguments, 0) : []; for (_i = 0, _len = states.length; _i < _len; _i++) { state = states[_i]; removeObserver = false; if (state.charAt(0) === "-") { removeObserver = true; state = state.substr(1); } if (this.currentObservers[state] === !removeObserver) { continue; } this.currentObservers[state] = !removeObserver; observeOrStop = function() { var args, _ref, _ref1; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (removeObserver) { return (_ref = _this.adapter).stopObserving.apply(_ref, args); } else { return (_ref1 = _this.adapter).observe.apply(_ref1, args); } }; switch (state) { case "showing": _ref = this.hideTriggers; for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { trigger = _ref[_j]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToHide); } observeOrStop((document.onresize != null ? document : window), "resize", this.bound.reposition); observeOrStop(window, "scroll", this.bound.reposition); break; case "visible": _ref1 = this.showTriggersWhenVisible; for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { trigger = _ref1[_k]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hiding": _ref2 = this.showTriggers; for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { trigger = _ref2[_l]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hidden": break; default: throw new Error("Unknown state: " + state); } } return null; }; Opentip.prototype.prepareToShow = function() { this._abortHiding(); this._abortShowing(); if (this.visible) { return; } this.debug("Showing in " + this.options.delay + "s."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._abortShowingGroup(this.options.group, this); } this.preparingToShow = true; this._setupObservers("-hidden", "-hiding", "showing"); this._followMousePosition(); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); return this._showTimeoutId = this.setTimeout(this.bound.show, this.options.delay || 0); }; Opentip.prototype.show = function() { var _this = this; this._abortHiding(); if (this.visible) { return; } this._clearTimeouts(); if (!this._triggerElementExists()) { return this.deactivate(); } this.debug("Showing now."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._hideGroup(this.options.group, this); } this.visible = true; this.preparingToShow = false; if (this.tooltipElement == null) { this._buildElements(); } this._updateElementContent(); if (this.options.ajax && (!this.loaded || !this.options.cache)) { this._loadAjax(); } this._searchAndActivateCloseButtons(); this._startEnsureTriggerElement(); this.adapter.css(this.container, { zIndex: Opentip.lastZIndex++ }); this._setupObservers("-hidden", "-hiding", "-showing", "-visible", "showing", "visible"); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); this.adapter.removeClass(this.container, this["class"].hiding); this.adapter.removeClass(this.container, this["class"].hidden); this.adapter.addClass(this.container, this["class"].goingToShow); this.setCss3Style(this.container, { transitionDuration: "0s" }); this.defer(function() { var delay; if (!_this.visible || _this.preparingToHide) { return; } _this.adapter.removeClass(_this.container, _this["class"].goingToShow); _this.adapter.addClass(_this.container, _this["class"].showing); delay = 0; if (_this.options.showEffect && _this.options.showEffectDuration) { delay = _this.options.showEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + delay + "s" }); _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].showing); return _this.adapter.addClass(_this.container, _this["class"].visible); }, delay); return _this._activateFirstInput(); }); return this._draw(); }; Opentip.prototype._abortShowing = function() { if (this.preparingToShow) { this.debug("Aborting showing."); this._clearTimeouts(); this._stopFollowingMousePosition(); this.preparingToShow = false; return this._setupObservers("-showing", "-visible", "hiding", "hidden"); } }; Opentip.prototype.prepareToHide = function() { this._abortShowing(); this._abortHiding(); if (!this.visible) { return; } this.debug("Hiding in " + this.options.hideDelay + "s"); this.preparingToHide = true; this._setupObservers("-showing", "visible", "-hidden", "hiding"); return this._hideTimeoutId = this.setTimeout(this.bound.hide, this.options.hideDelay); }; Opentip.prototype.hide = function() { var _this = this; this._abortShowing(); if (!this.visible) { return; } this._clearTimeouts(); this.debug("Hiding!"); this.visible = false; this.preparingToHide = false; this._stopEnsureTriggerElement(); this._setupObservers("-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden"); if (!this.options.fixed) { this._stopFollowingMousePosition(); } if (!this.container) { return; } this.adapter.removeClass(this.container, this["class"].visible); this.adapter.removeClass(this.container, this["class"].showing); this.adapter.addClass(this.container, this["class"].goingToHide); this.setCss3Style(this.container, { transitionDuration: "0s" }); return this.defer(function() { var hideDelay; _this.adapter.removeClass(_this.container, _this["class"].goingToHide); _this.adapter.addClass(_this.container, _this["class"].hiding); hideDelay = 0; if (_this.options.hideEffect && _this.options.hideEffectDuration) { hideDelay = _this.options.hideEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + hideDelay + "s" }); return _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].hiding); _this.adapter.addClass(_this.container, _this["class"].hidden); _this.setCss3Style(_this.container, { transitionDuration: "0s" }); if (_this.options.removeElementsOnHide) { _this.debug("Removing HTML elements."); _this.adapter.remove(_this.container); delete _this.container; return delete _this.tooltipElement; } }, hideDelay); }); }; Opentip.prototype._abortHiding = function() { if (this.preparingToHide) { this.debug("Aborting hiding."); this._clearTimeouts(); this.preparingToHide = false; return this._setupObservers("-hiding", "showing", "visible"); } }; Opentip.prototype.reposition = function() { var position, stem, _ref, _this = this; position = this.getPosition(); if (position == null) { return; } stem = this.options.stem; if (this.options.containInViewport) { _ref = this._ensureViewportContainment(position), position = _ref.position, stem = _ref.stem; } if (this._positionsEqual(position, this.currentPosition)) { return; } if (!(!this.options.stem || stem.eql(this.currentStem))) { this.redraw = true; } this.currentPosition = position; this.currentStem = stem; this._draw(); this.adapter.css(this.container, { left: "" + position.left + "px", top: "" + position.top + "px" }); return this.defer(function() { var rawContainer, redrawFix; rawContainer = _this.adapter.unwrap(_this.container); rawContainer.style.visibility = "hidden"; redrawFix = rawContainer.offsetHeight; return rawContainer.style.visibility = "visible"; }); }; Opentip.prototype.getPosition = function(tipJoint, targetJoint, stem) { var additionalHorizontal, additionalVertical, offsetDistance, position, stemLength, targetDimensions, targetPosition, unwrappedTarget, _ref; if (!this.container) { return; } if (tipJoint == null) { tipJoint = this.options.tipJoint; } if (targetJoint == null) { targetJoint = this.options.targetJoint; } position = {}; if (this.options.target) { targetPosition = this.adapter.offset(this.options.target); targetDimensions = this.adapter.dimensions(this.options.target); position = targetPosition; if (targetJoint.right) { unwrappedTarget = this.adapter.unwrap(this.options.target); if (unwrappedTarget.getBoundingClientRect != null) { position.left = unwrappedTarget.getBoundingClientRect().right + ((_ref = window.pageXOffset) != null ? _ref : document.body.scrollLeft); } else { position.left += targetDimensions.width; } } else if (targetJoint.center) { position.left += Math.round(targetDimensions.width / 2); } if (targetJoint.bottom) { position.top += targetDimensions.height; } else if (targetJoint.middle) { position.top += Math.round(targetDimensions.height / 2); } if (this.options.borderWidth) { if (this.options.tipJoint.left) { position.left += this.options.borderWidth; } if (this.options.tipJoint.right) { position.left -= this.options.borderWidth; } if (this.options.tipJoint.top) { position.top += this.options.borderWidth; } else if (this.options.tipJoint.bottom) { position.top -= this.options.borderWidth; } } } else { if (this.initialMousePosition) { position = { top: this.initialMousePosition.y, left: this.initialMousePosition.x }; } else { position = { top: mousePosition.y, left: mousePosition.x }; } } if (this.options.autoOffset) { stemLength = this.options.stem ? this.options.stemLength : 0; offsetDistance = stemLength && this.options.fixed ? 2 : 10; additionalHorizontal = tipJoint.middle && !this.options.fixed ? 15 : 0; additionalVertical = tipJoint.center && !this.options.fixed ? 15 : 0; if (tipJoint.right) { position.left -= offsetDistance + additionalHorizontal; } else if (tipJoint.left) { position.left += offsetDistance + additionalHorizontal; } if (tipJoint.bottom) { position.top -= offsetDistance + additionalVertical; } else if (tipJoint.top) { position.top += offsetDistance + additionalVertical; } if (stemLength) { if (stem == null) { stem = this.options.stem; } if (stem.right) { position.left -= stemLength; } else if (stem.left) { position.left += stemLength; } if (stem.bottom) { position.top -= stemLength; } else if (stem.top) { position.top += stemLength; } } } position.left += this.options.offset[0]; position.top += this.options.offset[1]; if (tipJoint.right) { position.left -= this.dimensions.width; } else if (tipJoint.center) { position.left -= Math.round(this.dimensions.width / 2); } if (tipJoint.bottom) { position.top -= this.dimensions.height; } else if (tipJoint.middle) { position.top -= Math.round(this.dimensions.height / 2); } return position; }; Opentip.prototype._ensureViewportContainment = function(position) { var needsRepositioning, newSticksOut, originals, revertedX, revertedY, scrollOffset, stem, sticksOut, targetJoint, tipJoint, viewportDimensions, viewportPosition; stem = this.options.stem; originals = { position: position, stem: stem }; if (!(this.visible && position)) { return originals; } sticksOut = this._sticksOut(position); if (!(sticksOut[0] || sticksOut[1])) { return originals; } tipJoint = new Opentip.Joint(this.options.tipJoint); if (this.options.targetJoint) { targetJoint = new Opentip.Joint(this.options.targetJoint); } scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); viewportPosition = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; needsRepositioning = false; if (viewportDimensions.width >= this.dimensions.width) { if (sticksOut[0]) { needsRepositioning = true; switch (sticksOut[0]) { case this.STICKS_OUT_LEFT: tipJoint.setHorizontal("left"); if (this.options.targetJoint) { targetJoint.setHorizontal("right"); } break; case this.STICKS_OUT_RIGHT: tipJoint.setHorizontal("right"); if (this.options.targetJoint) { targetJoint.setHorizontal("left"); } } } } if (viewportDimensions.height >= this.dimensions.height) { if (sticksOut[1]) { needsRepositioning = true; switch (sticksOut[1]) { case this.STICKS_OUT_TOP: tipJoint.setVertical("top"); if (this.options.targetJoint) { targetJoint.setVertical("bottom"); } break; case this.STICKS_OUT_BOTTOM: tipJoint.setVertical("bottom"); if (this.options.targetJoint) { targetJoint.setVertical("top"); } } } } if (!needsRepositioning) { return originals; } if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); newSticksOut = this._sticksOut(position); revertedX = false; revertedY = false; if (newSticksOut[0] && (newSticksOut[0] !== sticksOut[0])) { revertedX = true; tipJoint.setHorizontal(this.options.tipJoint.horizontal); if (this.options.targetJoint) { targetJoint.setHorizontal(this.options.targetJoint.horizontal); } } if (newSticksOut[1] && (newSticksOut[1] !== sticksOut[1])) { revertedY = true; tipJoint.setVertical(this.options.tipJoint.vertical); if (this.options.targetJoint) { targetJoint.setVertical(this.options.targetJoint.vertical); } } if (revertedX && revertedY) { return originals; } if (revertedX || revertedY) { if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); } return { position: position, stem: stem }; }; Opentip.prototype._sticksOut = function(position) { var positionOffset, scrollOffset, sticksOut, viewportDimensions; scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); positionOffset = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; sticksOut = [false, false]; if (positionOffset[0] < 0) { sticksOut[0] = this.STICKS_OUT_LEFT; } else if (positionOffset[0] + this.dimensions.width > viewportDimensions.width) { sticksOut[0] = this.STICKS_OUT_RIGHT; } if (positionOffset[1] < 0) { sticksOut[1] = this.STICKS_OUT_TOP; } else if (positionOffset[1] + this.dimensions.height > viewportDimensions.height) { sticksOut[1] = this.STICKS_OUT_BOTTOM; } return sticksOut; }; Opentip.prototype._draw = function() { var backgroundCanvas, bulge, canvasDimensions, canvasPosition, closeButton, closeButtonInner, closeButtonOuter, ctx, drawCorner, drawLine, hb, position, stemBase, stemLength, _i, _len, _ref, _ref1, _ref2, _this = this; if (!(this.backgroundCanvas && this.redraw)) { return; } this.debug("Drawing background."); this.redraw = false; if (this.currentStem) { _ref = ["top", "right", "bottom", "left"]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { position = _ref[_i]; this.adapter.removeClass(this.container, "stem-" + position); } this.adapter.addClass(this.container, "stem-" + this.currentStem.horizontal); this.adapter.addClass(this.container, "stem-" + this.currentStem.vertical); } closeButtonInner = [0, 0]; closeButtonOuter = [0, 0]; if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { closeButton = new Opentip.Joint(((_ref1 = this.currentStem) != null ? _ref1.toString() : void 0) === "top right" ? "top left" : "top right"); closeButtonInner = [this.options.closeButtonRadius + this.options.closeButtonOffset[0], this.options.closeButtonRadius + this.options.closeButtonOffset[1]]; closeButtonOuter = [this.options.closeButtonRadius - this.options.closeButtonOffset[0], this.options.closeButtonRadius - this.options.closeButtonOffset[1]]; } canvasDimensions = this.adapter.clone(this.dimensions); canvasPosition = [0, 0]; if (this.options.borderWidth) { canvasDimensions.width += this.options.borderWidth * 2; canvasDimensions.height += this.options.borderWidth * 2; canvasPosition[0] -= this.options.borderWidth; canvasPosition[1] -= this.options.borderWidth; } if (this.options.shadow) { canvasDimensions.width += this.options.shadowBlur * 2; canvasDimensions.width += Math.max(0, this.options.shadowOffset[0] - this.options.shadowBlur * 2); canvasDimensions.height += this.options.shadowBlur * 2; canvasDimensions.height += Math.max(0, this.options.shadowOffset[1] - this.options.shadowBlur * 2); canvasPosition[0] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[0]); canvasPosition[1] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[1]); } bulge = { left: 0, right: 0, top: 0, bottom: 0 }; if (this.currentStem) { if (this.currentStem.left) { bulge.left = this.options.stemLength; } else if (this.currentStem.right) { bulge.right = this.options.stemLength; } if (this.currentStem.top) { bulge.top = this.options.stemLength; } else if (this.currentStem.bottom) { bulge.bottom = this.options.stemLength; } } if (closeButton) { if (closeButton.left) { bulge.left = Math.max(bulge.left, closeButtonOuter[0]); } else if (closeButton.right) { bulge.right = Math.max(bulge.right, closeButtonOuter[0]); } if (closeButton.top) { bulge.top = Math.max(bulge.top, closeButtonOuter[1]); } else if (closeButton.bottom) { bulge.bottom = Math.max(bulge.bottom, closeButtonOuter[1]); } } canvasDimensions.width += bulge.left + bulge.right; canvasDimensions.height += bulge.top + bulge.bottom; canvasPosition[0] -= bulge.left; canvasPosition[1] -= bulge.top; if (this.currentStem && this.options.borderWidth) { _ref2 = this._getPathStemMeasures(this.options.stemBase, this.options.stemLength, this.options.borderWidth), stemLength = _ref2.stemLength, stemBase = _ref2.stemBase; } backgroundCanvas = this.adapter.unwrap(this.backgroundCanvas); backgroundCanvas.width = canvasDimensions.width; backgroundCanvas.height = canvasDimensions.height; this.adapter.css(this.backgroundCanvas, { width: "" + backgroundCanvas.width + "px", height: "" + backgroundCanvas.height + "px", left: "" + canvasPosition[0] + "px", top: "" + canvasPosition[1] + "px" }); ctx = backgroundCanvas.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height); ctx.beginPath(); ctx.fillStyle = this._getColor(ctx, this.dimensions, this.options.background, this.options.backgroundGradientHorizontal); ctx.lineJoin = "miter"; ctx.miterLimit = 500; hb = this.options.borderWidth / 2; if (this.options.borderWidth) { ctx.strokeStyle = this.options.borderColor; ctx.lineWidth = this.options.borderWidth; } else { stemLength = this.options.stemLength; stemBase = this.options.stemBase; } if (stemBase == null) { stemBase = 0; } drawLine = function(length, stem, first) { if (first) { ctx.moveTo(Math.max(stemBase, _this.options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb); } if (stem) { ctx.lineTo(length / 2 - stemBase / 2, -hb); ctx.lineTo(length / 2, -stemLength - hb); return ctx.lineTo(length / 2 + stemBase / 2, -hb); } }; drawCorner = function(stem, closeButton, i) { var angle1, angle2, innerWidth, offset; if (stem) { ctx.lineTo(-stemBase + hb, 0 - hb); ctx.lineTo(stemLength + hb, -stemLength - hb); return ctx.lineTo(hb, stemBase - hb); } else if (closeButton) { offset = _this.options.closeButtonOffset; innerWidth = closeButtonInner[0]; if (i % 2 !== 0) { offset = [offset[1], offset[0]]; innerWidth = closeButtonInner[1]; } angle1 = Math.acos(offset[1] / _this.options.closeButtonRadius); angle2 = Math.acos(offset[0] / _this.options.closeButtonRadius); ctx.lineTo(-innerWidth + hb, -hb); return ctx.arc(hb - offset[0], -hb + offset[1], _this.options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, false); } else { ctx.lineTo(-_this.options.borderRadius + hb, -hb); return ctx.quadraticCurveTo(hb, -hb, hb, _this.options.borderRadius - hb); } }; ctx.translate(-canvasPosition[0], -canvasPosition[1]); ctx.save(); (function() { var cornerStem, i, lineLength, lineStem, positionIdx, positionX, positionY, rotation, _j, _ref3, _results; _results = []; for (i = _j = 0, _ref3 = Opentip.positions.length / 2; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) { positionIdx = i * 2; positionX = i === 0 || i === 3 ? 0 : _this.dimensions.width; positionY = i < 2 ? 0 : _this.dimensions.height; rotation = (Math.PI / 2) * i; lineLength = i % 2 === 0 ? _this.dimensions.width : _this.dimensions.height; lineStem = new Opentip.Joint(Opentip.positions[positionIdx]); cornerStem = new Opentip.Joint(Opentip.positions[positionIdx + 1]); ctx.save(); ctx.translate(positionX, positionY); ctx.rotate(rotation); drawLine(lineLength, lineStem.eql(_this.currentStem), i === 0); ctx.translate(lineLength, 0); drawCorner(cornerStem.eql(_this.currentStem), cornerStem.eql(closeButton), i); _results.push(ctx.restore()); } return _results; })(); ctx.closePath(); ctx.save(); if (this.options.shadow) { ctx.shadowColor = this.options.shadowColor; ctx.shadowBlur = this.options.shadowBlur; ctx.shadowOffsetX = this.options.shadowOffset[0]; ctx.shadowOffsetY = this.options.shadowOffset[1]; } ctx.fill(); ctx.restore(); if (this.options.borderWidth) { ctx.stroke(); } ctx.restore(); if (closeButton) { return (function() { var crossCenter, crossHeight, crossWidth, hcs, linkCenter; crossWidth = crossHeight = _this.options.closeButtonRadius * 2; if (closeButton.toString() === "top right") { linkCenter = [_this.dimensions.width - _this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] + hb, linkCenter[1] - hb]; } else { linkCenter = [_this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] - hb, linkCenter[1] - hb]; } ctx.translate(crossCenter[0], crossCenter[1]); hcs = _this.options.closeButtonCrossSize / 2; ctx.save(); ctx.beginPath(); ctx.strokeStyle = _this.options.closeButtonCrossColor; ctx.lineWidth = _this.options.closeButtonCrossLineWidth; ctx.lineCap = "round"; ctx.moveTo(-hcs, -hcs); ctx.lineTo(hcs, hcs); ctx.stroke(); ctx.beginPath(); ctx.moveTo(hcs, -hcs); ctx.lineTo(-hcs, hcs); ctx.stroke(); ctx.restore(); return _this.adapter.css(_this.closeButtonElement, { left: "" + (linkCenter[0] - hcs - _this.options.closeButtonLinkOverscan) + "px", top: "" + (linkCenter[1] - hcs - _this.options.closeButtonLinkOverscan) + "px", width: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px", height: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px" }); })(); } }; Opentip.prototype._getPathStemMeasures = function(outerStemBase, outerStemLength, borderWidth) { var angle, distanceBetweenTips, halfAngle, hb, rhombusSide, stemBase, stemLength; hb = borderWidth / 2; halfAngle = Math.atan((outerStemBase / 2) / outerStemLength); angle = halfAngle * 2; rhombusSide = hb / Math.sin(angle); distanceBetweenTips = 2 * rhombusSide * Math.cos(halfAngle); stemLength = hb + outerStemLength - distanceBetweenTips; if (stemLength < 0) { throw new Error("Sorry but your stemLength / stemBase ratio is strange."); } stemBase = (Math.tan(halfAngle) * stemLength) * 2; return { stemLength: stemLength, stemBase: stemBase }; }; Opentip.prototype._getColor = function(ctx, dimensions, color, horizontal) { var colorStop, gradient, i, _i, _len; if (horizontal == null) { horizontal = false; } if (typeof color === "string") { return color; } if (horizontal) { gradient = ctx.createLinearGradient(0, 0, dimensions.width, 0); } else { gradient = ctx.createLinearGradient(0, 0, 0, dimensions.height); } for (i = _i = 0, _len = color.length; _i < _len; i = ++_i) { colorStop = color[i]; gradient.addColorStop(colorStop[0], colorStop[1]); } return gradient; }; Opentip.prototype._searchAndActivateCloseButtons = function() { var element, _i, _len, _ref; _ref = this.adapter.findAll(this.container, "." + this["class"].close); for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; this.hideTriggers.push({ element: this.adapter.wrap(element), event: "click" }); } if (this.currentObservers.showing) { this._setupObservers("-showing", "showing"); } if (this.currentObservers.visible) { return this._setupObservers("-visible", "visible"); } }; Opentip.prototype._activateFirstInput = function() { var input; input = this.adapter.unwrap(this.adapter.find(this.container, "input, textarea")); return input != null ? typeof input.focus === "function" ? input.focus() : void 0 : void 0; }; Opentip.prototype._followMousePosition = function() { if (!this.options.fixed) { return Opentip._observeMousePosition(this.bound.reposition); } }; Opentip.prototype._stopFollowingMousePosition = function() { if (!this.options.fixed) { return Opentip._stopObservingMousePosition(this.bound.reposition); } }; Opentip.prototype._clearShowTimeout = function() { return clearTimeout(this._showTimeoutId); }; Opentip.prototype._clearHideTimeout = function() { return clearTimeout(this._hideTimeoutId); }; Opentip.prototype._clearTimeouts = function() { clearTimeout(this._visibilityStateTimeoutId); this._clearShowTimeout(); return this._clearHideTimeout(); }; Opentip.prototype._triggerElementExists = function() { var el; el = this.adapter.unwrap(this.triggerElement); while (el.parentNode) { if (el.parentNode.tagName === "BODY") { return true; } el = el.parentNode; } return false; }; Opentip.prototype._loadAjax = function() { var _this = this; if (this.loading) { return; } this.loaded = false; this.loading = true; this.adapter.addClass(this.container, this["class"].loading); this.setContent(""); this.debug("Loading content from " + this.options.ajax); return this.adapter.ajax({ url: this.options.ajax, method: this.options.ajaxMethod, onSuccess: function(responseText) { _this.debug("Loading successful."); _this.adapter.removeClass(_this.container, _this["class"].loading); return _this.setContent(responseText); }, onError: function(error) { var message; message = _this.options.ajaxErrorMessage; _this.debug(message, error); _this.setContent(message); return _this.adapter.addClass(_this.container, _this["class"].ajaxError); }, onComplete: function() { _this.adapter.removeClass(_this.container, _this["class"].loading); _this.loading = false; _this.loaded = true; _this._searchAndActivateCloseButtons(); _this._activateFirstInput(); return _this.reposition(); } }); }; Opentip.prototype._ensureTriggerElement = function() { if (!this._triggerElementExists()) { this.deactivate(); return this._stopEnsureTriggerElement(); } }; Opentip.prototype._ensureTriggerElementInterval = 1000; Opentip.prototype._startEnsureTriggerElement = function() { var _this = this; return this._ensureTriggerElementTimeoutId = setInterval((function() { return _this._ensureTriggerElement(); }), this._ensureTriggerElementInterval); }; Opentip.prototype._stopEnsureTriggerElement = function() { return clearInterval(this._ensureTriggerElementTimeoutId); }; return Opentip; })(); vendors = ["khtml", "ms", "o", "moz", "webkit"]; Opentip.prototype.setCss3Style = function(element, styles) { var prop, value, vendor, vendorProp, _results; element = this.adapter.unwrap(element); _results = []; for (prop in styles) { if (!__hasProp.call(styles, prop)) continue; value = styles[prop]; if (element.style[prop] != null) { _results.push(element.style[prop] = value); } else { _results.push((function() { var _i, _len, _results1; _results1 = []; for (_i = 0, _len = vendors.length; _i < _len; _i++) { vendor = vendors[_i]; vendorProp = "" + (this.ucfirst(vendor)) + (this.ucfirst(prop)); if (element.style[vendorProp] != null) { _results1.push(element.style[vendorProp] = value); } else { _results1.push(void 0); } } return _results1; }).call(this)); } } return _results; }; Opentip.prototype.defer = function(func) { return setTimeout(func, 0); }; Opentip.prototype.setTimeout = function(func, seconds) { return setTimeout(func, seconds ? seconds * 1000 : 0); }; Opentip.prototype.ucfirst = function(string) { if (string == null) { return ""; } return string.charAt(0).toUpperCase() + string.slice(1); }; Opentip.prototype.dasherize = function(string) { return string.replace(/([A-Z])/g, function(_, character) { return "-" + (character.toLowerCase()); }); }; mousePositionObservers = []; mousePosition = { x: 0, y: 0 }; mouseMoved = function(e) { var observer, _i, _len, _results; mousePosition = Opentip.adapter.mousePosition(e); _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; _results.push(observer()); } return _results; }; Opentip.followMousePosition = function() { return Opentip.adapter.observe(document.body, "mousemove", mouseMoved); }; Opentip._observeMousePosition = function(observer) { return mousePositionObservers.push(observer); }; Opentip._stopObservingMousePosition = function(removeObserver) { var observer; return mousePositionObservers = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; if (observer !== removeObserver) { _results.push(observer); } } return _results; })(); }; Opentip.Joint = (function() { function Joint(pointerString) { if (pointerString == null) { return; } if (pointerString instanceof Opentip.Joint) { pointerString = pointerString.toString(); } this.set(pointerString); this; } Joint.prototype.set = function(string) { string = string.toLowerCase(); this.setHorizontal(string); this.setVertical(string); return this; }; Joint.prototype.setHorizontal = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["left", "center", "right"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.horizontal = i.toLowerCase(); } } if (this.horizontal == null) { this.horizontal = "center"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.horizontal === i ? i : void 0); } return _results; }; Joint.prototype.setVertical = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["top", "middle", "bottom"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.vertical = i.toLowerCase(); } } if (this.vertical == null) { this.vertical = "middle"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.vertical === i ? i : void 0); } return _results; }; Joint.prototype.eql = function(pointer) { return (pointer != null) && this.horizontal === pointer.horizontal && this.vertical === pointer.vertical; }; Joint.prototype.flip = function() { var flippedIndex, positionIdx; positionIdx = Opentip.position[this.toString(true)]; flippedIndex = (positionIdx + 4) % 8; this.set(Opentip.positions[flippedIndex]); return this; }; Joint.prototype.toString = function(camelized) { var horizontal, vertical; if (camelized == null) { camelized = false; } vertical = this.vertical === "middle" ? "" : this.vertical; horizontal = this.horizontal === "center" ? "" : this.horizontal; if (vertical && horizontal) { if (camelized) { horizontal = Opentip.prototype.ucfirst(horizontal); } else { horizontal = " " + horizontal; } } return "" + vertical + horizontal; }; return Joint; })(); Opentip.prototype._positionsEqual = function(posA, posB) { return (posA != null) && (posB != null) && posA.left === posB.left && posA.top === posB.top; }; Opentip.prototype._dimensionsEqual = function(dimA, dimB) { return (dimA != null) && (dimB != null) && dimA.width === dimB.width && dimA.height === dimB.height; }; Opentip.prototype.debug = function() { var args; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (Opentip.debug && ((typeof console !== "undefined" && console !== null ? console.debug : void 0) != null)) { args.unshift("#" + this.id + " |"); return console.debug.apply(console, args); } }; Opentip.findElements = function() { var adapter, content, element, optionName, optionValue, options, _i, _len, _ref, _results; adapter = Opentip.adapter; _ref = adapter.findAll(document.body, "[data-ot]"); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; options = {}; content = adapter.data(element, "ot"); if (content === "" || content === "true" || content === "yes") { content = adapter.attr(element, "title"); adapter.attr(element, "title", ""); } content = content || ""; for (optionName in Opentip.styles.standard) { optionValue = adapter.data(element, "ot" + (Opentip.prototype.ucfirst(optionName))); if (optionValue != null) { if (optionValue === "yes" || optionValue === "true" || optionValue === "on") { optionValue = true; } else if (optionValue === "no" || optionValue === "false" || optionValue === "off") { optionValue = false; } options[optionName] = optionValue; } } _results.push(new Opentip(element, content, options)); } return _results; }; Opentip.version = "2.4.6"; Opentip.debug = false; Opentip.lastId = 0; Opentip.lastZIndex = 100; Opentip.tips = []; Opentip._abortShowingGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip._abortShowing()); } else { _results.push(void 0); } } return _results; }; Opentip._hideGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip.hide()); } else { _results.push(void 0); } } return _results; }; Opentip.adapters = {}; Opentip.adapter = null; firstAdapter = true; Opentip.addAdapter = function(adapter) { Opentip.adapters[adapter.name] = adapter; if (firstAdapter) { Opentip.adapter = adapter; adapter.domReady(Opentip.findElements); adapter.domReady(Opentip.followMousePosition); return firstAdapter = false; } }; Opentip.positions = ["top", "topRight", "right", "bottomRight", "bottom", "bottomLeft", "left", "topLeft"]; Opentip.position = {}; _ref = Opentip.positions; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { position = _ref[i]; Opentip.position[position] = i; } Opentip.styles = { standard: { "extends": null, title: void 0, escapeTitle: true, escapeContent: false, className: "standard", stem: true, delay: null, hideDelay: 0.1, fixed: false, showOn: "mouseover", hideTrigger: "trigger", hideTriggers: [], hideOn: null, removeElementsOnHide: false, offset: [0, 0], containInViewport: true, autoOffset: true, showEffect: "appear", hideEffect: "fade", showEffectDuration: 0.3, hideEffectDuration: 0.2, stemLength: 5, stemBase: 8, tipJoint: "top left", target: null, targetJoint: null, cache: true, ajax: false, ajaxMethod: "GET", ajaxErrorMessage: "There was a problem downloading the content.", group: null, style: null, background: "#fff18f", backgroundGradientHorizontal: false, closeButtonOffset: [5, 5], closeButtonRadius: 7, closeButtonCrossSize: 4, closeButtonCrossColor: "#d2c35b", closeButtonCrossLineWidth: 1.5, closeButtonLinkOverscan: 6, borderRadius: 5, borderWidth: 1, borderColor: "#f2e37b", shadow: true, shadowBlur: 10, shadowOffset: [3, 3], shadowColor: "rgba(0, 0, 0, 0.1)" }, glass: { "extends": "standard", className: "glass", background: [[0, "rgba(252, 252, 252, 0.8)"], [0.5, "rgba(255, 255, 255, 0.8)"], [0.5, "rgba(250, 250, 250, 0.9)"], [1, "rgba(245, 245, 245, 0.9)"]], borderColor: "#eee", closeButtonCrossColor: "rgba(0, 0, 0, 0.2)", borderRadius: 15, closeButtonRadius: 10, closeButtonOffset: [8, 8] }, dark: { "extends": "standard", className: "dark", borderRadius: 13, borderColor: "#444", closeButtonCrossColor: "rgba(240, 240, 240, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(30, 30, 30, 0.7)"], [0.5, "rgba(30, 30, 30, 0.8)"], [0.5, "rgba(10, 10, 10, 0.8)"], [1, "rgba(10, 10, 10, 0.9)"]] }, alert: { "extends": "standard", className: "alert", borderRadius: 1, borderColor: "#AE0D11", closeButtonCrossColor: "rgba(255, 255, 255, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(203, 15, 19, 0.7)"], [0.5, "rgba(203, 15, 19, 0.8)"], [0.5, "rgba(189, 14, 18, 0.8)"], [1, "rgba(179, 14, 17, 0.9)"]] } }; Opentip.defaultStyle = "standard"; if (typeof module !== "undefined" && module !== null) { module.exports = Opentip; } else { window.Opentip = Opentip; } // Generated by CoffeeScript 1.4.0 var __slice = [].slice; (function() { var Adapter, isArrayOrNodeList; Element.addMethods({ addTip: function(element, content, title, options) { return new Opentip(element, content, title, options); } }); isArrayOrNodeList = function(element) { if ((element instanceof Array) || ((element != null) && typeof element.length === 'number' && typeof element.item === 'function' && typeof element.nextNode === 'function' && typeof element.reset === 'function')) { return true; } return false; }; Adapter = (function() { function Adapter() {} Adapter.prototype.name = "prototype"; Adapter.prototype.domReady = function(callback) { if (document.loaded) { return callback(); } else { return $(document).observe("dom:loaded", callback); } }; Adapter.prototype.create = function(html) { return new Element('div').update(html).childElements(); }; Adapter.prototype.wrap = function(element) { if (isArrayOrNodeList(element)) { if (element.length > 1) { throw new Error("Multiple elements provided."); } element = this.unwrap(element); } else if (typeof element === "string") { element = $$(element)[0]; } return $(element); }; Adapter.prototype.unwrap = function(element) { if (isArrayOrNodeList(element)) { return element[0]; } else { return element; } }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; if (args.length === 1) { return this.wrap(element).readAttribute(args[0]); } else { return (_ref = this.wrap(element)).writeAttribute.apply(_ref, args); } }; Adapter.prototype.data = function(element, name, value) { var arg; this.wrap(element); if (arguments.length > 2) { return element.store(name, value); } else { arg = element.readAttribute("data-" + (name.underscore().dasherize())); if (arg != null) { return arg; } return element.retrieve(name); } }; Adapter.prototype.find = function(element, selector) { return this.wrap(element).select(selector)[0]; }; Adapter.prototype.findAll = function(element, selector) { return this.wrap(element).select(selector); }; Adapter.prototype.update = function(element, content, escape) { return this.wrap(element).update(escape ? content.escapeHTML() : content); }; Adapter.prototype.append = function(element, child) { return this.wrap(element).insert(this.wrap(child)); }; Adapter.prototype.remove = function(element) { return this.wrap(element).remove(); }; Adapter.prototype.addClass = function(element, className) { return this.wrap(element).addClassName(className); }; Adapter.prototype.removeClass = function(element, className) { return this.wrap(element).removeClassName(className); }; Adapter.prototype.css = function(element, properties) { return this.wrap(element).setStyle(properties); }; Adapter.prototype.dimensions = function(element) { return this.wrap(element).getDimensions(); }; Adapter.prototype.scrollOffset = function() { var offsets; offsets = document.viewport.getScrollOffsets(); return [offsets.left, offsets.top]; }; Adapter.prototype.viewportDimensions = function() { return document.viewport.getDimensions(); }; Adapter.prototype.mousePosition = function(e) { if (e == null) { return null; } return { x: Event.pointerX(e), y: Event.pointerY(e) }; }; Adapter.prototype.offset = function(element) { var offset; offset = this.wrap(element).cumulativeOffset(); return { left: offset.left, top: offset.top }; }; Adapter.prototype.observe = function(element, eventName, observer) { return Event.observe(this.wrap(element), eventName, observer); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return Event.stopObserving(this.wrap(element), eventName, observer); }; Adapter.prototype.ajax = function(options) { var _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } return new Ajax.Request(options.url, { method: (_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET", onSuccess: function(response) { return typeof options.onSuccess === "function" ? options.onSuccess(response.responseText) : void 0; }, onFailure: function(response) { return typeof options.onError === "function" ? options.onError("Server responded with status " + response.status) : void 0; }, onComplete: function() { return typeof options.onComplete === "function" ? options.onComplete() : void 0; } }); }; Adapter.prototype.clone = function(object) { return Object.clone(object); }; Adapter.prototype.extend = function() { var source, sources, target, _i, _len; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; for (_i = 0, _len = sources.length; _i < _len; _i++) { source = sources[_i]; Object.extend(target, source); } return target; }; return Adapter; })(); return Opentip.addAdapter(new Adapter); })(); opentip-2.4.6/downloads/opentip-prototype.min.js000066400000000000000000001040071213277401600220410ustar00rootroot00000000000000// Opentip v2.4.6 // Copyright (c) 2009-2012 // www.opentip.org // MIT Licensed var Opentip,firstAdapter,i,mouseMoved,mousePosition,mousePositionObservers,position,vendors,_i,_len,_ref,__slice=[].slice,__indexOf=[].indexOf||function(t){for(var e=0,i=this.length;i>e;e++)if(e in this&&this[e]===t)return e;return-1},__hasProp={}.hasOwnProperty;for(Opentip=function(){function t(e,i,o,s){var n,r,a,h,p,l,d,u,c,g,f,m,v,w,b=this;if(this.id=++t.lastId,this.debug("Creating Opentip."),t.tips.push(this),this.adapter=t.adapter,n=this.adapter.data(e,"opentips")||[],n.push(this),this.adapter.data(e,"opentips",n),this.triggerElement=this.adapter.wrap(e),this.triggerElement.length>1)throw Error("You can't call Opentip on multiple elements.");if(1>this.triggerElement.length)throw Error("Invalid element.");this.loaded=!1,this.loading=!1,this.visible=!1,this.waitingToShow=!1,this.waitingToHide=!1,this.currentPosition={left:0,top:0},this.dimensions={width:100,height:50},this.content="",this.redraw=!0,this.currentObservers={showing:!1,visible:!1,hiding:!1,hidden:!1},s=this.adapter.clone(s),typeof i=="object"?(s=i,i=o=void 0):typeof o=="object"&&(s=o,o=void 0),o!=null&&(s.title=o),i!=null&&this.setContent(i),s["extends"]==null&&(s["extends"]=s.style!=null?s.style:t.defaultStyle),h=[s],w=s;while(w["extends"]){if(l=w["extends"],w=t.styles[l],w==null)throw Error("Invalid style: "+l);h.unshift(w),w["extends"]==null&&l!=="standard"&&(w["extends"]="standard")}for(s=(f=this.adapter).extend.apply(f,[{}].concat(__slice.call(h))),s.hideTriggers=function(){var t,e,i,o;for(i=s.hideTriggers,o=[],t=0,e=i.length;e>t;t++)r=i[t],o.push(r);return o}(),s.hideTrigger&&s.hideTriggers.length===0&&s.hideTriggers.push(s.hideTrigger),m=["tipJoint","targetJoint","stem"],d=0,c=m.length;c>d;d++)p=m[d],s[p]&&typeof s[p]=="string"&&(s[p]=new t.Joint(s[p]));for(!s.ajax||s.ajax!==!0&&s.ajax||(s.ajax=this.adapter.tagName(this.triggerElement)==="A"?this.adapter.attr(this.triggerElement,"href"):!1),s.showOn==="click"&&this.adapter.tagName(this.triggerElement)==="A"&&this.adapter.observe(this.triggerElement,"click",function(t){return t.preventDefault(),t.stopPropagation(),t.stopped=!0}),s.target&&(s.fixed=!0),s.stem===!0&&(s.stem=new t.Joint(s.tipJoint)),s.target===!0?s.target=this.triggerElement:s.target&&(s.target=this.adapter.wrap(s.target)),this.currentStem=s.stem,s.delay==null&&(s.delay=s.showOn==="mouseover"?.2:0),s.targetJoint==null&&(s.targetJoint=new t.Joint(s.tipJoint).flip()),this.showTriggers=[],this.showTriggersWhenVisible=[],this.hideTriggers=[],s.showOn&&s.showOn!=="creation"&&this.showTriggers.push({element:this.triggerElement,event:s.showOn}),s.ajaxCache!=null&&(s.cache=s.ajaxCache,delete s.ajaxCache),this.options=s,this.bound={},v=["prepareToShow","prepareToHide","show","hide","reposition"],u=0,g=v.length;g>u;u++)a=v[u],this.bound[a]=function(t){return function(){return b[t].apply(b,arguments)}}(a);this.adapter.domReady(function(){return b.activate(),b.options.showOn==="creation"?b.prepareToShow():void 0})}return t.prototype.STICKS_OUT_TOP=1,t.prototype.STICKS_OUT_BOTTOM=2,t.prototype.STICKS_OUT_LEFT=1,t.prototype.STICKS_OUT_RIGHT=2,t.prototype["class"]={container:"opentip-container",opentip:"opentip",header:"ot-header",content:"ot-content",loadingIndicator:"ot-loading-indicator",close:"ot-close",goingToHide:"ot-going-to-hide",hidden:"ot-hidden",hiding:"ot-hiding",goingToShow:"ot-going-to-show",showing:"ot-showing",visible:"ot-visible",loading:"ot-loading",ajaxError:"ot-ajax-error",fixed:"ot-fixed",showEffectPrefix:"ot-show-effect-",hideEffectPrefix:"ot-hide-effect-",stylePrefix:"style-"},t.prototype._setup=function(){var t,e,i,o,s,n,r,a,h,p,l;for(this.debug("Setting up the tooltip."),this._buildContainer(),this.hideTriggers=[],h=this.options.hideTriggers,o=s=0,r=h.length;r>s;o=++s){if(e=h[o],i=null,t=this.options.hideOn instanceof Array?this.options.hideOn[o]:this.options.hideOn,typeof e=="string")switch(e){case"trigger":t=t||"mouseout",i=this.triggerElement;break;case"tip":t=t||"mouseover",i=this.container;break;case"target":t=t||"mouseover",i=this.options.target;break;case"closeButton":break;default:throw Error("Unknown hide trigger: "+e+".")}else t=t||"mouseover",i=this.adapter.wrap(e);i&&this.hideTriggers.push({element:i,event:t,original:e})}for(p=this.hideTriggers,l=[],n=0,a=p.length;a>n;n++)e=p[n],l.push(this.showTriggersWhenVisible.push({element:e.element,event:"mouseover"}));return l},t.prototype._buildContainer=function(){return this.container=this.adapter.create('
'),this.adapter.css(this.container,{position:"absolute"}),this.options.ajax&&this.adapter.addClass(this.container,this["class"].loading),this.options.fixed&&this.adapter.addClass(this.container,this["class"].fixed),this.options.showEffect&&this.adapter.addClass(this.container,""+this["class"].showEffectPrefix+this.options.showEffect),this.options.hideEffect?this.adapter.addClass(this.container,""+this["class"].hideEffectPrefix+this.options.hideEffect):void 0},t.prototype._buildElements=function(){var t,e;return this.tooltipElement=this.adapter.create('
'),this.backgroundCanvas=this.adapter.wrap(document.createElement("canvas")),this.adapter.css(this.backgroundCanvas,{position:"absolute"}),typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager!==null&&G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)),t=this.adapter.find(this.tooltipElement,"."+this["class"].header),this.options.title&&(e=this.adapter.create("

"),this.adapter.update(e,this.options.title,this.options.escapeTitle),this.adapter.append(t,e)),this.options.ajax&&!this.loaded&&this.adapter.append(this.tooltipElement,this.adapter.create('
↻
')),__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(this.closeButtonElement=this.adapter.create('Close'),this.adapter.append(t,this.closeButtonElement)),this.adapter.append(this.container,this.backgroundCanvas),this.adapter.append(this.container,this.tooltipElement),this.adapter.append(document.body,this.container),this._newContent=!0,this.redraw=!0},t.prototype.setContent=function(t){return this.content=t,this._newContent=!0,typeof this.content=="function"?(this._contentFunction=this.content,this.content=""):this._contentFunction=null,this.visible?this._updateElementContent():void 0},t.prototype._updateElementContent=function(){var t;return(this._newContent||!this.options.cache&&this._contentFunction)&&(t=this.adapter.find(this.container,"."+this["class"].content),t!=null&&(this._contentFunction&&(this.debug("Executing content function."),this.content=this._contentFunction(this)),this.adapter.update(t,this.content,this.options.escapeContent)),this._newContent=!1),this._storeAndLockDimensions(),this.reposition()},t.prototype._storeAndLockDimensions=function(){var t;if(this.container)return t=this.dimensions,this.adapter.css(this.container,{width:"auto",left:"0px",top:"0px"}),this.dimensions=this.adapter.dimensions(this.container),this.dimensions.width+=1,this.adapter.css(this.container,{width:""+this.dimensions.width+"px",top:""+this.currentPosition.top+"px",left:""+this.currentPosition.left+"px"}),this._dimensionsEqual(this.dimensions,t)?void 0:(this.redraw=!0,this._draw())},t.prototype.activate=function(){return this._setupObservers("hidden","hiding")},t.prototype.deactivate=function(){return this.debug("Deactivating tooltip."),this.hide(),this._setupObservers("-showing","-visible","-hidden","-hiding")},t.prototype._setupObservers=function(){var t,e,i,o,s,n,r,a,h,p,l,d,u,c,g,f,m=this;for(o=arguments.length>=1?__slice.call(arguments,0):[],n=0,p=o.length;p>n;n++)if(i=o[n],e=!1,i.charAt(0)==="-"&&(e=!0,i=i.substr(1)),this.currentObservers[i]!==!e)switch(this.currentObservers[i]=!e,t=function(){var t,i,o;return t=arguments.length>=1?__slice.call(arguments,0):[],e?(i=m.adapter).stopObserving.apply(i,t):(o=m.adapter).observe.apply(o,t)},i){case"showing":for(c=this.hideTriggers,r=0,l=c.length;l>r;r++)s=c[r],t(s.element,s.event,this.bound.prepareToHide);t(document.onresize!=null?document:window,"resize",this.bound.reposition),t(window,"scroll",this.bound.reposition);break;case"visible":for(g=this.showTriggersWhenVisible,a=0,d=g.length;d>a;a++)s=g[a],t(s.element,s.event,this.bound.prepareToShow);break;case"hiding":for(f=this.showTriggers,h=0,u=f.length;u>h;h++)s=f[h],t(s.element,s.event,this.bound.prepareToShow);break;case"hidden":break;default:throw Error("Unknown state: "+i)}return null},t.prototype.prepareToShow=function(){return this._abortHiding(),this._abortShowing(),this.visible?void 0:(this.debug("Showing in "+this.options.delay+"s."),this.container==null&&this._setup(),this.options.group&&t._abortShowingGroup(this.options.group,this),this.preparingToShow=!0,this._setupObservers("-hidden","-hiding","showing"),this._followMousePosition(),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this._showTimeoutId=this.setTimeout(this.bound.show,this.options.delay||0))},t.prototype.show=function(){var e=this;return this._abortHiding(),this.visible?void 0:(this._clearTimeouts(),this._triggerElementExists()?(this.debug("Showing now."),this.container==null&&this._setup(),this.options.group&&t._hideGroup(this.options.group,this),this.visible=!0,this.preparingToShow=!1,this.tooltipElement==null&&this._buildElements(),this._updateElementContent(),!this.options.ajax||this.loaded&&this.options.cache||this._loadAjax(),this._searchAndActivateCloseButtons(),this._startEnsureTriggerElement(),this.adapter.css(this.container,{zIndex:t.lastZIndex++}),this._setupObservers("-hidden","-hiding","-showing","-visible","showing","visible"),this.options.fixed&&!this.options.target&&(this.initialMousePosition=mousePosition),this.reposition(),this.adapter.removeClass(this.container,this["class"].hiding),this.adapter.removeClass(this.container,this["class"].hidden),this.adapter.addClass(this.container,this["class"].goingToShow),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var t;if(e.visible&&!e.preparingToHide)return e.adapter.removeClass(e.container,e["class"].goingToShow),e.adapter.addClass(e.container,e["class"].showing),t=0,e.options.showEffect&&e.options.showEffectDuration&&(t=e.options.showEffectDuration),e.setCss3Style(e.container,{transitionDuration:""+t+"s"}),e._visibilityStateTimeoutId=e.setTimeout(function(){return e.adapter.removeClass(e.container,e["class"].showing),e.adapter.addClass(e.container,e["class"].visible)},t),e._activateFirstInput()}),this._draw()):this.deactivate())},t.prototype._abortShowing=function(){return this.preparingToShow?(this.debug("Aborting showing."),this._clearTimeouts(),this._stopFollowingMousePosition(),this.preparingToShow=!1,this._setupObservers("-showing","-visible","hiding","hidden")):void 0},t.prototype.prepareToHide=function(){return this._abortShowing(),this._abortHiding(),this.visible?(this.debug("Hiding in "+this.options.hideDelay+"s"),this.preparingToHide=!0,this._setupObservers("-showing","visible","-hidden","hiding"),this._hideTimeoutId=this.setTimeout(this.bound.hide,this.options.hideDelay)):void 0},t.prototype.hide=function(){var t=this;return this._abortShowing(),this.visible&&(this._clearTimeouts(),this.debug("Hiding!"),this.visible=!1,this.preparingToHide=!1,this._stopEnsureTriggerElement(),this._setupObservers("-showing","-visible","-hiding","-hidden","hiding","hidden"),this.options.fixed||this._stopFollowingMousePosition(),this.container)?(this.adapter.removeClass(this.container,this["class"].visible),this.adapter.removeClass(this.container,this["class"].showing),this.adapter.addClass(this.container,this["class"].goingToHide),this.setCss3Style(this.container,{transitionDuration:"0s"}),this.defer(function(){var e;return t.adapter.removeClass(t.container,t["class"].goingToHide),t.adapter.addClass(t.container,t["class"].hiding),e=0,t.options.hideEffect&&t.options.hideEffectDuration&&(e=t.options.hideEffectDuration),t.setCss3Style(t.container,{transitionDuration:""+e+"s"}),t._visibilityStateTimeoutId=t.setTimeout(function(){return t.adapter.removeClass(t.container,t["class"].hiding),t.adapter.addClass(t.container,t["class"].hidden),t.setCss3Style(t.container,{transitionDuration:"0s"}),t.options.removeElementsOnHide?(t.debug("Removing HTML elements."),t.adapter.remove(t.container),delete t.container,delete t.tooltipElement):void 0},e)})):void 0},t.prototype._abortHiding=function(){return this.preparingToHide?(this.debug("Aborting hiding."),this._clearTimeouts(),this.preparingToHide=!1,this._setupObservers("-hiding","showing","visible")):void 0},t.prototype.reposition=function(){var t,e,i,o=this;return t=this.getPosition(),t==null||(e=this.options.stem,this.options.containInViewport&&(i=this._ensureViewportContainment(t),t=i.position,e=i.stem),this._positionsEqual(t,this.currentPosition))?void 0:(this.options.stem&&!e.eql(this.currentStem)&&(this.redraw=!0),this.currentPosition=t,this.currentStem=e,this._draw(),this.adapter.css(this.container,{left:""+t.left+"px",top:""+t.top+"px"}),this.defer(function(){var t,e;return t=o.adapter.unwrap(o.container),t.style.visibility="hidden",e=t.offsetHeight,t.style.visibility="visible"}))},t.prototype.getPosition=function(t,e,i){var o,s,n,r,a,h,p,l,d;if(this.container)return t==null&&(t=this.options.tipJoint),e==null&&(e=this.options.targetJoint),r={},this.options.target?(p=this.adapter.offset(this.options.target),h=this.adapter.dimensions(this.options.target),r=p,e.right?(l=this.adapter.unwrap(this.options.target),l.getBoundingClientRect!=null?r.left=l.getBoundingClientRect().right+((d=window.pageXOffset)!=null?d:document.body.scrollLeft):r.left+=h.width):e.center&&(r.left+=Math.round(h.width/2)),e.bottom?r.top+=h.height:e.middle&&(r.top+=Math.round(h.height/2)),this.options.borderWidth&&(this.options.tipJoint.left&&(r.left+=this.options.borderWidth),this.options.tipJoint.right&&(r.left-=this.options.borderWidth),this.options.tipJoint.top?r.top+=this.options.borderWidth:this.options.tipJoint.bottom&&(r.top-=this.options.borderWidth))):r=this.initialMousePosition?{top:this.initialMousePosition.y,left:this.initialMousePosition.x}:{top:mousePosition.y,left:mousePosition.x},this.options.autoOffset&&(a=this.options.stem?this.options.stemLength:0,n=a&&this.options.fixed?2:10,o=t.middle&&!this.options.fixed?15:0,s=t.center&&!this.options.fixed?15:0,t.right?r.left-=n+o:t.left&&(r.left+=n+o),t.bottom?r.top-=n+s:t.top&&(r.top+=n+s),a&&(i==null&&(i=this.options.stem),i.right?r.left-=a:i.left&&(r.left+=a),i.bottom?r.top-=a:i.top&&(r.top+=a))),r.left+=this.options.offset[0],r.top+=this.options.offset[1],t.right?r.left-=this.dimensions.width:t.center&&(r.left-=Math.round(this.dimensions.width/2)),t.bottom?r.top-=this.dimensions.height:t.middle&&(r.top-=Math.round(this.dimensions.height/2)),r},t.prototype._ensureViewportContainment=function(e){var i,o,s,n,r,a,h,p,l,d,u,c;if(h=this.options.stem,s={position:e,stem:h},!this.visible||!e)return s;if(p=this._sticksOut(e),!p[0]&&!p[1])return s;if(d=new t.Joint(this.options.tipJoint),this.options.targetJoint&&(l=new t.Joint(this.options.targetJoint)),a=this.adapter.scrollOffset(),u=this.adapter.viewportDimensions(),c=[e.left-a[0],e.top-a[1]],i=!1,u.width>=this.dimensions.width&&p[0])switch(i=!0,p[0]){case this.STICKS_OUT_LEFT:d.setHorizontal("left"),this.options.targetJoint&&l.setHorizontal("right");break;case this.STICKS_OUT_RIGHT:d.setHorizontal("right"),this.options.targetJoint&&l.setHorizontal("left")}if(u.height>=this.dimensions.height&&p[1])switch(i=!0,p[1]){case this.STICKS_OUT_TOP:d.setVertical("top"),this.options.targetJoint&&l.setVertical("bottom");break;case this.STICKS_OUT_BOTTOM:d.setVertical("bottom"),this.options.targetJoint&&l.setVertical("top")}return i?(this.options.stem&&(h=d),e=this.getPosition(d,l,h),o=this._sticksOut(e),n=!1,r=!1,o[0]&&o[0]!==p[0]&&(n=!0,d.setHorizontal(this.options.tipJoint.horizontal),this.options.targetJoint&&l.setHorizontal(this.options.targetJoint.horizontal)),o[1]&&o[1]!==p[1]&&(r=!0,d.setVertical(this.options.tipJoint.vertical),this.options.targetJoint&&l.setVertical(this.options.targetJoint.vertical)),n&&r?s:((n||r)&&(this.options.stem&&(h=d),e=this.getPosition(d,l,h)),{position:e,stem:h})):s},t.prototype._sticksOut=function(t){var e,i,o,s;return i=this.adapter.scrollOffset(),s=this.adapter.viewportDimensions(),e=[t.left-i[0],t.top-i[1]],o=[!1,!1],0>e[0]?o[0]=this.STICKS_OUT_LEFT:e[0]+this.dimensions.width>s.width&&(o[0]=this.STICKS_OUT_RIGHT),0>e[1]?o[1]=this.STICKS_OUT_TOP:e[1]+this.dimensions.height>s.height&&(o[1]=this.STICKS_OUT_BOTTOM),o},t.prototype._draw=function(){var e,i,o,s,n,r,a,h,p,l,d,u,c,g,f,m,v,w,b,_=this;if(this.backgroundCanvas&&this.redraw){if(this.debug("Drawing background."),this.redraw=!1,this.currentStem){for(v=["top","right","bottom","left"],f=0,m=v.length;m>f;f++)u=v[f],this.adapter.removeClass(this.container,"stem-"+u);this.adapter.addClass(this.container,"stem-"+this.currentStem.horizontal),this.adapter.addClass(this.container,"stem-"+this.currentStem.vertical)}return r=[0,0],a=[0,0],__indexOf.call(this.options.hideTriggers,"closeButton")>=0&&(n=new t.Joint(((w=this.currentStem)!=null?w+"":void 0)==="top right"?"top left":"top right"),r=[this.options.closeButtonRadius+this.options.closeButtonOffset[0],this.options.closeButtonRadius+this.options.closeButtonOffset[1]],a=[this.options.closeButtonRadius-this.options.closeButtonOffset[0],this.options.closeButtonRadius-this.options.closeButtonOffset[1]]),o=this.adapter.clone(this.dimensions),s=[0,0],this.options.borderWidth&&(o.width+=this.options.borderWidth*2,o.height+=this.options.borderWidth*2,s[0]-=this.options.borderWidth,s[1]-=this.options.borderWidth),this.options.shadow&&(o.width+=this.options.shadowBlur*2,o.width+=Math.max(0,this.options.shadowOffset[0]-this.options.shadowBlur*2),o.height+=this.options.shadowBlur*2,o.height+=Math.max(0,this.options.shadowOffset[1]-this.options.shadowBlur*2),s[0]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[0]),s[1]-=Math.max(0,this.options.shadowBlur-this.options.shadowOffset[1])),i={left:0,right:0,top:0,bottom:0},this.currentStem&&(this.currentStem.left?i.left=this.options.stemLength:this.currentStem.right&&(i.right=this.options.stemLength),this.currentStem.top?i.top=this.options.stemLength:this.currentStem.bottom&&(i.bottom=this.options.stemLength)),n&&(n.left?i.left=Math.max(i.left,a[0]):n.right&&(i.right=Math.max(i.right,a[0])),n.top?i.top=Math.max(i.top,a[1]):n.bottom&&(i.bottom=Math.max(i.bottom,a[1]))),o.width+=i.left+i.right,o.height+=i.top+i.bottom,s[0]-=i.left,s[1]-=i.top,this.currentStem&&this.options.borderWidth&&(b=this._getPathStemMeasures(this.options.stemBase,this.options.stemLength,this.options.borderWidth),g=b.stemLength,c=b.stemBase),e=this.adapter.unwrap(this.backgroundCanvas),e.width=o.width,e.height=o.height,this.adapter.css(this.backgroundCanvas,{width:""+e.width+"px",height:""+e.height+"px",left:""+s[0]+"px",top:""+s[1]+"px"}),h=e.getContext("2d"),h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,e.width,e.height),h.beginPath(),h.fillStyle=this._getColor(h,this.dimensions,this.options.background,this.options.backgroundGradientHorizontal),h.lineJoin="miter",h.miterLimit=500,d=this.options.borderWidth/2,this.options.borderWidth?(h.strokeStyle=this.options.borderColor,h.lineWidth=this.options.borderWidth):(g=this.options.stemLength,c=this.options.stemBase),c==null&&(c=0),l=function(t,e,i){return i&&h.moveTo(Math.max(c,_.options.borderRadius,r[0])+1-d,-d),e?(h.lineTo(t/2-c/2,-d),h.lineTo(t/2,-g-d),h.lineTo(t/2+c/2,-d)):void 0},p=function(t,e,i){var o,s,n,a;return t?(h.lineTo(-c+d,0-d),h.lineTo(g+d,-g-d),h.lineTo(d,c-d)):e?(a=_.options.closeButtonOffset,n=r[0],i%2!==0&&(a=[a[1],a[0]],n=r[1]),o=Math.acos(a[1]/_.options.closeButtonRadius),s=Math.acos(a[0]/_.options.closeButtonRadius),h.lineTo(-n+d,-d),h.arc(d-a[0],-d+a[1],_.options.closeButtonRadius,-(Math.PI/2+o),s,!1)):(h.lineTo(-_.options.borderRadius+d,-d),h.quadraticCurveTo(d,-d,d,_.options.borderRadius-d))},h.translate(-s[0],-s[1]),h.save(),function(){var e,i,o,s,r,a,d,u,c,g,f;for(f=[],i=c=0,g=t.positions.length/2;g>=0?g>c:c>g;i=g>=0?++c:--c)r=i*2,a=i===0||i===3?0:_.dimensions.width,d=2>i?0:_.dimensions.height,u=Math.PI/2*i,o=i%2===0?_.dimensions.width:_.dimensions.height,s=new t.Joint(t.positions[r]),e=new t.Joint(t.positions[r+1]),h.save(),h.translate(a,d),h.rotate(u),l(o,s.eql(_.currentStem),i===0),h.translate(o,0),p(e.eql(_.currentStem),e.eql(n),i),f.push(h.restore());return f}(),h.closePath(),h.save(),this.options.shadow&&(h.shadowColor=this.options.shadowColor,h.shadowBlur=this.options.shadowBlur,h.shadowOffsetX=this.options.shadowOffset[0],h.shadowOffsetY=this.options.shadowOffset[1]),h.fill(),h.restore(),this.options.borderWidth&&h.stroke(),h.restore(),n?function(){var t,e,i,o,s;return i=e=_.options.closeButtonRadius*2,n+""=="top right"?(s=[_.dimensions.width-_.options.closeButtonOffset[0],_.options.closeButtonOffset[1]],t=[s[0]+d,s[1]-d]):(s=[_.options.closeButtonOffset[0],_.options.closeButtonOffset[1]],t=[s[0]-d,s[1]-d]),h.translate(t[0],t[1]),o=_.options.closeButtonCrossSize/2,h.save(),h.beginPath(),h.strokeStyle=_.options.closeButtonCrossColor,h.lineWidth=_.options.closeButtonCrossLineWidth,h.lineCap="round",h.moveTo(-o,-o),h.lineTo(o,o),h.stroke(),h.beginPath(),h.moveTo(o,-o),h.lineTo(-o,o),h.stroke(),h.restore(),_.adapter.css(_.closeButtonElement,{left:""+(s[0]-o-_.options.closeButtonLinkOverscan)+"px",top:""+(s[1]-o-_.options.closeButtonLinkOverscan)+"px",width:""+(_.options.closeButtonCrossSize+_.options.closeButtonLinkOverscan*2)+"px",height:""+(_.options.closeButtonCrossSize+_.options.closeButtonLinkOverscan*2)+"px"})}():void 0}},t.prototype._getPathStemMeasures=function(t,e,i){var o,s,n,r,a,h,p;if(r=i/2,n=Math.atan(t/2/e),o=n*2,a=r/Math.sin(o),s=2*a*Math.cos(n),p=r+e-s,0>p)throw Error("Sorry but your stemLength / stemBase ratio is strange.");return h=Math.tan(n)*p*2,{stemLength:p,stemBase:h}},t.prototype._getColor=function(t,e,i,o){var s,n,r,a,h;if(o==null&&(o=!1),typeof i=="string")return i;for(n=o?t.createLinearGradient(0,0,e.width,0):t.createLinearGradient(0,0,0,e.height),r=a=0,h=i.length;h>a;r=++a)s=i[r],n.addColorStop(s[0],s[1]);return n},t.prototype._searchAndActivateCloseButtons=function(){var t,e,i,o;for(o=this.adapter.findAll(this.container,"."+this["class"].close),e=0,i=o.length;i>e;e++)t=o[e],this.hideTriggers.push({element:this.adapter.wrap(t),event:"click"});return this.currentObservers.showing&&this._setupObservers("-showing","showing"),this.currentObservers.visible?this._setupObservers("-visible","visible"):void 0},t.prototype._activateFirstInput=function(){var t;return t=this.adapter.unwrap(this.adapter.find(this.container,"input, textarea")),t!=null?typeof t.focus=="function"?t.focus():void 0:void 0},t.prototype._followMousePosition=function(){return this.options.fixed?void 0:t._observeMousePosition(this.bound.reposition)},t.prototype._stopFollowingMousePosition=function(){return this.options.fixed?void 0:t._stopObservingMousePosition(this.bound.reposition)},t.prototype._clearShowTimeout=function(){return clearTimeout(this._showTimeoutId)},t.prototype._clearHideTimeout=function(){return clearTimeout(this._hideTimeoutId)},t.prototype._clearTimeouts=function(){return clearTimeout(this._visibilityStateTimeoutId),this._clearShowTimeout(),this._clearHideTimeout()},t.prototype._triggerElementExists=function(){var t;t=this.adapter.unwrap(this.triggerElement);while(t.parentNode){if(t.parentNode.tagName==="BODY")return!0;t=t.parentNode}return!1},t.prototype._loadAjax=function(){var t=this;if(!this.loading)return this.loaded=!1,this.loading=!0,this.adapter.addClass(this.container,this["class"].loading),this.setContent(""),this.debug("Loading content from "+this.options.ajax),this.adapter.ajax({url:this.options.ajax,method:this.options.ajaxMethod,onSuccess:function(e){return t.debug("Loading successful."),t.adapter.removeClass(t.container,t["class"].loading),t.setContent(e)},onError:function(e){var i;return i=t.options.ajaxErrorMessage,t.debug(i,e),t.setContent(i),t.adapter.addClass(t.container,t["class"].ajaxError)},onComplete:function(){return t.adapter.removeClass(t.container,t["class"].loading),t.loading=!1,t.loaded=!0,t._searchAndActivateCloseButtons(),t._activateFirstInput(),t.reposition()}})},t.prototype._ensureTriggerElement=function(){return this._triggerElementExists()?void 0:(this.deactivate(),this._stopEnsureTriggerElement())},t.prototype._ensureTriggerElementInterval=1e3,t.prototype._startEnsureTriggerElement=function(){var t=this;return this._ensureTriggerElementTimeoutId=setInterval(function(){return t._ensureTriggerElement()},this._ensureTriggerElementInterval)},t.prototype._stopEnsureTriggerElement=function(){return clearInterval(this._ensureTriggerElementTimeoutId)},t}(),vendors=["khtml","ms","o","moz","webkit"],Opentip.prototype.setCss3Style=function(t,e){var i,o,s,n,r;t=this.adapter.unwrap(t),r=[];for(i in e)__hasProp.call(e,i)&&(o=e[i],t.style[i]!=null?r.push(t.style[i]=o):r.push(function(){var e,r,a;for(a=[],e=0,r=vendors.length;r>e;e++)s=vendors[e],n=""+this.ucfirst(s)+this.ucfirst(i),t.style[n]!=null?a.push(t.style[n]=o):a.push(void 0);return a}.call(this)));return r},Opentip.prototype.defer=function(t){return setTimeout(t,0)},Opentip.prototype.setTimeout=function(t,e){return setTimeout(t,e?e*1e3:0)},Opentip.prototype.ucfirst=function(t){return t==null?"":t.charAt(0).toUpperCase()+t.slice(1)},Opentip.prototype.dasherize=function(t){return t.replace(/([A-Z])/g,function(t,e){return"-"+e.toLowerCase()})},mousePositionObservers=[],mousePosition={x:0,y:0},mouseMoved=function(t){var e,i,o,s;for(mousePosition=Opentip.adapter.mousePosition(t),s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],s.push(e());return s},Opentip.followMousePosition=function(){return Opentip.adapter.observe(document.body,"mousemove",mouseMoved)},Opentip._observeMousePosition=function(t){return mousePositionObservers.push(t)},Opentip._stopObservingMousePosition=function(t){var e;return mousePositionObservers=function(){var i,o,s;for(s=[],i=0,o=mousePositionObservers.length;o>i;i++)e=mousePositionObservers[i],e!==t&&s.push(e);return s}()},Opentip.Joint=function(){function t(t){t!=null&&(t instanceof Opentip.Joint&&(t+=""),this.set(t))}return t.prototype.set=function(t){return t=t.toLowerCase(),this.setHorizontal(t),this.setVertical(t),this},t.prototype.setHorizontal=function(t){var e,i,o,s,n,r,a;for(i=["left","center","right"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.horizontal=e.toLowerCase());for(this.horizontal==null&&(this.horizontal="center"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.horizontal===e?e:void 0);return a},t.prototype.setVertical=function(t){var e,i,o,s,n,r,a;for(i=["top","middle","bottom"],o=0,n=i.length;n>o;o++)e=i[o],~t.indexOf(e)&&(this.vertical=e.toLowerCase());for(this.vertical==null&&(this.vertical="middle"),a=[],s=0,r=i.length;r>s;s++)e=i[s],a.push(this[e]=this.vertical===e?e:void 0);return a},t.prototype.eql=function(t){return t!=null&&this.horizontal===t.horizontal&&this.vertical===t.vertical},t.prototype.flip=function(){var t,e;return e=Opentip.position[this.toString(!0)],t=(e+4)%8,this.set(Opentip.positions[t]),this},t.prototype.toString=function(t){var e,i;return t==null&&(t=!1),i=this.vertical==="middle"?"":this.vertical,e=this.horizontal==="center"?"":this.horizontal,i&&e&&(e=t?Opentip.prototype.ucfirst(e):" "+e),""+i+e},t}(),Opentip.prototype._positionsEqual=function(t,e){return t!=null&&e!=null&&t.left===e.left&&t.top===e.top},Opentip.prototype._dimensionsEqual=function(t,e){return t!=null&&e!=null&&t.width===e.width&&t.height===e.height},Opentip.prototype.debug=function(){var t;return t=arguments.length>=1?__slice.call(arguments,0):[],Opentip.debug&&(typeof console!="undefined"&&console!==null?console.debug:void 0)!=null?(t.unshift("#"+this.id+" |"),console.debug.apply(console,t)):void 0},Opentip.findElements=function(){var t,e,i,o,s,n,r,a,h,p;for(t=Opentip.adapter,h=t.findAll(document.body,"[data-ot]"),p=[],r=0,a=h.length;a>r;r++){i=h[r],n={},e=t.data(i,"ot"),(e===""||e==="true"||e==="yes")&&(e=t.attr(i,"title"),t.attr(i,"title","")),e=e||"";for(o in Opentip.styles.standard)s=t.data(i,"ot"+Opentip.prototype.ucfirst(o)),s!=null&&(s==="yes"||s==="true"||s==="on"?s=!0:(s==="no"||s==="false"||s==="off")&&(s=!1),n[o]=s);p.push(new Opentip(i,e,n))}return p},Opentip.version="2.4.6",Opentip.debug=!1,Opentip.lastId=0,Opentip.lastZIndex=100,Opentip.tips=[],Opentip._abortShowingGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i._abortShowing()):r.push(void 0);return r},Opentip._hideGroup=function(t,e){var i,o,s,n,r;for(n=Opentip.tips,r=[],o=0,s=n.length;s>o;o++)i=n[o],i!==e&&i.options.group===t?r.push(i.hide()):r.push(void 0);return r},Opentip.adapters={},Opentip.adapter=null,firstAdapter=!0,Opentip.addAdapter=function(t){return Opentip.adapters[t.name]=t,firstAdapter?(Opentip.adapter=t,t.domReady(Opentip.findElements),t.domReady(Opentip.followMousePosition),firstAdapter=!1):void 0},Opentip.positions=["top","topRight","right","bottomRight","bottom","bottomLeft","left","topLeft"],Opentip.position={},_ref=Opentip.positions,i=_i=0,_len=_ref.length;_len>_i;i=++_i)position=_ref[i],Opentip.position[position]=i;Opentip.styles={standard:{"extends":null,title:void 0,escapeTitle:!0,escapeContent:!1,className:"standard",stem:!0,delay:null,hideDelay:.1,fixed:!1,showOn:"mouseover",hideTrigger:"trigger",hideTriggers:[],hideOn:null,removeElementsOnHide:!1,offset:[0,0],containInViewport:!0,autoOffset:!0,showEffect:"appear",hideEffect:"fade",showEffectDuration:.3,hideEffectDuration:.2,stemLength:5,stemBase:8,tipJoint:"top left",target:null,targetJoint:null,cache:!0,ajax:!1,ajaxMethod:"GET",ajaxErrorMessage:"There was a problem downloading the content.",group:null,style:null,background:"#fff18f",backgroundGradientHorizontal:!1,closeButtonOffset:[5,5],closeButtonRadius:7,closeButtonCrossSize:4,closeButtonCrossColor:"#d2c35b",closeButtonCrossLineWidth:1.5,closeButtonLinkOverscan:6,borderRadius:5,borderWidth:1,borderColor:"#f2e37b",shadow:!0,shadowBlur:10,shadowOffset:[3,3],shadowColor:"rgba(0, 0, 0, 0.1)"},glass:{"extends":"standard",className:"glass",background:[[0,"rgba(252, 252, 252, 0.8)"],[.5,"rgba(255, 255, 255, 0.8)"],[.5,"rgba(250, 250, 250, 0.9)"],[1,"rgba(245, 245, 245, 0.9)"]],borderColor:"#eee",closeButtonCrossColor:"rgba(0, 0, 0, 0.2)",borderRadius:15,closeButtonRadius:10,closeButtonOffset:[8,8]},dark:{"extends":"standard",className:"dark",borderRadius:13,borderColor:"#444",closeButtonCrossColor:"rgba(240, 240, 240, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(30, 30, 30, 0.7)"],[.5,"rgba(30, 30, 30, 0.8)"],[.5,"rgba(10, 10, 10, 0.8)"],[1,"rgba(10, 10, 10, 0.9)"]]},alert:{"extends":"standard",className:"alert",borderRadius:1,borderColor:"#AE0D11",closeButtonCrossColor:"rgba(255, 255, 255, 1)",shadowColor:"rgba(0, 0, 0, 0.3)",shadowOffset:[2,2],background:[[0,"rgba(203, 15, 19, 0.7)"],[.5,"rgba(203, 15, 19, 0.8)"],[.5,"rgba(189, 14, 18, 0.8)"],[1,"rgba(179, 14, 17, 0.9)"]]}},Opentip.defaultStyle="standard",typeof module!="undefined"&&module!==null?module.exports=Opentip:window.Opentip=Opentip;var __slice=[].slice;(function(){var t,e;return Element.addMethods({addTip:function(t,e,i,o){return new Opentip(t,e,i,o)}}),e=function(t){return t instanceof Array||t!=null&&typeof t.length=="number"&&typeof t.item=="function"&&typeof t.nextNode=="function"&&typeof t.reset=="function"?!0:!1},t=function(){function t(){}return t.prototype.name="prototype",t.prototype.domReady=function(t){return document.loaded?t():$(document).observe("dom:loaded",t) },t.prototype.create=function(t){return new Element("div").update(t).childElements()},t.prototype.wrap=function(t){if(e(t)){if(t.length>1)throw Error("Multiple elements provided.");t=this.unwrap(t)}else typeof t=="string"&&(t=$$(t)[0]);return $(t)},t.prototype.unwrap=function(t){return e(t)?t[0]:t},t.prototype.tagName=function(t){return this.unwrap(t).tagName},t.prototype.attr=function(){var t,e,i;return e=arguments[0],t=arguments.length>=2?__slice.call(arguments,1):[],t.length===1?this.wrap(e).readAttribute(t[0]):(i=this.wrap(e)).writeAttribute.apply(i,t)},t.prototype.data=function(t,e,i){var o;return this.wrap(t),arguments.length>2?t.store(e,i):(o=t.readAttribute("data-"+e.underscore().dasherize()),o!=null?o:t.retrieve(e))},t.prototype.find=function(t,e){return this.wrap(t).select(e)[0]},t.prototype.findAll=function(t,e){return this.wrap(t).select(e)},t.prototype.update=function(t,e,i){return this.wrap(t).update(i?e.escapeHTML():e)},t.prototype.append=function(t,e){return this.wrap(t).insert(this.wrap(e))},t.prototype.remove=function(t){return this.wrap(t).remove()},t.prototype.addClass=function(t,e){return this.wrap(t).addClassName(e)},t.prototype.removeClass=function(t,e){return this.wrap(t).removeClassName(e)},t.prototype.css=function(t,e){return this.wrap(t).setStyle(e)},t.prototype.dimensions=function(t){return this.wrap(t).getDimensions()},t.prototype.scrollOffset=function(){var t;return t=document.viewport.getScrollOffsets(),[t.left,t.top]},t.prototype.viewportDimensions=function(){return document.viewport.getDimensions()},t.prototype.mousePosition=function(t){return t==null?null:{x:Event.pointerX(t),y:Event.pointerY(t)}},t.prototype.offset=function(t){var e;return e=this.wrap(t).cumulativeOffset(),{left:e.left,top:e.top}},t.prototype.observe=function(t,e,i){return Event.observe(this.wrap(t),e,i)},t.prototype.stopObserving=function(t,e,i){return Event.stopObserving(this.wrap(t),e,i)},t.prototype.ajax=function(t){var e,i;if(t.url==null)throw Error("No url provided");return new Ajax.Request(t.url,{method:(e=(i=t.method)!=null?i.toUpperCase():void 0)!=null?e:"GET",onSuccess:function(e){return typeof t.onSuccess=="function"?t.onSuccess(e.responseText):void 0},onFailure:function(e){return typeof t.onError=="function"?t.onError("Server responded with status "+e.status):void 0},onComplete:function(){return typeof t.onComplete=="function"?t.onComplete():void 0}})},t.prototype.clone=function(t){return Object.clone(t)},t.prototype.extend=function(){var t,e,i,o,s;for(i=arguments[0],e=arguments.length>=2?__slice.call(arguments,1):[],o=0,s=e.length;s>o;o++)t=e[o],Object.extend(i,t);return i},t}(),Opentip.addAdapter(new t)})()opentip-2.4.6/downloads/readme.md000066400000000000000000000005731213277401600167620ustar00rootroot00000000000000# Downloads Choose the **one** file that suits your needs. If you don't intend to support IE8 (or include excanvas yourself) you don't need the `-excanvas` version. You'll probably want the `.min.js` version unless you count on debugging Opentip. ## Generate downloads To generate downloads you need to run `npm install` once from within the root folder, and then `grunt js`.opentip-2.4.6/files/000077500000000000000000000000001213277401600143065ustar00rootroot00000000000000opentip-2.4.6/files/close-button-angle.png000066400000000000000000000304521213277401600205220ustar00rootroot00000000000000‰PNG  IHDRÝ¡› pHYs%%IR$ð OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF&UIDATxÚìÝ{tTõ¡èñß¼™d2IH&!!1@F¬ÖJ9X<¥ç¶¥-¥Çë9zi—í’Ö]µroõÖ£]jÏc=²ª·º”së)Jê*Þµ²  HLH2ÉÌdÈcž™÷ìûÇÖa#™$ßÏ_d’Ù³ç73_~{ÏÞ3 I’LJ†Á‚€`Á‚€`Á‚€`Á‚€`Á‚€`Á‚€`Á‚€`Á‚€`Á‚€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€` X@°€` X@°€` X@°€` X@°€` X@°€` X@°àÓ¨d¸½§^lvmB¬(ÿùâ’¿õG†wwÿ¶ËóŽâ» ž-Í™Ç, #lkûYEîõߘ»éõ“÷‡dø÷­w¯ªÚXdšÛØ¿%~ž…ïê|úøÐŽÔr‡‚öÿh½#uá7ænªÌ[Ê‘!’$1 ÈLìÛ¸^ùQÃÓûeP›¿^û‹K^æo›¾]bZœZ‚<}«Ê]9n™/ùE_~Óì,Ȳñ@döa!CEâcG\¯Ì/Xº¤{¤ÙhªÉÿÒ%/sÀw"*7Ÿ™1Ý`û®A]0îMÿ³v÷{}ù×kA­0!Ý#„âCf5u‰ÝÛ*„˜•5ç’—é »…³Lg– SKL‹G¾ò%þÈpËàŸn«¾‡€MBà,GÞ?ðB(>$„XjýÇ[æÜ%σ^9þÃô?[QþóݽO¦_òÝÏgï9õ|j'”¼*5Ejü“#Ð$„7÷λLùïÛÝïý¹ëáËî¹ÁöH|ìm÷~kþÙº|‚œ±­ígá¸çKå?¬Ì[Ú=ÒüúÉû¬YUýù·o´?æMß5n÷Ó¶¶ŸYô¶UÕ?ñG†ÿëÃõêÜuõÿ">Ùóµ¼ü'µ…_’cô·Uÿ\[ø%y µåÎk—¾þÈðï+O_}絿{£ý±ëJ¿Í;lgÙ{êEG éÖªûå÷à*ó–æé«íˆÄÇä?pŽÔ–Ôßí¡øP®¾4õ£#ÐT”U-„ÈÖåßyíïäZu47öo‘k%„ðF…:u–¦P|hNîãÖ$[—_bj wnkûY¹y)µÊdÖ€Ià 7»¶–˜Òë Wçʿҩr\Ò÷¸ŸžBfU¥*cPìî}2œ\[¼Z§6Ê—Ø–§¯–çVî`W³këŠòŸËMì÷O_BºŠÜë&‹Þ–Ú¨3,àcr;*r¯O¿p4|J.Ñyãâv !ÊÌ äuj㪪yúêÆþ-[š¾º÷Ô‹r즑pçæýËû¼GujÓ= ÿ/Õ qKH‰„³Í‹yh˜aç"(„ЫLã¶øªrWÊs%9.éožò4ÔéûÂ+ó–Væý®{¤ùÐÀ¶f×Ökò¿ Se !Òw„¥;åiÌÓWŸwoú)Oã…ZfX˜éäJ鎻ßBÔ}<ò„ ê‚ôàBñÑÓÇ3 ߉Íû—·»ß“³u}éºT…Î@[ú’wu>-O¾FÂ}ùy·OGÂjfºÊ¼ëòôÕG?ÞÅ~Ôñçf×ÖËîIãMåIœsÀ§|8ÕÁÿ+ÿØ9ü~ž¾º2oiA–MÞ}~Ôñg¹Do´?¶´ä›B_äô…Væ¸{÷'ó¾1š Ça ˜CAûû}[ås˜«rWÖýmªVò1SéÇUuüywï“é§:§Àµ `Íò9ß—·%ÓO®Ê]¹¢òGò¼I>Àj$Ü)„¹J-6}­Òo øtçæéÜc²03±ÓýJÙ³gÏn¸á†åË—_ü/Ÿyæ!Äš5kJJJ7!ĉáÝéG¬Ë/ =óÌ3X½zõ§ÖJ±aÓɴqãÆ®®®;hÝ#Í›÷/?êøs»û½pܳºæÁöí›÷/ð8`¥Ä´XÞˆÁÂeö›ßü&<øàƒõõõ¼ÊwÞYVV¶}ûö;hòû†»{Ÿìóý^ýo²uùòA¯ÿ¡Ygý<Ÿ'ƒé„}X—ÙöíÛ÷íÛ÷È#X,–ÏtÅ7ß|óÕW_}ê©§>뙃}Xgb!ÿû®»îJmÇ:th÷îÝíííBˆ†††Ûo¿=U“={ö¼øâ‹ò¿¿üå/ßyçB‡Ã±sçεk׎‹Ž×.ÿK/E¶mBä>ÿ|ößý½¨(gÓ¦üûÎ|†IVV–¢¿¿Ÿ`lž_(zâ‰'ÚÚÚüñ­[·ÖÖÖ¾øâ‹¡PHž+mÙ²å†nغuëSO=åt:ÿõ_ÿ55:pàÀ³Ï>»uëÖ†††Ã‡ËWyë­·„7ÞxÖéµ£/¼0tÛmº††9’d þçºï½Wa\¹’çÀ ë3xå•WÚÛÛüñ’’’ÑÑÑöööÚÚZƒÁpèС;w¦f[‹eñâÅ;wîlkk«¯¯ß·o_MMÁ`Blذ!µ´Ã‡744¤O‘‚žï?롇äÉ”º°Ð°zµïþûuëÖ.L_“`ðüOîp86nÜxÞ_¥fvÁšþFGGß}÷݆†ùx‹Å²uëVùWo¼ñ†Ùl^¶lYêF£bxxXQRRÒÔÔôÒK/}å+_I‹ÐÖÖæõzëêêÒoÂûïÿ.„ÈMËŠÚfBd­Y3neÆÆÆ„ùùãÏ)))I­Õ%hnnæY>,]:£¿cF«³³S1gΜsCÖßß/OµRž>}:”»ï¾ûå—_~÷ÝwåÞ­_¿Þ`0È-“»&‹»Ý‘mÛ4+Vh++ÏÚ¯©ÉþêWÇÝèÑ£GÍfóe?k†?¿A°¦yR#ïíN'ï²Z­ãêf6›å#,ˆ FGG_~ù妦¦ºººåË—ËÛteee©«$!„²°0}9þgŸÕ,Y¢<ûFåD644°I¬ó“gCòÔ)ŽwÞygåÊ•Bˆ@ ºüСCýýýk×® …B=öØâÅ‹¿óïX,–õë×755]h÷“ÒdB$Ýî3µÚµ+¶{·nݺqÙÒÒ"„¸þúëÏ]ÈçÜ$¦“ý.a}}½ÙlÞ·o_[[›<—yî¹çV®\i±XšššäCÏÛÚÚ~ÿûß744¬^½:÷÷÷ïܹÓáp!<(„¸öÚkÏÿ¿Aa¡nݺØîÝÞíÛ…ÁÆFÿK/iV¬HO˜ìí·ß.++;o°¤¨~ùË_ÎØ;¯Ñh-Zäv»ÿøÇ?¾þúëÉdrýúõÙÙÙrË‚ÁàÖ­[_ýõ¾¾¾¯}íkk×®B †ÒÒÒ@ °mÛ¶×_]£ÑüøÇ?–w<9Ž£GÞtÓMyyy©›0|éK±PÈÿÀžGQ-XP´iS¸«+¼ukpß>UuµÖfBìÙ³ç½÷Þ»ãŽ;JKKyFÁ‘î—ÍèèèOúÓµk×®^½zâ×r8O<ñĪU«>Óµ6 ñ¹X,–»îºëÕW_=tèЯ²gÏž7fB­æ¾éU¼æQ¼æÙÞ᡼,º½ yH¯y6·òр̰2Òž={Þ~ûí[o½õS?§á‰'ž°Z­K—.ø9ÒWÔõÇZn6-,P_ö—nÕnÿ¹—¿ºÐð*]†

“F!„¸5O•êìê"µ¢m4~ÉË|s0^£UT~²’…FåÉÕæg¾`âùF°péÜcÉݤüú¼Z‡âQ)Õ!„7–LM@&¢=L¿ºÂLŒKØç$ð–BÍygI—¦ÿì{ ‚…Ïæ…öpjgpjû‘¡¸bAî™ÿ®¾è÷öúå?Û°?àK¦ÿêoÞöû«`LÚÜ:&_>÷Mo£36®צ-_žzü÷kôÝÞĆýÅkžïí=³Ÿ«ÑK­žüÛÝäW\^òö®ˆâ5Ïý]ÑŽ¨$ß\ëPüÜHÝ»í]ù]…ÚÃÁ˜ôðÁó¾Ã°×KŸ²¹Ç’ÏÙcòJ^h_hÏ}Ó+ßú¸ÛR¼æyøƒ`GT’ (¯³|•ô1”L_rjiçMÂŒˆ&×íñ­ÛãëòÄ%IZ·Ç'vŒ¢II’6µÅŽÑÁ`BþKùÇW? K’4L¬xË»â-¯ü«¿ôFjvzä%<ÿaHì}ßMýÙ=~yéW‘$éžF¿Ø1ú—Þˆ$I]žø=þÔjÈV¼åM­Œ$I¯~;F[NÇÒ”¯.ëòÄÅŽÑM-ÁÔ%ƒÁDÍNÏ=~ù^Èë&ßù·bÇ芷¼›Z‚hRþãô5”$©f§§f§'u7å» ß»ôL]ø—ÞˆØ1šºÊ¹w³f§'ý^Èë°nï¼?ÊWO_óŽó ÇN÷äÉ–±m#‰®Ù•f•{,¹m$±.O•¥QÈóÔ¬]}Ñû»¢©Ù…Fåê"õý]ÑFgìÆbÍûGÞQÚe~oS°P«÷ÎcRTZbR¦oÐ !nkÍcBˆ‡lšûæ*ÏÞý´Â¤”WæÜ=Vö`BqmÚÖ_§71nJxoS°L«xòº,y!W®'Â;ú£ò½Ä$!ÄMÕ} BˆÔ ÛhB(^óÈ+óÃJݸ}í?ÿ ¸m$‘ÚñÿÅbMú>¯ÚÃ[\ñÔ‚•fÕ­y*1’HÝ y,gÝëôßI¤–v¡qf“3e/Õ£öØ=Vµü(4*¥oæÊo®cÒî@²ö“¾üúd¸F«øêlmêºfR10–B”g©:¢Ò†ý]}Ñô-¸m#‰;çè‚1é…öð÷KLÊß4d¥ï [aRJßÌ•¾™øšy$&Uíö§¶†Î݃ööH"½wé=•÷ÄÓ¶«/ºm$ñ÷eÚT‰ä$ÓwÓ'û§ÜcÉŽ¨”~‹òFë¦*­ôÍ܇lšÝä¸Ýù­Cñ-®øC6M*@]iû¼‚1é×Ý‘&媴qKй‘·.3µÕ|ÞqÁš)ä—Gú^¤”ôžÜŽ%i“ñÉ{y¥F¥ü¿ýC6ÍWü¶æ±¿yÛ×íM!œŽÉ¨ÿ¶Ç/„¸sŽî·d§ú"ßtªYÅ}ó BˆïŸËûe\cÉô—n·7Ñ•RSó¾!0.ar¿jsÏÔap,)„HUOþƒâ³W)}‚&OâäKî¬Ö !?J¿ÅwÑô䉳ߦlŠ+  Ê¬ FÖ“Ò”—VöÉߟwœA°f ùå‘s¾7¼Ò_xòfKuÖYOŒ÷G5ZÅÅ¿Vÿùº,雹›ª´»É͆„ž¨$„èZ‘ý×[sÖ×êÓg©jzä[·©š\|&rÞ„É+~YóP\±¦L›¾?59×ùR—TšU›ª´ÛFéïÈ7QœvéÛ­òôÓ–u¦˜Î³+|ndå«§~–_öÙ4æRÓ¥sOëùÞ^¿ü&éš2­¼ð3{ôVdËïK¤Ÿøš9K£H­‰¼ü{›‚òB~\£¿±XÓèŒÝux¬#*ÝcUß7ßðzoäþ®hj4ä³åß>¼ÈXhT¦Î^ÜT¥½o¡qÃþÀW|…IùhÁjT^hœ ÁÀ&!, , , , , , , , , ‚ ‚ ‚ ‚ ‚ €iGÍ`:‰F£~¿?„B¡P(‰Db±X,K&“‰DB¡R©”J¥F£Ñh4:Î`0 “É”­ÕjÀ §$‰QÀ”666644äñxFGG“‰D¶ÉdÊÊ2èõ½^§ÕÊmR**•J‘H$’’$W,†ÂáP8ý€R¥²X,¹¹¹F£‘%XÀe ‡Ëå’T——k6[rrôzý%/0ú|¯whdD(V«µ¤¤$++‹¡&XÀ%ŠÅbN§ÓápÄc±’¢"ka¡Ñ`¸ü³¶PÈåv;ÕMIIIqq±F£að 0Q~¿¿¯¯opp°¸°°¤¨Èœ“snÔëó9nwQQÑìÙ³³³³y p1§¯¯ÏçõV”••X­JåÕ~w;™L:\®žþþ³Ùf³Y,‚ŒìvûðÐPUy¹µ°P¡PLâÊH’är»»z{ó l6›Édâ"XÀÇ:;;ûíöªŠ [IÉä¦j\¶ìGWOO™ÍV]]ÍÃD°0Ó¹\®–––²ââ¹UUju&-ÇOvuõ;‹-²Z­;$nmµä糞`aÖÊ3:º´¾^þ(…é!‘H4·µåZ,4ë²ãü0™µžfµB¨Tª%õõ#ÃÃ<Ê ÓAww÷Û}ÝÂ…Ó¬V2µJuÝÂ…Cnwww75ÁÂÔæp8úúú–,\¨VOÛϼU«ÕK.´÷õ9q‚…©Êçó?~üÚ ô:Ýô¾§znñ‚Ç÷ù|<î S’Ýn¯­®6ÏŒƒÂÍ99µÕÕv»Ç`aêéèèHÆbSñXöKVV\œŒÅØO°0Ÿ\.—ÓY;󪬭®v9.—‹çÁ”ÑÒÒR7oÞ4ÞÑ~!jµºnÞ¼––ž SCgggYqqæbÌ’—›[V\ÜÙÙÉ3`!ÓÉŸt\SY9“¡¦ªÊn·ž Ín·_SQ1ÿ)K£V_SQÁ;†Ÿç^¢d2ÙÛÛ;00à÷ûãñ8rñéÕi·Û¼òïÿó´êáòD}ÖtyÊ)*¥R£ÑhµZ1±œ—$éý¦¦uu|ïÁºzz{{;V^^^ZZš=÷"&­­­³rs¿þQn“7©TˆµÅªGk4ׯö—Jl>¼Jqß’]—k’$%‰X,Åôz½V«Èµœn÷éÑÑ… òÄ`“ð*Õª££ãæ›o®««³X,Ôêâ|>ŸÏëµþé:í+Ôj…ØæHÔî ÿðXÌžÚÿY* •Z­7²²²"‘H4ȵ¬³fù¼^Ž}'XWiKðرcË–-ãÓ»'Èn·WØl …¢H§xz¾æä-ú(U%…x®/~ÍÞðÏOÄFbS~ޝR©ŒFc8Ø^Q(6{²ÖUš^•——S« ŠF£îÁÁ⢢Ô%ÅÖEÚ¶›õß(R…â×Ýñª=‘_}$¦|³´Í'YÅEEîÁÁ þ1Ö¥à[&Îáp”X­ªs¾Y~¾IñÚRíþu+ò•ž˜ô‹ŽØ5{ÂÿÞ&§ðÕh4±XlBuS*K¬V>Å`]q^¯×l63Ôßߑӗå*ÿºL÷ÖõºëÌÊÁˆô“cs÷†ÿc ‘œšÛˆ*•*‘œhqËŠ‹ûûûy†¬++™L*• Ú„ø|>•R™e4^üÏn-PºI·}‰vžIÑ’þ±%ºp_äÁ)¸‰¨Pˆ ¿çže4ª”Jv½,d —Ëe5kB¯t!¾mUµÝ¬¾^;Û 8H~£9ú…ÆÈ»ÃÉi<>ÖY³8š`!S M,X2µB¬·©:nÑÿ[­¦@«8àI®8Yu(ÒìýlÙòþ×ÒëOéõŽ;îÿw»3p|ŠfÍäyB°0ùÆÆÆ„$ †ÏzERütŽúÔ—õ¿¬Öd«Å[CɆ÷#kDO'´µå~ä‘‘Ûo·65• !Fn¿=kãFuaa‘Ñ`’466Ƴ…`a’ äå]òÕM*ñ¿«ÕÝËõÿ4G­SŠíÎDÝ{á´Åì=Ö4ÔÖ|üñ¼—_6Ô×+³²²¾ñ !Döš5;JyyCCC<[&™ÇãÉýÜo§h›k5'oѯ·©„ÏÛãs÷†ïk EÏŸ­ð! K–È?&}>Íòå†úúŒ¥\³Ùãñðl!X˜d£££–ËtüÇlƒâùzmÛÍúo[Uá„ø·SñÊ=áG:Ïs¬iÒçB(³²„q·Û·y³zÞ¼L%‹Ù<::ʳ…`a2E£Ñd"qy¿gžI±}‰öÐMº¯(ýqñËÎØœwÃOŠGÒöÈ«ËÊ„Á}ûüo½eŸ=;ÙÙ™ÎäÒëtÉD‚CÞ'Žwqùùýþl“éJ,ù:³r×õºw‡“ÿódì€'ùOí±ë‰ÿ²ZsG©J­æo}+´oßÈí· !rû[!„çG?ra}öYyÚ•²M&¿ßŸŸŸÏÓ†`arÓ• Ä—ó•ûoÔ½1˜ø_'ãÇÉÿÑý—nÅ£5š5V•õ©§ÄSOÙæºë® +SVV  XlbÒ„B!ƒ^¥oåëEªÖ›u[i+ Šö€ôíÃÑeïGÞšbÇšôúP(Äs†`ašK¡Tˆ(U¼Eÿô|M‘NÑäMÞz(²ò`ägÊdËh0p(ÁÂd ‡ÃWókèµJñã õGËõÖhr5Š¿'ohŒ|ëpôÃÀ8‹Z§ÕF"ž3 “&‹]ýï›0©Ä/®Qw-×=P©Ö«ÄWbá¾ð]­ÑÞPFgkâJ‚…+¬Iúäè<âÉyšnÑß=[­â¥þDÍÞð½ÆÜÑ Í–F­&X “M¡˜Ä/Ñ+ž­Ó´ß¢_W¢ŠKâéžø×þzú¾5'ï[sRìÚ•aãÄÁ,Lªx<®V©&}5®1*þ°XÛ|“T?ûÝÃÂå.—¸ûîŒ+•J•H$xÎLÇaaš[œ£|³A+ÿå㟙Î0ÃÎúoP­ŽgÚ¬áÙgEQ‘()Ï=—Që•H$T0e†…™-Ó&2·Ý&z{3rœ$Ťîïc†…™N£ÑÄâqÆa"bñøÕ?„`g‹·ê'¬É8f`gèõú0GoOL$Õ]ų0žÁ`…ÃŒÃDŒ…BÆOû&4,¬Œ ‡ Ÿý«:pÙ˜L¦@0È8LD 4]™;$XÀ„dggûÆa"üÁ`vv6ã@°0i´Z­R¥b¿û§ G"J¥R«Õ2 “Éb±Œz½ŒÃÅz½‹…q X˜d¹¹¹‚õi<^onn.ã@°0É †FF‡‹)((`&™Ñh Å_¯pac¡P(8‹`!#  12xútQQã@°¬V«Ëíf.Äuú´Õje2BNNN"™ òVçK$“999 ÁB¦(++ëw:‡sõ;eeeŒÁB)))q¸\‰d’¡H—H&.WII CA°A´ZmaQ‘sp¡Hç,,*âw‚…Œc³Ùzìv¾É*E’¤»Ýf³1 ''''Çlv>ÍPÈ\§Oç˜Íìn'XÈÜIVWO“,yzÕÕÓÃôŠ`!sY,–ü‚»ÃÁPô;yùùœðL°é“¬zzføWéÄãñÎS§˜^,d:“Éd³Ù:ººfò œìê²Ùl|\ÁÂP]]ÝïtŽx<3óîx<ýNguu5Ï‚…©aÑ¢EÇNœˆÏ¼ Ãx<~ìĉE‹ñ X˜2¬V«µ¸¸½³s¦ÝñöÎNkq1§:,L1555JfF`Øït*5ššš}‚…©Çf³µwvz}¾™pg}~{g'ï ,LU999óçÏ?züø´ÿZp$r䨱ùóçs\;ÁÂVZZj›=ûpkë4ÞÇ·¶ÚfÏ.--å'X˜Ú*++ ›[[‰Äô»w‰D¢¹µµ °°²²’Çš`a:¨©©±äç7·µM³f%‰æ¶6K~>;Ú ¦[³r-–ZZ¦Í¶a<ÿ ¥%×b¡V Ó³Yy‡Ž ‡ÃSý¾øCGŽäP+‚…i«ººº¸´ôÀáÃ^¿êÞ ¯ß¿mÇŽâÒRο¹rÔ 2Áœ9s´Zí¡#Gj««ËŠ‹§Üú÷;íùsæÌáÑd†…鯴´tÙ²eÞ`°­½} íÒŠÇãmííÞ`pÙ²eùùù<Ž 3ENN΂ tFccsó”ø\‡§±¹Yg4.X°€£CÙ$ÄLTSS“““ÓtôhYqñܪ*µ:Ÿ¥ñxüdWW¿Ó¹hÑ"Îj&X˜Ñ¬V«ÕjíììÜwð`UE…­¤D¡PdȺI’dw8ºzzÊl¶U«Vñ`,@ùÝÃâb»Ýþ~SSUy¹µ°pr³%I’ëô鮞žü‚‚†ë¯7™LŸÏét6·µ I*ÈËË5›-f³^§»ä%‡#‘Q¯×ãõŒ…¢°°pA]+,à2ÈÉÉÉÉÉ™;wîØØØÐÐÐéÑÑŽîîd2™•eÊÊ2èõFƒA«Ñh5µF£T(T*•"‘H$%)‹Ec±h,6 …Âá@0è•J¥ÅbÉÍÍ-¯¬4^•íM,Ì8F£qöìÙ³gÏBD£Q¿ßB¡Ð°×F£Ñh<O&“ò‡Ø¨T*¥R©V«µZ­V«5“i–ÕšÍFÁ®öc~~>§ÈLWœš€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€`Á@°€` X Ág/¥2™L28W<W«ÕŒÁÊ f³Ùëõ28—ßïÏÎÎfV)--`p®ÒÒRÆ`eòòòÞÞ^ŸÏÇP Ïçëíí-//g(V&—RYWWwðàAš…ôZ«ÞÞÞcÇŽUTT”––fgg«T*ÆdJ$~¿`` §§§®®ŽéÁÊ\Éd²§§g``Àï÷' dR©TÙÙÙ¥¥¥Ì­œ…ÿ, X, X, X, X, X, X, X, X, X,‹!@°€` X@°€` X@°€` X@°€` X@°€` X@°€` X@°€` X@°€` X@°€` X@°, X@°, X@°, X@°, X@°, X@°, X@°, X@°, X@°, X@°, X, X, X, Xdÿ?Á²7ë2ËôGIEND®B`‚opentip-2.4.6/files/explanations.psd000066400000000000000000004334451213277401600175400ustar00rootroot000000000000008BPSkD8BIM%8BIM$>X Adobe Photoshop CS6 (Macintosh) 2012-08-23T21:50:57+02:00 2012-08-25T11:23:14+02:00 2012-08-25T11:23:14+02:00 application/vnd.adobe.photoshop xmp.iid:088011740720681180838C1D33E82CA2 xmp.did:028011740720681180838C1D33E82CA2 xmp.did:028011740720681180838C1D33E82CA2 created xmp.iid:028011740720681180838C1D33E82CA2 2012-08-23T21:50:57+02:00 Adobe Photoshop CS6 (Macintosh) saved xmp.iid:048011740720681180838C1D33E82CA2 2012-08-25T11:22:23+02:00 Adobe Photoshop CS6 (Macintosh) / saved xmp.iid:088011740720681180838C1D33E82CA2 2012-08-25T11:23:14+02:00 Adobe Photoshop CS6 (Macintosh) / α α offsetY offsetY cos(α) = cos(α) = closeButtonRadius closeButtonRadius 3 sRGB IEC61966-2.1 8BIM:å printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXTprintProofSetupObjc Proof Setup proofSetupBltnenum builtinProof proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oàGrn doub@oàBl doub@oàBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@aÿ® vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlong cropRectLeftlong cropRectRightlong cropRectToplong8BIMíýqýq8BIM&?€8BIM x8BIM8BIMó 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM8BIM&8BIM08BIM- 8BIM@@à`8BIM8BIM5nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?ð8BIM H HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ8BIM'8BIM   à,ëÿØÿâ XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ  "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÐõT’I%)$’IJI$’R’I$”¤’I%)$Åõú`ˤíçôó4¬$IBËj©¥Ö81 I$Ɯߓ±ì|ì!ÛIk£±„,]^ªd’I"¥$’I)I$’JÿÑõT’I%)$’IM[:–vº§9Åì;Hkïtzž“KíÖúGÕô¿œôKüÚúÎ [¹ÞÖîsߨkXÀ,ºâøúµÌúá,©Î…i{ŸP&Ç ©àßK~‡óêý¿éjý¨né.š´{^ËÈs·unÝ>Æúuú[?™ÿ’EX⺽kz^ž§E÷W]AÄXlnç5Ì!õmõæXÖ;ó¾ŸÐV)Ȧð]KÃÀ0HB£§ãcÛêÖ0ðÐL†úŽõïsgó¯·ô–£2ªëVưC@‘!}U.<7ÃÓ‹æW«Wï·ï zµ~û~ð¨dõ Zã±¥­ªÂ½Ûe¯c«s6±–ìýýMû?HœõgiÖ4!Ò 6z,~í¾ÚßÓzÏúlþkÔR{3 k¼c² ÛÁ6[[hk…º0`"I;}Ì%ÌÛk6þè5b°ûœöTéní°f ì}»lº×»ßÿþèK#íƒ[^êÆ­oôzŸúPƹ»oºÿç?žô_ÿ¥ûZó²¶š´>œ8Ø@¥ÙoÛ£[½ÓMuÿדO(Iâ"ô½Ö}ãë{ðÿèI~ÄÏL·×ay©õúŽw?h}¿Oó¶{˜®5õ5¡¡íÓÏûÕ!Õˆ ÙXefâFßÓ~’¿ÑûÙ³úÕê©å²¦‹âÛ¶C½¤¶©¥Msë:ÿRgó>¯­o謮µTÆÈtëº~ñˆDëÖ¶u}Z¿}¿xN,¬˜øcºûŸk[5†‚Ú¦-eùõ7U¹¯~Ú*±Ÿà¿ëv«8ùæüƒH®;¦~‹ÝPÓo·~ÝþÿúÞÿNÄéb˜Gâº9ñÈÐ=kfâI$£eRI$’ŸÿÒõT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÓõT’I%)$’IJI$&¾×´=­n×jÙ&c·æ¤¤©!ÍÿºÏóþE)¿÷YþqÿȤ¤‰!ÍÿºÏóþE)¿÷YþqÿȤ¦Ox`“¬è䟇úG}'lºÞ~o?÷ÕZÌ»*´Û}$ÑË«›Gçzµ5¾«7Çó•¶ßøOMY®ÆZÁeNm•»è½§p?ÕsQ1 Z¨Œ¢Iê6?ú*½6ø»ü÷ä’ý#~‹·Ýw?'ûòƒ2ûL‡CK‹šdHvÂÍ?9_$ÐoeôÉ4<ƒàTíp´yù·ÿQ£¢µI$’JRI$’ŸÿÔõT’I%)$’IJCÇþb¿ê7ò"!ãÿ1_õùRD’I%)FÂZÇÈ…$ÄH‚’‘°ÆÀ¹V»§Öç:ÜwkŸ;ß_Ñ|Ïóôý ã?Ÿý˘¬WôO,öŸ—þI¾å$DˆØªQŒ†£m»Çû²ý/¥â[…qµ6²FC\[Œ±›=ûoe¾mýÛ+eáÖªdé u¥›]dîLYKYKÍÖAà‚+%Ìk$PŸüÞÑËý£çÿ‘o¹A]$’I I$’SÿÕõT’I%)$’IJCÇþb¿ê7ò"!ãÿ1_õùRD’I%)$’IHÞÇzŒxs|GþM©šö¿èG#‚?¬ÔUVÇý!$p{I6Å3œÖÆãð9'àÔþ‹|]þ{¿òJM­Œú" ä÷?’­¼ \ êÝÑòü÷#!ÑüÓ~•$)$’IJI$’SÿÖõT’I%)$’IJCÇþb¿&€~ ADP4ÒâK«i'’@ILÒCû=èÙþhKìô£gù¡%$Iìô£gù¡/³ÑþŸæ„”‘$?³ÑþŸæ„¾ÏGú6šRDþÏGú6šû=èÙþhIJ£ù–žÇQóDI$”¤’I%)$’IOÿ×õT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÐõT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÙ8BIM!UAdobe PhotoshopAdobe Photoshop CS68BIM"2MM*bj(1 r2’‡i¨Ôøœ'øœ'Adobe Photoshop CS6 (Macintosh)2012:08:25 11:23:14   "*(2HH8BIM ømaniIRFRì8BIMAnDsÌnullAFStlongFrInVlLsObjcnullFrIDlong~¹YFStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong~¹YLCntlong8BIMRoll8BIM¡mfri`p,ø¢¢¢8BIMnormÿ D(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Background8BIMluni Background8BIMlnsrbgnd8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`éÄ/8BIMfxrpÿÿ8BIMnormÿ0(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8BIMluni </Layer group>8BIMlnsrlset8BIMlyid 8BIMlsct8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`éĬ8BIMfxrp@DÀ.ÿÿ8BIMnormÿ0(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8BIMluni </Layer group>8BIMlnsrlset8BIMlyid8BIMlsct8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`éÅ8BIMfxrpÀ@RÀ¾e.ÿÿ¢¢¢¢ÿþŽ8BIMnormÿ8 @¾e.(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRounded Rectangle 18BIMvscgtSoConullClr ObjcRGBCRd doub@oàGrn doub@oàBl doub@oà8BIMlfx2 nullScl UntF#Prc@hÿŽHãŽ9masterFXSwitchboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@T€Clr ObjcRGBCRd doub@oàGrn doub@oàBl doub@oàFrFXObjcFrFXenabboolStylenumFStlOutFPntTenumFrFlSClrMd enumBlnMNrmlOpctUntF#Prc@>Sz UntF#Pxl?ðClr ObjcRGBCRd doubGrn doubBl doub8BIMlrFXŒ8BIMcmnS8BIMdsdw3x8BIMmul ¿8BIMisdw3x8BIMmul ¿8BIMoglw*ÿÿÿÿ¾½8BIMscrn¿ÿÿÿÿ¾½8BIMiglw+ÿÿÿÿ¾½8BIMscrn¿ÿÿÿÿ¾½8BIMbevlNx8BIMscrn8BIMmul ÿÿÿÿÿÿ¿¿ÿÿÿÿÿÿ8BIMsofi"8BIMnormÿÿÿÿÿÿÑÿÿÿÿÿÿ8BIMvsms(z=qBÿÎz=qE¹z=qE¹z=q°£×z=q°£×z=q²ÂÂ{õ´zâ~{´zâ~{´zâ¼ÌÍ´zâ¼ÌÍ´zâ¾ë¸´zâÀ£×²ÂÂÀ£×°£×À£×°£×À£×E¹À£×E¹À£×Bÿξë¸AG®¼ÌÍAG®¼ÌÍAG®~{AG®~{AG®{õAG®8BIMluni,Rounded Rectangle 18BIMlnsrshap8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`éÅe8BIMvstk< strokeStylestrokeStyleVersionlong strokeEnabledbool fillEnabledboolstrokeStyleLineWidthUntF#Pxl?ðstrokeStyleLineDashOffsetUntF#PntstrokeStyleMiterLimitdoub@YstrokeStyleLineCapTypeenumstrokeStyleLineCapTypestrokeStyleButtCapstrokeStyleLineJoinTypeenumstrokeStyleLineJoinTypestrokeStyleMiterJoinstrokeStyleLineAlignmentenumstrokeStyleLineAlignmentstrokeStyleAlignInsidestrokeStyleScaleLockboolstrokeStyleStrokeAdjustboolstrokeStyleLineDashSetVlLsstrokeStyleBlendModeenumBlnMNrmlstrokeStyleOpacityUntF#Prc@YstrokeStyleContentObjcsolidColorLayerClr ObjcRGBCRd doubGrn doubBl doubstrokeStyleResolutiondoub@aÿ® 8BIMsn2P8BIMfxrp@C@D8BIMlyvr‚ÿÿ8BIMnormÿ0(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8BIMluni </Layer group>8BIMlnsrlset8BIMlyid 8BIMlsct8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`éŬ8BIMfxrp@E€@I€£Ç -ÿÿššššÿþ,8BIMnormÿ8 ¼£Ç -(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ellipse 18BIMvscgtSoConullClr ObjcRGBCRd doub@oàGrn doub@oàBl doub@oà8BIMlfx2 nullScl UntF#Prc@hÿŽHãŽ9masterFXSwitchboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@T@Clr ObjcRGBCRd doub@oàGrn doub@nÀ Bl doub@nÀ FrFXObjcFrFXenabboolStylenumFStlOutFPntTenumFrFlSClrMd enumBlnMNrmlOpctUntF#Prc@<Sz UntF#Pxl?ðClr ObjcRGBCRd doubGrn doubBl doub8BIMlrFXŒ8BIMcmnS8BIMdsdw3x8BIMmul ¿8BIMisdw3x8BIMmul ¿8BIMoglw*ÿÿÿÿ¾½8BIMscrn¿ÿÿÿÿ¾½8BIMiglw+ÿÿÿÿ¾½8BIMscrn¿ÿÿÿÿ¾½8BIMbevlNx8BIMscrn8BIMmul ÿÿÿÿÿÿ¿¿ÿÿÿÿÿÿ8BIMsofi"8BIMnormÿÿöõöõÏÿÿöõöõ8BIMvsmsÀhõÃŽS¯hõàhõñ¬QwIrÀˆõÃÀš¢À¨õñ¬Q¨õà¨õÃŽS¯š¢€ˆõÀwIr€8BIMluni Ellipse 18BIMlnsrshap8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`éÅï8BIMvstk< strokeStylestrokeStyleVersionlong strokeEnabledbool fillEnabledboolstrokeStyleLineWidthUntF#Pxl?ðstrokeStyleLineDashOffsetUntF#PntstrokeStyleMiterLimitdoub@YstrokeStyleLineCapTypeenumstrokeStyleLineCapTypestrokeStyleButtCapstrokeStyleLineJoinTypeenumstrokeStyleLineJoinTypestrokeStyleMiterJoinstrokeStyleLineAlignmentenumstrokeStyleLineAlignmentstrokeStyleAlignInsidestrokeStyleScaleLockboolstrokeStyleStrokeAdjustboolstrokeStyleLineDashSetVlLsstrokeStyleBlendModeenumBlnMNrmlstrokeStyleOpacityUntF#Prc@YstrokeStyleContentObjcsolidColorLayerClr ObjcRGBCRd doubGrn doubBl doubstrokeStyleResolutiondoub@aÿ® 8BIMsn2P8BIMfxrp@V€@K8BIMlyvr‚Ó÷Ùýÿÿ&&&&ÿþ&8BIMnormÿÀÓ÷Ùý(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ellipse 28BIMSoCopnullClr ObjcRGBCRd doub@oàGrn doubBl doub8BIMvmskÀ‡®ŸK‡® ‡® ´ùˆ@Ê¡G®ˆõáG®‰ª¼¡G®Š=q ´ùŠ=q Š=qŸK‰ª¼ž¸RˆõÞ¸Rˆ@Êž¸R8BIMluni Ellipse 28BIMlnsrshap8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`éÆ78BIMsn2P8BIMfxrp@E€@I€8BIMlyvr‚¾øÕüÿÿ^^^^ÿþ^8BIMnormÿ¾øÕü(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿShape 28BIMvscgtSoConullClr ObjcRGBCRd doub@oàGrn doubBl doub8BIMvsmsÀ‡® £×‡® £×‡® £×‡®Ÿ\)‡®Ÿ\)‡®Ÿ\)z=qŸ\)z=qŸ\)z=qŸ\)z=q £×z=q £×z=q £×8BIMluniShape 28BIMlnsrshap8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`éÆz8BIMvstk< strokeStylestrokeStyleVersionlong strokeEnabledbool fillEnabledboolstrokeStyleLineWidthUntF#Pxl?ðstrokeStyleLineDashOffsetUntF#PntstrokeStyleMiterLimitdoub@YstrokeStyleLineCapTypeenumstrokeStyleLineCapTypestrokeStyleButtCapstrokeStyleLineJoinTypeenumstrokeStyleLineJoinTypestrokeStyleMiterJoinstrokeStyleLineAlignmentenumstrokeStyleLineAlignmentstrokeStyleAlignInsidestrokeStyleScaleLockboolstrokeStyleStrokeAdjustboolstrokeStyleLineDashSetVlLsstrokeStyleBlendModeenumBlnMNrmlstrokeStyleOpacityUntF#Prc@YstrokeStyleContentObjcsolidColorLayerClr ObjcRGBCRd doub@a™  Grn doub@hÍ`ØàBl doub@O~#þ@strokeStyleResolutiondoub@aÿ® 8BIMsn2P8BIMfxrp@C@D8BIMlyvr‚½Ì×úÿÿKjjjÿþK8BIMnormÿ½Ì×ú(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿShape 38BIMvscgtSoConullClr ObjcRGBCRd doub@oàGrn doubBl doub8BIMvsmsÀzΓƒ‹zΓƒ‹zΓƒ‹y¬N„#y¬N„#y¬N„#‡ÀÉŸX‡ÀÉŸX‡ÀÉŸXˆãžlLˆãžlLˆãžlL8BIMluniShape 38BIMlnsrshap8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`鯽8BIMvstk< strokeStylestrokeStyleVersionlong strokeEnabledbool fillEnabledboolstrokeStyleLineWidthUntF#Pxl?ðstrokeStyleLineDashOffsetUntF#PntstrokeStyleMiterLimitdoub@YstrokeStyleLineCapTypeenumstrokeStyleLineCapTypestrokeStyleButtCapstrokeStyleLineJoinTypeenumstrokeStyleLineJoinTypestrokeStyleMiterJoinstrokeStyleLineAlignmentenumstrokeStyleLineAlignmentstrokeStyleAlignInsidestrokeStyleScaleLockboolstrokeStyleStrokeAdjustboolstrokeStyleLineDashSetVlLsstrokeStyleBlendModeenumBlnMNrmlstrokeStyleOpacityUntF#Prc@YstrokeStyleContentObjcsolidColorLayerClr ObjcRGBCRd doubGrn doub@e´ÉL Bl doub@mçÿàstrokeStyleResolutiondoub@aÿ® 8BIMsn2P8BIMfxrp@C@D8BIMlyvr‚ÇïÎøÿÿA8BIMnormÿ#(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?8BIMTySh!È?ð?ð@mà@iÀ2TxLrTxt TEXT± textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntantiAliasSharp TextIndexlong EngineDatatdtaÿ << /EngineDict << /Editor << /Text (þÿ± ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Name (þÿBasic Paragraph) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 2 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 14.0 /AutoLeading false /Leading 50.0 /AutoKerning true /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 .87057 0.0 0.0 ] >> >> >> >> ] /RunLengthArray [ 2 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 18.0 /GridLeading 22.0 /GridColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 4 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (þÿPhotoshopKinsokuHard) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ0ü   ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž00A0C0E0G0I0c0ƒ0…0‡0Ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0›0œ?!\)]},.:;!! ¢ÿ 0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00\([{ÿåÿ£ÿ §0ÿ) /Keep (þÿ  %) /Hanging (þÿ00.,) >> << /Name (þÿPhotoshopKinsokuSoft) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ  ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00) /Keep (þÿ  %) /Hanging (þÿ00.,) >> ] /MojiKumiSet [ << /InternalName (þÿPhotoshop6MojiKumiSet1) >> << /InternalName (þÿPhotoshop6MojiKumiSet2) >> << /InternalName (þÿPhotoshop6MojiKumiSet3) >> << /InternalName (þÿPhotoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (þÿNormal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (þÿNormal RGB) /StyleSheetData << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 /CharacterDirection 0 /HindiNumbers false /Kashida 1 /DiacriticPos 2 >> >> ] /FontSet [ << /Name (þÿGeorgia-Italic) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (þÿAdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (þÿMyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> /DocumentResources << /KinsokuSet [ << /Name (þÿPhotoshopKinsokuHard) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ0ü   ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž00A0C0E0G0I0c0ƒ0…0‡0Ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0›0œ?!\)]},.:;!! ¢ÿ 0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00\([{ÿåÿ£ÿ §0ÿ) /Keep (þÿ  %) /Hanging (þÿ00.,) >> << /Name (þÿPhotoshopKinsokuSoft) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ  ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00) /Keep (þÿ  %) /Hanging (þÿ00.,) >> ] /MojiKumiSet [ << /InternalName (þÿPhotoshop6MojiKumiSet1) >> << /InternalName (þÿPhotoshop6MojiKumiSet2) >> << /InternalName (þÿPhotoshop6MojiKumiSet3) >> << /InternalName (þÿPhotoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (þÿNormal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (þÿNormal RGB) /StyleSheetData << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 /CharacterDirection 0 /HindiNumbers false /Kashida 1 /DiacriticPos 2 >> >> ] /FontSet [ << /Name (þÿGeorgia-Italic) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (þÿAdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (þÿMyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> >>warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluni±8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`ê.b8BIMfxrpÀ@RÀÿÿ8BIMnormÿ((ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGroup 28BIMluniGroup 28BIMlnsrlset8BIMlyid 8BIMlsct8BIMpass8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`ê.Ï8BIMfxrp@E€@I€ÿÿ8BIMnormÿ((ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGroup 38BIMluniGroup 38BIMlnsrlset8BIMlyid8BIMlsct8BIMpass8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`ê/+8BIMfxrpÀ@RÀÿÿ8BIMnormÿ0(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8BIMluni </Layer group>8BIMlnsrlset8BIMlyid#8BIMlsct8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`ê/j8BIMfxrp@A@;LÒ^ ÿÿ¢JJJ8BIMnormÿ$X(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿoffsetY8BIMTySh#?ð?ð@j@@V€2TxLrTxt TEXToffsetY textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntantiAliasSharp TextIndexlong EngineDatatdta!: << /EngineDict << /Editor << /Text (þÿoffsetY ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Name (þÿBasic Paragraph) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 8 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 18.0 /AutoLeading false /Leading 50.0 /AutoKerning false /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 .55295 .77646 .24707 ] >> >> >> >> << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 18.0 /AutoLeading false /Leading 50.0 /AutoKerning true /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 .55295 .77646 .24707 ] >> >> >> >> ] /RunLengthArray [ 1 7 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 18.0 /GridLeading 22.0 /GridColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 4 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (þÿPhotoshopKinsokuHard) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ0ü   ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž00A0C0E0G0I0c0ƒ0…0‡0Ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0›0œ?!\)]},.:;!! ¢ÿ 0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00\([{ÿåÿ£ÿ §0ÿ) /Keep (þÿ  %) /Hanging (þÿ00.,) >> << /Name (þÿPhotoshopKinsokuSoft) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ  ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00) /Keep (þÿ  %) /Hanging (þÿ00.,) >> ] /MojiKumiSet [ << /InternalName (þÿPhotoshop6MojiKumiSet1) >> << /InternalName (þÿPhotoshop6MojiKumiSet2) >> << /InternalName (þÿPhotoshop6MojiKumiSet3) >> << /InternalName (þÿPhotoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (þÿNormal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (þÿNormal RGB) /StyleSheetData << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 /CharacterDirection 0 /HindiNumbers false /Kashida 1 /DiacriticPos 2 >> >> ] /FontSet [ << /Name (þÿGeorgia-Italic) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (þÿAdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (þÿMyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> /DocumentResources << /KinsokuSet [ << /Name (þÿPhotoshopKinsokuHard) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ0ü   ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž00A0C0E0G0I0c0ƒ0…0‡0Ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0›0œ?!\)]},.:;!! ¢ÿ 0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00\([{ÿåÿ£ÿ §0ÿ) /Keep (þÿ  %) /Hanging (þÿ00.,) >> << /Name (þÿPhotoshopKinsokuSoft) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ  ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00) /Keep (þÿ  %) /Hanging (þÿ00.,) >> ] /MojiKumiSet [ << /InternalName (þÿPhotoshop6MojiKumiSet1) >> << /InternalName (þÿPhotoshop6MojiKumiSet2) >> << /InternalName (þÿPhotoshop6MojiKumiSet3) >> << /InternalName (þÿPhotoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (þÿNormal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (þÿNormal RGB) /StyleSheetData << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 /CharacterDirection 0 /HindiNumbers false /Kashida 1 /DiacriticPos 2 >> >> ] /FontSet [ << /Name (þÿGeorgia-Italic) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (þÿAdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (þÿMyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> >>warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMlunioffsetY8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`êMð8BIMfxrp@\@CaŸd<ÿÿÿþ8BIMnorm3aŸd<(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿShape 48BIMvscgtSoConullClr ObjcRGBCRd doub@oàGrn doub@oàBl doub@oà8BIMvsmsÀ?\)ffg?\)ffg?\)ffg>¸Rffg>¸Rffg>¸Rffg>¸RÉ™š>¸RÉ™š>¸RÉ™š?\)É™š?\)É™š?\)É™š8BIMluniShape 48BIMlnsrshap8BIMlyid!8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`êN@8BIMvstk< strokeStylestrokeStyleVersionlong strokeEnabledbool fillEnabledboolstrokeStyleLineWidthUntF#Pxl?ðstrokeStyleLineDashOffsetUntF#PntstrokeStyleMiterLimitdoub@YstrokeStyleLineCapTypeenumstrokeStyleLineCapTypestrokeStyleButtCapstrokeStyleLineJoinTypeenumstrokeStyleLineJoinTypestrokeStyleMiterJoinstrokeStyleLineAlignmentenumstrokeStyleLineAlignmentstrokeStyleAlignInsidestrokeStyleScaleLockboolstrokeStyleStrokeAdjustboolstrokeStyleLineDashSetVlLsstrokeStyleBlendModeenumBlnMNrmlstrokeStyleOpacityUntF#Prc@YstrokeStyleContentObjcsolidColorLayerClr ObjcRGBCRd doubGrn doubBl doubstrokeStyleResolutiondoub@aÿ® 8BIMsn2P8BIMfxrp@A@;8BIMlyvr‚[Tk•ÿÿ>œXX8BIMnormÿ&¬(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcos(?) =8BIMTySh%`?ð?ð@U@Z2TxLrTxt TEXT cos(±) = textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntantiAliasSharp TextIndexlong EngineDatatdta#ˆ << /EngineDict << /Editor << /Text (þÿcos\(±\) = ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Name (þÿBasic Paragraph) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 9 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 18.0 /AutoLeading false /Leading 50.0 /AutoKerning false /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 .36863 .36863 .36863 ] >> >> >> >> << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 18.0 /AutoLeading false /Leading 50.0 /AutoKerning true /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 .36863 .36863 .36863 ] >> >> >> >> << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 18.0 /AutoLeading false /Leading 50.0 /AutoKerning true /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 .87057 0.0 0.0 ] >> >> >> >> << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 18.0 /AutoLeading false /Leading 50.0 /AutoKerning true /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 .36863 .36863 .36863 ] >> >> >> >> ] /RunLengthArray [ 1 3 1 4 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 18.0 /GridLeading 22.0 /GridColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 4 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (þÿPhotoshopKinsokuHard) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ0ü   ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž00A0C0E0G0I0c0ƒ0…0‡0Ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0›0œ?!\)]},.:;!! ¢ÿ 0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00\([{ÿåÿ£ÿ §0ÿ) /Keep (þÿ  %) /Hanging (þÿ00.,) >> << /Name (þÿPhotoshopKinsokuSoft) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ  ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00) /Keep (þÿ  %) /Hanging (þÿ00.,) >> ] /MojiKumiSet [ << /InternalName (þÿPhotoshop6MojiKumiSet1) >> << /InternalName (þÿPhotoshop6MojiKumiSet2) >> << /InternalName (þÿPhotoshop6MojiKumiSet3) >> << /InternalName (þÿPhotoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (þÿNormal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (þÿNormal RGB) /StyleSheetData << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 /CharacterDirection 0 /HindiNumbers false /Kashida 1 /DiacriticPos 2 >> >> ] /FontSet [ << /Name (þÿGeorgia-Italic) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (þÿAdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (þÿMyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> /DocumentResources << /KinsokuSet [ << /Name (þÿPhotoshopKinsokuHard) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ0ü   ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž00A0C0E0G0I0c0ƒ0…0‡0Ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0›0œ?!\)]},.:;!! ¢ÿ 0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00\([{ÿåÿ£ÿ §0ÿ) /Keep (þÿ  %) /Hanging (þÿ00.,) >> << /Name (þÿPhotoshopKinsokuSoft) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ  ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00) /Keep (þÿ  %) /Hanging (þÿ00.,) >> ] /MojiKumiSet [ << /InternalName (þÿPhotoshop6MojiKumiSet1) >> << /InternalName (þÿPhotoshop6MojiKumiSet2) >> << /InternalName (þÿPhotoshop6MojiKumiSet3) >> << /InternalName (þÿPhotoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (þÿNormal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (þÿNormal RGB) /StyleSheetData << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 /CharacterDirection 0 /HindiNumbers false /Kashida 1 /DiacriticPos 2 >> >> ] /FontSet [ << /Name (þÿGeorgia-Italic) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (þÿAdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (þÿMyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> >>warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMlunicos(±) =8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`ê”68BIMfxrpÀ,@Ji£w:ÿÿVVV8BIMnormÿ$œ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcloseButtonRadius8BIMTySh#4?ð?ð@d`@]À2TxLrTxt TEXTcloseButtonRadius textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntantiAliasSharp TextIndexlong EngineDatatdta!J << /EngineDict << /Editor << /Text (þÿcloseButtonRadius ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Name (þÿBasic Paragraph) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 18 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 18.0 /AutoLeading false /Leading 50.0 /AutoKerning false /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 0.0 .68234 .93726 ] >> >> >> >> << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 18.0 /AutoLeading false /Leading 50.0 /AutoKerning true /Kerning 0 /FillColor << /Type 1 /Values [ 1.0 0.0 .68234 .93726 ] >> >> >> >> ] /RunLengthArray [ 1 17 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 18.0 /GridLeading 22.0 /GridColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 4 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (þÿPhotoshopKinsokuHard) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ0ü   ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž00A0C0E0G0I0c0ƒ0…0‡0Ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0›0œ?!\)]},.:;!! ¢ÿ 0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00\([{ÿåÿ£ÿ §0ÿ) /Keep (þÿ  %) /Hanging (þÿ00.,) >> << /Name (þÿPhotoshopKinsokuSoft) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ  ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00) /Keep (þÿ  %) /Hanging (þÿ00.,) >> ] /MojiKumiSet [ << /InternalName (þÿPhotoshop6MojiKumiSet1) >> << /InternalName (þÿPhotoshop6MojiKumiSet2) >> << /InternalName (þÿPhotoshop6MojiKumiSet3) >> << /InternalName (þÿPhotoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (þÿNormal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (þÿNormal RGB) /StyleSheetData << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 /CharacterDirection 0 /HindiNumbers false /Kashida 1 /DiacriticPos 2 >> >> ] /FontSet [ << /Name (þÿGeorgia-Italic) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (þÿAdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (þÿMyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> /DocumentResources << /KinsokuSet [ << /Name (þÿPhotoshopKinsokuHard) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ0ü   ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž00A0C0E0G0I0c0ƒ0…0‡0Ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0›0œ?!\)]},.:;!! ¢ÿ 0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00\([{ÿåÿ£ÿ §0ÿ) /Keep (þÿ  %) /Hanging (þÿ00.,) >> << /Name (þÿPhotoshopKinsokuSoft) /NoStart (þÿ00ÿ ÿ0ûÿÿÿÿ  ÿ 0ÿ=ÿ]0 0 0 000ý0þ00ž0) /NoEnd (þÿ  ÿ0ÿ;ÿ[00 0 00) /Keep (þÿ  %) /Hanging (þÿ00.,) >> ] /MojiKumiSet [ << /InternalName (þÿPhotoshop6MojiKumiSet1) >> << /InternalName (þÿPhotoshop6MojiKumiSet2) >> << /InternalName (þÿPhotoshop6MojiKumiSet3) >> << /InternalName (þÿPhotoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (þÿNormal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (þÿNormal RGB) /StyleSheetData << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 /CharacterDirection 0 /HindiNumbers false /Kashida 1 /DiacriticPos 2 >> >> ] /FontSet [ << /Name (þÿGeorgia-Italic) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (þÿAdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (þÿMyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> >>warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluni(closeButtonRadius8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`ê®%8BIMfxrp@P@@PÀÿÿ8BIMnormÿ8(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGroup 48BIMluniGroup 48BIMlnsrlset8BIMlyid"8BIMlsct8BIMpass8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`ê®d8BIMfxrp@A@;8BIMlyvrPÿÿ8BIMnormÿ8((ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Close Button8BIMluni Close Button8BIMlyid 8BIMlsct8BIMpass8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAÔ&`ê®°8BIMfxrp@DÀ.ÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËˀˀ€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€€Ë€  ËþnÇóˆÿÒÿóÇnþÿÏ…ÿÏÿÏÏ„ÿÎÿÐmƒÿÍÿmǃÿÍÿÇùƒÿÍÿø‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿ‚ÿÌÿùƒÿÍÿóǃÿÍÿÇnƒÿÍÿnЄÿÎÿÑÿÏ…ÿÏÿÐþoËôˆÿÒÿôËoþË›››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€›€  ›ØCn°ÈÜîóÿÿóîÜȰnCØÜ$k¦áíÿá¦k$Üß(„ÛåÿÛ„(ßâlÈßÿÈlâä'™÷Ûÿ÷™'äæ&¤ý×ÿý¥&æè•ûÓÿû•èêcïÏÿïdêë ¿Ëÿ¿ ëì\ñÉÿñ\ìî›Åÿ›îïÊÃÿÊïð,áÁÿá,ðñ8î¿ÿî8ñò>ó½ÿó>òó7ó»ÿò7óô-ð¹ÿð-ôõã·ÿãõöȵÿÈöö›³ÿœö÷\±ÿ\÷ø ñ±ÿñ øù¾¯ÿ¿ùùd­ÿeùúí­ÿîúú”«ÿ•úû&û«ÿû&ûû¥©ÿ¦ûü'ý©ÿý(üüš§ÿšüýö§ÿöýýr¥ÿsýý×¥ÿ×ýþ3£ÿ3þþ‰£ÿ‰þþÛ£ÿÛþÿ#¡ÿ#ÿk¡ÿkÿ§¡ÿ§ÿâ¡ÿãŸÿCŸÿEnŸÿnŸÿ±Ÿÿ²ËŸÿËߟÿàïŸÿïòŸÿóÿÿòŸÿóïŸÿïߟÿàËŸÿ˱Ÿÿ²Ÿÿ‘nŸÿnDŸÿEŸÿÿã¡ÿãÿ§¡ÿ§ÿk¡ÿlÿ#¡ÿ#þÜ£ÿÜþþŠ£ÿ‰þþ3£ÿ4þý×¥ÿØýýs¥ÿsýýö§ÿöýüš§ÿšüü(ý©ÿý)üû¦©ÿ¦ûû&û«ÿû'ûú•«ÿ–úúî­ÿïúùe­ÿeùù¿¯ÿ¿ùø ñ±ÿñ ø÷\±ÿ]÷öœ³ÿœööɵÿËöõã·ÿãõô-ð¹ÿð-ôó8ó»ÿó8óò>ó½ÿó>òñ8ï¿ÿï8ñð-áÁÿá-ðïÊÃÿÊïîœÅÿœîì\ñÉÿñ]ìë"ÀËÿÀ"ëêeïÏÿïeêè•ûÓÿû•èæ'¥ý×ÿý¦'æä'™÷Ûÿ÷™(äâs×ßÿ×sâß4‹ÛåÿÛ‹4ßÜ$k¦ãíÿä¦k$ÜØDp‘²ÉÝîôÿÿôîÝɲ‘pDØ›IææIæÿÿææÿÿçJçäJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿIææIæÿÿææÿÿçJçäJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ????????????????????????????????????????????????????????????????????????????????????????????ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÓÿTµ0ØÿÊÿý§$Úÿ’ùÿû˜Üý ¡ýÿö‰Þû*¯þÿï{ àù7½ÿÿèmâ÷EËÿÿß^äöT×ÿÿÔOåôcáÿÿÇAçòpëÿÿ¹3éð òÿþª'ëîŽ÷ÿû›íìœûÿöŽïê(«þÿò ñè4¹ÿÿëpóæAÇÿÿáaõäOÔÿÿÖS÷ã^ßÿÿÊDøámèÿÿ¼6úß |ïÿþ­*ü݉öÿüŸþÛ˜ûÿù‘Ù$§ýÿÊ×0µUÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®Ó®ÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓïÓï ÓÿTµ0ØÿÊÿý§$Úÿ’ùÿû˜Üý ¡ýÿö‰Þû*¯þÿï{ àù7½ÿÿèmâ÷EËÿÿß^äöT×ÿÿÔOåôcáÿÿÇAçòpëÿÿ¹3éð òÿþª'ëîŽ÷ÿû›íìœûÿöŽïê(«þÿò ñè4¹ÿÿëpóæAÇÿÿáaõäOÔÿÿÖS÷ã^ßÿÿÊDøámèÿÿ¼6úß |ïÿþ­*ü݉öÿüŸþÛ˜ûÿù‘Ù$§ýÿÊ×0µUÓwÿÿÌwÿ"ªÿDÌÿªDÿwwÿDˆÿ3ˆÝ™ÿ""î»wÿwfÿÿÌ»ÿÿˆˆÿÌøÞøÞøÞøÞøÞøÞøÞøøøøøøøøøøøøøø25222*035 ò ™ÿÿw"»ÿÿDàó ̈Uÿˆ"îUˆÿUíªýÿw3ýÿUôˆîýÌ»íî»þ™ÿ»üÝ»3õî™þUÿfîDÿwþîÝýf»þõfÿwþ™ÿ3îfÿDý»ÿD"Ìþþwîÿÿ™DüÿwüÿDªþÿwþfÌÿÿ»Düÿ wfÿˆÝ"ýÿÌÝUUÿªþ»îýî»þ̪"Ý̈îffÿfîÝü"ÿÝ»Dü™ÿDþÝÿîÝþ3ÿ™3ÿwü UÿfˆÿU"ÿ™ûÌÿÌwû"ÿÌýÌÿ3"ÿ™þ fÿfîÿˆþ ÌÝf™ÿwfÿfûˆÿªúfÿˆýîÿfÿfþ™ÿ"þUÝÿÿ™"þÿªˆþ™ÿ"û™ÿfúwÿwþ3ÿ»™ÿ3þÝîûUÌÿD3ÿªúÿÝúÝÿ"úfÿwþ™ÿU»îýî»DÿfUÿU3ÿÝýª"ÿ»û"ÿÝùÝÝwÿˆþî»þDÿwfÿݪÝÌÿw"»3Dÿ»ûˆÿÝú3»ÿÿ»UþDÿwþwÿDþwîÿÿª"»ÿÿ»"Ýÿÿˆwüÿwû÷wÿDþ»îÙ÷ÿÌþîˆÙû UÿwfÝ"ˆÿD™»Øû Dÿÿªwÿÿw×ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇ?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?Ç?ä‚ÿåÿäÿäÿÿ‚åÿÿäÿÿäÿÿ‚åÿÿäÿÿäÿÿ‚åÿÿäÿä‚ÿåÿä 135/.32/2âwÌwöÿ»3ðä»ÌUôªÿDñäÿÌñÝÌñå™î"ñˆÿ"òþˆþÿwþfÌÿÿ»"þwþÿª3ÿˆüfÌÿÿˆ"ÿ™ýwÿUòÌÌ3Ìÿ™ÿw"Ýݙ̻îªÿ"ýˆÿ™"ÝÌÿDýwÿUò ªÿ3"ÿÌfÿwþ™ÿUî»ûî»ýUÿªþ™ÿÌüˆÿUü3ùÿª"ÿ»ûÝîþˆÿwÌÿª3þUÿwýÌÿ3þwÿwü™ÿ3òfÿˆü"ÿÌý ªÿU"»ÿÿ»wÿfþ"ÿÝýwîüÝîñwÿwü3ÿªýÝîý"»ÿwˆÿ3þ3ÿÌýÝÌü"ÿ»û3ùÿªfÿ™þ"™"ÿ»þfÿˆÝ™ÿˆˆÿ3þ"ÿÝþfÿÌüwÿfñîîU3Ì"»ÿDUî»"ÿÿ3wÿ3ˆÿ3ýÌÿwUÌÝÝüÿÝð3»ÿÿªªÿÿÝwþ fÌÿÿ»3wÿDý"»ÿÿ™ªÿÝUwÿfðç"ÿˆò3îˆïæwÿfôwÿˆîåwÝwö̪Uí *( " ( âþ^öþ^ðäý^ôþ^ñäÿ^ñÿ^ñåþ^ñþ^òþü^þû^þü^ÿþ^üùÞýþ^òý^þ^þ^þ^ÿþ^þ^þ^ýþÞüÞýþ^òþ^þ^þ^þþ^^^ûÿ^ýþÞþþÞüþ^ü÷^þ^ûþ^þþ^ý^þþ^ýþÞþþÞüþ^òþ^üþ^ýþ^û^þ^þþÞýþÞüÿ^ñþ^üþ^ýÿ^ýý^þ^þþÞýÿÞüþ^û÷^þ^þü^þû^ÿþ^þ^þþÞþþÞüþ^ñý^þ^þ^þ^ý^þ^þ^ýþÞýÞüÿ^ðû^ÿû^þû^ÿþ^ýüÞýÞÿþ^ðçþ^òþ^ïæþ^ôþ^îåþ^öþ^í "   âþ^öþ^ðäý^ôþ^ñäÿ^ñÿ^ñåþ^ñþ^òþü^þû^þü^ÿþ^ðþ^òý^þ^þ^þ^ÿþ^þ^þ^ðþ^òþ^þ^þ^þþ^^^ûÿ^ïþ^ü÷^þ^ûþ^þþ^ý^þþ^ïþ^òþ^üþ^ýþ^û^þ^ïÿ^ñþ^üþ^ýÿ^ýý^þ^ðþ^û÷^þ^þü^þû^ÿþ^þ^ðþ^ñý^þ^þ^þ^ý^þ^þ^ðÿ^ðû^ÿû^þû^ÿþ^ñþ^ðçþ^òþ^ïæþ^ôþ^îåþ^öþ^í "   âþ^öþ^ðäý^ôþ^ñäÿ^ñÿ^ñåþ^ñþ^òþü^þû^þü^ÿþ^ðþ^òý^þ^þ^þ^ÿþ^þ^þ^ðþ^òþ^þ^þ^þþ^^^ûÿ^ïþ^ü÷^þ^ûþ^þþ^ý^þþ^ïþ^òþ^üþ^ýþ^û^þ^ïÿ^ñþ^üþ^ýÿ^ýý^þ^ðþ^û÷^þ^þü^þû^ÿþ^þ^ðþ^ñý^þ^þ^þ^ý^þ^þ^ðÿ^ðû^ÿû^þû^ÿþ^ñþ^ðçþ^òþ^ïæþ^ôþ^îåþ^öþ^í%8-0“˜‘‘˜˜”÷îÿÿw”3þÿ™êöªÿDæ3úÿwÓˆûÿîwíªÿfÿ"îÌïöªÿ"å"îÿD"ÌÿˆôwÿDþDÿwéUÿî3Ýÿwî™ÿ3ÿ"î»ïöÿÝãÿîþˆÿªô»îýwÿDéDÿ»þ™ÿªîÝîê÷"ÿ™äDÿ»þ™ÿ™ôÝ»ý™îèwÿwþ™ÿ™îî»êþˆþÿwfÿfþfÌÿÿ»"þ fÝÿÿ»"™ÿÿîUþwÿˆþÝî"3»ÿÌþUÿw»ýÿîwüÿD™ÿÿîwwîÿˆªÿÿwý»ÿD"îî"ýˆþÿˆîDþwîÿÿªÿwwÿÿˆfÝÿˆþ ˆÿDfÝÿÿ»"&ÌÌ3Ìÿ™ÿ"™ÿw"ÝÝfî3ˆÿU"Ý»ÝÝþ»ÿf3»Ì3þ ÝÿwÿDwÿfþ3ÿ™þ"î»"ˆÿw"ÿÝ™"îÝýÿîÿfÝÝUþÌÝUfÿîþ»ÿf3îÿD"ÿÌ"ÿÌþ »îfî3ˆÿUªÿ3"ÿÌÝÝfÿwþ™ÿUªîûÿÌÿîÌþÝýÿª3ýÿÝþ»îþ™ÿ"þfÿfþ ÌÝ"ÿÌ3ÿªþîÝþDýÿÝwü »ÿDÿ»ˆÿfþ»î3ÿ™"ÿ™þîü"ÿ»ûÿ»Ýîþˆÿwˆÿ»fþUÿfˆÌÌ""ÿÝ»ÿˆ"ÿ™þîÌþÿÝý™ÿ"fÿˆþ ÿîfÿf"ÿ™þwÿ™ªÿDýDÿªþDÿwîÝýî»fÿffÿfDÿˆˆÿ»fþfÿˆûDÿw"ÿÌýªÿUªÿÿÝ3™ÿÿ݈fýfÿ™þ3ÿÿ"Dÿf3ÿ™"ÿ™ýÿÝþ™ÿUþ 3ÿÌ™ÿDfÿfþ™ÿf3ÿÌý™ÿfþwÿDUÿ™þDÿ™ ™ÿ"wÿ"wÿfþªÿÿÝ3wÿwûwÿD3ÿªýÝîü™ÿ»ªÿ3ú™ÿfþDÿÿ"wÿDfÿffÿfþ"ÿ™þªÿ3þwÿwÝîþ™ÿ"þÝÿ"™ÿUþªÿDþ»îwÿwþfÿfÝÝþ»îþ™ÿ"ü™ÿ»fÿ™þ "™»î"ÿ»þfÿˆ»Ìþÿ̪ÿfþÿfÿÝÿ"þªÿÌ»îþ™ÿ"™ÿDþfÿwþ™ÿDþÌî"ÿ»þÿÝþ"ÿÝþîÝþ™ÿUþîÌfÿˆþ™ÿ""ÿ™þî»þÿÝÿ»ÌþÿÌ îîU3Ì"îîþ2»ÿDUî»Ýÿw3îwUÿÌwªUÿÿ3ªÿî3Ìÿ3ˆîÿ"»ÿDþwÿwþDÿ»»ÿUUÿw"ÿÌþˆÿÌýˆÿ™Uÿª"»ÿÌî̪îÿ"fÿ™ÿݪÿÝÝÿw3îw3»ÿÿª™ÿÿwªÿÿÝwþ3»ÿÿÝfþwîÿîwîûÿîˆþUÿÿ»"wÿÿwwÿÿÌ3DÿÿîffÝÿÿª"þwÿDþÌÿÌwüÿ33þÿwÿÿª"ÌÿÌUUîÿ»3™ÿîw"îÿ»"ˆÿÿ™»ÿÝU3»ÿÿÝfêêêêêêêêêêêêêê®ê®®ê®®ê®®ê®®ê®®ê®®ê®®ê®®ê®®ê®®ê®®ê®®ê®®ê®ïêïïêïïêïïêïïêïïêïïêïïêïïêïïêïïêïïêïïêïïêï8BIMPatt8BIMTxt23? /98 << /0 7 >> /0 << /1 << /0 [ << /0 << /99 /CoolTypeFont /0 << /0 (þÿGeorgia-Italic) /2 1 >> >> >> << /0 << /99 /CoolTypeFont /0 << /0 (þÿAdobeInvisFont) /2 0 >> >> >> << /0 << /99 /CoolTypeFont /0 << /0 (þÿMyriadPro-Regular) /2 0 >> >> >> << /0 << /99 /CoolTypeFont /0 << /0 (þÿTimesNewRomanPSMT) /2 1 >> >> >> ] >> /2 << /0 [ << /0 << /0 (þÿ) >> >> ] /1 [ << /0 0 >> ] >> /3 << /0 [ << /0 << /0 (þÿPhotoshop6MojiKumiSet4) /5 << /0 0 /3 2 >> >> >> << /0 << /0 (þÿPhotoshop6MojiKumiSet3) /5 << /0 0 /3 4 >> >> >> << /0 << /0 (þÿPhotoshop6MojiKumiSet2) /5 << /0 0 /3 3 >> >> >> << /0 << /0 (þÿPhotoshop6MojiKumiSet1) /5 << /0 0 /3 1 >> >> >> << /0 << /0 (þÿYakumonoHankaku) /5 << /0 0 /3 1 >> >> >> << /0 << /0 (þÿGyomatsuYakumonoHankaku) /5 << /0 0 /3 3 >> >> >> << /0 << /0 (þÿGyomatsuYakumonoZenkaku) /5 << /0 0 /3 4 >> >> >> << /0 << /0 (þÿYakumonoZenkaku) /5 << /0 0 /3 2 >> >> >> ] /1 [ << /0 0 >> << /0 1 >> << /0 2 >> << /0 3 >> << /0 4 >> << /0 5 >> << /0 6 >> << /0 7 >> ] >> /4 << /0 [ << /0 << /0 (þÿNone) /5 << /0 (þÿ) /1 (þÿ) /2 (þÿ) /3 (þÿ) /4 0 >> >> >> << /0 << /0 (þÿPhotoshopKinsokuHard) /5 << /0 (þÿ!\),.:;?]}¢    0!! 0000 0 0 0000A0C0E0G0I0c0ƒ0…0‡0Ž0›0œ00ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0û0ü0ý0þÿÿÿ ÿ ÿÿÿÿÿ=ÿ]) /1 (þÿ\([{£§  00 0 0000ÿÿÿÿ ÿ;ÿ[ÿå) /2 (þÿ  % &) /3 (þÿ00ÿ ÿ) /4 1 >> >> >> << /0 << /0 (þÿPhotoshopKinsokuSoft) /5 << /0 (þÿ  0000 0 0 00000ž0û0ý0þÿÿ ÿ ÿÿÿÿÿ=ÿ]) /1 (þÿ  00 0 000ÿÿ;ÿ[) /2 (þÿ  % &) /3 (þÿ00ÿ ÿ) /4 2 >> >> >> << /0 << /0 (þÿHard) /5 << /0 (þÿ!\),.:;?]}¢    0!! 0000 0 0 0000A0C0E0G0I0c0ƒ0…0‡0Ž0›0œ00ž0¡0£0¥0§0©0Ã0ã0å0ç0î0õ0ö0û0ü0ý0þÿÿÿ ÿ ÿÿÿÿÿ=ÿ]) /1 (þÿ\([{£§  00 0 0000ÿÿÿÿ ÿ;ÿ[ÿå) /2 (þÿ  % &) /3 (þÿ00ÿ ÿ) /4 1 >> >> >> << /0 << /0 (þÿSoft) /5 << /0 (þÿ  0000 0 0 00000ž0û0ý0þÿÿ ÿ ÿÿÿÿÿ=ÿ]) /1 (þÿ  00 0 000ÿÿ;ÿ[) /2 (þÿ  % &) /3 (þÿ00ÿ ÿ) /4 2 >> >> >> ] /1 [ << /0 0 >> << /0 1 >> << /0 2 >> << /0 3 >> << /0 4 >> ] >> /5 << /0 [ << /0 << /0 (þÿNormal RGB) /6 << /0 2 /1 12.0 /2 false /3 false /4 true /5 0.0 /6 1.0 /7 1.0 /8 0 /9 0.0 /10 0.0 /11 1 /12 0 /13 0 /14 0 /15 0 /16 0 /17 0.0 /18 true /19 false /20 false /21 false /22 false /23 false /24 false /25 false /26 false /27 false /28 false /29 false /30 0 /31 false /32 false /33 false /34 false /35 2 /36 0.0 /37 2 /38 0 /39 0 /40 false /41 2 /42 0 /43 << /0 .5 >> /44 2 /45 2 /46 7 /47 0 /48 0 /49 -1.0 /50 -1.0 /51 0 /52 false /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 0.0 0.0 0.0 ] >> >> /54 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 0.0 0.0 0.0 ] >> >> /55 << /99 /SimpleBlender >> /56 true /57 false /58 true /59 false /60 false /61 0 /62 0 /63 1.0 /64 4.0 /65 0.0 /66 [ ] /67 [ ] /68 0 /69 0 /70 0 /71 4 /72 0.0 /73 0.0 /74 false /75 false /76 false /77 true /78 true /79 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 1.0 1.0 0.0 ] >> >> /80 false /81 0 /82 3.0 /83 3.0 /84 false /85 0 /86 << /99 /SimpleCustomFeature >> /87 100.0 /88 true >> >> >> << /0 << /0 (þÿNone) /5 0 /6 << >> >> >> ] /1 [ << /0 0 >> << /0 1 >> ] >> /6 << /0 [ << /0 << /0 (þÿNormal RGB) /5 << /0 0 /1 0.0 /2 0.0 /3 0.0 /4 0.0 /5 0.0 /6 1 /7 1.2 /8 0 /9 true /10 6 /11 2 /12 2 /13 0 /14 36.0 /15 true /16 .5 /17 [ .8 1.0 1.33 ] /18 [ 0.0 0.0 0.0 ] /19 [ 1.0 1.0 1.0 ] /20 6 /21 false /22 0 /23 true /24 0 /25 0 /27 /nil /26 false /28 /nil /29 false /30 << >> /31 36.0 /32 << >> /33 0 /34 7 /35 0 /36 /nil /37 0 /38 false /39 0 /40 2 >> >> >> << /0 << /0 (þÿBasic Paragraph) /5 << /0 0 /1 0.0 /2 0.0 /3 0.0 /4 0.0 /5 0.0 /6 1 /7 1.2 /8 0 /9 true /10 6 /11 2 /12 2 /13 0 /14 36.0 /15 true /16 .5 /17 [ .8 1.0 1.33 ] /18 [ 0.0 0.0 0.0 ] /19 [ 1.0 1.0 1.0 ] /20 6 /21 false /22 0 /23 true /24 0 /25 0 /27 /nil /26 false /28 /nil /29 false /30 << >> /31 36.0 /32 << /0 2 /1 12.0 /2 false /3 false /4 true /5 0.0 /6 1.0 /7 1.0 /8 0 /9 0.0 /10 0.0 /11 1 /12 0 /13 0 /15 0 /16 0 /18 true /19 false /20 true /21 false /22 false /23 false /24 false /25 false /26 false /27 false /28 false /29 false /30 0 /35 1 /38 0 /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 0.0 0.0 0.0 ] >> >> /54 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 0.0 0.0 0.0 ] >> >> /68 0 /70 1 /71 4 /72 0.0 /73 0.0 /87 0.0 >> /33 0 /34 7 /35 0 /36 /nil /37 0 /38 false /39 0 /40 2 >> /6 0 >> >> ] /1 [ << /0 0 >> << /0 1 >> ] >> /8 << /0 [ << /0 << /2 << /6 [ -1.0 -1.0 ] /11 << /4 -1 /7 false >> >> >> >> << /0 << /2 << /6 [ -1.0 -1.0 ] /11 << /4 -1 /7 false >> >> >> >> << /0 << /2 << /6 [ -1.0 -1.0 ] /11 << /4 -1 /7 false >> >> >> >> << /0 << /2 << /6 [ -1.0 -1.0 ] /11 << /4 -1 /7 false >> >> >> >> ] >> /9 << /0 [ << /0 << /0 (þÿkPredefinedNumericListStyleTag) /6 1 >> >> << /0 << /0 (þÿkPredefinedUppercaseAlphaListStyleTag) /6 2 >> >> << /0 << /0 (þÿkPredefinedLowercaseAlphaListStyleTag) /6 3 >> >> << /0 << /0 (þÿkPredefinedUppercaseRomanNumListStyleTag) /6 4 >> >> << /0 << /0 (þÿkPredefinedLowercaseRomanNumListStyleTag) /6 5 >> >> << /0 << /0 (þÿkPredefinedBulletListStyleTag) /6 6 >> >> ] /1 [ << /0 0 >> << /0 1 >> << /0 2 >> << /0 3 >> << /0 4 >> << /0 5 >> ] >> >> /1 << /0 << /0 << /0 1 /1 [ << /0 (þÿ ) /1 (þÿ1) >> << /0 (þÿ ) /1 (þÿ6) >> << /0 (þÿ ) /1 (þÿ0) >> << /0 (þÿ \)) /1 (þÿ5) >> << /0 (þÿ) /1 (þÿ5) >> << /0 (þÿ0) /1 (þÿ1) >> << /0 (þÿ­) /1 (þÿ3) >> ] >> /1 0 /2 0 /3 .583 /4 .333 /5 .583 /6 .333 /7 .7 /8 true /9 [ << /0 0 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 1 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 2 /1 (þÿ«) /2 (þÿ») /3 (þÿ ) /4 (þÿ ) >> << /0 3 /1 (þÿ«) /2 (þÿ») /3 (þÿ ) /4 (þÿ ) >> << /0 4 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 5 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 6 /1 (þÿ«) /2 (þÿ») /3 (þÿ 9) /4 (þÿ :) >> << /0 7 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 8 /1 (þÿ«) /2 (þÿ») /3 (þÿ ) /4 (þÿ ) >> << /0 9 /1 (þÿ«) /2 (þÿ») /3 (þÿ ) /4 (þÿ ) >> << /0 10 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 11 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 12 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 13 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 14 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 15 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 16 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 17 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 18 /1 (þÿ«) /2 (þÿ») /3 (þÿ ) /4 (þÿ ) >> << /0 19 /1 (þÿ«) /2 (þÿ») /3 (þÿ ) /4 (þÿ ) >> << /0 20 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 21 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 22 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 23 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 24 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 25 /1 (þÿ«) /2 (þÿ») /3 (þÿ 9) /4 (þÿ :) >> << /0 26 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 27 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 28 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 29 /1 (þÿ0) /2 (þÿ0) >> << /0 30 /1 (þÿ0 ) /2 (þÿ0 ) >> << /0 31 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 32 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 33 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 34 /1 (þÿ«) /2 (þÿ») /3 (þÿ ) /4 (þÿ ) >> << /0 35 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 36 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 37 /1 (þÿ«) /2 (þÿ») /3 (þÿ ) /4 (þÿ ) >> << /0 38 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 39 /1 (þÿ«) /2 (þÿ») /3 (þÿ<) /4 (þÿ>) >> << /0 40 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 41 /1 (þÿ«) /2 (þÿ») /3 (þÿ<) /4 (þÿ>) >> << /0 42 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 43 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> << /0 44 /1 (þÿ«) /2 (þÿ») /3 (þÿ 9) /4 (þÿ :) >> << /0 45 /1 (þÿ ) /2 (þÿ ) /3 (þÿ ) /4 (þÿ ) >> ] /15 << /0 (þÿHunspell) >> /16 false >> /1 [ << /0 << /0 (þÿ± ) /5 << /0 [ << /0 << /0 1 >> /1 2 >> ] >> /6 << /0 [ << /0 << /0 << /0 (þÿ) /5 0 /6 << /0 0 /1 14.0 /4 false /5 50.0 /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 .87057 0.0 0.0 ] >> >> >> >> >> /1 2 >> ] >> /10 << /0 4 /2 true >> >> /1 << /0 [ << /0 0 >> ] /2 [ << /99 /PC /5 0 /6 [ << /99 /F /10 0 /5 2 /6 [ << /99 /R /6 [ << /99 /R /5 2 /6 [ << /99 /L /14 -11.8501 /15 4.24512 /1 [ 0.0 -11.8501 0.0 4.24512 ] /6 [ << /99 /S /15 << /0 2 /2 0 /5 false >> /6 [ << /99 /G /1 [ 0.0 -11.8501 8.37402 4.24512 ] /5 [ 302 3 ] /8 [ 0.0 -11.8501 8.37402 4.24512 ] /9 [ 0.0 -11.8501 15.09396 4.24512 ] /11 true /12 -11.8501 /13 4.24512 /20 0 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> >> << /0 << /0 (þÿoffsetY ) /5 << /0 [ << /0 << /0 1 >> /1 8 >> ] >> /6 << /0 [ << /0 << /0 << /0 (þÿ) /5 1 /6 << /0 0 /1 18.0 /4 false /5 50.0 /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 .55295 .77646 .24707 ] >> >> >> >> >> /1 8 >> ] >> /7 0 /10 << /0 4 /2 true >> >> /1 << /0 [ << /0 1 >> ] /2 [ << /99 /PC /5 0 /6 [ << /99 /F /10 1 /5 2 /6 [ << /99 /R /6 [ << /99 /R /5 2 /6 [ << /99 /L /14 -15.23584 /15 5.45801 /1 [ 0.0 -15.23584 0.0 5.45801 ] /6 [ << /99 /S /15 << /0 8 /2 0 /5 false >> /6 [ << /99 /G /1 [ 0.0 -15.23584 55.07227 5.45801 ] /5 [ 82 73 73 86 72 87 60 3 ] /8 [ 0.0 -15.23584 57.336 5.45801 ] /9 [ 0.0 -15.23584 63.71219 5.45801 ] /10 << /0 [ << /4 2 /9 0 /10 0 >> << /0 1 /4 2 /9 0 /10 0 >> ] /1 [ 1 7 ] >> /11 true /12 -15.23584 /13 5.45801 /20 0 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> >> << /0 << /0 (þÿcos\(±\) = ) /5 << /0 [ << /0 << /0 1 >> /1 9 >> ] >> /6 << /0 [ << /0 << /0 << /0 (þÿ) /5 1 /6 << /0 0 /1 18.0 /4 false /5 50.0 /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 .36863 .36863 .36863 ] >> >> >> >> >> /1 4 >> << /0 << /0 << /0 (þÿ) /5 1 /6 << /0 0 /1 18.0 /4 false /5 50.0 /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 .87057 0.0 0.0 ] >> >> >> >> >> /1 1 >> << /0 << /0 << /0 (þÿ) /5 1 /6 << /0 0 /1 18.0 /4 false /5 50.0 /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 .36863 .36863 .36863 ] >> >> >> >> >> /1 4 >> ] >> /7 0 /10 << /0 4 /2 true >> >> /1 << /0 [ << /0 2 >> ] /2 [ << /99 /PC /5 0 /6 [ << /99 /F /10 2 /5 2 /6 [ << /99 /R /6 [ << /99 /R /5 2 /6 [ << /99 /L /14 -15.23584 /15 5.45801 /1 [ 0.0 -15.23584 0.0 5.45801 ] /6 [ << /99 /S /15 << /0 9 /2 0 /5 false >> /6 [ << /99 /G /1 [ 0.0 -15.23584 65.77734 5.45801 ] /5 [ 70 82 86 11 302 12 3 32 3 ] /8 [ 0.0 -15.23584 65.77734 5.45801 ] /9 [ 0.0 -15.23584 74.41727 5.45801 ] /10 << /0 [ << /4 2 /9 0 /10 0 >> << /0 1 /4 2 /9 0 /10 0 >> << /0 4 /4 2 /9 0 /10 0 >> << /0 5 /4 2 /9 0 /10 0 >> ] /1 [ 1 3 1 4 ] >> /11 true /12 -15.23584 /13 5.45801 /20 0 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> >> << /0 << /0 (þÿcloseButtonRadius ) /5 << /0 [ << /0 << /0 1 >> /1 18 >> ] >> /6 << /0 [ << /0 << /0 << /0 (þÿ) /5 1 /6 << /0 0 /1 18.0 /4 false /5 50.0 /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 0.0 .68234 .93726 ] >> >> >> >> >> /1 18 >> ] >> /7 0 /10 << /0 4 /2 true >> >> /1 << /0 [ << /0 3 >> ] /2 [ << /99 /PC /5 0 /6 [ << /99 /F /10 3 /5 2 /6 [ << /99 /R /6 [ << /99 /R /5 2 /6 [ << /99 /L /14 -15.23584 /15 5.45801 /1 [ 0.0 -15.23584 0.0 5.45801 ] /6 [ << /99 /S /15 << /0 18 /2 0 /5 false >> /6 [ << /99 /G /1 [ 0.0 -15.23584 150.88184 5.45801 ] /5 [ 70 79 82 86 72 37 88 87 87 82 81 53 68 71 76 88 86 3 ] /8 [ 0.0 -15.23584 150.88184 5.45801 ] /9 [ 0.0 -15.23584 159.52176 5.45801 ] /10 << /0 [ << /4 2 /9 0 /10 0 >> << /0 1 /4 2 /9 0 /10 0 >> ] /1 [ 1 17 ] >> /11 true /12 -15.23584 /13 5.45801 /20 0 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> >> ] /2 << /0 2 /1 12.0 /2 false /3 false /4 true /5 0.0 /6 1.0 /7 1.0 /8 0 /9 0.0 /10 0.0 /11 1 /12 0 /13 0 /14 0 /15 0 /16 0 /17 0.0 /18 true /19 false /20 false /21 false /22 false /23 false /24 false /25 false /26 false /27 false /28 false /29 false /30 0 /31 false /32 false /33 false /34 false /35 2 /36 0.0 /37 2 /38 0 /39 0 /40 false /41 2 /42 0 /43 << /0 .5 >> /44 2 /45 2 /46 7 /47 0 /48 0 /49 -1.0 /50 -1.0 /51 0 /52 false /53 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 0.0 0.0 0.0 ] >> >> /54 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 0.0 0.0 0.0 ] >> >> /55 << /99 /SimpleBlender >> /56 true /57 false /58 true /59 false /60 false /61 0 /62 0 /63 1.0 /64 4.0 /65 0.0 /66 [ ] /67 [ ] /68 0 /69 0 /70 0 /71 4 /72 0.0 /73 0.0 /74 false /75 false /76 false /77 true /78 true /79 << /99 /SimplePaint /0 << /0 1 /1 [ 1.0 1.0 1.0 0.0 ] >> >> /80 false /81 0 /82 3.0 /83 3.0 /84 false /85 0 /86 << /99 /SimpleCustomFeature >> /87 100.0 /88 true >> /3 << /0 0 /1 0.0 /2 0.0 /3 0.0 /4 0.0 /5 0.0 /6 1 /7 1.2 /8 0 /9 true /10 6 /11 2 /12 2 /13 0 /14 36.0 /15 true /16 .5 /17 [ .8 1.0 1.33 ] /18 [ 0.0 0.0 0.0 ] /19 [ 1.0 1.0 1.0 ] /20 6 /21 false /22 0 /23 true /24 0 /25 0 /27 /nil /26 false /28 /nil /29 false /30 << >> /31 36.0 /32 << >> /33 0 /34 7 /35 0 /36 /nil /37 0 /38 false /39 0 /40 2 >> >>8BIMFMsk ÿÿ2"!#$7:9::27::#69>;6=:78"5=25˜ž‘–—’ŸŸ™&"+++,*)((1232221(((((&" "$.&"!#$7:9::27::#69>;6=:78"5=25˜ž‘–—’ŸŸ™&$++,,**'(1232221'((((&%!! "$.&"!#$7:9::27::#69>;6=:78"5=25˜ž‘–—’ŸŸ™&$++,+))''0132111''''(&%!! "$.&ÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿ ÿ ÀÏÿò°äìÿ‘ÿáÿÿ¡ÿ §ÇÝÇò–ÝÇÝíÿ¸ýÏÿëýÝÿáÿÿ¢ÿÇ–ýÿ§°íÿ–°þÿÀ°üÿŸ°ëœÿáÿÿ£ÿø–ÀþÿÝÖîÿäÏþÿø–ŸýÿÖ°šÿáÿÿ£ÿÖÏþÿÀëîÿÖäþÿÿ°äÿÿò§øšÿáÿÿ¬ÿÏ–ÀÿÿäüÏüäø¸þÏþÿÖ§°ÿäüÏÿÿÖÇÿøŸò™ÿáÿÿ­ÿ§ŸÝÿݸþÿ°–ýÿ–°þÿ§¸ÿòŸ§ÿÿÇ–ÖÿÖÖÿÿ–ŸýÿÿòŸÿ°ä˜ÿáÿÿ®ÿÀäþÿŸøÿÿ–ŸþÿëÀÿÿëÏüÿ ÝÖÿÿÇÝÿòÀýÿÿÿ§§Ï—ÿáÿÿ¯ÿò§ýÿ§ëÿòÀþÿ ÖÖÿÿø–Çøþÿ §ŸÿÖÀÏÿÿÖÖýÿÿÿǸ–ÿáÿÿ¯ÿÖÇýÿ–øÿÖÖþÿÀòþÿÝŸÀÿòþ¸ÇøþÿÀòýÿÿÿÀÖ–ÿáÿÿ¯ÿÏÏþÿë°ÿÿÀëþÿŸ–ûÿݧäë¸úÿÿŸüÿÿÿŸò–ÿáÿÿ¯ÿÖÏþÿÀÝÿÿ°–ýÿ–°ÿÿäÖÿÿÝÝëŸýÿ¸ÿò°üÿÿòŸ•ÿáÿÿ¯ÿøŸŸøÿÏÇþÿ–°þÿäÏÿÿÖŸÿÿ¸Ÿÿÿ§Ïÿò°ëÿä°üÿÿÇŸø–ÿáÿÿ®ÿë°°ÝþÿäÏþÿÏäþÿÏ–¸øÿÿò°°òÿÿøŸÇÿÿÏüÏ—ÿáÿÿ¥ÿÏäþÿ°–åÿ‘ÿáÿŽÿ¿‡¿÷ÿÿ““å©ÿÿ§þÿø–Çåÿ‘ÿáÿÿö“‡ÒöÿÿÿŸ^Ü®ÿ ÝÏÖŸòÇäÀ°äÿ‘ÿáÿÿÿ‡ôÿþÿz‡®ÿ 䏸ÿÏÏãÿ‘ÿáÿ‘ÿªmîôÿþÿ´^î‡ÿ‘ÿáÿªÿ´þ^¿þÿɇ^^“îþÿ¿þ^Ÿÿÿå^´üÿòåÞÞîûÞìÿþÿ¿^Ò‡ÿ‘ÿáÿ¬ÿö‡‡åÿ‡^öÿª^¿ÿîzzÿÿª‡öÿ“möÿŸ^îýÿ îÞìÿûãåÞöÿþÿ¿^Ò‡ÿ‘ÿáÿ¬ÿ Ÿ^åÿî^‡ÿÉ^¿þÿª^Òÿm“ûÿm“ýÿôÞéþÿìÞåÿÿþÿ´^Òüÿåù^Ÿ–ÿ‘ÿáÿ­ÿî^“ûÿzmöþÿ´^¿ÿ‡^ŸåþÿÒ^¿ýÿåÞùþÿðÞðÿÿþÿª^åçÿ¡ÌÆÌÌÿáÿ­ÿÉ^´üÿî^‡ýÿ Ÿ^Òÿî“^^“öÿ¿^ÉþÿûÞãýÿðàýÿÿþÿzm†ÿ‘ÿáÿ­ÿ¿^¿üÿå^Ÿýÿzmýÿî“^¿ÿ´^åþÿùÞåýÿãåþÿÿÿî^“ûÿåù^Ÿ–ÿ‘ÿáÿ­ÿÉ^ªþÿîªî^“þÿÉ^´özªÿÿö^´ÿ´^åþÿûÞãþÿòÞåþÿÿÿ¿^Ɇÿ‘ÿáÿ­ÿömmÒÿå‡îÿ“^ÜÿÒm“ÿî^^åÿ¿^åÿ´^åýÿåÞðÿôåããþÿÿÿÿz…ÿ‘ÿáÿ¬ÿ å“^^ŸöÿÿöŸ^^z¿þÿ ɇ^^“åÿÿ¿^Üýÿ ûçÞÞìÿéÞãôÿÿ¿^É…ÿ‘ÿáÿ“ÿî^´òÿåm´„ÿ‘ÿáÿ’ÿ¿^Éôÿ¿^´Öÿ&ª²ÿãÿÝþ´ÿáÿ‘ÿ¿z¿öÿ‡ŸÒÔÿ}ÑæÿÝúªÖÿþÿœû&ªíÿ}¸ÿÿé&X¹ÿáÿÿÓÿ}éåÿé&ÑÿéXœôÿªÑþÿѪíÿýÿÅ&ÿÿÝBªîÿÝÿÿé&k¹ÿáÿÿÓÿÿBãÿÿ&þÿœ}ôÿk&ýÿªÑíÿýÿÑkþÿ}îÿB&³ÿáÿÿÔÿéäÿÑkþÿôÿBkýÿ&ìÿýÿªªþÿîÿ&k³ÿáÿÿÛÿœþªÿÿ¸¸þÿ¸Xkéþÿ ¸Bkéÿÿô&ÅþÿªœþÿB&éÝkXþÿŪÿký&ªüÑÿô&ªÿÿª&œô}ªýÿkÑÿÿé&&éýÿœþœ&Ñþÿª&}ªÿªœÿ¸Bœþÿ œÑÿÿ¸BkéËÿáÿÿÝÿ%ôXXÝÿXôÿéÿÿªÿéBBÿÿ¸&ÝÿœÅÿéBkôÿBBþÿk¸ÿÝkXÝþÿ BôÿÿªÑÿÿª¸þÿÝþÿé&kéÿœªÿÿéBôé&Býÿÿ&ÿÿ¸BBÅþÿôXBÅÿ¸&þÿk¸ÿÝ&ÑÿÿéXÿÿéXþÿ k&ÿÿ¸&ÝÿœÅËÿáÿÿÝÿ}ÝÿéXÿÿBBÿÿ¸ªþÿÅÿ}&ûÿÿXÿÿô&XþÿBý}ÝýÿÿBþÿk&þÿéþÿ¸¸þÿ XBôÿÿéXÿÿÝ}þÿ&BþÿÑýBªüÿ kÑÿÿôkÿÿœ¸þÿk&þÿÝÿÿéþÿ&kÿÿ}&ÆÿáÿÿÞÿékûÿôkÿÿB&ôþÿœªÿœk¸þÿŸôœXXéÿÿéBÿÿôkœÿÿéþÿ&XþÿÿBýÿéÿÿ¸œþÿ ô&ÿÿ¸¸ÿÿéþÿªÿ}ÑýÿÑ}þÿѪÿô&Býÿ&kþÿ¸¸ÿÿ¸¸ÿÿÑœÿÿœk¸ÈÿáÿÿÞÿ¸œûÿѪÿéXýÿ}Åÿÿ}BÝÿBœ¸ýÿ¸þÿÝéÿѸÿÿÝÿÿéýÿÿBþÿÅþÿ ÝXÿÿÑÿÿ¸¸þÿ¸ÿÝXýÿ¸þÿªÑÿÅþÿÑþÿ éÿÿªéÿÿª¸þÿ}BÝÊÿáÿÿÞÿªªûÿªÑÿÝ}ýÿB&üÿkÿ}Ýúÿ¸þÿÑéÿªÑÿÿ¸¸ÿÿ¸¸þÿéþÿ}ÝþÿªªÿÿB&þÿéþÿBéÿÿÅþÿ}Ñþÿk&ÿÿªªþÿ¸¸þÿÿBþÿk&þÿéüÿkÊÿáÿÿÞÿ¸þÿ éÿk&ÿÿékþÿ¸œÿkXþÿÿXÿ}¸þÿÿ¸ÿÿBéþÿ}Xÿÿk&þÿéÿÿÑþÿ¸ªþÿÑþÿX&ôÿékþÿÿBÿÿÿéBþÿô&BþÿÅþÿ&Xÿÿ¸œþÿéÿÿéþÿ&kþÿÿBÿÿkXþÿÿXÊÿáÿÿÞÿ ô&&ÅÿÝXéÿ&&þÿ2kÑÿÅ&kÿÿBªÿÝ&ªÿÅXôÿª}ÿÿÅÝÿÿ}&ÝÿÿXÝÿœ&éÿÿkÑþÿªªþÿÑkÿÿkÅÿÿŪÿÿéXÿÿÿœXýÿ/œÿÿÅ}ÿékXÿÿô&Xôÿ}&éÿÿ¸ÿÿôBÿô}BÿÿBªÿÝ&ªÊÿáÿÿÝÿÝk}ôÿÿªÿô}BªþÿÝkB¸þÿª&&ªÿÿ&û&œôþÿÅk骪ÿªXÝÿÑ&¸ÿÿ¸B}éþÿªÑþÿXXªüÝÿÿÝþ*ôÿª}éXXÅÿÅ&kÝ&ªÿé&kéÿœÿkBÅÝkB¸Éÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿ‘ÿùìà×Îǽ»¸¸»½ÂÇÎ×àìù•ÿáÿÿ•ÿõáÑÀ¾Ë×àéðõúüÿÿüúõðéà×˾ÀÑáõ™ÿáÿÿ˜ÿôÚÂÂÖæ÷ñÿýÿ÷æÖÂÂÚôœÿáÿÿ›ÿúáÇÃÝõíÿùÿõÝÃÇáúŸÿáÿÿÿòÔ½ÖðêÿöÿðÖ½Ôò¡ÿáÿÿŸÿïÑÃãýèÿôÿýãÃÑî£ÿáÿÿ¡ÿóÖÃæþæÿòÿþæÃÖó¥ÿáÿÿ¢ÿÚ¾áþäÿðÿþá¾Ú¦ÿáÿÿ¤ÿç¸ÔûâÿîÿûÔ¸ç¨ÿáÿÿ¥ÿÙÁíàÿìÿíÁÙ©ÿáÿÿ§ÿñÔÒûßÿëÿûÒÔñ«ÿáÿÿ¨ÿäºãÝÿéÿãºä¬ÿáÿÿ©ÿÞ¿ðÜÿèÿð¿Þ­ÿáÿÿªÿÚÄ÷Ûÿçÿ÷ÄÚ®ÿáÿÿ«ÿÙÈúÚÿæÿúÈÙ¯ÿáÿÿ¬ÿÙÉüÙÿåÿüÉÙ°ÿáÿÿ­ÿÙÇüØÿäÿûÇÙ±ÿáÿÿ®ÿÝÅû×ÿãÿûÅݲÿáÿÿ¯ÿå¿÷Öÿâÿ÷Àå³ÿáÿÿ°ÿñºðÕÿáÿðºñ´ÿáÿÿ°ÿÔãÔÿàÿãÔ´ÿáÿÿ±ÿÙÒÓÿßÿÒÙµÿáÿÿ²ÿçÁûÓÿßÿûÁç¶ÿáÿÿ²ÿ¸íÒÿÞÿí¸¶ÿáÿÿ³ÿÚÔÑÿÝÿÔÚ·ÿáÿÿ´ÿó½úÑÿÝÿú½ó¸ÿáÿÿ´ÿÖáÐÿÜÿáÖ¸ÿáÿ™ÿýÞÃ¶í²µ²¦‘ FÄÒñìñôùóÿþÃî¹ÿáÿšÿà´ÓîûíÿµÿÑæ5XÛÛÿÿüÿíÿþü÷ñùôÿæÑ¹ÿáÿ›ÿàºñêÿ¶ÿ ñÃþèmgåÝÿÿüÿêÿüòùõÿþÃñºÿáÿœÿý´ñéÿ¶ÿÔãþÿß^ víßÿÿüÿéÿüñôÿãÔºÿáÿœÿÞÓèÿ·ÿù¾üüÿÕP„óáÿÿüÿèÿ÷ùõÿü¾ù»ÿáÿœÿÃîèÿ·ÿߨùÿÈB’ùãÿÿüÿèÿüôôÿØß»ÿáÿœÿ´ýèÿ·ÿÃô÷ÿº4 ¡ýåÿÿüÿçÿñôÿôûÿáÿœÿ²çÿ¸ÿñÆõÿþ«(+°æÿÿüÿçÿñóÿÆñ¼ÿáÿœÿ²çÿ¸ÿÙÞóÿûœ8¾èÿÿüÿçÿñóÿÞÙ¼ÿáÿœÿ²çÿ¸ÿÂõñÿøFÌòÿ ðÞÞåðÞûÿüÿçÿñóÿõ¼ÿáÿœÿ²çÿ¹ÿõÂîÿó€ UØõÿ éÞöýåÞéÿÿüÿçÿñòÿÂõ½ÿáÿœÿ²çÿ¹ÿáÖìÿëqdâøÿ öÞðÿÿðÞöÿÿüÿçÿñòÿÖá½ÿáÿœÿ²çÿ¹ÿÑæêÿác qëúÿîÞùÿÿîãþÿÿüÿçÿñòÿæÑ½ÿáÿœÿ²çÿ¹ÿÀ÷èÿ×T €óüÿìÞûÿûàçþÿÿüÿçÿñòÿ÷À½ÿáÿœÿ²çÿºÿù¾åÿËFøþÿðÞðòÞÞåþÿÿüÿçÿññÿ¾ù¾ÿáÿœÿ²çÿºÿìËãÿ¾8žûÿÿçÞÞîîÞåýÿüÿçÿññÿËì¾ÿáÿœÿ²çÿºÿà×áÿ°+)¬þøÿÿüÿçÿññÿ×à¾ÿáÿœÿ²çÿºÿ×ààÿý¡ 5»ùÿÿüÿçÿññÿà×¾ÿáÿœÿ²çÿºÿÎéÞÿù’CÉûÿÿüÿçÿññÿê;ÿáÿœÿ²çÿºÿÆñÜÿóƒRÕýÿÿüÿçÿññÿñƾÿáÿœÿ²çÿºÿÁöÚÿ ív `àÿÿüÿçÿññÿöÁ¾ÿáÿœÿ²çÿºÿ¼ûØÿågnéüÿçÿññÿû¼¾ÿáÿœÿ²çÿºÿ¼ûÖÿÛX5úÿçÿññÿü»¾ÿáÿœÿ²çÿºÿ¸ÓÿÏJªúÿçÿñðÿ¸¾ÿáÿœÿ²çÿºÿ¸Éÿçÿñðÿ¸¾ÿáÿœÿ²çÿºÿ¼ûÊÿçÿññÿü»¾ÿáÿœÿ²çÿºÿ¼ûÊÿçÿññÿû¼¾ÿáÿœÿ²çÿºÿÁöÊÿçÿññÿöÁ¾ÿáÿœÿ²çÿºÿÆñÊÿçÿññÿñƾÿáÿœÿ²çÿºÿÎéÊÿçÿññÿê;ÿáÿœÿ²çÿºÿ×àÊÿçÿññÿà×¾ÿáÿœÿ²çÿºÿà×Êÿçÿññÿ×à¾ÿáÿœÿ²çÿºÿìËÊÿçÿññÿËì¾ÿáÿœÿ²çÿºÿù¾Êÿçÿññÿ¾ù¾ÿáÿœÿ²çÿ¹ÿÀ÷Ëÿçÿñòÿ÷À½ÿáÿœÿ²çÿ¹ÿÑæËÿçÿñòÿæÑ½ÿáÿœÿ²çÿ¹ÿáÖËÿçÿñòÿÖá½ÿáÿœÿ²çÿ¹ÿõÂËÿçÿñòÿÂõ½ÿáÿœÿ²çÿ¸ÿÂõÌÿçÿñóÿõ¼ÿáÿœÿ²çÿ¸ÿÙÞÌÿçÿñóÿÞÙ¼ÿáÿœÿ²çÿ¸ÿñÆÌÿçÿñóÿÆñ¼ÿáÿœÿ²çÿ·ÿÃôÍÿçÿñôÿôûÿáÿœÿ²çÿ·ÿߨÍÿçÿñôÿØß»ÿáÿœÿ²çÿ·ÿù¾üÎÿçÿñõÿü¾ù»ÿáÿœÿ²çÿ¶ÿÔãÎÿçÿñõÿãÔºÿáÿœÿ²çÿ¶ÿñÃþÏÿçÿñöÿþÃñºÿáÿœÿ²çÿµÿÑæÏÿçÿñöÿæÑ¹ÿáÿœÿ²çÿµÿîÃþÐÿçÿñ÷ÿþÃî¹ÿáÿœÿ²çÿ´ÿÖáÐÿçÿñ÷ÿâÕ¸ÿáÿœÿ²çÿ´ÿó½úÑÿçÿñøÿû½ò¸ÿáÿœÿ²çÿ³ÿÚÔÑÿçÿñøÿÔÚ·ÿáÿœÿ²çÿ²ÿ¸íÒÿçÿñùÿí¸¶ÿáÿœÿ²çÿ²ÿçÁûÓÿçÿñúÿûÁç¶ÿáÿœÿ²çÿ±ÿÙÒÓÿçÿñúÿÒÙµÿáÿœÿ²çÿ°ÿÔãÔÿçÿñûÿãÔ´ÿáÿœÿ²çÿ°ÿñºðÕÿçÿñüÿñºñ´ÿáÿœÿ²çÿ¯ÿäÀ÷Öÿçÿñýÿ÷Àä³ÿáÿœÿ²çÿ®ÿÝÅû×ÿçÿñþÿûÅݲÿáÿœÿ²çÿ­ÿÙÈüØÿçÿñÿÿüÈÙ±ÿáÿœÿ²çÿ¬ÿÙÉüÙÿçÿñÿüÉÙ°ÿáÿœÿ²çÿ«ÿÙÈûÚÿçÿñûÈÙ¯ÿáÿœÿ²çÿªÿÚÅ÷ÛÿçÿäÅÚ®ÿáÿœÿ²çÿ©ÿÞ¿ðÜÿèÿðŒÞ­ÿáÿœÿ²çÿ¨ÿäºãÝÿéÿ㺟¬ÿáÿœÿ²çÿ§ÿñÔÒûßÿëÿûÒÔñ²¬ÿáÿœÿ²çÿ¥ÿÙÁíàÿìÿíÁÙÿÿ²¬ÿáÿœÿ²çÿ¤ÿç¸ÔûâÿîÿûÔ¸çþÿ²¬ÿáÿœÿ²çÿ¢ÿÚ¾áþäÿðÿþá¾Úüÿ²¬ÿáÿœÿ²çÿ¡ÿóÖÃæþæÿòÿþæÃÖóûÿ²¬ÿáÿœÿ²çÿŸÿîÑÃãýèÿôÿýãÃÑîùÿ²¬ÿáÿœÿ²çÿÿòÔ¾ØôêÿöÿôؾÔò÷ÿ²¬ÿáÿœÿ²çÿ›ÿùßÃÆßõíÿùÿõ߯Ãßùõÿ²¬ÿáÿœÿ²çÿ˜ÿñØÂÂÖæ÷ñÿýÿ÷æÖÂÂØñòÿ²¬ÿáÿœÿ²çÿ•ÿõáÑÀ¾Ë×àêðöúüÿÿüúöðêà×˾ÀÑáõïÿ²¬ÿáÿœÿ²çÿ‘ÿùìà×ÍÇÁ½»¸¸»½ÁÇÍ×àìùëÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ´ýèÿÿèÿû¶¬ÿáÿœÿÃîèÿÿèÿîìÿáÿœÿÞÓèÿÿèÿÓÞ¬ÿáÿœÿý´ñéÿÿéÿñ´ý¬ÿáÿ›ÿàºñêÿÿêÿñºà«ÿáÿšÿà´ÔïüíÿÿíÿüïÔ´àªÿáÿ™ÿýÝÂµí²²í²µÂÝý©ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿ ÿ ÞÆÆåÿøÖÆÆñìÿ‘ÿáÿÿ¡ÿ ÒâíÆâøÊíâÆííÿÚýÆåÿôýÆíÿáÿÿ¢ÿâÊýÿÒÖíÿÊÖþÿÞÆÖüÿÎÖôœÿáÿÿ£ÿûÊÞþÿíÆéîÿñÆåþÿûÊÎýÿéÖšÿáÿÿ£ÿéÆåþÿÞÆôîÿéÆñþÿÿÖÆñÿÿøÒûšÿáÿÿ¬ÿåÊÆÆÞÿÿñüÆåüÆñûÚþÆåþÿéÒÆÆÖÿñüÆåÿÿéÆâÿûÎø™ÿáÿÿ­ÿÒÎíÿíÆÚþÿÖÊýÿÊÖþÿÒÚÿøÎÒÿÿâÊéÿéÆéÿÿÊÎýÿÿøÆÎÿÖñ˜ÿáÿÿ®ÿÞÆñþÿÎÆûÿÿÊÎþÿôÆÞÿÿôÆåüÿ íÆéÿÿâÆíÿøÆÞýÿÿÿÒÆÒå—ÿáÿÿ¯ÿøÆÒýÿÒÆôÿøÆÞþÿ éÆéÿÿûÊÆâûþÿ ÒÎÿéÞÆåÿÿéÆéýÿÿÿâÆÚ–ÿáÿÿ¯ÿéÆâýÿÊÆûÿéÆéþÿÞÆøþÿíÎÆÆÞÿøþÆÚâûþÿÞÆøýÿÿÿÞÆé–ÿáÿÿ¯ÿåÆåþÿôÆÖÿÿÞÆôþÿÎÊûÿíÒÆñôÆÚúÿÿÎüÿÿÿÎÆø–ÿáÿÿ¯ÿéÆåþÿÞÆíÿÿÖÊýÿÊÖÿÿñÆéÿÿíÆíôÆÎýÿÚÿøÆÖüÿÿøÆÎ•ÿáÿÿ¯ÿûÎÎûÿåÆâþÿÊÖþÿñÆåÿÿéÆÎÿÿÚÎÿÿÒÆåÿøÖôÿñÆÖüÿÿâÆÎû–ÿáÿÿ®ÿôÖÆÆÖíþÿñÆåþÿåÆñþÿåÊÆÆÚûÿÿøÖÆÆÖøÿÿûÎÆÆâÿÿåüÆå—ÿáÿÿ¥ÿåÆñþÿÖÊåÿ‘ÿáÿŽÿ¿‡¿÷ÿÿ““å©ÿÿÒþÿûÊâåÿ‘ÿáÿÿö“‡ÒöÿÿÿŸ^Ü®ÿ íÆåéÎøâÆñÞÖäÿ‘ÿáÿÿÿ‡ôÿþÿz‡®ÿ ñÆÆÚûÿ寯åãÿ‘ÿáÿ‘ÿªmîôÿþÿ´^î‡ÿ‘ÿáÿªÿ´þ^¿þÿɇ^^“îþÿ¿þ^Ÿÿÿå^´üÿ¸Xœéÿþÿ¿^Ò‡ÿ‘ÿáÿ¬ÿö‡‡åÿ‡^öÿª^¿ÿîzzÿÿª‡öÿ“möÿŸ^îýÿ œÿéBXÑÿþÿ¿^Ò‡ÿ‘ÿáÿ¬ÿ Ÿ^åÿî^‡ÿÉ^¿þÿª^Òÿm“ûÿm“ýÿÅ}þÿXÿÿþÿ´^Òüÿåù^Ÿ–ÿ‘ÿáÿ­ÿî^“ûÿzmöþÿ´^¿ÿ‡^ŸåþÿÒ^¿ýÿXÝþÿªªÿÿþÿª^åçÿ¡ÌÆÌÌÿáÿ­ÿÉ^´üÿî^‡ýÿ Ÿ^Òÿî“^^“öÿ¿^ÉþÿéBýÿª&ôÿÿþÿzm†ÿ‘ÿáÿ­ÿ¿^¿üÿå^Ÿýÿzmýÿî“^¿ÿ´^åþÿÝXýÿBXþÿÿÿî^“ûÿåù^Ÿ–ÿ‘ÿáÿ­ÿÉ^ªþÿîªî^“þÿÉ^´özªÿÿö^´ÿ´^åþÿéBþÿ¸Xþÿÿÿ¿^Ɇÿ‘ÿáÿ­ÿömmÒÿå‡îÿ“^ÜÿÒm“ÿî^^åÿ¿^åÿ´^åýÿXªÿÅXBBþÿÿÿÿz…ÿ‘ÿáÿ¬ÿ å“^^ŸöÿÿöŸ^^z¿þÿ ɇ^^“åÿÿ¿^Üýÿ ékÿ}BÅÿÿ¿^É…ÿ‘ÿáÿ“ÿî^´òÿåm´„ÿ‘ÿáÿ’ÿ¿^Éôÿ¿^´Öÿ´®®Ü²ÿãÿðþ®Ñ´ÿáÿ‘ÿ¿z¿öÿ‡ŸÒÔÿË®ëæÿðú®ÜÖÿþÿÖû®´ÜíÿË®áÿÿõ´À¹ÿáÿÿÓÿË®õåÿõ´®ëÿõÀ®ÖôÿÜ®ëþÿë®Üíÿýÿæ®´ÿÿðº®ÜîÿÑ®ðÿÿõ´Æ¹ÿáÿÿÓÿÿºãÿÿ´þÿÖ®ËôÿÆ´ýÿÜ®ëíÿýÿë®ÆþÿÑ®Ëîÿº´³ÿáÿÿÔÿõ®Ñäÿë®ÆþÿÑ®ÑôÿºÆýÿÑ´ìÿýÿÜ®ÜþÿÑ®Ñîÿ´Æ³ÿáÿÿÛÿÖþ®Üÿÿá®áþÿáÀ®®Æõþÿ Ắ®ÆõÿÿúÑ®®´æþÿÜ®Öþÿº´õðÆ®Àþÿæ®ÜÿÆý®´Üü®ëÿúÑ®®´ÜÿÿÜ´®ÖúË®®ÜýÿÆ®ëÿÿõ´´õýÿÖþ®Ö´ëþÿÜ´®®Ë®ÜÿÜ®®ÖÿẮÖþÿ Ö®ëÿÿẮ®ÆõËÿáÿÿÝÿ%úÀÀðÿÀ®úÿÑ®õÿÿÑ®Üÿõººÿÿá´ðÿÖ®æÿõºÆúÿººþÿÆ®áÿðÆÀðþÿ º®úÿÿÜ®ëÿÿÜ®áþÿð®Ñþÿõ´ÆõÿÖ®Üÿÿõ®ºÑúõ´ºýÿÿ´ÿÿẺæþÿúÀºæÿá®´þÿÆ®áÿð´®ëÿÿõ®Àÿÿõ®Àþÿ Æ´ÿÿá´ðÿÖ®æËÿáÿÿÝÿË®ðÿõ®Àÿÿººÿÿá®ÜþÿÑ®æÿË´ûÿÿÀÿÿú´Àþÿºý®ËðýÿÿºþÿÆ´þÿÑ®õþÿá®áþÿ Àºúÿÿõ®Àÿÿð®Ëþÿ´ºþÿëý®ºÜüÿ Æ®ëÿÿú®ÆÿÿÖ®áþÿÆ´þÿð®Ñÿÿõ®Ñþÿ´ÆÿÿË´ÆÿáÿÿÞÿõ®Æûÿú®Æÿÿº´úþÿÖ®ÜÿÖ®Æáþÿæ®áúÖÀÀõÿÿõ®ºÿÿúÆ®Öÿÿõ®Ñþÿ´ÀþÿÿºýÿÑ®õÿÿá®Öþÿ ú®´ÿÿá®áÿÿõ®ÑþÿÜ®ÑÿË®ëýÿë®Ëþÿë®Üÿú´ºýÿ´Æþÿá®áÿÿá®áÿÿë®ÖÿÿÖ®ÆáÈÿáÿÿÞÿá®Öûÿë®Üÿõ®ÀýÿË®æÿÿË®®ºðÿÑ®®ºÖáýÿá®Ñþÿð®®õÿë®áÿÿð®Ñÿÿõ®ÑýÿÿºþÿÑ®æþÿ ð®ÀÿÿÑ®ëÿÿá®áþÿÑ®áÿð®ÀýÿÑ®áþÿÜ®ëÿæ®Ñþÿë®Ñþÿ Ñ®õÿÿÜ®õÿÿÜ®áþÿË®®ºðÊÿáÿÿÞÿÜ®ÜûÿÜ®ëÿð®Ëýÿº´üÿÑ®ÆÿË®ðúÿÑ®áþÿë®®õÿÜ®ëÿÿá®áÿÿá®áþÿõ®ÑþÿË®ðþÿÜ®Üÿÿº´þÿÑ®õþÿº®õÿÿÑ®æþÿË®ëþÿÆ´ÿÿÜ®Üþÿá®áþÿÿºþÿÆ´þÿÑ®õüÿÑ®ÆÊÿáÿÿÞÿá®Ñþÿ õÑÿÆ´ÿÿõ®Æþÿá®ÖÿÆÀþÿÿÀÿË®áþÿÿáÿÿº®õþÿË®ÀÿÿÆ´þÿÑ®õÿÿÑ®ëþÿá®ÜþÿÑ®ëþÿÀ´úÿõ®Æþÿÿºÿÿÿõ®ºþÿú´ºþÿÑ®æþÿ´Àÿÿá®ÖþÿÑ®õÿÿõ®Ñþÿ´ÆþÿÿºÿÿÆÀþÿÿÀÊÿáÿÿÞÿ ú´´æÿðÀõÿ´´þÿ2Æ®ëÿæ´Æÿÿº®Üÿð´Üÿæ®ÀúÿÜËÿÿæ®®ðÿÿË®´ðÿÿÀ®ðÿÖ´®õÿÿÆ®ëþÿÜ®Üþÿë®ÆÿÿÆ®æÿÿæ®Üÿÿõ®ÀÿÿÿÖ®Àýÿ/Ö®Ñÿÿæ®ËÿõÆ®Àÿÿú´ÀúÿË´®õÿÿá®Ñÿÿú®ºÿúË®ºÿÿº®Üÿð´ÜÊÿáÿÿÝÿðÆ®®ËúÿÿÑ®®ÜÿúË®®ºÜþÿðÆ®®ºáþÿÜ´®´Üÿÿ´û®´Öúþÿæ®®ÆõÜ®®ÜÿÜ®®Àðÿë®®´áÿÿẮ®ËõþÿÜ®ëþÿÀ®ÀÜü®ðÿÿðþ®*úÿÜ®®ËõÀ®Àæÿæ´®ÆðÑ®´Üÿõ´®ÆõÿÖ®®ÑÿÆ®ºæðÆ®®ºáÉÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿ‘ÿùìà×Îǽ»¸¸»½ÂÇÎ×àìù•ÿáÿÿ•ÿõáÑÀ½ÉÔÜäêïôõøøõôïêäÜÔɽÀÑáõ™ÿáÿÿ˜ÿôÚÂÁÓâðñøýøðâÓÁÂÚôœÿáÿÿ›ÿúáÇÂÙïíøùøïÙÂÇáúŸÿáÿÿÿòÔ½ÓêêøöøêÓ½Ôò¡ÿáÿÿŸÿïÑÂÞöèøôøöÞÂÑî£ÿáÿÿ¡ÿóÖÂá÷æøòø÷áÂÖó¥ÿáÿÿ¢ÿÚ½Ý÷äøðø÷ݽڦÿáÿÿ¤ÿç¸ÑôâøîøôѸç¨ÿáÿÿ¥ÿÙÀèàøìøèÀÙ©ÿáÿÿ§ÿñÔÏôßøëøôÏÔñ«ÿáÿÿ¨ÿäºßÝøéøߺä¬ÿáÿÿ©ÿÞ¾ëÜøèøë¾Þ­ÿáÿÿªÿÚÃðÛøçøðÃÚ®ÿáÿÿ«ÿÙÆôÚøæøôÆÙ¯ÿáÿÿ¬ÿÙÈõÙøåøõÈÙ°ÿáÿÿ­ÿÙÆõØøäøõÆÙ±ÿáÿÿ®ÿÝÃô×øãøôÃݲÿáÿÿ¯ÿå¿ñÖøâøñ¿å³ÿáÿÿ°ÿñºêÕøáøêºñ´ÿáÿÿ°ÿÔßÔøàøßÔ´ÿáÿÿ±ÿÙÏÓøßøÏÙµÿáÿÿ²ÿçÀôÓøßøôÀç¶ÿáÿÿ²ÿ¸èÒøÞø踶ÿáÿÿ³ÿÚÑÑøÝøÑÚ·ÿáÿÿ´ÿó½óÑøÝøô½ó¸ÿáÿÿ´ÿÖÝÐøÜøÝÖ¸ÿáÿ™ÿýÞÃ¶í²µ²¦Ô¿ÞÒéíéêìñ÷ôø÷Âî¹ÿáÿšÿà´ÓîûíÿµÿÑá½®¯ÈîÛøÿÆüøíø÷ôïêòôøâѹÿáÿ›ÿàºñêÿ¶ÿ ñÂ÷ñΰ®¯ÌðÝøÿÆüøêøõëòõø÷Âñºÿáÿœÿý´ñéÿ¶ÿÔßþøïɯ®±ÐóßøÿÆüøéøõê÷õøßÔºÿáÿœÿÞÓèÿ·ÿù½öüøìÅ®®³ÔõáøÿÆüøèøïñõøö½ù»ÿáÿœÿÃîèÿ·ÿßÕùøèÁ®®µØöãøÿÆüøèøôìôøÕß»ÿáÿœÿ´ýèÿ·ÿÃî÷øä½®®·Ý÷åøÿÆüøèø÷êôøîûÿáÿœÿ²çÿ¸ÿñÅôøຮ®ºáæøÿÆüøçøéóøÅñ¼ÿáÿœÿ²çÿ¸ÿÙÚóø÷Û·®®¾åèøÿÆüøçøéóøÚÙ¼ÿáÿœÿ²çÿ¸ÿÂïñøö×´®®Âéòø ¥U¥âøÆÆüøçøéóøï¼ÿáÿœÿ²çÿ¹ÿõÁîøõÓ²®®Çíõø yËíUyøøÆÆüøçøéòøÁõ½ÿáÿœÿ²çÿ¹ÿáÓìøòϰ®¯Ëðøø Ë¥øø¥ËøøÆÆüøçøéòøÓá½ÿáÿœÿ²çÿ¹ÿÑâêøï˯®±Ïòúø—×øø—@þøÿÆüøçøéòøâѽÿáÿœÿ²çÿ¹ÿÀñèøìÆ®®²Óõüø‰âøâ%hþøÿÆüøçøéòøñÀ½ÿáÿœÿ²çÿºÿù½åøé®®´×öþø¥¥²UþøÿÆüøçøéñø½ù¾ÿáÿœÿ²çÿºÿìÉãøå¾®®·Ü÷øøh——UíøÆÆüøçøéñøÉì¾ÿáÿœÿ²çÿºÿàÔáøẮ®ºà÷øÿÆüøçøéñøÔà¾ÿáÿœÿ²çÿºÿ×Üàø÷Ý·®®½äùøÿÆüøçøéñøÜ×¾ÿáÿœÿ²çÿºÿÎäÞøöص®®ÁèûøÿÆüøçøéñøå;ÿáÿœÿ²çÿºÿÆëÜøõÔ³®®ÆìýøÿÆüøçøéñøëƾÿáÿœÿ²çÿºÿÁðÚø óб®¯ÊïøøÆÆüøçøéñøðÁ¾ÿáÿœÿ²çÿºÿ¼ôØøð̯®°ÎòÆÆüøçøéñøô¼¾ÿáÿœÿ²çÿºÿ¼õÖøîȯ®¯±ýøçøéñøõ»¾ÿáÿœÿ²çÿºÿ¸ÓøêÃJýøçøéðø¸¾ÿáÿœÿ²çÿºÿ¸Ñøýøçøéðø¸¾ÿáÿœÿ²çÿºÿ¼õÒø°°ýøçøéñøõ»¾ÿáÿœÿ²çÿºÿ¼ôÊøçøéñøô¼¾ÿáÿœÿ²çÿºÿÁðÊøçøéñøðÁ¾ÿáÿœÿ²çÿºÿÆëÊøçøéñøëƾÿáÿœÿ²çÿºÿÎäÊøçøéñøå;ÿáÿœÿ²çÿºÿ×ÜÊøçøéñøÜ×¾ÿáÿœÿ²çÿºÿàÔÊøçøéñøÔà¾ÿáÿœÿ²çÿºÿìÉÊøçøéñøÉì¾ÿáÿœÿ²çÿºÿù½Êøçøéñø¾ù¾ÿáÿœÿ²çÿ¹ÿÀñËøçøéòøñÀ½ÿáÿœÿ²çÿ¹ÿÑâËøçøéòøâѽÿáÿœÿ²çÿ¹ÿáÓËøçøéòøÓá½ÿáÿœÿ²çÿ¹ÿõÁËøçøéòøÁõ½ÿáÿœÿ²çÿ¸ÿÂïÌøçøéóøï¼ÿáÿœÿ²çÿ¸ÿÙÛÌøçøéóøÚÙ¼ÿáÿœÿ²çÿ¸ÿñÅÌøçøéóøÅñ¼ÿáÿœÿ²çÿ·ÿÃîÍøçøéôøîûÿáÿœÿ²çÿ·ÿßÕÍøçøéôøÕß»ÿáÿœÿ²çÿ·ÿù½öÎøçøéõøö½ù»ÿáÿœÿ²çÿ¶ÿÔßÎøçøéõøßÔºÿáÿœÿ²çÿ¶ÿñÂ÷Ïøçøéöø÷Âñºÿáÿœÿ²çÿµÿÑâÏøçøéöøâѹÿáÿœÿ²çÿµÿîÂ÷Ðøçøé÷ø÷Âî¹ÿáÿœÿ²çÿ´ÿÖÝÐøçøé÷øÞÕ¸ÿáÿœÿ²çÿ´ÿó½ôÑøçøéøøô½ò¸ÿáÿœÿ²çÿ³ÿÚÑÑøçøéøøÑÚ·ÿáÿœÿ²çÿ²ÿ¸èÒøçøéùø踶ÿáÿœÿ²çÿ²ÿçÀôÓøçøéúøôÀç¶ÿáÿœÿ²çÿ±ÿÙÏÓøçøéúøÏÙµÿáÿœÿ²çÿ°ÿÔßÔøçøéûøßÔ´ÿáÿœÿ²çÿ°ÿñºêÕøçøéüøëºñ´ÿáÿœÿ²çÿ¯ÿä¿ñÖøçøéýøñ¿ä³ÿáÿœÿ²çÿ®ÿÝÃô×øçøéþøôÃݲÿáÿœÿ²çÿ­ÿÙÆõØøçøéøøõÆÙ±ÿáÿœÿ²çÿ¬ÿÙÈõÙøçøéøõÈÙ°ÿáÿœÿ²çÿ«ÿÙÆôÚøçøéôÆÙ¯ÿáÿœÿ²çÿªÿÚÃðÛøçøÝÃÚ®ÿáÿœÿ²çÿ©ÿÞ¾ëÜøèøë‹Þ­ÿáÿœÿ²çÿ¨ÿäºßÝøéøߺŸ¬ÿáÿœÿ²çÿ§ÿñÔÏôßøëøôÏÔñ²¬ÿáÿœÿ²çÿ¥ÿÙÁèàøìøèÁÙÿÿ²¬ÿáÿœÿ²çÿ¤ÿç¸ÑôâøîøôѸçþÿ²¬ÿáÿœÿ²çÿ¢ÿÚ½Ý÷äøðø÷ݽÚüÿ²¬ÿáÿœÿ²çÿ¡ÿóÖÂá÷æøòø÷âÂÖóûÿ²¬ÿáÿœÿ²çÿŸÿîÑÂÞöèøôøöÞÂÑîùÿ²¬ÿáÿœÿ²çÿÿòÔ½ÕîêøöøîÕ½Ôò÷ÿ²¬ÿáÿœÿ²çÿ›ÿùßÃÅÛïíøùøïÛÅÃßùõÿ²¬ÿáÿœÿ²çÿ˜ÿñØÂÁÓâññøýøñâÓÁÂØñòÿ²¬ÿáÿœÿ²çÿ•ÿõáÑÀ¾ÉÔÜåêïôõøøõôïêåÜÔɾÀÑáõïÿ²¬ÿáÿœÿ²çÿ‘ÿùìà×ÍÇÁ½»¸¸»½ÁÇÍ×àìùëÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ´ýèÿÿèÿû¶¬ÿáÿœÿÃîèÿÿèÿîìÿáÿœÿÞÓèÿÿèÿÓÞ¬ÿáÿœÿý´ñéÿÿéÿñ´ý¬ÿáÿ›ÿàºñêÿÿêÿñºà«ÿáÿšÿà´ÔïüíÿÿíÿüïÔ´àªÿáÿ™ÿýÝÂµí²²í²µÂÝý©ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿ ÿ ž??¶ÿìƒ??×ìÿ‘ÿáÿÿ¡ÿ tªÌ?ªìS̪?Ìíÿ‘ý?¶ÿâý?Ìÿáÿÿ¢ÿªSýÿtƒíÿSƒþÿž?ƒüÿdƒâœÿáÿÿ£ÿõSžþÿÌ?Áîÿ×?¶þÿõSdýÿÁƒšÿáÿÿ£ÿÁ?¶þÿž?âîÿÁ?×þÿÿƒ?×ÿÿìtõšÿáÿÿ¬ÿ¶S??žÿÿ×ü?¶ü?×õ‘þ?¶þÿÁt??ƒÿ×ü?¶ÿÿÁ?ªÿõdì™ÿáÿÿ­ÿtdÌÿÌ?‘þÿƒSýÿSƒþÿt‘ÿìdtÿÿªSÁÿÁ?ÁÿÿSdýÿÿì?dÿƒ×˜ÿáÿÿ®ÿž?×þÿd?õÿÿSdþÿâ?žÿÿâ?¶üÿ Ì?Áÿÿª?Ìÿì?žýÿÿÿt?t¶—ÿáÿÿ¯ÿì?týÿt?âÿì?žþÿ Á?ÁÿÿõS?ªõþÿ tdÿÁž?¶ÿÿÁ?Áýÿÿÿª?‘–ÿáÿÿ¯ÿÁ?ªýÿS?õÿÁ?Áþÿž?ìþÿÌd??žÿìþ?‘ªõþÿž?ìýÿÿÿž?Á–ÿáÿÿ¯ÿ¶?¶þÿâ?ƒÿÿž?âþÿdSûÿÌt?×â?‘úÿÿdüÿÿÿd?ì–ÿáÿÿ¯ÿÁ?¶þÿž?ÌÿÿƒSýÿSƒÿÿ×?ÁÿÿÌ?Ìâ?dýÿ‘ÿì?ƒüÿÿì?d•ÿáÿÿ¯ÿõddõÿ¶?ªþÿSƒþÿ×?¶ÿÿÁ?dÿÿ‘dÿÿt?¶ÿìƒâÿ×?ƒüÿÿª?dõ–ÿáÿÿ®ÿâƒ??ƒÌþÿ×?¶þÿ¶?×þÿ¶S??‘õÿÿìƒ??ƒìÿÿõd??ªÿÿ¶ü?¶—ÿáÿÿ¥ÿ¶?×þÿƒSåÿ‘ÿáÿŽÿ¿‡¿÷ÿÿ““å©ÿÿtþÿõSªåÿ‘ÿáÿÿö“‡ÒöÿÿÿŸ^Ü®ÿ Ì?¶Ádìª?מƒäÿ‘ÿáÿÿÿ‡ôÿþÿz‡®ÿ ×??‘õÿ¶??¶ãÿ‘ÿáÿ‘ÿªmîôÿþÿ´^î‡ÿ‘ÿáÿªÿ´þ^¿þÿɇ^^“îþÿ¿þ^Ÿÿÿå^´üÿ¸Xœéÿþÿ¿^Ò‡ÿ‘ÿáÿ¬ÿö‡‡åÿ‡^öÿª^¿ÿîzzÿÿª‡öÿ“möÿŸ^îýÿ œÿéBXÑÿþÿ¿^Ò‡ÿ‘ÿáÿ¬ÿ Ÿ^åÿî^‡ÿÉ^¿þÿª^Òÿm“ûÿm“ýÿÅ}þÿXÿÿþÿ´^Òüÿåù^Ÿ–ÿ‘ÿáÿ­ÿî^“ûÿzmöþÿ´^¿ÿ‡^ŸåþÿÒ^¿ýÿXÝþÿªªÿÿþÿª^åçÿ¡ÌÆÌÌÿáÿ­ÿÉ^´üÿî^‡ýÿ Ÿ^Òÿî“^^“öÿ¿^ÉþÿéBýÿª&ôÿÿþÿzm†ÿ‘ÿáÿ­ÿ¿^¿üÿå^Ÿýÿzmýÿî“^¿ÿ´^åþÿÝXýÿBXþÿÿÿî^“ûÿåù^Ÿ–ÿ‘ÿáÿ­ÿÉ^ªþÿîªî^“þÿÉ^´özªÿÿö^´ÿ´^åþÿéBþÿ¸Xþÿÿÿ¿^Ɇÿ‘ÿáÿ­ÿömmÒÿå‡îÿ“^ÜÿÒm“ÿî^^åÿ¿^åÿ´^åýÿXªÿÅXBBþÿÿÿÿz…ÿ‘ÿáÿ¬ÿ å“^^ŸöÿÿöŸ^^z¿þÿ ɇ^^“åÿÿ¿^Üýÿ ékÿ}BÅÿÿ¿^É…ÿ‘ÿáÿ“ÿî^´òÿåm´„ÿ‘ÿáÿ’ÿ¿^Éôÿ¿^´Öÿðïïø²ÿãÿüþïõ´ÿáÿ‘ÿ¿z¿öÿ‡ŸÒÔÿôïûæÿüúïøÖÿþÿ÷ûïðøíÿôïùÿÿýðò¹ÿáÿÿÓÿôïýåÿýðïûÿýòï÷ôÿøïûþÿûïøíÿýÿúïðÿÿüñïøîÿõïüÿÿýðó¹ÿáÿÿÓÿÿñãÿÿðþÿ÷ïôôÿóðýÿøïûíÿýÿûïóþÿõïôîÿñð³ÿáÿÿÔÿýïõäÿûïóþÿõïõôÿñóýÿõðìÿýÿøïøþÿõïõîÿðó³ÿáÿÿÛÿ÷þïøÿÿùïùþÿùòïïóýþÿ ùñïïóýÿÿþõïïðúþÿøï÷þÿñðýüóïòþÿúïøÿóýïðøüïûÿþõïïðøÿÿøðï÷þôïïøýÿóïûÿÿýððýýÿ÷þï÷ðûþÿøðïïôïøÿøïï÷ÿùñï÷þÿ ÷ïûÿÿùñïïóýËÿáÿÿÝÿ%þòòüÿòïþÿõïýÿÿõïøÿýññÿÿùðüÿ÷ïúÿýñóþÿññþÿóïùÿüóòüþÿ ñïþÿÿøïûÿÿøïùþÿüïõþÿýðóýÿ÷ïøÿÿýïñõþýðñýÿÿðÿÿùññúþÿþòñúÿùïðþÿóïùÿüðïûÿÿýïòÿÿýïòþÿ óðÿÿùðüÿ÷ïúËÿáÿÿÝÿôïüÿýïòÿÿññÿÿùïøþÿõïúÿôðûÿÿòÿÿþðòþÿñýïôüýÿÿñþÿóðþÿõïýþÿùïùþÿ òñþÿÿýïòÿÿüïôþÿðñþÿûýïñøüÿ óïûÿÿþïóÿÿ÷ïùþÿóðþÿüïõÿÿýïõþÿðóÿÿôðÆÿáÿÿÞÿýïóûÿþïóÿÿñðþþÿ÷ïøÿ÷ïóùþÿúïùþ÷òòýÿÿýïñÿÿþóï÷ÿÿýïõþÿðòþÿÿñýÿõïýÿÿùï÷þÿ þïðÿÿùïùÿÿýïõþÿøïõÿôïûýÿûïôþÿûïøÿþðñýÿðóþÿùïùÿÿùïùÿÿûï÷ÿÿ÷ïóùÈÿáÿÿÞÿùï÷ûÿûïøÿýïòýÿôïúÿÿôïïñüÿõïïñ÷ùýÿùïõþÿüïïýÿûïùÿÿüïõÿÿýïõýÿÿñþÿõïúþÿ üïòÿÿõïûÿÿùïùþÿõïùÿüïòýÿõïùþÿøïûÿúïõþÿûïõþÿ õïýÿÿøïýÿÿøïùþÿôïïñüÊÿáÿÿÞÿøïøûÿøïûÿüïôýÿñðüÿõïóÿôïüúÿõïùþÿûïïýÿøïûÿÿùïùÿÿùïùþÿýïõþÿôïüþÿøïøÿÿñðþÿõïýþÿñïýÿÿõïúþÿôïûþÿóðÿÿøïøþÿùïùþÿÿñþÿóðþÿõïýüÿõïóÊÿáÿÿÞÿùïõþÿ ýõÿóðÿÿýïóþÿùï÷ÿóòþÿÿòÿôïùþÿÿùÿÿñïýþÿôïòÿÿóðþÿõïýÿÿõïûþÿùïøþÿõïûþÿòðþÿýïóþÿÿñÿÿÿýïñþÿþðñþÿõïúþÿðòÿÿùï÷þÿõïýÿÿýïõþÿðóþÿÿñÿÿóòþÿÿòÊÿáÿÿÞÿ þððúÿüòýÿððþÿ2óïûÿúðóÿÿñïøÿüðøÿúïòþÿøôÿÿúïïüÿÿôïðüÿÿòïüÿ÷ðïýÿÿóïûþÿøïøþÿûïóÿÿóïúÿÿúïøÿÿýïòÿÿÿ÷ïòýÿ/÷ïõÿÿúïôÿýóïòÿÿþðòþÿôðïýÿÿùïõÿÿþïñÿþôïñÿÿñïøÿüðøÊÿáÿÿÝÿüóïïôþÿÿõïïøÿþôïïñøþÿüóïïñùþÿøðïðøÿÿðûïð÷þþÿúïïóýøïïøÿøïïòüÿûïïðùÿÿùñïïôýþÿøïûþÿòïòøüïüÿÿüþï*þÿøïïôýòïòúÿúðïóüõïðøÿýðïóýÿ÷ïïõÿóïñúüóïïñùÉÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿ‘ÿùìà×Îǽ»¸¸»½ÂÇÎ×àìù•ÿáÿÿ•ÿõáÑÀ½ÉÔÜäêïôõøøõôïêäÜÔɽÀÑáõ™ÿáÿÿ˜ÿôÚÂÁÓâðñøýøðâÓÁÂÚôœÿáÿÿ›ÿúáÇÂÙïíøùøïÙÂÇáúŸÿáÿÿÿòÔ½ÓêêøöøêÓ½Ôò¡ÿáÿÿŸÿïÑÂÞöèøôøöÞÂÑî£ÿáÿÿ¡ÿóÖÂá÷æøòø÷áÂÖó¥ÿáÿÿ¢ÿÚ½Ý÷äøðø÷ݽڦÿáÿÿ¤ÿç¸ÑôâøîøôѸç¨ÿáÿÿ¥ÿÙÀèàøìøèÀÙ©ÿáÿÿ§ÿñÔÏôßøëøôÏÔñ«ÿáÿÿ¨ÿäºßÝøéøߺä¬ÿáÿÿ©ÿÞ¾ëÜøèøë¾Þ­ÿáÿÿªÿÚÃðÛøçøðÃÚ®ÿáÿÿ«ÿÙÆôÚøæøôÆÙ¯ÿáÿÿ¬ÿÙÈõÙøåøõÈÙ°ÿáÿÿ­ÿÙÆõØøäøõÆÙ±ÿáÿÿ®ÿÝÃô×øãøôÃݲÿáÿÿ¯ÿå¿ñÖøâøñ¿å³ÿáÿÿ°ÿñºêÕøáøêºñ´ÿáÿÿ°ÿÔßÔøàøßÔ´ÿáÿÿ±ÿÙÏÓøßøÏÙµÿáÿÿ²ÿçÀôÓøßøôÀç¶ÿáÿÿ²ÿ¸èÒøÞø踶ÿáÿÿ³ÿÚÑÑøÝøÑÚ·ÿáÿÿ´ÿó½óÑøÝøô½ó¸ÿáÿÿ´ÿÖÝÐøÜøÝÖ¸ÿáÿ™ÿýÞÃ¶í²µ²¦êíêÒéíéêìñ÷ôø÷Âî¹ÿáÿšÿà´ÓîûíÿµÿÑáñïïò÷Ûøÿ?üøíø÷ôïêòôøâѹÿáÿ›ÿàºñêÿ¶ÿñÂ÷÷óþïó÷Ýøÿ?üøêøõëòõø÷Âñºÿáÿœÿý´ñéÿ¶ÿÔßþø÷òþïó÷ßøÿ?üøéøõê÷õøßÔºÿáÿœÿÞÓèÿ·ÿù½öüø÷òïïðôàøÿ?üøèøïñõøö½ù»ÿáÿœÿÃîèÿ·ÿßÕùøöñïïðôâøÿ?üøèøôìôøÕß»ÿáÿœÿ´ýèÿ·ÿÃî÷øöñïïðõäøÿ?üøèø÷êôøîûÿáÿœÿ²çÿ¸ÿñÅôøõðïïñõæøÿ?üøçøéóøÅñ¼ÿáÿœÿ²çÿ¸ÿÙÚòøõðïïñöèøÿ?üøçøéóøÚÙ¼ÿáÿœÿ²çÿ¸ÿÂïðøôðïïñöòø ¥U¥âø??üøçøéóøï¼ÿáÿœÿ²çÿ¹ÿõÁíøôþïò÷õø yËíUyøø??üøçøéòøÁõ½ÿáÿœÿ²çÿ¹ÿáÓìø÷óþïó÷øø Ë¥øø¥Ëøø??üøçøéòøÓá½ÿáÿœÿ²çÿ¹ÿÑâêø÷òþïó÷úø—×øø—@þøÿ?üøçøéòøâѽÿáÿœÿ²çÿ¹ÿÀñèø÷òþïôûø‰âøâ%hþøÿ?üøçøéòøñÀ½ÿáÿœÿ²çÿºÿù½åøöñïïðôýø¥¥²Uþøÿ?üøçøéñø½ù¾ÿáÿœÿ²çÿºÿìÉãøöñïïðõþø h——Uíø??üøçøéñøÉì¾ÿáÿœÿ²çÿºÿàÔáøõñïïðõ÷øÿ?üøçøéñøÔà¾ÿáÿœÿ²çÿºÿ×Üßøõðïïñöùøÿ?üøçøéñøÜ×¾ÿáÿœÿ²çÿºÿÎäÝøôðïïñöûøÿ?üøçøéñøå;ÿáÿœÿ²çÿºÿÆëÛøôðïïò÷ýøÿ?üøçøéñøëƾÿáÿœÿ²çÿºÿÁðÚø÷óþïò÷øø??üøçøéñøðÁ¾ÿáÿœÿ²çÿºÿ¼ôØø÷óþïó÷??üøçøéñøô¼¾ÿáÿœÿ²çÿºÿ¼õÖø÷òïïâ±ýøçøéñøõ»¾ÿáÿœÿ²çÿºÿ¸Óøöò`ýøçøéðø¸¾ÿáÿœÿ²çÿºÿ¸Ñøýøçøéðø¸¾ÿáÿœÿ²çÿºÿ¼õÒø°°ýøçøéñøõ»¾ÿáÿœÿ²çÿºÿ¼ôÊøçøéñøô¼¾ÿáÿœÿ²çÿºÿÁðÊøçøéñøðÁ¾ÿáÿœÿ²çÿºÿÆëÊøçøéñøëƾÿáÿœÿ²çÿºÿÎäÊøçøéñøå;ÿáÿœÿ²çÿºÿ×ÜÊøçøéñøÜ×¾ÿáÿœÿ²çÿºÿàÔÊøçøéñøÔà¾ÿáÿœÿ²çÿºÿìÉÊøçøéñøÉì¾ÿáÿœÿ²çÿºÿù½Êøçøéñø¾ù¾ÿáÿœÿ²çÿ¹ÿÀñËøçøéòøñÀ½ÿáÿœÿ²çÿ¹ÿÑâËøçøéòøâѽÿáÿœÿ²çÿ¹ÿáÓËøçøéòøÓá½ÿáÿœÿ²çÿ¹ÿõÁËøçøéòøÁõ½ÿáÿœÿ²çÿ¸ÿÂïÌøçøéóøï¼ÿáÿœÿ²çÿ¸ÿÙÛÌøçøéóøÚÙ¼ÿáÿœÿ²çÿ¸ÿñÅÌøçøéóøÅñ¼ÿáÿœÿ²çÿ·ÿÃîÍøçøéôøîûÿáÿœÿ²çÿ·ÿßÕÍøçøéôøÕß»ÿáÿœÿ²çÿ·ÿù½öÎøçøéõøö½ù»ÿáÿœÿ²çÿ¶ÿÔßÎøçøéõøßÔºÿáÿœÿ²çÿ¶ÿñÂ÷Ïøçøéöø÷Âñºÿáÿœÿ²çÿµÿÑâÏøçøéöøâѹÿáÿœÿ²çÿµÿîÂ÷Ðøçøé÷ø÷Âî¹ÿáÿœÿ²çÿ´ÿÖÝÐøçøé÷øÞÕ¸ÿáÿœÿ²çÿ´ÿó½ôÑøçøéøøô½ò¸ÿáÿœÿ²çÿ³ÿÚÑÑøçøéøøÑÚ·ÿáÿœÿ²çÿ²ÿ¸èÒøçøéùø踶ÿáÿœÿ²çÿ²ÿçÀôÓøçøéúøôÀç¶ÿáÿœÿ²çÿ±ÿÙÏÓøçøéúøÏÙµÿáÿœÿ²çÿ°ÿÔßÔøçøéûøßÔ´ÿáÿœÿ²çÿ°ÿñºêÕøçøéüøëºñ´ÿáÿœÿ²çÿ¯ÿä¿ñÖøçøéýøñ¿ä³ÿáÿœÿ²çÿ®ÿÝÃô×øçøéþøôÃݲÿáÿœÿ²çÿ­ÿÙÆõØøçøéøøõÆÙ±ÿáÿœÿ²çÿ¬ÿÙÈõÙøçøéøõÈÙ°ÿáÿœÿ²çÿ«ÿÙÆôÚøçøéôÆÙ¯ÿáÿœÿ²çÿªÿÚÃðÛøçøÝÃÚ®ÿáÿœÿ²çÿ©ÿÞ¾ëÜøèøë‹Þ­ÿáÿœÿ²çÿ¨ÿäºßÝøéøߺŸ¬ÿáÿœÿ²çÿ§ÿñÔÏôßøëøôÏÔñ²¬ÿáÿœÿ²çÿ¥ÿÙÁèàøìøèÁÙÿÿ²¬ÿáÿœÿ²çÿ¤ÿç¸ÑôâøîøôѸçþÿ²¬ÿáÿœÿ²çÿ¢ÿÚ½Ý÷äøðø÷ݽÚüÿ²¬ÿáÿœÿ²çÿ¡ÿóÖÂá÷æøòø÷âÂÖóûÿ²¬ÿáÿœÿ²çÿŸÿîÑÂÞöèøôøöÞÂÑîùÿ²¬ÿáÿœÿ²çÿÿòÔ½ÕîêøöøîÕ½Ôò÷ÿ²¬ÿáÿœÿ²çÿ›ÿùßÃÅÛïíøùøïÛÅÃßùõÿ²¬ÿáÿœÿ²çÿ˜ÿñØÂÁÓâññøýøñâÓÁÂØñòÿ²¬ÿáÿœÿ²çÿ•ÿõáÑÀ¾ÉÔÜåêïôõøøõôïêåÜÔɾÀÑáõïÿ²¬ÿáÿœÿ²çÿ‘ÿùìà×ÍÇÁ½»¸¸»½ÁÇÍ×àìùëÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ²çÿÿçÿ²¬ÿáÿœÿ´ýèÿÿèÿû¶¬ÿáÿœÿÃîèÿÿèÿîìÿáÿœÿÞÓèÿÿèÿÓÞ¬ÿáÿœÿý´ñéÿÿéÿñ´ý¬ÿáÿ›ÿàºñêÿÿêÿñºà«ÿáÿšÿà´ÔïüíÿÿíÿüïÔ´àªÿáÿ™ÿýÝÂµí²²í²µÂÝý©ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿÿÿ‘ÿáÿopentip-2.4.6/files/tests.png000066400000000000000000003610271213277401600161670ustar00rootroot00000000000000‰PNG  IHDRN§±œ ¯iCCPICC ProfileH ­–wXSÉÆçœôFKˆtBïH¯Òk(‚t°’@B‰!š¨¨,®àŠ""6d)¢àZY bÁÂ"`¯ ²ˆ¨ëb *÷.qïsïþw'Ï™óË7ï™òÍÌó¼+YBa*,@š SæçɈ‰cà"ò£:°d±3„¡¡AàËÔIošIúúGÙÿnçp3Ø@¡Hs'ƒ†ð ä)` E™ l¸nv¦PÂ1ÓDÈ–ŒCKšã 'Ìqù¬&"Ì Ñ4€'³X¢$H'8#‹„ôCº…°…€Ã@F#ìÊæ±8{#lš–¶JÂB„ þÖOÒߘÅJöÉb%Iyn-È—ÈÀÞü a*+wöÏÿ³JK#ùš-HMÎH DÞx$g9l–Oø<ó¸LÉžÍÆ…™žaóÌÏdFÌ3Oì9Ïâ”HyNY(Õ ‡ÌÇÙ^HîçúÌãEDÏ3‡ëí3Ï¢UaR}FV¸4žÇóZ<¯IfHö{vn,BÿfnªŸt\af¨tž‚ÔÅÒµ$Š|¥nÆ÷õfò"üçûÉEH5‰|_æ|œ'ò—Æ…©³gzv"q˜4\A¤4‡–·4·€‚ °3¹9ÈÀk•0WÄOâe2XŠ@ Øv‚*°à8ÚÁip\×A?¸ ‚!0 ^‚ 0¦!ÂAˆ )CšdYA+äAaP,%AH åC¡¨ ª‚@MÐ/Ð)è_‡oÃCðKxP$¥…2C9 ¼P!¨8T"J„Z‹*FU jQ-¨NTê&jõ õ ESÑ ´ÚíŽD³Ñéèµè-è*t#º }}=Œž@ÃP0jŒ†‰‰Á$a²1E˜ L=æ$ææ6f3…ÅbéX¬=Ö‹MÆ®ÆnÁîÁ¶b»°Øì$‡SÆ™à\p!8.W„Û;Œ;‡Äâ>âIxM¼Þ‡à7à+ð‡ðgñƒø1ü4AŽ Gp"„8„\B)¡ŽÐI¸A%Lå‰Db1™¸žXIl!^">"¾#‘HÚ$GÒŸT@ª$%]! “>‘ÈÆd/ò2²˜¼•Ü@î"ß'¿£P(úwJ%“²•ÒD¹@yBù(C•1—aÊpdÖÉTË´É Ê¼–%ÈêÉzȮ͓­=.{Cö•AN_ÎKŽ%·V®Zî”Ü]¹Iyª¼¥|ˆ|šüùCòWåŸ+àô|8 … .(ŒPQTª•MÝH­£^¢ŽÒ°4“–L+¡¡õÑ&m£s«Ï(ÑQt}:“žJ/¥£ß¡^ ¾ÀcwÁæ- |PRUrWâ*+µ*ÝVú¬ÌPöQNQޮܮüX­b¬²D%[e¯Ê%•Wª4UgU¶j±ê1Õj°š±Z˜Újµƒj½j“êê~êBõÝêÔ_iÐ5Ü5’5Ê5ÎjŒkR5]5ùšåšç4_0ŒTF%ã"cBKMË_K¬u@«OkZÛ@;R{ƒv«öc¢ŽƒN¢N¹N·Î„®¦n°n¾n³î=‚žƒOo—^Þ}ýhýMúíúÏ ” ˜yÍ )†n†é†µ†·Œ°FF)F{Œúac[cžqµñ ØÄ΄o²ÇdÀcêh*0­5½kF6ó0Ë2k66§›™o0o7½PwaÜÂí {~³°µHµ¨³xh©``¹Á²Óò­•±ÛªÚê–5ÅÚ×zu‡õ®Í^›{¶TÛ`ÛM¶Ý¶_íìíDv-vãöºöñö5öwh¡[®8b=×9žvüädç”étÌé/g3ççCÎÏ,â.ª[4â¢íÂr9à2äÊpwÝï:ä¦åÆr«u{ê®ãÎq¯wó0òHö8ìñÚÓÂSäyÒ󃗓ׯ.o”·Ÿw±wŸ‚O¤O•Ï_mß$ßfß ?[¿Õ~]þÿ@ÿíþw™êL6³‰9`°&àb 90<°*ðiq(¨3Þüh±ÞbÁâö Ùò8Ô 4=ô×%Ø%¡Kª—< ³ Ëë §†¯ ?>áQñ0Ò0RÙ%µ,ª)êC´wtYôP̘51×cUbù±q¸¸¨¸ú¸É¥>Kw.]f»¬hÙåËs–_]¡²"uÅ™•²+Y+Çcâ£ãÅa…°jY“ Ì„š„ ¶{û%ÇSÎçºp˸c‰.‰e‰Ï“\’v$óÜx¼W|/~ÿM²ò¾ä)!) )3©Ñ©­iø´ø´SAŠàâ*U9«„&Â"áPºSúÎô Q ¨>ÊXžÑ‘ICÌJ¯ØPüƒx8Ë5«:ëcvTöñùANo®qîæÜ±<ß¼ŸW£W³Wwçkå¯Ï^ã±æÀZhmÂÚîu:ë ×ø4®'®OYÿÛ‹ eÞoŒÞØY¨^XP8òƒßÍE2E¢¢»›œ7íûý#ÿǾÍÖ›woþVÌ)¾VbQRQòe {˵Ÿ,ªüifkâÖ¾R»Ò½Û°ÛÛîlwÛÞX&_–W6²#xG[9£¼¸üýΕ;¯VØTìÛEÜ%Þ5TTÙ±[w÷¶Ý_ªxU·«=«[kÔj6×|ØÃÙ3¸×}oË>õ}%û>ïçï¿wÀï@[­~mÅAìÁ¬ƒÏê¢êz~vø¹©^¥¾¤þkƒ a¨1¬ñb“}SÓ!µC¥Íp³¸yüð²ÃýG¼t´˜µh¥·–GÅG_üÿËcǺ;o9¡w¢æ$õdqÔ–Û6ÑÎkêˆí8pª»Ó¹ó䝿¿6œÖ:]}FñLéYâÙ³3çòÎMv »^O:?Ò½²ûá…˜ ·..¹Øw)ðҕ˾—/ôxôœ»âråôU§«§®9\k¿nw½­×¶÷äo¶¿ì³ëk»a££ß±¿s`ÑÀÙA·Áó7½o^¾Å¼uýöâÛw"ïÜ»»ìîÐ=νç÷Sï¿yõ`úaÁ#Ì£âÇr+ž¨=©ýÝè÷Ö!»¡3ÃÞýOß>a¼ü#ã/£…Ï(Ï*Æ4Çšž[=?=î;Þÿbé‹Ñ——ӯŠþ”ÿ³æµáë¹ÿÕ;31úFôfæí–wÊïÞÛ¼ïž |2•65ý¡ø£òÇÆOŸz>G›Îþ‚ûRùÕèkç·ÀofÒff„,kÖ  NLàm”XÄ;ô@”™ó¸³ hΗ#,ñç³ý¿yÎÏêíhp ²€ .ö"Âdä-±kî¶¶–>HDR2­­f"‹kòqfæ:¸N¾Šff¦÷ÌÌ|­C¼ø}ºÒç¼µD•`?NBW $6ö?Ë¿²¦ðžç-ÍÞiTXtXML:com.adobe.xmp 846 679 )V«@IDATxì œ]E•ÿOÒÝI:ûBv²…$¦ì["²ü ŠDDu@ÇQ‡”mTÀQQvA°@{HHBö}éN§;ý¯ï}ý뮾¹ïõë¤;8ÕŸÛçÔÙªêw«êV½{ß}mjkkÍ“#à8Ž€#à8Ž€#à8Ž@~ÚæW¹ÆpGÀpGÀpG|ãäýÀpGÀpGÀp&ðS¹ÚpGÀpGÀpß8ypGÀpGÀpG  |ãÔ@®vGÀpGÀpGÀ7NÞGÀpGÀpGÀhß85«GÀpGÀpGÀ(uŠC MHÅYº•#à8Ž€#à8Ž€#ðáA ü®«ÿ°k§«ÍÇ 'ßüÑ#ÜÄpGÀpGÀ(Ó¦ë#µqòQ‘=ÜÍGÀpGÀpm€ÀGicõ¡Ý8mÃM’?¢· •á8Ž€#à8Ž€#ð#°MÙû°n¦>T§Ü,ùfè—^GÀpGÀp1-²Éú0m¢¶ûÓVl–Z{sÔÚñ?ÄãÈ«î8Ž€#à8Ž€#°#Ð"›žíÛ¢øÛû&j»Ü8mÁfik71[ë_ ß¸ÊpGÀpGÀøÐ#°E›¡¨ÕÍòß7QÛÍÆ©•7K-¹1jÉXQ_rÖpGÀpGÀئ4k3ÓDÍš«9¶¶½l¢>ðS37LÅnZеÓùo®½üœ:Ž€#à8Ž€#à8šµÙ €k_¬Ý¾úÀ6N-¼a*vãS¬]ºóo©_:ŽçGÀpGÀpí¢70©Êë×”]Súúb?¨;PÈÆ©ÈMSS›•­Õ üBq éäïÔpGÀpGÀø¨ PhSH·¿)»­Õ wŸ¶éÆ©È  Ú°äÓå“ë$fé³d²/D·Ô¯PL×9Ž€#à8Ž€#à8Û ¦6/ùê‘å—%‹ýóéóÉñ-¤«½-ï>m³S‘›¦B’|ºbåùìêL16±}ß1²âºÌpGÀpGÀhEm>šXLŒ´M:¯"š+Ç/Ÿbn³»OÛdãTĦ©Ðf#K—%¼XóõÀÖ1…t²-dSH'§Ž€#à8Ž€#à8ŽÀöŠ@¡ I!ÚSÈ&Öż|¡Yò,™| é¶Éæ©Õ7N[±iÊÚœ4%kJ/àcšöIçcÛBü–úŠé:GÀpGÀpG`k(¸é(<í—Χ]³ô±,æå[¬ û,[ÅiõÍS«nœšØ4åÛhdÉ É éê¬cbÛ˜OۑϧÏ'oNŒ,[—9Ž€#à8Ž€#à8[‹@ÁÍE*x>Û|r¹Çú˜—š%—L´XûØ._ìĦ5¿óÔj§VÜ4iã"* Óyä±,æå“¶)&ûâó•WÈÇuŽ€#à8Ž€#à8ŽÀÖ"µ1)&fÚ¯©¼bÆv1Ÿ¥G&Ñ|v±­lDÓ¾’·Ú§VÙ8µÐ¦)½ñP^TàÊo©N±¡éÒå“KïÔpGÀpGÀØÈ·é(VÛÅæsÚÜÿXóùlb¹óŽ€#à8Ž€#à8ŽÀöˆ”¬µm¼qIÛÈ>¶‰Û†^>²Q;饋ã‰W¼ØF¼tŠ£<4Kë[ŒoÑ;Nî6¥Q#ㆤm”Mû uÒK&ª2”•\~1Mó±mÌgÅjŽ>¶uÞpGÀpGÀØZÒ›t¼¦ôØÇ6âEãx’‰J§Žƒ¼©|–M¯¥6O-²qÚÆ›¦x¯|> `…t±>æåƒ,òéòÉÓþžwGÀpGÀp¶é ‡ÊÌ'G/h,KûËF4¶•,¦âe—ÎÇñcì¥ÏÊ瓵țö¶åwœhHzcçÅ‹¦í‘KÓ˜/Æ'¶Iû¢S’Ž|>>ËV2§Ž€#à8Ž€#à8ŽÀö‚@zB½bYÌ«ÎñXzÑØ¶PñÒ磱Ÿ½lòé‘“d'ËÒzôè}ƒpЬv¢6„Yª-’ÅñÄ‹67`!?ÕY6ÐB û¦l ùK×qTgÅ„nI\ù@IYíË*+1®û×”>¶-†ã‰-Æ?¶)ä·Y8ľi¾›´OV¾%âdµkKâÊJ"n:e•Û4¥m‹áãxâE‹ñm ùÅm±oš/Æ&í“•o‰8YíÚ’¸ò’ˆ›NYeÅ6MécÛbø8žxÑbüc›B~q›…Cì›æ‹±Iûdå["NV»¶$®| $â¦SVY±MSúض>Ž'^´ÿئ_Üfáû¦ùblÒ>Yù–ˆ“Õ®-‰+(‰¸é”UVlÓ”>¶-†ã‰-Æ?¶)ä·Y8ľi¾›Ø§‰²ß|ë­·^øë_ÿúÈ\ðRð[\ç›;áT„¼N²8_gšéÈ`û§yéÓqñãdå‘mUj;Nj ‹ùt]¬ËÅ7G—¶í6Mœzê©ßîÔ©Ó^T¢¦¦RŸâNDiÛ¶m¢ƒO'ÉD±…WÇÝ´i“•””Ô—\:ìb{ÅPäeƒ >®›bI–öWôÔ'ùÅ2ñ²cªüØO2ÙÉ/¶QLÑ´Ž¼ê'hV|ÉOT>äáIª¼dð$hœâ8øûùÏ¡#ÜÓøÄyaËbláÓ:ò~þ7ÿà¼Óý/Æ^‡lÓX oáëãX±\>Pâ*ÁÇåIÇ'ŲDýKëÈ«~Ò‰ªLÕCrh:I‡\zùÅ2ùQ&s34Nqü}üçÐѹHãç…{,‹±…OëÈûù÷ñO?PßUŸÓ8–šNÒ©AåËàI>þ7ïs9d²çO p»|ó"ztkÖ¬yéÆo¼êâ‹/~&Ä].&º ˆo*O•òÙJ%É.—k(++¯r¥£¯l&«W6ÁlñÆ)€µyOø§Ê‹ói>Ç™äâ³òÒÅ>ùì=ùä“ÿ6|øðS8ùê 8ŠWÇH‚EÍ’9I8ÓIb¤ôŠ'A¥<”#‰ËWYð¤8FNÒX¦˜êèØ§“dq™ª³üeƒ/:åÅÇyd’S.|œ°•L~j4ËG²ØO¶qT®ìÐQ‡ÊH—/[ÉÉSžâ&L]Ù"Þ¤¸ÒáË‚LzÅ‹ãã§<”ƒ8±<ÉÔÙ‰WYÊÇ1²dŠIÒ¾±=¼ê/^>ä)G ;åÅÇyd’>Nª32ù©nÐ,É ?ÙGåÅ9 [Ù‹ã¤yò”G’ßt¹ê.¾~þs}Dç œ”báIÂPçTXÊGq$ÇO¶Ø W\Qù’—½ø8Nš'ïç?ÿâHXǸƒ«òèe£ó¦sŽx¨ŸŸÿ5F³úŒdq¿ññß0–4þ4¦4þÀˆ~c‰ ú'_a‹ ^>äe#]œ‡}¥+--µY³fÝ|ÐA]üÞ#Lê \,Kç¥KËã¼x()öQ>QÔéħu‰<Ôÿf§–Ü85^-…sÕ&ͧó˜"“\|V^:|è%ùlУ6sæÌ?–•• B@Òfêt±.–©S¡;ŒòÄ‘\¼hÚWr:©ü¡ÈÕéÅÇ6ð*ª¸â#ޝxñ€ÀŽ„h¼èK„áq±‰ËE‡œ$y<8U6zxެOxÑ“T†bÊ_õU[•‡­ôȱ¡ÜEŒë¢Ø± {2bàK’-¼t±Leʪ$;(IuMûJNù¤Ø²IبäC¶ÐX&9~q|Å‹ñ" ;Q?ÿ Cá¦ÂHXƒ—°NÀ«Ë sdâEÓ¾’ûùowÂ4Ɔó <¸‚vÂS}xÿ¹¾'Ìâ1ó`IÂNÔÇÃX÷ñŸt‹dœÑG4îrÒ†ùOrSõ¥x,ãï×ÿÆÊÄãÌb¼ÒsËFx+¯yLjã+¾â“€áv$#åaøGLd*ñ²UðQ6nÜøÞˆ#¾D³Â‘+$Gáu6ás lKŸå'ŸX‡Œ$¿\.—Ïâe+mT¼zY1ÌmœHÚ¬Äe¤eÊ‹b ŸÎ§å²‘]œÏâåŸo5,삟ÔI§ê`E¦‹†òPñtl…­:~â“Âëb"ÇVL6òÇ™ò”Ã_u@ŽLvèÈK.š„ò‡Æea§rÐQ/Ö©/£óñïã_}D×NåÕãþ… ½ú¦l$WŸT*^ý_yñēǕƒ.¶‘?¶Š)?µbÉn{¹þ‡Gð,<‚gUUUÉV©ïºuëì?ÿó?“:Ófð:tè!A S¼©g1š4G¥Ï¢Äåq^<”$»\®q’É.΃;¾ÍJ-µqj͹âã|šW>¦i>+¬¹µ>cÆŒÇ9Ùêàñ‰— Õ‹ÛO=i³^zɽ;+9ýwf;í±‡írȡ֭OÌ’¤û£PºrÙ"{sê6wÆT[:‡~dÖ{È0ä$:å²åKí…éSìY¯Øœsq°Á‡Ø˜aãlßq[ïú&1°'–êÂÔ‚Grâ¡WR{ЫP’d Š8OŒt,d:(;Ž-^†b@_•\>詃|cûØ^uÆ7¶CN|Ù¤ËJÑ?ôòϪSÚ_y¨ÊP¸8V,S\(õ%©Þ²S”'V:ù8–ò~þs}]x@I`%™pMSôÂ^Øb£>™öWJŠ}âX‰2ü“½lýü7ÌÓÂHXs4þ—Ìzͪz±ÁÝJëdzΓ°{#pÖPÙH¦²Ò½âÆçRuJû+UŠÇŠeŠ«ú¢S½e§:(O¬t<òq,å}üûø÷ë¿ææ‡ô¼\ózÍCšK°çøûßÿníÚµ³ðôV}Œ•+WÚ‘GIˆ$'|-æ°™™“Ôoh´±i.%LìçÅ‹æ¬är>9®1ŸÖÑÞØO>iklœrWŒ\±i^yQ¬àuÏ­dÒ壱=„!T2‹¦ÎżÚïw=þúšÄ·s˜'NœôU;j·þI^±ãòTt­qþçþý7öË·v¶ þåPë°EãÝzÒ×lã…¿µ¯íZ?…ëìÉ¿µkŸ|Ïz”—'}¯C‡f••VÀݰa¥í8áß쇪ǜ¶ÓÖtŠe²N>þ}üÓ_èJðê;ôIdšC±U?Å?9ôÈÕÏ”G&92üH*{ô$ñŠIž¤ò•âÊN~È[cü«<êD|ê£2UϸnÈ”üúŸ;—:‡Ûêüs>Ö¯_oÏ?ÿ|²yÒùXµj•qÄõý•úŒ5êSAÏÆ)}w)΋§Ó6uPö¤Ø6'ÉÉb]Z.]–œq‘8ÒA?wU„C°a¦(¾ bÅñÄK^ˆ2sңæmuuuý¤òõ“<võÒ¥öÜm·ÙÊW^¶sŽ:ÒNoÜ?9•O?kó&O¶ß>ü¨ý3ØwêÙÓzôë×èbMgaN,xî4M}ìV«ñ¼}ëÌÏXŸ޲vÝ Þm¬jÅ“¶äÚm¿{À¦†¾Ð±kOëÒ½w²!Z Kè²Kí¯OÞn3–½i§~ósvø˜#­w—ݨ¾-^ó²=üúƒöÇß?`µOÖX÷¯gw~®*7R'ñPòL>”O|M\Pä± ><·šÈ©>ØÁËž˜$xuôðÈIÄŠSlƒ\yQÕ‡–K¯lÄc§öˆÏ?¾ò’âºÁã/_ltN$W{E)[í žxbJ"Vì£ò±—^eÉ_xhWz?ÿ ŸX §Ãù_óÖ=ö/ßúÃ;뢯Ûè²EvÛ¯°/>×fžõs;ã@>|iÝñ¿ræsöÄ»evôQûXÇÐéK›ªgÛœ§z؆36Zi4GÐ?©ú T¼ú4¸Ó•{ôhkkK«“xjƒÆXûîýÃUá‡û†©rÉTûûs BäÝì˜c†„S7ëYÖ¦~â|ª !ê¡„N6ðËÞ~Æž|·~øžI{ð¡N>þ}þ§Ÿh^PŸ’Ô7Åc§¾ƒædÉÕßEé{ê§ÄO Ÿÿýú¯¹‹¾÷õ?ú )îk²Å÷+陳¹³ô—¿üņ V?¢§¿Bå_×ÿ“uwR`nS£ rm|ÄçHq‚ Pœ\còyÜŠ‡6sI±‹rjöÆ©¨¨9#5޼ò1Mó²kŠzlCž$¹òش夒À† ÊA'á˜1å)[ýÒT;q×ÑÖp¸âΚe3f$>m‚ý€!ƒíÄÑ;Û/¾h3ŸyÚöœx\N|ã£IïiOZí;/ØÄ£ÆZ¯Ñ£­võB«\~sΧ´Ìzt³í¾‡_°YáÑ»=ù\RbQ(‡êúÒëÏÚÛï¿nfO5d„Íß8Çf.ÉÕ¯Ci;;tŒò™yöÔ/Û?C¼O41)‹ú#N`èÀ€¼° L2Kl+¬°Å—< ž¤É[1‰¯ØØ SûÔ6üXt`G‚ª‰ üÃ'ŽC>®vª“â+ŽÊÄ™ÊU¼862Ù%Lø‡^1‘‰Ú,¹dÈÅ+>Ô9‡RÌ«ª+”CuUL|áeO;Ê•­Ú…Nrx%•‹[òò! YŒ/¶”©r•Çžäç¿&Áì„mLø®È9”b^¸båÐ9UL|áeO;Ê“­Î¥Ù ûË5÷ûíû7^aûtª´ªÚQvá݃ì¢þÝžùÍ-öé}ζÊZ÷ü¯xón»ç³±‡~ÂF”åÚ7dâ5ö·/UÛû‹WÚ†-ÿ•m™×rs8¨O‚Í€ýO°óÍÍ{ÕïÞk½ø;;åš‹ìóƒJá»]UklÅš útŒ)*!çgÒê·ï±»ÿ\kcÞÓvî=ÿoçßÇ¿ÆçÄyMwQÙ%árÿx,J.ç]|܇ðEΡó*;Å„W]_xÙ“Ç.{üûùa V~þsý,4GÑŸÀEý²ôõÿ°&:î<áÃc{êq%D8’µ7ñBbòdR…"ÏM¦ Û8Ÿ›øG,MþâEq…'a#>´Ô¿–Ø8©Ô)æUÇX&šæ%+$G§“’æ³òÈJ8Éœ`N®•Ó´âÕWll§ŽÖ7L|Õ¯¿a¥]»Z[ïiSxÄ£zõj뻩ÆvéXn˦½lµŸ˜tâ*&“œéÊùÓmì .ÖµS«žý¶•tñÚåâÕlÜ`5kW':lÞ÷JðËmÄ’Ã?ud:7uœ¹àMë³sOëÔµƒ½¹øMëÜ¡«µ › RÕÆ*[S±&ܹ*·~£zÚ¬…oÕ×=1HÄ!›ƒú’Xð ‡Dþ©²EŽLõÂ>x±¼tŠ«8Pð‚ª^Ø3He yô”­¤:HÇÑ…&®?z+ÅS9ÄR\dq[U_¨ÊÄV‡bª ÅDO"/ßxs‘(óüS]¨;þ¢˜S7•);òØ(/Š=rqHè8üü7ŒáF…ó¿qîsö÷õmmÄ)gÛžm—ÙÊ5Éé·umÚß9Ü^¼r²½ËÞxÈ.ÿÅF‹m‡}íßÿã4Õ•—Ï,·§o»Î~?y&šÐ ÏÙ5~ÆJæ÷;羽þäã¿ñ|Éü£y |þOºJý?Íßš÷E1ðù?·Èq?Òø#Æú™®Íºn¢'É^˜TæÚA>ÊÓNŽæ^ÿùpŸµk×&kÆOúÓöØc%OýPŽ®™Ä‰Å% &2âÛ(¯…zñØÄ ÿ\cbi.Žä²’‹O)Y–^vEÑ–Ø8S˜e‹.>°ÈX&>–§yò¤ÍätžøÄÒ‰8´i¨š=×Fvì`*+¬ýŠåÖvCx¾}n£Sø’°ÃÞ(6SÞ{/ñ£ bhÒ'¾Ê¨Z7?|©GÑÆJàmM¸xnÌ=FÖ¦ºÂÚÔ®Ktؼµ`~Ò¹ñÕ–Î'ùÊõ‹màØÞÖ¶<<žÖ¦ÒÖoâñ¹vTÁ6ÖT%²’PÝþƒ{Ûâ.Nê¡úÐÙ©§ŒÊd<{-ð lùÈž²$Ã^I¾äc¹òò’t.(WyüôxµÊ'É_y¨b¨\b«Æin¼ûõ?Æ„1CÒ\¦¼ÆrxŽæ\ÿy¯K—. þšG‰AÙûï¿¿ýãÿ°îÝ»ÛÑGŒ[¾Ûtÿý÷×aÊ­K¬ÁÙ<1Y#䀗,·¨Ë­Õ³ø`ZŸˆ…MîP/Nb6ä8ìê+Ò nY®Y§fºòq>‹GË©},KóùôØ¥7DòEžO‡Mý'‚«#¨S!+oWž‡/³òέ]Çð$~øRq6N¡¹µ%!4éÀw §£¼2\øC¡³Ò¡Ô¡Y“€¨C‡Rkߣ£•uïbeܽ ±Ú”¶OôµÕá®Wûpwªmm°©°Ës·=eøGlu@]TÚ——Z×άSyÇp·©£u(igíKÚ'vU›J¬$ré°#þȨ¯b¨läò• ª:R¾ÄAN‚'¶Úȧ.ðŠ‡Žƒ„\ =rÊà >m ¾êˆLõT ü±á Q>þ$ùÆ<:|åC<âª~¢ŠG>ÔäªåâCŠxb —=:lÔÞDQ ¹êSbPOù(&qUâHîç¿ùç¿ÖrŸ¶©wÌ«sw§Á“Tµ¡u çvy°©®®±•%Öö°sìÎù¤­X]acÿã|{ùÔ ì©WØ>U3ìÅÐÇ;x¤mœ¿ÌzŽù¤u+™fs¯ §n኶!œÇþvî5WØÞ+¬z×/Zÿ{.²šÚáèe{z¬Ý}K… =Âv,Ýhk×aϸ ß MúwsÂ6þ»ý›{Ûšõm׆ò¿Êy¾ÜoHý¢Zcf´áQ½ð}†xPÚ§~KûÚº $›4òꇳ^z*ôµávàÈö6wn­}â3Ø#7¼h³V6•¹q=í…é6òˆ}lô.;ØÚÕ묦}C{í<Üú‡öTn¨²Ò0ù¶mû®½6}¦¶çHÛ)l&+ªÊóñŸ› ãñîãßçÿ¸?0^9|þÿà®ÿwÜq‡p Ö9¬ƒyéÃ#_QQ‘\|™¬I¹ wÛú— tÚi¨­Áºv³6=º™uïÉ.$”èkÖ†¯ ¬Ÿ2[û ¨Ÿ½Zè¢Ý±ç`[µi îØÙÚÖVÖ9)»ÍƯlm¸ µÑV[;ëØs‡d‰RþºÎ—L"ÈzwßÑ6­­J6L]Â#]ʺ……O§$Þúšu¶ªjUÒq7…'EútË=^CÝ´ØUl(uÔKÈ3YiQOž²ñ#¬ðAÎ->È JĤ®l.ÀöøÃs¨>øb‹*_x|ÐSå“*Ãã’Z<“GÏA">q<òj¿ÊÆ?ëüCåŠ'6~øÀãG»¨¶è´‰BŒ”æJ ì°áP}é|HOýI žvÆmŠeŠ)¿Ø)®£ÊC·“<1üüÎÿ†5IŸa£RÓ37Î8¿ô‡ª•Kl^èw;vÍõé° ±¾áµÞï¾·0wþkWÑá¬-…çØé;Oýö¿mJ]ÿmÓ¶«õꘛ?7…wÕµíwˆ°…¶hYØ®µYoƒomØÔTU®¶Uëƒ>„©XìX·ÓF¸Låús ›(?ÔeÎüŹ1²q%Ö¶47¶7ÿáëà³)Ì¡l é³ÔQó y•5ú;lñ6l‚`·ÞÞ}óý@—ÙUÿù£ºqæê¶Ã¬c›MV6òûÎÄ÷ìÊ¿üÞ~ò·­ß'O°ùòÖaýªúöl\½ÆV‡ïl1¼öúÚÅvøÒÿ´{®û»ÇÊíÐIߴό˽EUãÎÇ¿ÏÿôÍÕ>ÿ7ŒW¿þç^r¥þ¡ëø¶¾þ÷êÕËî½÷^›0a‚=úè£Ö'üüNÿþýmÚ´i¶[x›4¿Ù¤õue^&1¯’׺ˆ)¶î`ñÁb&·@ —Ÿº¼ÖæZ@’׆I¶A”øá#™xQlb^yhœðÇ®ÅRKmœÔ°¸bȲ䲑^¹x(`’Ò¼l¾ôYT²äBJ‡dÂÒ…5 Nxç1cmÑóÿ°{õ¶²Ý­mè,^IÎÅÛ–/³M%eV^°(|Q ë.»&h.Ìš¹`“ È:õmK×Â]uÇøŠKyø!KŸlUwô”­<>ÄT}=:|cÕƒ8q ñq‰K^>Ä£Õ0P¹j”D ñäñý‰éç?‡X€ÍÇåü—÷n]B?}øÉ×í°“÷æ 9t‘¤ßÎzúoVúÚcû‡þ³2Ù¸´)mÏ›Â]ì6Á·S¸I^S77󟿱/é˜ôY®AëÞ_`ËÖ‡¹!ÜÑ)©¬Þ„§›“>[c•ÁW×ÁÐËC¿ß9jÿ°éaOÆùظ‰ÂÆ.Ü#O. 8óRžŽáidõçÆã?´%”ÁcxŒ!x’Æ ã&DLÆ9ô¹óßÕFíg-èg—Ü|¾ v´©6Ü%[±`‘­_[i£?Ïþøùõ6õ¡ÿ³ŸÿùnûÛžcì³#º˜Ú³¾&Ì á©ÊZSÙþrÉmvòªðŸ«h¹õ6=úêO¿óñïó?ý’þÈA?ä€Wßõù?7–’ñƾ®}äÁ©ñø÷ë?ý‰>>JÌ•š/Á¬¹×ÿöíÛ'/€`ÓÄ‹ ȳ)4hPWóq)›õ 7%(‹z G*ÇäÊÅGÑ ª—Áç&á¾±-6Š¯Ô€$9š[àæ|bʉeÍæ·f㤊S¨lÓ4öE—ÖœdðÊçã±ÍÒ%'^ ªNÀIï÷‰OØüE í¥Š ¶çˆ>Vî8•†:„aÕá´TÔl²—Âï9U츣 Ük¯dƒŽ£Ne°#ë·Ó'mþ«ïÙôwÛîáQ½òö¡“Õæ.ê5Á¯"|ßiú¬%á‹ÚƒmÀà½ê;;1é$MȆÜÕ–ÏX`ï½±ÄzíÑÓÚ´ o‡ ›2R›š°1 ¤¢ëRÛÏv¼‡:o}GÖ$M9h»ÊIbÐÎè]Œ“ì˜ÀHÂÕ5Q„šäÈ£Ó†[â’4ÈÈcCR¹’e屓=x³ÂNå@U†&_Ê¢ìøPý±åPÝ Š;Å¡lòèU6*SvÈÀWvÊã/ôØeë¼(&”ö!mÆN¸^¾j qñE®r¡Èe«:a‡œ¯úH&;?ÿŽó¿©ýX;çs£ì’ðJ»«îª²“k]Úl´™ÏýÅn²ØÚ~âö‰N¶*|hØ.Ü=ZþÀŸì™^_°½†´³i÷ÿÞæ·íbߨwHøà§·Øöûë_få_Ÿ¾§Tj«–.´=v²!ÝÚ…µ…~æ…dfОº¾Ükàð Ÿo ç½o;ônoãÐaö ²ÜœSî8•Õ•?¥Ûçm¯¡ííõ‡nJÊ?c¿!aLäîòjГ±újmøÀ¨¶6÷ø,2Æ@¢ }œÄx ]?ׯƒžq‘;ªmð~ã­í£wØåÿÞ&MÜ?`³Î¾·Ìzí<Ò:®˜fO¿ÜÑv5غöß1ø¿dÝÊsåìPמó–Xß~yªÛ¦=ü¸•èÛÙúî¾#ðN×ðXwxÑP¸x¨>o‡È93Æ4Þd'?¨ÿÜ $0!q~}þÏ} âóöøglq4ŒýÜ ë㰘™Põ/tØéºNŸ#ẕ̌‡Êžq,;åñ‡çn{ÿÔ‰ÍÒN;í”´“Mmân¡èÕ†B¸Ü" sæœ6Oé|0©ßX‰×:x| â[Ÿ$KÓzƒŒ| ˜d«¶fã”qs)•#Å>ÎçÓËN;NŠ|á•G¦|,+¡è¢l’ADç%ÑqÛwìdý›`Kÿñ¬=ýÎ ä;´ Г÷-±3g؆p…ì¿ßÖ®Kפ1‰3ik(¯´]—ð¼OÛÒw³gŸËú ?xÛ§oRÞûK‡ tØ4mèg}GfeºÕoÄCƒšX,”;¶ïl{?$üøí³öÒ?Þ°!×'·Q ¸8Ä›=onøòrWÛ}Ø~‰­­¹êðÄEG½•Tòè“ú=…AD êůxìÉ“ˆã O4öSyà§úSm†R6~zì~؉¢'OâË=I:åãúÉ;ùÊ™|ˆ^íQ}¡ó[¨ÚO|•…Œ¼Ê"×I:dœåáåC,ôJÊS.öèüüç6Ô`ô±;ÿá… =ÿž}¿ë­ö³›ï·«_¼_]Åö>î_íëŸi‹ç-·MáÍt<*WҥƿùíÁ:«£Ïþ/סʖ®mo§]ó#kÿ?ÿmwÿîªú~=áŒïÛ€Žá{j¥á}˜'“¾ÎØ ý®<ô¿²’ÜívÚ×öï<żáª{ûî?¾“Ù#Üq ”`[îÜP~ÛÎ5öÔm¿¶‡£òw-«°¥ërß…‹ÇT›6¡ï®§MÿáC/ÆC×ðAc„ÄØXßm¼]þïm첟ßi¿¼ü±Dn6ØNûþNÖ¾z…=xÇmö׺qÜ{ÿ/ÛøaílÃÚp­s,íyè†ðJõ6ûÛ9?¾ûõ˜ÝñøãõóÆá_;Éúµ­¶µaãDY÷¢È4¦5G cì’¤Cæã?ëü7|ÐÕÔù_ÒÇnü‡¾ãóÿÇxþß‚óÏüÄxb¬Ðw ‡zhýzWcIë ôš·ðE?Ã-Lf¹II.iÁ’[ü„åWËN|nÌÙ‹‡2³hÎ2[/]‹S¾UtИ‚OËŽdÐB‡ì¡ØAc^¾ñIIÛÄyÅõÄOÜb%'™Í‚œMsè l$ø$´$,ØW¿ó¶­˜9ËÖ/]‚‹uìÝÇz fÝF޲êàÇë¹° xuxâÓ¡øµúÒ6U¶rÑ´ð íV±v~¯¼ó@ëºÃëÑ÷ÐkÚ'¿ÆŒ‚xº°’'&qèˆð]ëêðEì9‹Þ°…Ëßµ•«–b~ð¶ Øa˜ ê3*|¿ Cò*þºøâËARÛë:wb£ö£ã½üøP'ä$âq`•J=U<1Hø#'/ùI/e ýÉËFu‘/±¨ öPÙÊ_:Ê&áÏ‘uþSvPâÐ7Wþ* xê¦ðØPT:ü‘ ÷b°Q;Èc#xê %.IeàƒŽØÔUzÊ&áÃAB'[òØøùÏðà„á‡ÿü‡Ç{õ·Þjléò á®÷Fk×£ŸµÛ°Ô,Z^PÃù¯°iaSóâ¾ß³Ÿ}~¤­_WiµíÊ­vÅ|[nG%X”u kô³¶UáѺManë¾³ô®- ‰N}†Ø€®U6{æ¢0?…~!4¸—U.žc‹×…‹iø.æ€A½¬6|G³¤}µ-œ»Ø:ôÛÉúu®´9³[MØýóúËmê~ç٥dzŠõ•¯±Ÿ—pOÔž»æç¶ñ¤sí¾êÇl9o$úw›Ž½m§~]l õY~|·n `SÞ½¯õéæàµ|¶½uêTjKfϱµíƒOïv¶6þÆ%˜¸€—pË:ÿèÀ‘ĹÏ?öšÿГ'%}>P|}þ÷ë¿ú•úO2¯ÔõxúáGáúÿì³Ï&/† =¤9sæØ§>õ©dýYì¸8ì°Ã¾\ß ‡@ð:²òLÚ±ml#>˜4Š)û4Å)×s¼d¢HëùÐæz>gžÿkmœ´É¡äÜl®cuÕ€JŸE¥i>¾Ð&ŠØøšª'>òE¯¶q^Š<¦ÂˆØ´EíÄFõVyè ÿ$pø§òñ£=$|9‹²H”µ¼ê"{ ?ÿÁóÞ`×®,œóð3mÂwŠªÃ¿áüo²ç~ö {2ÜU9ïÁ¡„…f¸–TÕÝ©¡¯¨Ÿnb¬…>WîñC²êÛê‡Pì#$õ3lKËB? qk£|—¹>×&)ÿ‰&Ù÷è|£ƒá P<"M96ÿµöÊŸo´šOj㺇»euóeªlê¢r«ïo>þê<üÞ^5oKÍù'c‚7åñ⊀WmmÃ"ÄÜp, KW‡ßÐk“|i5øq׎¡Ïw©BÚNFÔQ˜«ŽªwR^°ÅÇÇ¿Ïÿô÷\?k|ýO:TøçóÃ-à¤q>[ÅÿÜŽŒMâà¯ñ_35è¼hnû(]ÿz衃;ÖkÖ¬±c=6Y{‚qS¸„Ö¤`oœ´ÒÆIy)â¥ãâ‘æ%ƒæ;ð!‰bG’½ø˜6âù•ò‚©èSè(¹+A.\Sìh›Ê O"x•o±ç_í$þ”Ïyã-9ÿª7±ˆ­¶hƒ·;(ITçœÈ œmE¯vªÞ~þÆ´ŸÿÜXÚ|ü‡1¸j‘­ë²£u/mØØ«O‰j\¨Ò×Zfü‡OkW-°Šnƒ­Gi®oÓ¿5n²Ç‰ =Òjϲ…á®uÓ8ðñïó?ýÇç¿þ3WqèºÈÜÇ5“9EsóyÙjžc>Aöqºþï´ÓNÉ<Ê?p7(ÌŸŸû½QtMá^Qþ•`oœX ² a¢Ž,zÉE%#/™ø|4˜Öoš°!‰æåÃÜÛ$NYÿZrã¤zLÓ<ùÜ ¸1•óñfH|!*ßF§°“¾‘ÀÀѤªŽ(ð (‰Ž!üd' ½£òi{ÊÂGòØ=’Dž‰^”Á×ôª :ö$0ª2mžXè“(¹êD{•Clê‰ ?ùHŽ?åàƒŒ¼êO\%Õ‘<ñäœ<~ÄQ›zÇuR}‰…ÊQ\êÀ†F‹%üµ¹Q;ð#Q>þäÑÅõ„÷óïçŸ~@Rÿ‚W?‘Ž>‡JS>îgÈÔw%í¥×ø!¯±Õ/õˆû,å“ð#ùøÏ}Xâã¿áqjúˆÏÿ¹;7ŒƯÏÿ¹5 óýCó s s 2x¿þûú>ÂõEý‚1DÿÐ5©Ðu1ü0îWƒyzã¤Í´©ƒE›lÄCc=)¦²’”ŸEcí“/ò¼©á-yM¶H‘»²ç\á•Ï¢’© Ù‹"×fI2ò1¯|l'š,ÖÁ„NСΡ»6, u†2¹È_G òt°xBO9è(“‰HåB‘“<:Mb‰¢NGLT{b(“ƒEvÔ‘x:d•-þèU?ää‰-^yM¨ÄGNØQŽñÔ~ÙC5Aã‹=yä´EÊQ™q¼x|ŠŸê¨ Ê!öòS|ê­Cv~þð÷óŸÛ€ÓŸãþ'\è3ô=òô¯¸Ï‹§O¢£Ïi|a¯~Nlò$ÅByb’ Ä¤||‰¡„‡ÿ†£ÀÃÇn~T?ª¯ÐèsêŸÈÉÓ·Ä+O?ÄÎçÿ܇†³>þýú¯9_sµÆÎGiþ§ÌÌÐB×Å0ÅhíÍtÃÆF$æ¹ÈqDó![ÿÒˆÜ2g×pQlXûË/M‰!{bˆGÞ"©µî8Å †Wà¤ø|Töñ¤4ÛÀÇqGßwß}ÿGgfÁÁ…@‹ed$-Lèø’ÉF‘Ä0üÃF tš8ÑK‡žƒ¼ü‰«<›x-èá5øˆ£²ñ¡¾è ØáK¢\•ORg†ÇžƒŽŽŸ’êƒ/<BÕCþ²Qyl*T(‡bRGd± Ä‚W9Âúà'ü±ËÇž6££=ª£üÑ~Ø t”¡:"—½dø©Ô9 [xÕ%†Ø C®òb• UûU–ò~þsýQ¸ [?ÿûýF}Jÿññßø³>gúƣƠ°ÓøC.{ÉðS?_ä$lá}ü‡· úüŸô þÑGè>ÿçæp#Æó7ŒüúÿÑ»þÓÿ‹™'Nœøõ`úf8˜LÙ,ÅGüØ<:ìÒ|ì+>‹×úÄ"a§#΋i#>ôgüšL-µqbƒ¢”[Å6Þ,¡‹7GðñòéùôfI±Çöâeݘ¿?òÈõZx3áéä]’t…Æ¢l‘k‚ˆ'Ma câ§ _%}²Gž &þt{|Ñ¥ë"_éñ¥L&(-8ñ'QüÑ«^äµ`Ç^ :dñ&‹rHø£çP»âÍ ei’ÄêF,tj‹tPä$ê‹/±)GŸ ##N\.>Ø WLéÉ“hƒÚ+tjƒl§ð¹bb+{(¶è)?®:µCråÑÑ6ùªCò”ççßÏ?ý€~Bá ïdõEõé}üçæ$]Æ”Ÿÿ5·3†HPÆŒÏÿ~ý÷ëî{Æ‚Rk¬ÿŽ<ê¨3Bü7¡͋6Eñ ^rìòñ±â!SɃ:ÙLAÑ“Ð)É'Î'|XÃÉ^ºLÚøã»L“‚ÂÜ꺠IA%þŠ!¾©<±Ñ&I~ÊCcY›»î¾;YüjReBe0)O`åá•â§1øÊÊ- á¥ùI‡\·<ÑË;-’Åq©¶ÔW‹ÕQ:•—Ö#Ç/¶ƒW½$W[)GõÅFq òQ™øÆ2xéb9ñ(W7ሠõV›U_ä$ÕM¼üÉ«(¾*^eH'ûX®¸ùÊE.¼ð—/Tu†×9Žë%?éð÷óŸ[ÜGðòóïã_c)ß8Ô8õñŸ›ÏÁƒ¤yêó¿ÏÿñøÑu/î'ðº.IÎ\LÿÑ¡ë$”¤8ÊÇ}_’dðòåèýúÿѽþÓÂÁä¤ÍJtlÚ´ÉV­Z•ëׯ·7&m(++³Ž;Z·nÝ’£mÛÖº/Ò$dYkðXF€t>–ÅÄvñ+Ä‘ÇùاÕù-Ý8Qéb’ìDóùdéóÉë žø˜ªÉ”wê8Ž€#à8Ž€#à|(`s4{öìäX¼x±õéÓÇzõêe:u².]º$m¨ªª²eË–ÙÛo¿mØôë×φšlª¶aJ¯»•)Õ‰óðé²tʲ‹m¤uY|±v|·tãÔ(H32T²PBŸ¶‰eùt± ñ•-T¦ëGÀpGÀpíÊÊJ›>}ºÍ˜1ÃFŽiãÆ³öíÛ'õ+--5î*µi“[×ÖÖw£ª«« žÔܹsíŽ;î°#FØn»íf:tØmÓº[Te*/*9)Ÿyzc•8Ôý“,k5~k7N[RÙ,`Ò ,dSŒN6POŽ€#à8Ž€#à8ŽÀvŸ7ÞxæM›f{챇}ôÑÆF©]»vÆÝ£¦ÃcÅ]*ÝcÓ´hÑ"»ûî»m÷Ýw·1cÆÔo¶Zˆx .>«¸btMm˜ˆQÈ&_¹Íõ©³µ§ú@[ÀLád%‰ær »ÓØ.ËFöNGÀpGÀp튊 {ê©§’MÏ‘G™l–¸SÄÆ©ØÄÆŠ;SÜb³Õ·o_{ýõ×í‘G±ƒ>ØÊËË‹ ×\»¬5xzžeC9±]¡ì Ù4·ÞEÛ`ß‹j(¥ÁŒÌêu²oʶ»8¾óŽ€#à8Ž€#à8ŽÀ6G`õêÕöÀØðáÃmìØ±Ö¹sçähΦ)]i|‡˜Ä¦ åk¥¯½‹]§S•¦leSÈ®•šÔ8lKmœZ¢!q ø8ß¸Ö 9Ù¥iƒ…sŽ€#à8Ž€#à8ŽÀvŠ™»îºËöÞ{ïäżGóZ*‹˜½{÷NÙ»õÖ[Ú6Héõ¹òM¶#¿µ©%bXKmœÔ˜¬J¥/Ûb¨|W´)ߨ¯¥ÛØTÙ®wGÀpGÀpšD€Çóî»ï¾äº=zX×®]›üS“A3 x„·ðñV¾Ã;Ì~øa£ìN¬¹ã5x1áµ¶o®_:¶ü³äiÙç[cSÑZÏ6-Ûb ÜÑpGÀpGÀØVð"¾Ó´çž{&wƒ¸+ÔÔ˶¦n¼…ÍS÷îÝ“2)›:lƒï Ä‹R¼Öó[Z•,ÿ8þ–ÆÝ̯56N*$«èòÉå×\ÇHiÚܘnï8Ž€#à8Ž€#à´¼=·ßõìÙ3ù.’^/Þj†Àl̸«E™”MZ0¥×ßÊ«ò-™òÅË'ßê²[sãDå U]ZŸ%ÛêFzGÀpGÀpG`{A€ßiâ•ã»ì²Kòc¶­y§)ÝfÊât)›:P—í4eí ²dqõÓ{‹X·Õ|koœŠ©`Yβ+&¾Û8Ž€#à8Ž€#à8Û ¯½öZò¸/nhÉAÛ@•ËoEñC»`Ê·¾OïòÙmÓªo'58 ò,d'ÛeÙ+¾SGÀpGÀpGàE€¨}ë­·’ßWâwš>¨DÙýúõ³wÞy'ùÑÜV¨‡Öå¢*BkxÑXž–¡Ë’Ég›Òíiã´% È,0%Ý’Øîã8Ž€#à8Ž€#à´(³g϶‘#G&?l»5¿Ó´µ•¢lŽ#Fuj¤u·h:d>yÚn»ÍØ7NÛ-°^1GÀpGÀØ~¨©©²šší·~^³.lRü<¢—F•Gö¨K mœÒá?ryß8}äN©7ÈpGÀø P9ÓnüÁ)Æ›ÄÚŒ;ή{lN}¥«lì!ÇÚ1û |¸ËòÔ]vÿ3³ŒõYÇÁöé“>o»õ\kSîºÇžž…}™ 7ÞŽ=zOë\³<[¬VÍšbwÞó´- :í0ÖŽýâ16¤<}ÍB»çWwZ÷Ïžn‡ )Þ¹T=óA;ëq³'—ÿ·Ì:mÏŽ6qÒ%öæ¢5ÉÆéï—Ýlç\þŽò‰°±éÐÅ´X©ž{GØ4Ýk×N_mgîÚ%8Ž´«‚ßËó‚߀"|5KìþßÜl¯Âä›ìÎ'Ù—Æï˜‰Í¨ íõwÍvß?ØF œ¯ÿ›Ùé§d´¨fùtûý¯Ú§¾ù%ë¿,œƒÉ•¶× 6ùùåvü·Ï´¾ [¯­mw]ý—¼úw»ûámehïa£Â ÌèÍkÓ×Íþ™êKŸÿ¤½zÛ6—rn¿ÂnÚç$;idcü–¿=Åî¹?×oÊ:ö·ƒÿœ}rÇÎIÙ7üm¥ê³Üž{}aÐÉö=þ;lç°ûÊÓ(¦zc• =d’ÝpÆõvÚ³l§ôÆhéd;bÈDLÍÎØÃæ¸úÿ…ûR©åëƒá„çõÁ 0«W¯¶^½z%ß-Êg¶lÙ2;묳ìöÛo¯7yöÙgíšk®±ªª*û·û7;ôÐC]>ù£>j¼¹ï”SN©ß ýá°#Ž8"Ù$Õ ßs¢N¾qŠQÉæýQ½l\\š PmkÖ®°+±VH84Ž€#à8Û#55•¶òýY6íÝ.vìÉ'ÛãºÚkOÞf÷¿½Êªæ2ÍÞ|{Ø4­· '}ÅN8r›ûÊÃöàkmNyÍò—ìÚÛŸ63ÁN:ñÿYßU¯Ùm7?noç±·šõ¶|ý:«NV:ü ¶zùjÛ¿n¯3çá[ì^gŸØ)l†V¼l oG¾2ÜI*+ïjem޳‡ææ®Aïüýæé'vl²iÊm¿[Ø[ýÄS{¶ß>Ö?¸öy í=²{^lªªVÚÒ÷V¦jÖòUkmÝû Ï}U­œ6‘ËlC°LÎÁÂæi±=à`ë[Ñ2xm}»ÃæhÑ?ì†^ ·îµ“O=Á,{Ëh]©•4«M;,ÉèK¿o}¨õ×qÚ~ך¿š¥/Øoî~ÚVöÛ׎?ñXÛ¥ãB›|Ëöv€1×o_³çæ÷´ãO:ÉVeÏÝÿlòˆd¾þб{eŸ°õc÷úù=­Ñ¶yíT;®Ï§ì°É¯Øíg„ûQûî\¿ùÆ—TÓ}0ߨÈEmúÿºuë þn››/~ñ‹Æ†HiéÒ¥6iÒ$ûÚ×¾fßùÎw’ÍÐ{ï½gùä÷ÝwŸýþ÷¿·Þ½{'~ÄY³f½òÊ+›mšÐéwÖ¯oÑ[„þÈ%ß8}äNi 4hÅL»õ²sÃ3ÁeÖµKÏä×¥{v)Ï O°‹®}È–¤¯€-Pd«„¨œnçŽkcgÞòþ>A«4̓:Ž€##N?ÑvÙqGÛóè“íаCxíµùVÒ}Œ:á$;ú“;‡Ç„†W‡Æ¢°Ø¯·¬Ê6„Uÿ Ý&Øi'o{±Í#Ÿ÷bØ4…m×чín}ú²#>¿o¸5ÕWæ‰Ón¸}íüóíðènS®Þ¥Ö¥w’ÖØäkÏ´¡G^`çÜü'›Ð;Hæ¿nÙ${ôåV±æ»öä{íèoßf•áoê}a{ué‘6 $Ôs¾MiÎ_ÒÍvÙcšßgÜ>¶óŽÝòbSY¢BR4-/É݋ŇžúM;æà]le¼–4 ¯hwhÂÂéÿ ÿÇÚÉÇïg;önG}ãäd£S̓ˆqåin6uËìK+­ç˜½l0¸î’Ã5Ž9ïå©!è0ûê—³‡íbG}õ+6ØÖÙ”—æQZHì„S±‡ ±ý÷g¶ñ[ÀÊòöŸÄ)ü[`O^evÎþƒ%0«|Óþ£ËÞÖå·oØÇwµG“|G0´AŸp…1Í߃sž±‘* o¶ºº:ùNÇe%¾ÿ´ûî»7RÝsÏ=6nÜ8;üðÃ퀰ñãÇÛ3Ïw “Û´pA]6Ï?AÙNN“WÃpZ>ÕkÃÂN¹Tb=yšíݹVÑy³y÷Øå“y$¯.u+µ!Ÿú¼í½âN{ú-QYxôîó_žWnÖ1XͲ›®¾BQºnÔDÛ{̓›Åid”ÊTÎlgù”]oãí†çæÛW÷Ém‡ºìz¦ÕÖžYgÝþüÝË쬽V‡3l [<³WVò?—ª¼j7‡;UOmt¿Aê<´&w,¼U/¬Ì­¤s)›’Íî“å ×Hœ;»öÓN$¯µ;7¯–iwX¯[Ù¸1VÿD[IŸd£Óôó$Û”¯Æ¸6†e£•í²»õ”°¤—õÐL]Ë}:*6ÂÔ=ÉYU÷¦C!(—L>è} (~4¼ozIøîÜ»ÄÂ:åÐ2›>å¡Ð¿ÆÙ ï϶5Õ£­Kýª·0¦]zäëƒáÑÆíWØðí¬1×§ÒnvÔÉ“¬ÏøAõ"gGÀøè"À„üŽ-ŸÔw«[„V‡ï-Ù½lÉ÷Úo÷µ¾ñÞ³³Í{ä:ãfüºU56ö3ߴûUÙ’9oÚ÷=l·ýiûÆgwÌ”7 |ÕÿPûöWö³’°Â-±UöÖëï[÷®í­MFœsOß/y¹BóÊ™wXùˆmâ…÷Úâ >k}dP½ÀnüÞÿX¿ïü^AZò:·”>™ð¡8߯{ŽÿŸ½á§f‡}Ëöhξ©Þ;ÇÌɃMʬ![·°—`ó ¿åRuu¼º5¯–j÷ÆwÞ ›Ïáuçd­­7’®ÒŒ65—Z/„’­‘mœ6ð¶s®¼À­ д ß­IÒÞèX3û¥ðAï$Ûu`Ý‹!Öγ)1¬SF\Ÿ„æßi߯­¹Çöªß5a¾¾Ô%ôÁsò÷ÁµyÆL¾¾^_‰:†ïq¨¶¶6­Ê›ç1»xãÄ ¸3Å¢,ù˜1cŒï8ñ(ßÀí‡?ü¡}÷»ßµÛn»Íþüç?'ò8 u¡NÛÃ[þT§í•ú£zÛë™Ùæõª¶‡.>7<a6é×/Úu6Mu•)íc'\òW»÷ìp=¼ïè›ÞÌSËJ[±t‰- Çš‚e…ïP­ÈÙ5ùªê5I¼%KWX%~¥RX$©}Y´“ë0ÜλùõŸb¦\B¶ØznîéGÀp¶OÖÙýwO±åa´|Öãö—·7Zÿ1C¬¶:Ü]éÖÃztng«æ½dO ßn)«¶¹ßb7]{—Í ‹È^ý‡YîV••Ø‚<ò»ŒÏ|=a¾¾Ä_Rc³Ÿ»ßþò·ÇlÆ“ÙqJªÚC7ýÑ^XÄsWJ ìêãO4;û»êÛ[õ‚6gî[°"\0ÂþöUWÚù7üÕ–„É~É«wØç&Ýlã¯Ü7|‡¥‹íýʼnöØ9´éÁvÎc?³C.|Å®½æËч|*£xZ›F¿ñm,J’ÇØ¦Ù‹´ª°Pø¾i¡0]…—; ^o7 ¯–i÷€QáÜ­Îî}vŽUÕTØëÞî&[sÚ”¯º¦¯Y¼ÀVU„þa–”½ñE»ÿ©™V¾#öú#wÚkÁþ{ìØ°t.³ÿ4Í~nrØ8dÚ7Yç½ìaÀF€ãÅKÃzåŒ{mc-›¦ðêñ[.²s/{(< ZÓ‚}ÐòŽ™Í·‹ õŒ¹N:ßsjΫ¿÷Úk/›;wn}6D»í¶›å“cÈ£wlšÞyçä++W®L6M¿þõ¯íü£Íž=»>u¡N;r‡ÔS!¢Uf!3×}äXú¤ýì*Ðûý×Y{hnûìÿkã¯:Än>ý:»ð+á®Sõt;³|œ üÛv|Å}6é¸óëõË…™táíöó NhøD1ˆçL¹ÑÎþÖivoôlúø“/³«®9ÏvK>9\`??Ðfžò¤Mjÿ ÞšÔÆÙn¾Á.:y/+ ßc¢ìì–ÓþêËÙ¯¦¿bãÂæï_-KtëûŠýákÁ Î¶9õl(Ó9GÀp> t·þÏÛo®x:©l§a‡Úç>ÙÇJæ^ù=9È_ òðö¼a½ÃwÓlþè£lØ¢‡ì¶k¯Î5®¬¿ûÕ½lTø.Ð7ݽ™¼sxÖêø}–ÚÝÜd¯=€K™íýÙIvЀ•¶$þÄfÛ; Âo}´Š^»ÈžaîŸ~² ½*W,ÿÇ]ú›vþ¾öïÓosúDë{aN71\C®?{ß$³Û¤ŸÚ~5ÎÆõÌ]~òç7êÞ®—³-ö?‹}7`Ïllž^®e¹Ï—KÚ°Ñ$µ²Ÿ:è{â¶k“Ç{ ߯™µ:Ñ%ÿ¢=Tùñ™xðZZ,^!hK´»|X]] C®x’šª¢%ÍjS>¼Ÿµ¿ Ù©»M{òûÃÚìŒ1 ˜Qö ¬°;ž¹Ã®~&AÉÆ†×Áï×»$üFVT•œ*¬ß¼ÿÔÛTÚ[SîµñÇý8ÏÆy½ðÐ+vÆ·ÆÖ½¢Â^ø¿ ìÊoò´KÁ>8êˆãíµÌsW_±‚L×®]í­·Þ2¾ëTlúä'?i¿üå/“GóÖ®]›|·é·¿ýmòR‡,y÷W¿ú•]|ñÅ6}út¾CÆkÇ¡¼¹oèС‰)u!?lذØÕù Ú4u«0|a,þöšø4ÍÍ,fÈãy:/4ßÁÆ4Í3ßI/›4•ÍØÐÆ;OÐw„&i“QÀ–ËÍC?ØÛ޾´—=ºd²Mè2ÕN)ß;Ø5ÊF¼ò²•?4ßÁóŽÒÁë@&^4ˆ[(2Rš‚©d9‹Ôÿ›rRq=û!C`ùÌ9IÚgh5/µCx\ïf{uÞ ›0¦Áeü¥ÚÃçO¨íç„#޶Ý'õ´Ón9Ë®™r¼ýø  »$Ù4³Ûߘb'Œî’8OÿY;|ß3mïÓ¯´ïßxŠÝóU«ÿ錛_±ëNŸü‘ÆO°Oí5Äzî{–=ôØ»vÞ>ûÚ·¯¼Âªß¼1Ù8];ý7áÓǺ«lÇ›®gý÷¹rý¿#à8Û;5aý±±2yBç°¡©ûšSTë°1 r¥v_Ò.Ë>|2™G!–"5мö &Erá­{¼´!3Òe:!ÌM>ç¿|6õòÁ«…Ú§.Ôµø65¯‹e×cµM™B˜ÒMÔŸw}6„WYò¥öíÛoæ1|øðúMJîa\ýõÉ÷šøRÏžáÖoy¢ ÿ <Χü/~ñ ±õ”:Pꔵ‰«7t&A€»2žzæ,ŸC¯oÆô6r3YxØ®únæ)gÐþzŃá6f\ûW[úæcáÛQÁò·ªß4)Ð^_»Ô. û£{ÿôBxþXé'v6Mu¢ã_5{ì¡—mE¬¢:÷Zˆ ‹©Óõl(_õpê8ŽÀö@ùƒí¤“ÈØ0mßõöÚ97xDŽï,ñB†æ$67Ú4Å~ùä|Ç©¤$}_1ö ?Fê@]¨“§¦ðSÓ},,ªÃc¤!½3>BÌ@`Ù¬›K'îeC³îaöÞ×¾uX0Ÿ¿Á¾õvâwýŒ©öÔ”Éá®Ñd›¬cÊKV9,¨Ÿb3ÂÝ"6/ã.<¨á÷:Ïð¯ÃP;hb.“UœÌòÒ"êÉ}cOŽ€#à|¨ßK2$|ŸéCUi¯¬#ðñC€MÊŒ3’ï95ç»N-esPß8‡î­;‹ íV&úŒ oÛ iêKÌ¢_dÏ׆¥‹çÕ8Û¹oîQŠäMß^õ_5mìWnýw’°gZ5ûõœêÒ“íK[5äæÛƺËN}^;Û 7ÛüÆv¬ÍÏ[Où1t#à8Ž€#àl9V츟ܞ´ó’ã†ÚÏž™ÑæJ{îwgÚ!ßç%á“ìǧ‡W|7J7Ûiá‡åß­©´û~ò¯Éëþà[GXï¹;\ù… í©¥œmÍ«·Ù‰×ÙÎ,÷¾˜Æúbr•ë—žíÓt=s f{»ÔpGÀp­E`̘1¶~ýúð´Írã÷™ØÐ´vâmÛ”E™”M<€oœŠÇê#oY:ü›ÿÔUI;Ï?r„µ9î\»î–ûlrx‰Ã¿û™2®Üö;Íx»÷ß„_áÞ’W.<Úöžt‘=ôüT›þüdûÙ¤}m"?¬»Ûeö¯G /vØÍ~xóÁñf;¤Ï»úöÉ6ýÕ©vßµÿa]w;- xùGZSŸ}Ô½C¯~“VVžÛêœÿ­ïÛ·ÜhwL wÍêöP]7¯¦5YÏ 9Ž€#à8Ž€#ÐRðšñƒ>8ydoåʕɆ¦‰ŸÚª¢Ù˜­ZµÊ–.]š”IÙ®u«Â,œý‰¤Åi.¾‘ú¶­ž³§ýú⟇¤½Òκ——‡7¤Iß¿Á~xÞ$Ý£q×ᥠ“~û;oÇ'lÜ‘çÛÑ·\Pï4þŒkí7WYÿv¼Ñ'ÿÒ^´vÚ¤ ìì/ð])¥IÿŸ½÷‹â:÷ÿ?´ÙDLÑÉ¥ÅÔ]nðk1½j¦ILî7K®Ñ¶oCíë÷›€Í}‰$mü“¦½mÀÛ*¡Mô6â· Ú+¤ èý)©&-¤Ò]›%µ…TTÈeMX³›Ìï93;»³ÃÎì‚Qžãë0gΟç<ÏûœYϳgfµ­åxHü¶“ÿ7˜RâÔ£ürˆŒÔÀo=ÅÏXŒÚ¢läUÕÜl-Vìj™H«uôGµÎçÈÆ'¨‡ðyÐ×7ˆØ †Ü>L¥RKõ—‰ô²ˆ\Ë V¶á`¹*>7µë‡›Þpž05I‰ûGT¯·× $&寤ÀçŽPÕ@u½!Fl4ÅÒýºÃT­žéœ`L€ 0&À˜ÀØ/khhhÀm·Ý&ÿVÓUW]…±rl„ì÷Þ{O¾=¯££CvÔ¦L w?ÎùÙE.ÃÓ$áO?¤(î;ÇpQ,ÕÔ:jZ=Wë«íÅÑ(Jš2‘V£¨¯¦Õ#eÉrÄQ䉠?‚|5O©¡û;lm©+çÓ L 6>ÓoLTøQáˆM@ÒtŠ‘*S½é7*·Ø%ŽD¾‰Ü°“Qýhõ4jÏùL€ 0&À˜ÂIºï¾ûäÝ wÞy·Þz«ì8‰7ÄÆŽn¹.~£I¼r\8NâEâ™&чØåâ0:bW†#á_F>FÂÇPÌ¥¢çšÌ¢˜`L€ 0qM@84_úÒ—ä§}ûöáoûÜn·Ï;ÕË#Ä-y¢®ÚNȲ¦N*Ëf§éü¦Àè\Øóë“[_v®Ä­wdãÚ97ŒsË.=Ç9FV 0&À˜¸ Ä2b·é–[nÁŸþô'466Ê?P{ã7bÒ$å¡m±%žRŸ¦w— ‡Iì0‰ §'NàèÑ£òí>ðÀüÊñ1-~ÆiŒ@²&À˜`L€ 0&0–¼^/Ž;&Ç“'O")) Ó¦Mƒö(õ&ñ⇾¾>$''#55UŽqqá_²5–:ª²ø'•™`L€ 0&À˜øX Ç'--MŽêëÄå—=ˆßcAì@}úÓŸ–w©®¾úê1#ßÇjð8ïŒoÕçÄê1&À˜`L€ 0q{^"½MKD‡¿ââpç^™`L€ 0&À˜¸„°ãt «Ê˜`L€ 0&À˜ÀÅ!ÀŽÓÅáν2&À˜`L€ 0&p `Çé,V• 0&À˜`L€ 0‹C€§‹Ã{eL€ 0&À˜`Là"ÀŽÓ%4X¬*`L€ 0&À˜`‡;N‡;÷ÊÂð¡¯÷ÞygÊo‡©ÂYL€ 0&À˜`…;N;wz¡¸{£wàãq;ƺ¯îÚ$§ü; ¦OÅÖŽ …ˆå2&À˜`L€ Œ‚;N£€ÆMÆ/£/¤"å‹ÏÁý1¨8¦}ù:±!'ªÚŸFåÎ|eþì:} ƒÈ]0&À˜`L Jì8E Š«]®¼ÚL›„¸Aݱì«ïðϰŰߖ€tûÿ… %¨ïô| VpL€ 0&À˜`Ñ`Ç)J\' n~~rbb#Çl©kGpé¯/ÏE•nªótbSawÄãÙªŒ ¬©j Ùyé;Ò„Çs3ü}Ä`yét‹NDûüåX÷‹·W •[ˆÝ´ïä—Û9Ћ†ª5Ȉ)DûiQwô~ÉÀ‘](,Ý­Ù­Òëì·É¨/™’¾Mx;Cô9ëÆËUe°mþ n2&gà;y@Á/~/Kä?L€ 0&À˜`Ÿ;N . PŽš_÷ú¹ ÎÃlÚóžA_Á6fvÓÇw?«VÜõ?‹xÜf_ løúü9|`L€ 0&À˜¸¸b/n÷Üûå@ÀÓýKØ«Øx°OfO—M²¦¿€ïîÄ¢üTÌ»~XyÖmYpM¿³–-DÓr/ÈÞÜ‚J²ä“ÌôgÐØY‰Å­øIÞ xÏ“óŸùÁ£X0™’³­øïƒGrÎOñæOB–½W?׈•ó±rÕȵi7jŠ8Z7¢ëõ'1CdzÚ1þéCÜ$‘7 â¢0·é¶Hkñ„®/O÷®¨ì¦ÏÀaœA6²Ò*%Íʤô/ðöÙµH¶r`L€ 0&À˜¸¨xÇé¢â¿<:óW?%CʱÊï4©V-|¢®ãÿŠw ÊÓ(D>U~ý/ýr“Aú»ú«sÔæò1%žYrœÆÅMù´œ·fÕ&ìèÆÀY’²¿¯w?2e/ ð~ ¤ÐQþüSþŸk§)˜ešŠd“pqô}µÑÛ):Öêã>ÖåiŸËJH¹•žsâÀ˜`L€ 0&0^°ã4^FâÖãÊO§öï³ vòt¤ß˜£rĦbÑÀž×è¹$9dã–$ý&¨p„”] øáØáí°9ÖcQæLLMˆCŒm9^tšßÐ6H»9_LKð÷ÝÁHgÕ¦pRŒÚèí¦Oܤáâ,W…Ù^s˜`L€ 0&À>ì8}<œ/ë^Þ?ÝC·Â]²c"<ЉïwÃmTŽ“øó+@Îm×øxuÏ DÂçAò¼‡ñ‚CÂPÿI¸ZQzËNäe¦`·ü†ˆÚOâô>š¦E$›Â©iØ&Œš®hëê\È©8ñs ™ŽÚ]¨a•8ƒ 0&À˜`Làc#ÀŽÓdžúòíèú9÷Î"4ꜗöš/caÖs¸Ê ÜÝÑ„2Â2wFrTpœ?΂%n‹üÖ»øÄ$¤þ|o·ƒö“€¿œ7óEd¯§=Z÷§¿ WÅÿèS$›”› Cû3jÉ΄dñRˆ3xOs¡×§8Sš¬ÐÎøŒ 0&À˜`Làc%ÀŽÓÇŠûòì,i~>Ê­@ÞÌESg/<7œõ˜³Îû¶¯âVmù*§£ã»aÏ\Ø·ãËolˆÌ&yNU*BYíaôy<ðœíEÓ+ä™ë§Ydòæ³ožè£~ dÆ_‰4**ÿèðÐFVšÊW¢ä•`ýH6%QU}_!mFbgRVÒSN¿;üÉÛ¡SÇ©‡{p3¿"8(œbL€ 0&À˜ÀE$`r³ÒEÔŠ»¾ÄLÇÚßÒë VÙ°xÖ΀îö u¨YE…@¹5Xn[Yc?~Á§¦„¹5ÞAçßJšÿ(m{ ó¢,_íÆ†ò½.<äw¾n^ô z©BæÝT‰òÖ~¬õ¿a!ä–·Øt¬?X…”z•yU"èŽhÜ›‰ÅßQo›‹lÓ°¾>¯icj§î¼Ø›ð%ò —6ÁÚÏ/ }<øÿèw°®SU3ùȘ`L€ 0&pQ ÄH’dªý˜iŒ¦‚šÖÕ+‘¯"_®æ‰£Qü¤¿Lõiáì‰v"_¤Õ:ú£ZçsdãTÃÇ@À3Їþ!b-S‘”èÕ¦_µÜ2e*'/×T5NÒŽV_¿°X0%1Qyí¸qmãÉé#9q Hº&è¾é¨:Ù¤¯/ÎÕ6ÑÚéîØ‚)™¿‡ËûÒ݇‘1u!¾sÜ‹oSœ`L€ 0&ÀÆ7rž& ÿDñCŠù"­âž µŽšVÏÕºj{q4ŠÂ‰QËDZ"OM«Gʒ늣ÈAù jžRC÷—'>e‡@/6Ť gï1¬9S„Y/,Æ`s¡f7îâhŽ2&À˜`L Áq⯳£™ \‡ \pÓñHk9¦f}'Pí®Øiºà̹&À˜`L€ DO€§èYqM&pA $~~-m‹.~tAûaáL€ 0&À˜`#' žâÀ˜`L€ 0&À˜`&Øq2ÃEL€ 0&À˜`L€ 0A€'žL€ 0&À˜`L€ 0ØqŠˆ‹™`L€ 0&À˜`ì8ñ`L€ 0&À˜`L€ D ÀŽS@\̘`L€ 0&À˜`ljçÀø# õcK÷ˈq½„-ïºÇŸ~c¢‘Îý h?å9oiî#[cÛ‚±$e.Óƒ]¹1¨èÑݼMHÕ1> eéî¨@LLBµ›./žc£?KaL€ 0&ÀFO€§Ñ³ã–„ÀGh8öŠ>øå×ÞG?•pAz¹øB}h¾ÛŽ_ým 4ñ “7¢BD8CÎBNÜ 9UN.”aº Í eiI]Œº¿Kh¥±;3á2v°$&À˜`L`¼`Çi¼È×ÇóÞ[°Ó&LöäL¬MŒä4ùÐZû82bbh‡!Ùkpð„žÎ]È-| Ï?Nù¹h= urmJ½åŸEEárì8â–ëæäï ìÖøzb¹m œÔF–“¿ ;Ê eù1$¿áÕ&l¢ÝÑ_N~:ýF}»¨]0ßIÛJûŠ`û˜ìx½ œXc³ ˆÆz}¦…ÏÓJÜ׋]¥Ë•~b2°¦ªiøŽ‰Qá19ÛQ£ê©öãŸK½¯uËÈ.DC§²#ô3²]? 7?äWZFR9^_IÕc£ŸéQQô2Â1Ò‹0Ó57ÿqlÙ¨2òËÃÒwò-Ô¿öWÈ~u`.3ÌøÈJ…Ÿ[z}ùœ 0&À˜˜8Øqš8c} Xúö÷u‘žS°õú”ˆúzŽlżü2äímA—ë– ‹~¸C>7êkVÁ¾¢å;Ã-ý»‘º È«‡‹êݰgJjvbÐëƒwè4škOú:y;Äû”ãrj×£À™‰6ç”’|û‚Ÿÿ\­u@m Öír’ÏÓ„äÌ<`E=í0ÏQ[Á ÈíKPð»hq:P»î ¾ñs ħ¡pkò©üÊZ|ý Épþt5ò6÷ ÞÙ…¶}+PY¼ß5ôf3ã:“HR ŠôýP®ïDR²òàÈÙŽ–öCX‘Rû¬%h%Ñf¶SÓ@ðt¿œUÀ’:¸ºÚ0×µõT: ±:J¯Ǟi8är¡±2 %Ël¨ gш‘[#ÁTW™eŠöÜ*Ûqõ0–Þ¡^ì¬ê•%G–f|¨¥ÑÜòiôå$`L€ 0&0±èW>Ëz¶ö¢ð uá+ÇþŒ›§þ/xDÙ#E”;Å ÇðÙi‹¾L-Ŷæn ÖÇžXxwúÂWÉ}§ë(úÎzpdÛ,ÌLzÎS@ÊÌLÌþ U»êŠçϨÎ'C$†ž¤-$Ýœ«PVÛ·g‡«C UY}ï,sÛ5N•,ÃÏÏCÏ®*¡ýµ0/‡»nÆÊoïB¯ÇƒÞŽX¸Á•÷f Ý€ÑIºfº*ÕÂËVÝ%•¥Ö!Œ,S£€&i8·4\4Õ9ɘ`L€ Lêšc˜Ê&ŽgIŸ²¡úÌ{˜;ùª¨ÕL³?…ìuv¤XèÅ´³Q¼Ž^·°¹;\´¬·Òn?$Üö(\{=˜•k“üÙy´3E{NŸ¶XŸ¾ uE[±Ôš,×Î_WLNÖÛjS’LÊÕ´à¹Ø›F¯–K˜½-Ïub^ÎLÙ)ºTnÀçbÉ‘ i/ÚªN™³—ØQ´lþ¸­ û¿Õ‚Ò–y°% —„‚u%5Ýâ8ÝnT§ŸžA2è'á¶ôŒÕqÌÉŸƒ2Â#Bù¾.e…@,ÈQRC¼&­æÅÆ~€Úo.FÉÖ|”ÞG¯qؼ¶u¸ÕÿÒQO´3vUTIޱñ¤ËùI‰O;³ž¢©3¬½‰nQÛ.Ë&9lF<Ù–„‰Aáêxé +ç»äT‰4VÁ´2O„“iÞ‚J#Ï­ˆ"¸`L€ 0&pÙ`Çé²J6Ĉ@ìô{ðGwZïÀ_{Ïâ@ûw±ð¶›Bv¥ŒÚrþø `}çÐȦñ¡>kÁ˜`L€ \Øqº ‘Mˆ‚ÀäéÈʦEU®2 Ä&Á:{êÅ*1&À˜`†€xˆ`L€ 0&À˜`L€ ˜`ÇÉ1&À˜`L€ 0&Àvœx0&À˜`L€ 0&À"`Ç) .fL€ 0&À˜`L€ °ãÄs€ 0&À˜`L€ 0&;NqñE õcK÷ˈq½„-ïºG¬€ø±ÔÛŒ¼¥qWæ2=Ø•ƒŠŽcšsYšŠ—dÒçþ´Ÿ¢ß]¢0¾l Õ-oh™»£11ˆnDIæmF6GBuã3&À˜`L`<`Çi<Œë !ð޽†¢>DùµwàÑOø§N¯7 q©c’tKqÿŸ,l‰‰¬°õ/™Lšï¶ãWó+|¡ÆbT´Ö>Ž Y?Ñ×<¡ìÄ(5<Ø]œƒ5uÊé@+ m9ØÕ©ì•¹>Ù›Ðí 'çžÍÏÁ¦æ^µ3 tì >¨¾Ç€K &`j«Wjß×d—“_§vKÆãÄ›ETo}¦…Ï”ca*ä=s©Ÿc9¼½‡«–## 2>,ÏEÆ#?ÄÿÑë¦ò£·ïä[¨í¯²®èð8¶lTçZ*ê†{¾Ú6BttsDU‚L€ 0&À˜Àx'ÀŽÓx¡ ¥ßGØß×EOÁÖëS"ZîüéjämîA½³ mûV ²x1¾ÿªXÉO¢Xƒ¢ßÍ@‹ÓÚugPðŸËN•ïDR²òàÈÙŽ–öCX‘Rû¬%h¥fÞ¡Óh®=èwèäìtþïr”„§{7RsVKêàêjÃ\×zÔSÑ$„þž´çÈVÌË/CÞÞt¹a *±è‡ûá È‹Ç-7ŸAåÖwjàOûPãlÆ‹¿=&×xó×åhþÌ? ¹3œœ7ðÙ´3X¿i¿ßÑ#窺Žyóñþ#.ŽMm5âêëmBrf°¢Žö˜ç(­`GÀÑD| ·Ö!ŸºÉ¯¬Å׿L)“±ˆ$Z{}nÔ×–  ÜX†m¿ÿðPP[„’ÚNrô¶bѺz”üŸÁ#Ãtóó£·w¨;«×KÑ¡ E{nÀ!— •i(YfC…Æ’´m¢#~ øÀ˜`L€ \ØqºérVÑ3Ô…\×ËXs’v„>êC%yö«g!=& «Ï R¥38KžÍ­9+qÌÙ‚¯SÛe£mçZdͶbÙ×VÓÔ^ü™vŽ\/?OJiñû0²n[€Gwt¡ÍøÑ˴룿·/N,ú‡gýï­”[ŽíëDúŒL<ºÛ%; ç4.‘h›œº½|Ëž…›R?‹[çÙ€ƒÇ ÝÀºõî5À+{qŒê¿ýZ»h†ú'Irã7ë(]>ñr>Wðjû ~ŠùºP]lÿÚS.rÃÒÚjÐÞÕPAK±aÅ]HMûŠwm'eŸÁ›ƒâ‘>ÿŸ0ß Xý3²Ò“üŒEDyþæa{K÷mÄÎüYäèaås<”þiÝDaôÖϪÕxà{XžŽ{Š~Œº•@Iã[ª‚ÊQÓ&Ú9*€Ï˜`L€ 0ñL€§ñ<:@·xËuȽâCTö·"·»\˜+ðØ5ê‚Û€µð'¨.š†¼¬™°ÄYpÿæß nª¸½ï­Üs‘6Yi?äßâ‘×µäØ6Û1]›‚Œ;Çiò¾¢ ^o«¼‰jýØTÙY»FÚ›8 x£qt«^œ%K7;€[B÷¥âÓ`%íWµéÆï›ÞÆöÃõ°×ÿ®Þ7ÐDƒý’`$'þÆE¨²:ð‹ßöÒ-mûIJ)îJ‡1­vÆiãöb° 3,˜B1ÙJ;;p õ¨ö~=¯ /¶_Ä_ &chä®ýô»¾F\E°ãëËÈ““ƒ^7vÄ2aQ92¯QëÇâ1öt¾<"Ú9¢Jä#`L€ 0&0þ °ã4þÇè2×ð*<|s–¼È­÷}Hwv¥b®æ›{3ãú¼¸ó‰ý¤AÚmjÄ}=tëØ#{•…ûðGPdQ^úë¨}#x{Ñ÷ 0mu* 5!N‘¤É &´“t”úq`L€ 0&0þ°ã4þÆdâiô‰$x:±å‘"*™¢HÓ8²ŒW °‰^à¡gpW•Ð>Ìð—Cx=ghÃã&\;Õ‚¾Î&<ýMzjÝЧ‘%„ß¶lUehÎû"nŠMDVÞ4ÔlÞ‰•Ù2 C9Ôö¦Å_§*z¨ xt‰²³bÄEë˜ÙjÔ>}±«YŠmÍÝä{øàØŒȇ@IDAT³ ï.ÃIa„.¼Óu}gC\5] mò†5¦ £ö½ï4aæ²”<‰¶ãu@•š—h˜é(Óh/tå·w¡×ãA/½„cáVÞ›ê‚iÚD;GÂÙÅyL€ 0&À˜Àø$ ]KO Y« A éS6TŸys'_µ½·«¥-ó`Kn ëJjº±ýô ’zw–RB(á¶ôìÓqÌÉŸƒ2ñ åûºðàâRX†º¢­XjM–óó×Ó3DoËé8 í:XÅ-[€Ñò\'æÑ ”ži÷A¡—Sšý)d¯³#ÅB/’ ŠâuÔáæ"üìØIVнKœ•-?#…Å™òBü3Ù¹Tÿ ¾ü…›d©Fr~Ò±ko›ƒUäßÕ[ƒ¹þ[É ¹ÈÒ”?ñ³m5jŸH·§ÉvçÌ”MaSõáXC̶`ö;Š–ÍÁ·µ¡~>õg4³ýMå´ý h}$ȫœÙt›#DK¥órJðÀÐöÝ®ÊÔ Õûå;‚ã­T²#çt9ež|š½®›É)Ö†ÑÌm{N3&À˜`ã›@Œ¸…È,Ð+›µé«iýQݹùÚ(òõçjž8E±ªeâ¨O‹ešZ&ÒjýQ­ó9²ñ ªÇá2%àó¸1DovHˆþBpC“}Úqò"nr°.ÏY7¼±’â %Ë,“ãCwBjÒkÎ’vþ~„ìXJG"A91’Ó‡Š˜d¼³¯ÏÜxrKn 3[ Û›° £xä¬ó•w¾í#h(~ÄwÊC“0ä(D,ßP4sC•ÕQ+ó‘ 0&À˜À¥K€\†§Iû?Q¤g/ð‘ÿ(Òú(ž>Wë¨iõ\­«¶G£(œµL¤Õ(òÔ´z¤,¹®8Š<ôGñh…š§ÔÐýùúM'€O™ÀÅ&Ÿ`ú¬IXýbã‘@O¸Æ™ W²Œ°%šÌXê'!p.d. —ã¦ß8š2K쀣+'Ôi}DÃÅÌVÃö&ìFeÛùÊ;ßö‘”öÒ-‡ÎwÉ9iüF4‚QÍ‘H p9`L€ 0&0°ã4Fu`£ `IÎDãÞH[¸3øJÁèš$X†Ã942‡):Ñ\‹ 0&À˜¸„ðrë,V• h Ä&Òo ÙÓµYœ¾b“`}!³L&À˜`LàR" žâÀ˜`L€ 0&À˜`&Øq2ÃEL€ 0&À˜`L€ 0A€'žL€ 0&À˜`L€ 0ØqŠˆ‹™`L€ 0&À˜`ì8ñ`L`Ìøèw‹|â.ó0Qì¼Ì‡‘ÍcL€ 0&0"ì8WþXHýØÒý2b\/aË»îw)~°4ƶ#oiÜ•¹Lv寠¢cÀXÀ˜–øàÜ߀öSôûBÌu‹Üñù¶Wz𡵺qqÄý 5r§rP;ýy¨wGbb* (^gó>B{Tδý #ÚéëÄúÝð˜ü&sÐg³us&l;v’,Û&×8¤µ…Ä"{5™á”qÞžËamŒNÉÑytò#×ù܉,“k0&À˜À¥D€§Ki´&„®¡áØk(úàC”_{ýÔˆ~nT!ä‡Iˆk^Ncî¿—}‰ÍwÛñ«¿ù%Ÿ¯½çÛ^VƒŠ­5(Ý×…¡ÇæDi²ÎrJBìÒI±¤.FÝ‹_„EäZgó>t]ʧ!ý Ç)‚}- ¨-kŸAó cÇæÜ™ÐÞ·‹Çƒß=€lçzüà°ÜÀ×½³òkPüâO3}ìQâBÎåð6†r0=3¹MÛIáÈçΘtËB˜`L`Ü`ÇiÜ +"xÞ{ vÚHÉžœ‰µ‰œ&_/v•.§oÞéù˜ ¬©j’w#dÉÙŽšrñ­¼(ËÁŽ×û€{_ß…å6‘ƒŒìB4t*;EžÎ]ÈÉߨ%ðõ¤zkà<hHo~¹~ËK+ÐH ºø@©’0•g¤;5íëê—“_§v#ËãÄ›ETo}¦…ÏSÇÂC4±×TžPÕ¤½°!·ðY4<ÿ8ñÊE+±&ïÔqTäf¡ˆT)û·™(ý™KHÕr6jG†<‚ù<ú‡P;žýeè9Ù¥ïû·o¿…ú×þªøLªÎƒc\Q§¬ª ¹ŸÃŽ´f–7•ûNúûõE²S˜ìÁËÿ^ûs°=Ïïü—CdFLÚ]“ƒíûJѼn!ÍãV|ï¥@^-Ê–ÎÐÉ Ãù„GáHóh‡ÁõÍ\–wÚôc…ìPMl ­qLDõpã&Ï™üMA[i®5¼Ú„M´#,®wq=u*µ&íð wÝétæS&À˜˜$I‚Y$1š(-?éâëN¯ðÇItëGñ¥ð•'S«ß)¯¦˜HqÅOSL¢x-Å鯧x#ÅTŠ·PL£øYŠ·R´RÌ ˜Iq.ÅÛ)þ#Å…s(~‰â=ï£x?Å(>HqůRü.ÙÇá’ ð¡Tÿ— o¾"¹>Ь°c›]"KªwvImûª( ©ôp¿4謖Ӱ—K-N‡T»Î&ÁZ%õ“Hïñz¹ÌV´]ji?$UåA–ÑB…ƒíBF•4èïZ9Ï–ZÜTæ – uÕÉ2ìê$WW›Te2 U·«-fòŒt÷ö4ʲò+ë%Gû©ÔJ²íÛ:IÒä:\'åSù•µR‹ë¤¹½å ÛŒyʈsùÎCR_8yÿ»JjÚW+­:mVtÒŽÞÌRùÞ©ËuHÚxÙTT'9Cì8al—¿ïšñ èe-•¹\RcåJ™[y+ñÐÔzÇq8»È¼Õö4/¼'¥C&vÊ6÷)ã×Hó©ÿ`)é´Rêòji¨éA©ŠÆ¶¼]ÌJ Û IõE4‰1/µÑœÔ‡ðœë¥~“ñv.F¶^¿È6*-ŒÆ¤Ws ×ñÏå¼j©ÍIטkĬø¹’«µNʦ´ý9‡±ý°ÏŽásg˜}œÁ˜˜àèóö»ÅÚ[¬ÁÅZ\¬ÉÅÚ\¬ÑÅZ]¬ÙÅÚ]¬áÅZ^¬éÅÚ^¬ñÅZ_¬ùÅÚ_øÂ>A*Eá#_Aø Âw>„ð%„O!| ác_CøÂ÷>ˆðE„O"|ÕOQýÕù•‰ðuhÍý¢ˆ4ÂüÂEj‡ªªBì8Mð‹f¤æ½T²¿ùk©øï'%éÃw¤ì7${¥£ŽÊlZÙ¤ÚÖ.iÈ;$s¶Hm]ªã”X\z]b1¥8@ŠÃR*õ¨ò½]R1-¦òwºBœ#Q¬,Î9ZÇɱMô[.;b²¯KvdªÔE°_¶¶^ž‘îŠìR©Ë=$ R<éÜ.Û(œ·`’ªÅ¢Û9$giõ¡ö ]Í噵W”:ÿêßX¿P‚º’>}©n/-V…nC'¥º€#«oz®ï[ËS-kìS{òJu+i‘¼áé8 ÇSËÎØU®˜A§Yß>XKIÉóËï¤Ký-òB½¼Õï…Tuœ¢i׳O8bd£½Vf"ŽNŒ8Ÿ'£ë!º¹<Ùzý¢±Q´1“ƒ­Áq0¯“/¹üΪK|¹b­¦QWBÛf›dÛÜfÒ‡òY¡:¦Úk)ÒØû»à`L` ÿ£.{ÇI8A˜ÀE#o¹¹W|ˆÊþVäv·£™¾xìñEBä`-ü ª‹¦!/k&,ôR‚û7ÿqSÅ— çè;‹\¤‰ï( ù3‰'çaÛl—¿²§ˆMAÆ€ãôûòi4¼$ÞVy§ü‡\?6óé;ÿ@ш€±î)Ô¾ 3,˜B1ÙZ@ç´ÐÈõ é9Ÿ!ž‰½ˆFžY{ÑS9Íß‘ˆ`$ï”N'¥¶ø›H_½Q8ºU*Î’Œ¥›éöµ[&ÑVµÞý¹¾ï LyŒI¯ÌkÔ¼XÜ ¾‡ÚÓwÕ¬°G}FöhykéÛkËŽãÿ}³žn›,ÂTq[âÔy4ŸºmOÌ 7ÝÒxü”;Ð@|ˤóvrºU¬äî2àÚ3©ÏÃ_íSŽÆœÇ7Ú¹<ÙÅäD6„“?×^£&u¬s‘⟮^ ÊR½~ÙqñâËIŒÚÓ¸}v ›¯Š$þ˘`‡;Ng¬Ç©¥Wáᛳ@·y¡Þ÷!m¨¦b®ìáDVw Ï‹;ŸØO[ªƒ8ælÄ}=%°=²WYÀ;÷ (Gíç˜@ «¾Wh¯wuª®®üMãIa9ö:4ŽR?އëÏDž‘îgÏõÐÝ]u ›þ04ä%ߨ‡öµà+V±­ª3Cùáú§lo´ò Ú+=ÆË÷㊴±¼O)UÃüuþ8K7Ü€¶ž~yû›v€¿h+jì³µçÁ¾µ-”÷&¼}6˜ûl´éŸŠÉ&܃µ•>Œí Ç;Ø:\ÊÝQO.¯ u­.¸œ8\]hy±¨y ¿%‡i{R*RŸ?êoÚ‡vb.î!0o'ªûдц(Ʊæý8°Žœ±Á©óÔM9›Œo4sy´²ýÆFa£ZÓxŽ-Iw^(ÁhÜä:&¶ªSc´í•ÞµóSÕˆL€ 0&0°ã4Fy¼Ûø‰$8ölÄBÚi8)tÐ…wºŽ¢ï¬nõ¬«“6yº¦aOG#Ïë9ØoµS-èëlÂÓbWfÚ9r” ·CPD3J^3V~{z=ôvìÀ ¬¼7ƒvMÆQ×gTö ë7 ‘&Ao\«¦ù’÷ä~>é³­°¦Ï@ÖÿB_ 8°å¥·0]|;Pû+t}£†N…¿nÞÎ‰Ž­X¼™ž¾k}7‘ ›óDìäFÙ66 E"quô!Ú¹<ÙÁ¾"± õtŒÆ„¾' Ã:æ‰óio8?Í»äR&À˜¸ИæAñ3Nö^Õ×ðsRu×+R[ØéÃkâík <üM×"=˰R:ÔãUžI¡çLÔW5(ÏÃØýÏۥح/3ÖoPyvH÷œ—P|ÐU/?ë£ð²IÅëòeÝËÛûBì²ÍìÒŽÁK<ûe—ŠóÔ&‹uuþçÎŒ¹ëû0¶'ˆ\Û/YÞÎ!‡Dûh’x9…>Ú ¼œ¤·«Q®£Îé;©ÝìïHkH®m]cÈsMÇöm”nw©³Ü˜ó¦Ë4s7t|ÃÙn.¡¹l?‰H6ªÏ„À…¿BÇ!|ý|•Ÿ«º£:ðY ž-Ì®l£ž¢k¯ÿìÐÎÏ€ºœ`L€ 0™ýÿñ]Š_¥¸Œâeùrˆ²”l3ô Wñ¦ 5¨iýQݹùÚ(òõçjž8Eñò Q¦¾„B›÷I¨ç"­ÖÑÕ:Ÿ#Ÿ z.S>CôNí„xqãS”Áç¡'/â&' ÛáòœuÃk!ynÉ‘eÐk[&ÝN¦èb&ÏPwý¢´0´ÚE—çƒû,’Ÿ·`Ké„Cm08óÐø{éå9úñ2ã>LÔXóÖšáÁÀ)zî&v G0_Õæ£äÕ\¥ìˆ:TˆfL¢©c ^Î>ßöf²¹Œ 0&0ÁËð4™ü'Šôì>òEZÅM'j5­ž«uÕöâh…£–É_(Ò¹š§=iD]ÔsýQl&©yJMÝ_vœt@ø” 0&À˜`L€ 0‘˜Ž“Ø•áÀ˜`L€ 0&À˜`&Øq2ÃEL€ 0&À˜`L€ 0A€'žL€ 0&À˜`L€ 0ØqŠˆ‹™`L€ 0&À˜`ì8ñ`L€ 0&À˜`L€ D ÀŽS@\̘`L€ 0&À˜`ljç`㊀~[Ç'~Õ`L€ 0&ÀÆvœÆÑ`°*~R?¶t¿Œ×KØò®{ÄXÜG¶ ƶ#oiÜ•¹Lv寠¢cÀX€\¬çî¨@LL"µ'ÐL³²p²y¾N¬¡ßºŽÉßaÂÍg³uv†mçÁîB’eۄ㨳¶lÎÁÁÞ`f(Z« gAÜZª6¡—íÜ߀öSYܨ9(ã>ò,Ù–‹ö³¡œÕ¹ˆÉ~VaêiÇrÁX—oÜ…^¡•çŸVŒP‰öLË%”Ÿq¿Ú6†µ l뮣91>áø‰k}À€mNyè<ŠÖ&C;ƸÀ\ŸàçEôÝŽ¦MôÒ¹&`L`¢ˆèØþñFà#4{ Eå×ÞG?•0r½¢É$ļ¥y §q±û/ÆeÚµž%u1ê^|ma´éHö™èiÔE_K*Eaí3hþ^>î¿1üGù3¡·‹Çƒß=€ì¤E(øA6–,€¯{7få× øÅ.äLÊå@ŽÓÖ”îë“97…v4Š3½ìæ»íx·}™×°H GÑ0¦åi˜õÀ†ÚÖ_ kŠ¢Âûï´àßrò°ú+ö>¦ùÅÈòÏŸP~Åœß?s”ød„Gâ£/—)ÆMCþŽae>/⦦d‹Äˆl iyaN"é£~^Œ¤÷Ñ´‰|®Ë˜˜ÈxÇi"þ8´ÝóÞ[°Ó·ïÙ“3±61‚ÓäëÅ®Òåþoð3°¦ªIÙÁ“³5åb‡C|߃¯÷¬í}}–Û”oþ3² ÑЩìûx:w!'W`ÇÅ×{ê­3ÌÀñæg‘ë—±¼´´pŒôLÕó| õ¯ýUY¿Ùr$jG†‡"#{ ž 8ª}ƒöUÔ…_¹öumÍɯ€3ì—/ÿ{ ìÏÀö<¾ó_Ž ¦)“v×ä`û¾R4¯[Hì[ñ½–yµ([:#Db€ƒï8*r³PDf”ýÛL”þÌROŒM.é¿Ã`LÃÙíqbÍ‚"’¸>Ó‚Âç©•áäÉ:>‹†ç§9•;Ê¡iH·¥cFz:Ò)ff?Œâ<àíSï‡ØéÄlçêh0Ÿ : ð£òHüƒ"ÜhØH×dö&t7ÅqAŸY΋»‚<ȉÏ4X3ƒüÒÓ­HŸ1ŠX]Ùl+fLý ÑÚÃë.¨b÷ãØ"lò–¨×Z¸ù~\ÜØ]œƒÇ뺂û^ÝBŸ5;ð®ös€J>/DÃps\䛵å˜`L`ì°ã4v,YÒyøûûºHÊl½>%¢4çOW#osê]hÛ·•Å‹ñýW…g0‰b Š~7-Nj×AÁ7~.;U¾ HÉʃ#g;ZÚaEJ ì³– •šy‡N£¹öt ß¡“G°ÓùGè—´Ú=IÍY,©ƒ«« s]ëQ/÷º*4«çêÅΪ^¹/#;ìzpà?×bFèå@Wu3^Ýw‡›â ÅïDà 4ñ¦iû7ç#d4ÿ:(ãàþ&îT¾Ñ—5íoEŸÎyÓÚdtÝiµQì.CÑž†]kr™f>ÜÒoôÙ’€[n¦/žúµÿÖ\UáŒu&©s”:5û¼0º–OEùY¤µ‰ÓL€ 0&p$I‚Y$Ñ1š(-?éâ¿F¯ðG±_¼‹;®¤(–â+?ñµ¢X$RÿM~šbÅk)N§x=Å)¦R¼…bÅÏR¼•¢•bEq?Ç\Š·SüGŠ )æPüÅ{(ÞGñ~ŠP|â2Š_¥ø]²Ã8%0ôþQÉþ毥⿟”¤ß‘²ßlì=”Ž"8*³%ZrJµ­]ÒwH:æl‘Úºú¥Ag5ågKmnEˆ×¥œ·Ð¹c›ÊJ¥U¾·K*¤ü.jWEeUÒ ¿L+G[æØ&ú-—ú2\-Ê¥ªö@Ž\bV/DžÞ>‡T·×!yIšwè¤T·Î&ÁZ%íƒÔØP@ª[ …Ø ô_*u¹‡¤AŠ'ÛIo›$8hƒÌ„äÊÚ÷·HÙdKyk¨-JýA©ÊJe~;£i׳¯”ú$Ýìµ²Ú~EZËA’†¤j!ß9¤¯aLÅx ·ó`«vRy6Í[ýø¨²Ô£ù6ÖÑh>iGZ;¡iãkJ®g-–ª7ˆkK;/Uéhh»˜ÕÊ5gX'ÈG\gAnJÚ^Ùf ?_r覒Ö&£ÏÖþy§µÉ«¹ÖBY›‹÷x¬÷qÍz’ì¨í¢ëRó™cöyat-×ÊŸ‘?‹´6qš 0&p¡Ðçów)е·Xƒ‹µ¸X“‹µ¹X£‹µºX³‹µ»X˵¼XÓ‹µ½X㋵¾X󋵿ð„/ |‚TŠÂG¾‚ð„ï |áKŸBøÂǾ†ð9„ï!|ዟDø&ªŸ¢ú-ªó *1àëS¿HTæÀ.xËuȽâCTö·"·»¾O¾]#®‡ÈÁZøTMC^ÖLXè…÷oþ =Ó ®™stéå"Í¿#0äSdʼnùAØ6Ûå+OÎMAÆ€ãôûòi4¼$ÞVy§|¥*2R1Ÿ.uº‰.$D[ÏÈŽØDúádì-ÿß‚žqÒËVñ_¦A0ºîB«+<åçâäíµ¦cm2.±7.¢™üâ·½tÛc#íPoÄ3B•3ÿ¼?Ç;þæê³(Ô&>cL€ 0Ñ`Çi´ä¸Ý¸ ßœ%ߢUïû¾HÅ\ÙÉ,~ Ï‹;ŸØOß â˜³÷õЭhìUßÎðí½”í¨}#ð“x ¿ïúÊbu* 5!N‘¤É &{G©Ç ú‹¦ž‘øq>–n¸m=ýò·®mvÿ"S¸/MxûlPŸhAŽÛSå¯YÔ\ï¹`eh CC^òGzph_ ¾b_Î(ÁÝQO®• u­.¸è¶F‡« -/–ÒZþ)ü–¦íI©H}þ¨¿vÚÉN±Ü3o'ªûдц(Ʊæý8°Žœ±Á©÷.ý’£:06²sIšøÂI4žÍ¨äÅœ ­ä„Ô¹´l§["…øþÿœ¡1$j˜†Ä”$$Ò—I‰‰H¿ë› ]<üâÕcjèŸ ø¦sX®^G§á|Ò÷`pnÀKþ¢‚n„t¸éÖL ÀZ†ã"¼A5"ó1h(gG–lmtÝ…Ž`¤k-ÈÚ|\±dg>jêvã—µµÈÞö€üuiP%eôya4Çï¾.Fmô²ùœ 0&ÀΟ;NçÏ%œ/O$á©ë®“¥lœzý°ç`ŒÄÙ6 3“ž„ó23³?C5¯ºB¾Ô¨MÚÂ/Ó·ã«PVÛ·g‡«C U^}ï,z ¶X$Ñ·ÿ}ð tbË#´ ”w~é qªd¯`½ÁCÏ~®*!çcøË!LëiäÙ!yhÑm¿ ×Nµ ¯³ O‹¡içü‹ðf¬ü¶xµ½;°pƒ+ïÍ@¬FnÚ"²µf)¶5ÓCé±>8ölÄBÚ:Iº*Á‡fzÖyßAîçéeô0½5}²ørdØòÒ[˜¾’jÖþ ¢ŸÃ´7B¾-ù˜æíœèØŠÅ›éÆÇÖ'q¹9O´ÁNn”mc“Ɖ a}Fþ×ÈNò«‡…wºŽ¢ïlèÒX_ÉPž¾¢ö|òµ¸ƒÎ f•âpwý•ݯ>‹yëÈÎË îNŠ6:çAÌ:œS•=ƒNW7º»;ÑÙéBž¨ãfsX­îè5OþªâT›'PÍõ¬ó‘:9÷¯o!² UíjéÈZc©uD>ÝpëÚvª±ÉèºÓ¸Ö~1ך®“Hã2ã®Øj‹è¹LÖÞ?Ki­ÑÇìóÂhNN^@×xŸE:Uù” 0&ÀFI`øÿ£Ä͘ÀùHú” ÕgÞÃÜÉWE-æöoµ ´elIÂm¡`]‰CM÷"¶«r—¬’ëÿ+n}¥›_o[¶Ç1'Êò•¢rzýõƒòë·—¡®h+–Z“å‚üuôôÓ+oËé8 -߬âÖEFËs˜G/dPz¦Ý9„^N¢/£zZyFv¤Ò“ZëìH±¬"é6¯#…7á…?ÿˆÎíÈ9]NeyrÏÙëê°™œ¬¸Nž³ýýçÌ”C!£úp¬ªšž'O¨¼uaè.Jl:ò7ذ°ò·Øö_°Ï\ŒYS×ËýبŸ‡fþ ËÍÚ=S‡§Ž<ÛºF¬þ¼w‹Þ’Xµo#êï^Œ_ÄÃé ²<-‘AÚkvòä*Á?´3ücj`ç?$4ÆLÜê<{‰EËæàÛÚP?Ÿ$PÞçbÉqÖFÕh:Öö‚'o!Δ_ì.Ø×Õ¢æ±,µR˜cþ!/«öþ…sé¦Cò2g†Ö³V¡ßñhÀù2›Ãî#ÔÔ@Ç4ûSaçÓO:–címÊ8iÇC›–&Wá/×Swg³°}o)Rsç á¯ák탒ŒiÁ³á©(øÐµàxrxÓ09Z›Œ®;õò6­AÇÚl\dY×ÌE ]®y=ÕÈò¿’_«ÙçE‚ÁŸ77Åð3&¨?§˜`L`¬Ĉ‡ Ì½‚5FS®¦õGuçJäk£Èן«yâhÅC[¢Lûð–šÿ¯©e"­æëjÏ‘OP=—)ŸÇ!z¿tB|è3¦æÒŽ€ÛC¿óBß’ë[yκᵼáK¨™² Z’OÞ®R®žDY/¼>¸Ï’u~=…n±”V5óí^r Lu5±UUÑüèÁÀ)òâb§ 1QO˼åÇZzÞvê´¥<7½-OŽ Ù>¡ëª.Âë,X dÙVç IA»É¿7œÃÁú¦sÖHjþö¡½€u5æŠ]:m¸fžÙù$¬“µ™bþç¤Üç‚ .©…ƒæøêš{7ámáøF×P©|Ƙ`Làò!ÀŽÓå3–—¤%ž¡.äº^Æš“´#ôQ*iCÅ~õ,¤ÇDaιAªtgɳ¹5g%Ž9[ðàuj»l´í\‹¬ÙV,ûÚjZ¡îÅŸév×ËÏS…Rr6FÖm ðèŽ.£?z¹SÙÉP›‹cœX Ï>úß[)·Û×?ˆô™xt·K^ØŸ#'ALëiï#4°#69u{ø–= 7¥~·Î³AÝ(h<ð=,HOÇ=E?Fy%oi»‡«¡‚ÎK±aÅ]HMûŠwmêŸÁ›ª*5êÃ"Is¢Õ[ÎÏYiщç6>{•}‘s£nON•›„wý32­´&¿ïŸ‘•ž¤é0éóÿ óEÙ"mYø~£±Ù¨Î'ï󤧨{Ÿ ;k‰éƒ†;e:œF:ûÍRí§cï¯)Lç¬\#œé«ežÖèåz¹’€—cÏú‡`¥9^øÓ.lß|;ð¡a\Í{áR&À˜`—,vœ.Ù¡»<·\‡Ü+>De+r»ÛÉ…¹]£]8Ûi-ü ª‹¦!/k&,ôRû7ÿqSÅí}çhÑ—‹4ÿ7êC~F^ÒBÕ¶ÙŽéªØØdÜ8NË«`5×ôè%ñ¶Ê;‘¨ÖŠM•öäó…„hëÙ›8 x£qt«^œ%K7;€[ľ)@Ž›ü¼Üc,níéÀ»!ˆ]»2ÌL°` Ådk;Ðz4x¿žq!‚ NL8‹]1g%Vm{qÀßOºb~Ù^Ù*ÚöðŸkú2³~#Û „¯óÏ¢ üâ·½t^#í"nÄ3„³gPÿ8q4šgt¦¥ðöˆ%½Z.Mç¬ jíü #ê鯖Â5hè6yî®ÐÌñøx¸äaÜ–n¸m=ýd£×6; ¿„Bì„5ámÍÎѠݨÛS¡½ûÊ{®XY‡Aj;4ä¥5|íkÁW¬—NÃ>‚¶š¦ ì–WÚ‡s¸Q_XËpÜTP4…šûü úÆfã:7cÉÎ|ÔÔíÆ/kk‘½íÞ¨þ’´+É1‰¤·Fç0UÆ>8·”ii8g…LRçÿ –àå#îžþP‹¢šƒHN_2GsgpÕÓ‰Šâ üùœpÇz\uà&À˜`ã‰;Nãi4&ª.ŸHÂS×]'[¿qêõa_²Í‘m³03éI8éÖª”™™˜ýªuÕød¸Êþ¼´…_¦…æ*”Õ¶ÓoÚ àpõc´´Vß;‹^…-’"¼t¤žNly„Vüô¼•4N•,ã•l¢2xè“ÃU%´¯3üå¦õ4òŒì-Öj™H«uôGµÎçÈÆ'¨‡Ë”€Ïã¦ç8âèu˺—˜ÙëóÐŽ“q´#¢oå9ë†7ÖBò´Ë×0Âd´Dž¯{Ÿž®n”õÂÛáƒû,Yç×SèKiU3Ùî¥Eº©®&¶*šš÷¡³æÒ8h3™M­µ#­¯m!~ìuΣßÙôÓíšâ‡pi¾Fü}Z4s.ê¶\‘ 0&À&rž&ƒÿDQ¼JHÜ£ Žá¢xú\­£¦Õsµ¾Ú^¢pbÔ2‘V£ÈSÓꑲäºâ(òDÐÅ£jžRC÷—'>eL€ 0&À˜`L`d&‚ã$ve80&À˜`L€ 0&À˜€ vœLàp`L€ 0&À˜`L@`ljç`L€ 0&À˜`L vœ"âb&À˜`L€ 0&À˜;N<˜`L€ 0&À˜`°ã3&À˜`L€ 0&ÀØqâ9À˜À%EÀG¿-ä¿úÀ 0&À˜`#vœ>FØÜU”¤~lé~1®—°å]w”‚ÕÜG¶ ƶ#o”¡O™Ëô`Wn *:tÍ|pîo@û).?ôÔ\vhÝhÏ´2µéhÛ›× µËÝQ˜˜ è­7—1šRZ« gAÜZG#à‚¶9?ΡL£WÔhîIˆ®Ÿó³Å¨oÎgL€ 0&pi`ÇéÒ¿ËPûÐpì5}ð!ʯ½~*aä6zE“IˆyKóNãb÷_•ùÐ|·¿ú[¸2]ž‰l]ÍèOµ2µéè%Ô µË’ºu/~ƒÚc—MŽÓÖ”îëÂÐcsÆNìXJ5çP¦#Q)üÜ3’0‚~Fm‹QߜϘ`LàÒ&ÀŽÓ¥=~—öž÷Þ‚6h²'gbmb§É׋]¥Ëi·#†bÖT5)»Âcr¶£¦¼Ð_–ƒ¯÷Xõ¾¾ Ëm¢M 2² ÑЩì•x:w!'W`§Ê×{ê­ól i q¼ùYäúe,/­@#-2㥔ð8±ÆfA%×gZPø¼X…Ò¿öqdÈúо×àà ýn” ɦìMè¦ÛÑú:‚ºæäWÀ9l['™ZÅBÓf,róÇ¡‹¬o*êȆ0vùN¾…ú×þ Ù_%ñæ2+°#ܸ¥ª®ï8*r³PD*”ýÛL”þÌ1^¹…Ï¢áùÇIÇ\´Ò8™÷½)Ø7±oxµ ›h§PØ'Øvê‡ÂD§ÈãbâÜÌÂé>lì~ƒgós°©¹W¥ŒŽ4/7ámÝ­ÑØ &À˜`—)vœ.Ó½4ÍúûûºHõ)Øz}JDœ?]¼Í=¨wv¡mß T/Æ÷_žÅ$Š5(úÝ ´8¨]wßø¹ìTùN4 %+Žœíhi?„)5°ÏZ‚Vjæ:æÚÓ~‡NÁNçñ~ GIxºw#5g°¤®®6Ìu­G=MBl°f| ·Ö!Ÿrò+kñõ/$Ãsd+æå—!oo º\‡°•XôÃýäNQ°N¢Šçþ¡þs-nêkBrf°¢Žö˜ç(­`GÀ±ÍLeŠ &Á”…ÏúÚ2í¹‡\.4V¦¡d™ Ž«‡ÙåêÅÎ*eñYf ÂŒ‹ñXªXpûꬤÓü¼Z|…xz…Ž5«`_Ñ‚òá–~“±•íYg&ÚœPJìí càþpµÖµ%X·K8·Á`¤“¯7ü¸hýk£:bþ-(Àà’Z8hî¬N¡9ð™j,þйbÔþT4sL«û>­»Y¸5í ÖoÚïŸSâVÈ8æÍÇÍš©l¤‹;ˆŠSL€ 0&À&I’`‰BŒ& GKÄOú£øïUÄ+üQ¬XÅïâ®+)N¦(¶ ¦P¼šb"Åi?M1‰âµ§S¼žâS)ÞB1âg)ÞJÑJ1ƒb&Źo§øRÌ¡ø%Š÷P¼âý ø Åe¿Jñ»d‡qJ`èý£’ýÍ_KÅ?)I¾#e¿Ù Ù{(EpTfK€Mªmí’†¼CÒ1g‹ÔÖÕ/ :«)?[js+B¼.å¼…ÎÛìTV*õ¨ò½]R1 åïtQ»**«’ýeZ9Ú2Ç6Ño¹Ôá’ÈA’ªÚ9þ’!©Ú ©Ü9$Ÿ{ûRÝ^‡ä¥3ïÐI©nM‚µJ:!úµKÕ„nû”æJ?¥R—{H¤xÒ¹Êm’°C ¦2ý¶huWÛ‰£9 Á,¨ i,Õ­„„ ‡¨e¨]Zù‘eŒ‹ÁXþÿì½ xUÕïÿM›HN%V ¢ˆV¬ÐKc.zkZuO:Š}!<#u.AŸGã'á=ü–ÏÊ~Yký^>km\¿½öÞÇjoº^ÃÆ†N&šÉîÛ2-lTÕÂ< ëÈ#µ­òkþUm‰#c£_ª~ÙÑš?ª:õìg¡eìD:µõ«Ök;SÏöYŒ=•íN†±®}Líà1 kêóõao–kAe‹uÚÀÉB@\xÎM™çÞ<ç¹8ÏÉynÎstž«óœçî<‡ç¹<ÏéynÏs|žëóœŸçþp,À1Á$Ê#p¬À1ÇCp,Á1Çcp¬Á1ǃp,Â1 Ç&fœbÆ-fó*㜌u¨ã<ã"®,Iœ5ù¾ (½èV÷µ¢ô@;vÑØ~ô2¾2§ÂòŸ¢®bæÍš }0àîU¿EÞX¾fŽÓ¥WŠ)|éPŠèK:0Þy:Þÿª€~åé…¹1cüðcý0›?1ï_}›~¥2&áºÔOzÑ[ÂKYFµ1t}¿Yƒ éíZ7‹qt½.YeÓ ¢_æ~™opIÕw·OÈCpW‡ñx&Wv f±õý*ƒ©gû,ÆžÊöO³ïÆ ð?bÝúø÷Ÿ=ÀÚï¤n*dðÅ:Ue#„€B`DÀiDwïyâÜgÆã© tcW޽Êþ‘ö­†Éã€Ða`âä"Lÿ2U¾ø"ý9RU³)³¿E“÷E¨ªoÇ@ô(öÔ=Š¥Tù¡;§Ñg®y5·/ïëEôhÖ„¥µ—pÔdªj?úk4&²{*ÛMž¦öþš;¾‡@#½{V É#;_ì½#GB@!pa ÿýòw(ßGyD¾ã”C]L¾©}ª—'3™ûέ¹rÅç­™Ï;Ís¼UeÌ¸Ì Ð¬û¨™Ç¼oÖqnÍ:_!§z’F(xtzƒ© ßùn†‡Ãñ(­8ÅG«<ÎVÑÁÄr}$‡—GÒeÐ]‚Ñ©ÇÅ œF~‹‡B`èrÇ£púЛI‹ó‹@øF`êùe´X+„€Bà,à÷€$ ! „€B@! „€ œ<àH‘B@! „€B€ Hà$ã@! „€B@!€NI±B@! „€B@'B@Œxqú ¢8ÿRÄYJg[ÿYr[Ô ! „€Q$pQÝ9BœÑú°æÀ+È ¿Œ5džìÿxkŽ †ÞR­Ê[f›JsP³÷¨Z@V%q„¶7¡ýpÔ¥¶½ÌÛ—æ§ì”Ãú½§œœœ¬ç™Í³ë0ÑÃ@IDATÍ\߬Gk]9òò|Èû×Vý÷©N½îýο•Òa×oZ•ýv¸~g¯!US­ËîSªÅÙÚó¶Ç½_¼mNo‰R*„€#€|Ž|äõéyîѧh:ø*>ª¯˜ƒG.-º?1n2 yCoéÝ"¤.xG]–}I»nàX{E—9[9ÊN—NµiÇv;|“î@Ã/?†/­Þ©>a×›½t \ž]‡ÊmøAÉ5ÈøÜ)µ×­ßíLìú³·Û¬9\¿ÍöCÙªuÙ}ŠÌÓS7“=ný’É’á´É$SÊ…€B`d§‘ÕŸç½7ÑÞF€\ŠGá±1‚¦x6UΧ»û9”g`IíVcåƒ#¦P;ÖU—'ÊJ°áõÞ$›ž×7a¾ŸÛä`Fq9š:Œõ’hÇ&””mJ®TÅ{vR½% &›&wºv=‡Ò„Œù•5ØBAU~²4±£²Š{÷¦l()«AèÏ!,ñûPAeOùPþ‚%J‹º”eð1M¾Ë’‡Ò²åX³Òd[‚š²ÇÅŽø¡·ÑøÚûÐã8²Ý[f 6¸õ‰'¤‹^>¯Ò¥·á?ñ.Ô”ÎB™^õ/“Qùó0RöƱ§v>f”­AÞ ŽÕ¥˜±øE½ÿUü²é÷¤ýIÛ:[ë—c†>~y,.ÁÎ÷,«®~S æÒ†Çniùshza9ëR´Ò˜ízuCjŒ®|5åó±a߀®9Í¿\Æ˜ÅØ¤O|.SQÝ·1d–9luï˼¸¸Ë°V=õ¾º†®Ñ 8æw^ý’ækâZðjcê“­B@MÓà•©rŽ%s Åù³‰Ì+Vœ/JäQ´åù#߀þåÑ”yö{ åÏSCyå/POù ÊWR¾Šò)O¢ü%ÊS(ÿåë)RžA¹ˆòLÊ7Sþ*åÙ”K(ÿåoP¾‹òÝ”¿Iù^Ê÷Qþå’’Î '´Æwš4¼µ[ šÙààÚ€F!–ÖêÔÚ¶ÕÒ>´Ê=}Z¨NßG Zk µúe~ …µZ‰Œu5êeþŠõZK{³V;ºŒ*ìogµZBµq\¬µ PY(UélÐeV4háÎ6­6À2 Õµ›- *ûbÝ[ôúe«µ`û­²ÚÖioìiÐÊHNÙêz­%|È ¢…ež>ºÊ_Ÿô‹{r0ùVjÍá°¶eõBÝÞêÖ®t;,̲’éÒ'*N)éþ{éJ¶‹Òš·Õk ™é*ƒ©­{wh~.ÛÖé~@«÷kîý³^ëͲߓ:\ô'm£ˆ>¦ UonÑ:ÃÍÚÊ94*µX²Rºßª6}fŸÑõP½±YëíJŒÑUZ˜dëcŒ|­mïSøç5þì×Fæþâë%q ¦¡C©²¤­êk²muqòÚ¥Q«5Ðõê_Õb»V½®Ç“íËdWÈŽB@d$ÀsnÊ<÷æ98ÏÅyNÎssž£ó\çìɾB@x ÿŸŽøÀ‰ƒ IBà¬È÷M@éE'°º¯¥Ú±‹n êD=¹óÛû§XVýž’بy厡eoÖ ÕËó]޹«‚tom”¾„Ÿ’ao¯ncôÙ­×ñ½,Btè 85FÇN$ÍäîŸ÷ø3ÛÒ¥¥¼îRuôkP1†Žé#¹¦­^ã&÷‹·’àÿÕCÿmA#Vâ¶ëøb*y_/S:eO! .L8]˜ý~y}1î¿v–>ymŒŸ ÕI˜©G8™M<ÚÃmo§%Õ~ mÁ]ÝKáx³`„ÜÛÇèt°þÍä{L@?zwÓZï(RÊ…–”gH²œIí7-Rº\ô©ì<Þ ,l=؇H$FqR7š·µàÛ…—&“ß”6랥ÌE'׌)åój¶‘<9è«Ú[ñî YøôPÛÍ“ô5pã¬ÅެdR%…½*NÎ@Ôª×Ûþ„AYl4ü먞Ÿ¦ä7}¿IïS¿Û'ä!›~ÏB­^%ô“2Ì]q5ÚºûôÇÂk)´yGÕÚàíÝ&ßt7·¥Æh_7yh$•Ù? »þâ‡ÜÇq?#e«w_ŽÁ=˰®áEüG}=Š×~S>ÃIIÕ/*_Ou_:í‘c! „€™$p™ýz~yõ™ñxjÂÝæ•c¯JÿȂ›}k§aòø t˜8¹Ó¿L/¾HŽTÑSf‹&ð‹PUߎèQì©{K©òCwN£OVód¯/ïëEôhÖ<\AÇüÈ,%KP¥ËؽOÒ¢ñúÈÀRZ?Jÿ8„ʾ©·’ ëæbí.zé=7ŽàK+1ûö*ÒtîGï {ØàU–hŽ)äs=/†œ]XøýMè‰Fѳwf¯bá3’ó¤N. ¶¦mn[§ôÐ,Å&³ýnšèœÅÞxÏVL¾¾¸·óÚºèõ¶jvõ(ùþõ[ýnÕ¡°B?‹¡…®kpÅXz;¶âé)´w‰R[S“w¶m¦Ì.MÚz”ÇòCw$åe¦®dÞ±p˾¿¼Ç)?S_^÷õð×W`­È=v÷4£™Å¯ëQåkÖ}i)[! „€L€žVôÌT%ùÂís ÅYÞqò~ÌSJ‡Là¸V×¹[kK½ŸQB¬·E«œc¼ŸBc’^"_¨5wÇŒ÷èýóS Æ;Ä;O1­mceò½nW½­3¡«Ok¨ I°,ÊeËÓÖhá÷¤’2cZËó\fê6ÚÔ:>¡²^ÖHk_·ç ÙÓv¬à÷= ¯msøo/ÓßñHÚc¾S’òÑiŸ!ß*RÍÁäµx^ŠEñ²†Ä;]v;œ\Tl½ìUs²Ûkg£¶ßÚŠÈï%Þ?KÙÛ§ÕñG=æÕÓ[[FjYÍìË´`DÝ?N®ÜWÎ~Oé`¹vý Uú¦?ܨ[ÆÐâeezßWÛÞ•³óVµyò—U–ñih o®NŽÑâyƸª³·jÿìŒSÖZ}ʦ¿¼Æs,°=ªqcXЯÕóG\æÔ%ß+´ÚãæOª_Ô¾fÓ—)²'„€™п½?¤üÊ#öã9üS'úd3Nf2÷[såŠÏ[3Ÿw›çx«Ê˜q™ Y÷ùF´yÌûfçÖ¬óòñqª'i„ˆG¡_m*È·¿ûàén’Of'ù.uøÇu/ùî(D‚åÈ%‘lXXít‘i-Ví+9©ðùaêò™,SÉÖÏgî÷¤Ï8iô&Æ!½\Ú÷y™ÛDßÛ‰5¯|‚}C¼’?î›ö3´ ìDQâÝ¿“eçÕ_ÃC*Þžü,…^ý¢’íÕÆ"Zv…€B 3 ž¦Z Lï^àÓÄ–÷™®0ë˜ûæ±Y×lÏ[Uæ Æ,KÞ,Lœ³›Á×åd;·¼˜dž3j:þzÿÿÙQY…À¹H 7¿ÀòîM–ææ£€·”ïL¹Õƒ.õÄvRiŸ‡ 6Ã=ÈF¾[=&:FÁ(}ã“X U¿›Ì,d(9yµ¦./‘É2•lý|²ÖIîäÒ8Læ±—9en“›û ê¼KŸ-C%}¶jÕFø—mÁõfÐÄJTþe6@¯áÙ_ÃC'içõ¨’}Jû2KpRM! Î[8·]'† ÓC  ð~C‘¡L§Ç‘: ¹W~¿èFëï‚x¿g;ÚˆÙ7\“a%kŠMd )ÀÈi! „€8¯ Hàt^wŸ/NÜñ(œ~äŠÈ3K`ô•˜ULùÌj5´É:ÔE§B@œfü$! „€B@! „€ð “)B@! „€B@0 œd! „€B@! 2À) )B@! „€B@Hà$c@! „€B@!€NIñY  õaÍW~kŽ ÙþñÍÿ ½¥Z•·Ì(6•æ fïQµ€ó¨d`o rrjàîÍp|j›8BÛ›Ð~˜~OJ’B@! Îò9òs¤#Ä “À§h:ø*>ª¯˜ƒG.ÍæAͶ‰mŒ·£ç8}Ò‡!µ„wÔeç[‰oÒhøåÇð) ޝCkÇ®Û8ÖAÑe #ä´B@! Î0Yq:ÃÀE7èGo#@ Å£‹ðؘ AS¼›*çÓêHåXR»ÕX%áˆ)ÔŽuÕ割lx½7©¸çõM˜ïç69˜Q\ަcm%Ú± %e›’+UñžTo BƒÉ¦É®]Ï¡4!c~e ¶PP•Ÿ,5v<å©l§¦½{Sö•”Õ äXúa¹¥e˱f¥é{ jŒ¨N/+M/,'ÿJÑJ¶»û;€—`yäս¯®!ÿ7àØ¡·ÑøÚûÐãO*õòUe«W›¤B7Ñ–ø}¨ JOùPþ‚á—›ƒÃ“Ø`ösñ4½ºOÒê÷-³ëE«$nÙB@! NŽ€N'ÇOZŸRŸb{o'I¼Ï^51£äÐϼUÝh u¢mÛX½øü¯W9ÊEy*þïuh Q¿ìüÓ¿ëAUü½&Lœ5Á’õhioÆ×!0í´R³XäCìªÿ0©7rh6†~“gŒè1©dpOÂm˜~T4 ö\/y*Ûã=[qyÑ<àFÛwà¦àRølHslA,>€Æú*T¼t5šÃalY=Kï󣆂C½lÝ"hAõÆGñ¥>•¿øÒµ@ÕS¿N<’Gs]ŽNèH6ÖöèÎzùª²õp–|\¼ñ”?Û€2Ò^¶ºßûï—C¥ç¨Îá ,¡-´•XÀ×îÀÑ»w ÜÚÔ/ŲMË„º‡òG! „€Ù°Ïô²k#µ„À)#tâÛÿˆkÇþ ~|Ù§XM+ÏOÃÔœ,Tï§JG0H‘Íõ% q04 Gøù²·-FÛÆÇP4¸ñ9Àúþ8ø>÷Ê TVIÁÆý¸’öfmèÄ»õ“ño¯tàÙÜÎ’ò8CÚ#ûó,­Æú'îÅÚ›úb¿Ë›†ãˆsõTr>+h•§°=ÜTCí+±â¯c<í-Þ´U…?Æ[ƒ÷cùbM[vü_ãGÙ¦þ o­ÃÜ-oãÁ{Œ Ûqïu¹Õ•Ò w×ó!R0{?‚’1al¬–v„HkR—¯*[S<ŽÚgÁÇ•A>¦^÷÷¸¥øË­ÿ€YSóÉw&Ë =eo(ÇTú—ìsß  êȨú^‰¾ú÷¿Wù±à°¹n–tIv„€B@!0,²â4,lÒèTÈ÷M@éE'°º¯¥Ú± áÑË8dÈœ ËŠºŠq˜7k2|y>ܽê·ÈË÷ K1%hDñŒÇÐdÝ¿* Mº†Ü‰˜1~HÑW–)Fâý«oÓƒ&½Iî$}¢?”§ÂÔ¶óJ[&øp åË Ðq­ûy%ÍLd&©÷rq5G/íÅ1öÊn¥ IOþæ~ñVª üâ¿zíØB«f+qÛuö½}u·uïŸbYñQ3ˆé^РáÜõ¼ÑE}V8®ÆÀ4­È%Zåås'I! „€§†€N§†£H6‹qÿµ³°Ú7ÆOÐón“0Ó¹R£}´7†ÛßMë§Õ¦-¸«›k{x³1é¹7âIu°þMË£oýèÝ ŒEJÍw¢iž!ÉUPps©@©]nú<ä©l<Þ ,l@¿¦!‰QìÐæm-øv!¯m™‰W¶â]Ë»WŸÀÜ< F¬˜Ÿ|hÐÓ_ ýîÙX†u /â?êëQ¼ö›ú*—©Åܪ|)l½}BTmL™¼U1Hq5""•ž{¦|ŽÞe³J´ï;ðÛ åH! „€C$ ÓIõÓ@à3ãñÔ„ ºà•c¯JûÈ‚Jã¾µÓ0yü: Lœ\„é_¦š_„ϪÐù)³¿E“íE¨ªoÇ@ô(öÔ=Š¥tþ¡;§!O”®/ïëEôhÖ<\A%—Ò,³p]Æîx’>È¥÷löÔ.¥5¢ôCxÉSÙ>õV²oÝ\¬ÝEmÈ#øÒJ̾½ ‡ +,waá÷7¡'EÏÞ ˜½"ˆ…wÎHLfE/¹Îu__}=ÊÄcwO3šeéë…­£¿F>dÁGÅ ±€„:÷£w0 •ž^ÓIÙ ! „€Bà 0ç(g@•¨jã/õ£îÈG˜9úbu%GÉÍÿ܂ʖ›àÏa ¥Â…hÞz'rûž¥}ãTê¯Üð½ûÔ…ËnD€Rõ¶NÜûE¾îCCų˜[x¹~¾lÙb ÞÕ÷ó|´ÊSÈÁ,£åùÜDd04Ójžì—Sþtµ<•ícè‘;]vÉd= £‡Q·§ …vѤ-€’«1Ñ7O×\¼¬«×ûèÐâ»·¿T÷²™XJ"æu×aÖ•†’l}-˜žàà°õ¦™³â£bÀVL¿'€ŠûnÄï×¶aç"w=_É¥OrX|Õƒ\ËÓy¼p9Îþä!‘$„€B@áÈÑè‘ ¯DŸõµ¾¦oî;·æÊŸ·f>ï<6ÏñV•yÑ€ËxëÜçy•YÆûfçÖ¬óòñqª'i„ˆGè{y(ÈÂ,9¥§òF¤­pEËõ‘<#PbÓe¾Ñ©GãÜêzÉSÚîaÿï%ß…H°¹dk$k[Ýýu³9휗¯*[½ÚX(Xêè»*=Îzr,„€B@œq2}vŸãh­+G^žyÿÚš¥#gÊ¶ÌæØ}É\?½†—/^eé’äŒB@3A@§3AYt À§h:ø*>9ê+æà‘K³úyW»üŽBžýìÉ…Ô"Þq+‹c×íüêOneŽs²5‡'í»]žoÒhøåßÂçКéðø‘L5€ìeÛmÊ,ùdkœ>}vŸ)pzv*·u"òèY}¦lËlŽÝ—ÌõÓkxùâU–.IÎ! „€8$p:”EGÖ¢½-Ð.Âcc2MñlªœO+"9”g`IíVce„#¦P;ÖU—'ÊJ°áõÞ¤ =¯oÂ|?·ÉÁŒâr4uë)ÑŽM()Û”\©Š÷ì¤zKL6Mîtíz¥ ó+k°…Ÿüd)íDCXâ÷¡‚vŸ(ò¡üŽŒh¢\¿3t{Y÷ì|Ϲ5€¦•äSñ“8@oõîMÙZRVƒuéÇMG߇*/~èm4¾ö>8c>¥e˱†íÓ}(AMCæˆOÅ;]v 68ûÌÍG²%•LUc#ÕºÃeü(ô¹q3x<™²™ú³éÕ­x’V™÷W‡£{“>Ç»PS: „¯ê_&£òça«eg×6¶ÄÝB$}¡óž×Ž›,g]…K™Îºü94½°œØ–¢¹ÝûZuë/‡ùr(„€B`è4MƒW&‰9–ÌçÏ&2ÿ€.ç‹ymyþÈ7¨?Gy4ežý^Bùó”ÇPGù ”ÇS¾‚ò•”¯¢üEÊ“(‰òÊEùzÊ…”gP.¢<“òÍ”¿Jy6åÊGù”ï¢|7åoR¾—ò}”¿Cù‡äŸ¤ó‚À ­ñ& oíÖŸf68¸6 Qˆ¥5†:µ¶mµ´­rOŸÖªÓ÷¨ÖZBA­~™_Ca­ÖG"c]z™¿b½ÖÒÞ¬Õ΃.£… ûÛYF­ÖŸPmk-TJ•E:t Z¸³M« ° huífKÑÂ{´2:_¶º^k Ò"º hÕ›[´Îp³¶rµ«hÔúø|a£ÿ+ÈVòiGWD‹uoÑå–­nÔ‚í;´ÊBªXŸ´ÏM‡§ïÑga’”]X©5‡ÃÚ–Õ uûª[%ˆ™›~­–l­nïËšwRvZŸ¥s4µðVÅt¯blXÛºŸž´~SõC9ÎæÕim!êîOêïÅÏïЭ Z1ížZU¦ÆXìÖ¼­^[HuÊVãÃZñ¬ÚF†¸ëç+(•¬×‹uŸkX¯wYéœS’Óû<9>èÚ¨ÞØ¬½g—N}ªþ²^)]²'„€§ŠÏ¹)óÜ›çà<ç99ÏÍyŽÎsuž³óÜçð<—ç9=ÏíyŽÏs}žóóÜŸcŽ8&˜D™cŽ8fàØcŽ%8¦àØ‚c Ž58æà؃cŽE8&áØÄŒS̸Ōc>Ceœ“±±ðŒ‹X€$!pÖD#øöÁ?âÚ±ƒ_ö)VÓúÀç§a*áLéx?Õ8‚Áé*+Yˆƒ¡Y8—I„£mãc(¢ËçÆ|óVý|Ÿ{å*«Ä–Õ÷ëW߬ x·~2þí•<Ë—¬5åñµ†´GþöÿæY:[õOÜ«_­S_ ãwyÓpœV”R)Soù{ÜBÿüåÖÀ¬©ùˆ.FÃæ Jt2Ú‹ëoò¿>ˆÁâVx~å½XTÄ–^ %—Ñ¢Y] ¯Äо®ÿ ±xÓzTþo ÞYüÏý{àÔ1°Ï+|o®<–™J[vü_#û0õ'hxkænyý7þ7,=…‡Â[a÷,G«–ÜËÝ™~t­blX»Žbz½ßTýбü’V†ð†rL¥I?÷­ªŽÜªï•èÿRÿïU~,8Ìku–”—ØÏ¯}ýð»Œña©œMÛØWý6 í†é—YÅzí¸ÊJçl6Uk ¡s;î½.ûö¦ªóžE_8ã8·7•#! „€Ùà(K’8kò}PzÑ ¬îkEév좛^æ> wYXþSÔUŒÃ¼Y“á£ìï^õ[äå› ÇéžE)¦èÁÅQ‰xFŸÛÑ$ο* Mº¼Ü‰˜1~HÑW–)Fâý«oÓƒ&½Iî$=@r<•EE1¶„6z$‡Ü1tcäÍäÑc\y¾Ë1wU¢%[ ÐB«±hE£.îχô-0‘¶U˜\àÃ%”//\@ÇA´î?š(ç]‡§ïÃ’gQ¥{S"šô”‹«ùÞÏK{ñþá.t6í6nïèU²æíÑgi>Úù¯Š©_96RmÕãÇÉÔ½Þè¢1S8·Ÿbà`{ÄHyùÔߞɩ'UùlÛ¦ÖŸ²1Û=µ,µÿ®ãšnVÜJASæäÞ_öë&³©!„€BÀI@''9>Ã.Æý×Î=²„Æø šqOÂLçÝk…EG{c¸íñí´¤ÚO«M[pW÷RøÞl+!÷F<© Ö¿™| 4ÙíÝMk½£H©9ãM4Í3$¹ ÒÊQ*PêC—BŸÑؘì…~R†¹+®F[wŸ¾ ^Þá^•!8ÐÆ `AaºèLìx7°°ôˆ"‘Å_ÝhÞÖ‚oòª´3Y&” [†-/©ŠWà¶âÝÁä |Z5»ùr¼8~&½°?QЋv²×Ç=y§Ä{ »SÕ,>&Nª˜SŒTŸªñ“ªcèSq»g = àa³c8¥ÜÈbïlÛ–Y¿Ã ‡³Ök'³¬ô~MI·–åëÏ…ëeúTýå~ݤ4ÉžB@L$pÊDHÊO?ÏŒÇS&èzV޽JŸpg£tßÚi˜<þ¦µ™ÉE˜þejuñEú xªöSf‹&»‹PUߎèQì©{K©òCwN£ÏBs`P—÷õ"z´k¦(Fd–6–‰š.c÷·^[•Ei<ÝkžmÛ2éwZíuíd’ervÊäcU™—>U¹]7n:åœB@sŽ *—óBàŒ©uG>ÂÌÑg­ïænAeËMðç°…RáB4o½¹}ÏÒ¾q*õ—ߤ·ox€Þ}êÂe7¢Š¾ÜÀ©š>}ïùR¸ Ïbnáåúù²e‹Ýïêûy> ª õït-Ïwà¦ûüzÀDîéuŒï¤$võÓï  â¾ñûµmh <…âeLô-¢R?/#VUà矡cC6ÆÌÂúÍ•˜Tz#vuE ë)™¬wܦnO mW­CÇ-$Jåûô†,ï•9)¿u—@ɇÕäÃ<ý°xYV¾ ßô-L¾ÓÆ>¡Ÿ÷ÓùïN/ ·4Õ¼£;d+ìæ÷;­w.*2L¡¿SLƒÿs;¯§dKZ(Sªc×çÎí+¹øÚl¦16.¥€NÇñ²›%YÇŸ&–•ËTųm›—þ”•©½üéêkÇK–sª_}Þè×^ú ²ç)ÛeO! „@¶røë^‰>«k}MßÜwnÍ•+>oÍ|Þylžã­*ó×.¸ÌúÕ sŸ§fï›ç[³ÎWÈÇÇ©ž¤J  ïAä¡ ß1Kõò7¥§òh•ÇÙ*:8€X®äÙ"”tiº šâ¶œ…þÊl±ÔB@Œ\2u½º!Åås¨)Ÿ ûtÑi6}à¦K¯*„€B@!5 œ²F%O?O±½·“Ô\‚g¯š˜Q]ègaÞªn4†:Ѷí¬^|þ׫eŒ¢¼ÿ÷:´„‚¨_v þéßõ *þ^&Κ‡`Éz´´7ã‰ë˜vZ©Y,ò!vÕ˜Ô9´C¿ÇÇÉ3ÆNôÀ‹˜T²¸§áÎ6Ì ?F*ûïI{ÉSÙïÙŠË‹æ4"ؾ7—¿`C2˜c bñ4ÖW¡â¥«ÑcËê)XzŸ5êeë!ð@ ª7>Š/õ©ü-À—®ªžúu⑼8šë*p¤pFEz°±¶GwÖËW•­‡³á“?åÏ6 Œ´”­®Ç÷þûåˆî{7•UaÞæt†›qVãÖg¶#ÂþÚ|"þ_[ÌkD˜ê]ýÒ",]·ý±8\mz°e]ºsòG! „€C `Ÿé ¡¡T§‚@4Ò‰oü#®û7øñeŸb5­6>? Ss²~¼Ÿ*Á E6×—,ÄÁÐ,áçË"ܶmCÑhàÆäëøãà#øÜ+/PY%÷ãJÚ›µ¡ïÖOÆ¿½Òggp;KÊã iüíÿͳt¶럸choê‹aü.oŽÓЉ-9Ÿ´ÊSØnª!•XñÀ×1žöoZªÂã­Áû1‹|±¦-;~„¯]Fg¦þ o­ÃÜ-oãÁ{Œ Ûqïu¹Õ•Ò w×ó!R0{?‚’1al¬–v„HkR—¯*[S<ŽÚgâ“©·ü=n)þrë?`ÖÔ|Ä£as¥:íÅõ7ù_Äà?ýò©(¬Åú¥wëü´u ª&Þ¡Û¬²)¾±Õ¦+é ì! „€B K²â”%(©vzäû& ô¢XÝ׊ÒíØ…‹ðèe2dN…å?E]Å8Ì›5¾<î^õ[äåÇûŽÓĺSF$Ïèq ,þU=hÒ5äNÄŒ9@ðCо²L1ï_}›>i×›äNÒ'åCùÄÚv^i«Âä.¡|y!­¬ ˆÖý¼’f&2€“"šô”‹«9 |i/ޱïTv+Mzòð7÷‹·RMàÿÕCÃm¡U³•¸í:û‡Þ¾ºÛº÷O±,ùÄtki©O75w \oÖ ÕËó]޹«‚À—xÏî“nÓÅ)þc'"`xKÝmjÝئ+Y]v„€B@!% œ²%ÕN‹qÿµ³°Ä7ÆOÐón“0Ó¹R£P}´7†ÛßMë§Õ¦-¸«›k{x³1A¹7ŠÑé`ý›–GßúÑ»7Š”r¡%å’,gR»AZIJ}èrÓç!Oeûàñn`aú5 ‘HŒbŠn4okÁ· ymËL¼³ïZÞ½ú´:só$±b~ò¡AO)ô¸gcÖ5¼ˆÿ¨¯GñÚoê«\¦s«ò5¦°õö yPµ1eÚ·FúI殸mÝ}Ô§Âk)J~t#å· nnKñï£Ç5U6}»ðÒD YdO€B@!0D8 ˜T? >3OM˜  ^9öª´,¨4î[; “Çÿ¡Ã´Î0¹Ó¿L5/¾ŸU5 óSf‹>±UõíˆÅžºG±”Î?tç4äéÒUàå}½ˆíÀš‡+¨äCš%Òeì^€'éƒ QzÿfOíRZ#Jÿ8„—<•íSo%ûÖÍÅÚ]ôцÜ8‚/­ÄìÛ«pȰÂòw~z¢QôìÝ€Ù+‚XxçŒdÀdVôò—ë\÷õð×WУŒA4T<‹¹…—ëçË–-¦ ú»ú~žVy ù‘1€e´<ß›èƒ †fZíÑ“ýrÊŸ®–§²} =r§Ë.™¬tôP êö4¡Ð.š´Pòa5&úæéš‹—5`ØG‡ß½ý¥º—ÍÄR1¯»³®4”dëkÁô‡­7Íœ˜Ðϧß@Å}7â÷kÛÐx ÅËä}xƒü^¼Œ:hU6„‰ráçt?ùOÁ ¼9Ši¥ÿâyü ^#¾àó¡`ª»M…¹>¶èÚ¹¨()Ov„€B@! ~$Æ+Ñ'›­¯é›ûέ¹rÅç­™Ï;Ís¼Ue^4à2Þ:÷yvg–ñ¾Yǹ5ë|…||œêI¡âÑúD òíïçxºÒŠS y£ ÒV¸¢ƒˆÑD» ?-Z±‹ÔeÐô´ý12{%ú·<¥íöññ^òÝQˆË‘K²#YÛêî¯Ó^×c/_U¶zµqUÂ'ã¤ÞLô ³Ë¥}kODßÛ‰5¯|‚}Ô‚?Wî›ö3´ ìÔ?¢‹VÙ¤Ê! „€BàT ái’ùÊôî>Mlyß™ùís³Ž¹o›uÍö¼UebÌ2Þ73Ÿ3÷Í-Òëò–ÏqrnùUóœQÃñ×:qÉ¡8?äæèè!Y›› xÜR¾K0åVº ×ÛI/yJÛ=ì£gÚèqÃcúÇÇ­[†Ê»èS«6¿l ®·~uPe“S˜ ! „€B K8e Jª s…@Aáý†"ÙLçŠÑ§ÐŽÜ+¿ßt£õwA¼ß3ˆí?Äì®±­JBu"J! „€: œd ó@îxN?ߌ>Åö޾³Š)Ÿb±"N! „€*ü$! „€B@! „€ð “)B@! „€B@0 œd! „€B@! 2À) )B@! „€B@Hà$c@! 2ˆÓocÅù×6$ ! „€¸@ Hàtvü9í¶Ö‡5^ANøe¬960dSùbsük0ô–jUÞ2£ØTšƒš½GâmoBûaúÝ%ä-Û£¡^d×qr²X ]žSûÀÞääÔÀ驳Þ)9޶c>ýþ6ÿ·-Sß¾úxh6{sš,kíÓ%תÃÜWë²÷s­uåÈËó!ï_[ÍÆ‰­Z†£â)8Të²Û›YÕPë§KTÛ’éJ—%g„€Bà|! Ÿ#?_zꂱóS4| ŸÕWÌÁ#—¦ÿjF1®1 y+±BH]à·²8vÝÀ±öŠ.s+·œóm©å²ëÐqÒ¾;ä94ú&݆_~ Ÿãüé:ì†õ­¿À¬KÝ5þ›7£#/ÒŸ.­ÙÈõæ”÷:§K®›6µ.{?Sàôì:TnëÄJ®qRËpT<‡j]v{3«jýt‰j[8pÊúºO,g„€Bà& +Nçpç\ˆ¦E?zZ )]„ÇÆdšâ=ØT9?±1Kj·+!1…Ú±®ºQäCù <˧ hýrÌH¬ Ì(^‚ï9W£д’|*~豨޽)[KÊj².õ¸éÈàûPå1“ÒòçÐôÂrbYŠÿz÷m4¾ö~"ˆº^Ýâ°ò9Ô”Ïdž}: ¯27;œºZuîãPX4×MŠ©z.ÄÔë®Lû±[¥¼²'±ÁÄ»éÕ­x’Vy‹yv$ð«ÛפÚç$Æ‘wÝcó¢ŸUãÕlæ*×]–«!ñþÀm|š†ÐH=”èçxjJg¡‚†oÕ¿LFåÏéJ碽l]&Î\Åôö=¯{7Y®~³bJ.eξjn÷þwÆm,Âå¯B@œuš¦Á+“9–ÌçÏ&2¯Xq¾(‘GÑ–ç|Cús”GSæÙ/Ý/Æç)¡<Žò(§|å+)_Eù‹”'Qþå)”ÿŠòõ” )Ï \Dy&å›)•òlÊ%”ÿŽò7(ßEùnÊߤ|/åû(‡òÉ?IçZã;MÞÚ­…?Ílppm@£Kk ujmÛjiZåž>­?T§ï#P­µ„‚Zý2¿†ÂZ­Dƺõ2Åz­¥½Y«]F ö·³ŒZ­?¡Ú8.ÖZ¨,”*‹t6è2+´pg›V`ÐêÚÍ–, ¢…÷4het¾lu½Ö>¤EtЪ7·háfmåjWѨõñùÂ:-Fÿ5V­äÓŽ®ˆëÞ¢Ë-[ݨÛwh•…T?°>iŸ›OßOFÙT½±Y{ÏÂ(Ö•à°ªQ “?º}äom{qö(SØÑcö[BW_¤M °¼Í;´æ;´œ·mÑš‰¥µ?Tœ’òæÕim!âǼIÞâçwháÖ­˜öÏ•œ“íÓÆQzß&†Œ¾Qõó^ÅxMµM—«’Õç`Õ;dÞë´7ã3e‡åZˆÒš·Õk ‰UÙ*c§êƒö’qªRv[ü£“^×½»¬ž´k;%;Iòšt¹†¸õßÕX¶þË’Ò%{B@s‹Ï¹)óÜ›çà<ç99ÏÍyŽÎsuž³óÜçð<—ç9=ÏíyŽÏs}žóóÜŸcŽ8&˜D™cŽ8fàØcŽ%8¦àØ‚c Ž58æà؃cŽE8&áØÄŒS̸Ōc>Ceœ“±õŽ‹2V°Kg¦BÓÓ œÎ­1|Î[ùx¿xë×Úâ?Ò´hÅo5inÚÏ"WÓDدշvj‘XD;jÑÚ:ÍÀ©Xk£€‡S,Ì”¡J­Û(¢ÂNm1O 7†m“q.6&<†ëD=¸–õVë˜.&Ö$ì)¢ÕQ°SŠÕzƒZÃfš¨ÓQ,rHkHtïéÓb­n‚жôR =•Zç@Dë§|(´^÷—¹T²ë°ÚÌuì¾³ÝÑ­¡“­f&©R·/ê…‰€ˆ9d,s±cg«ðšº4 œ8ðd&ÖXÝ–n‡«<¶µL ¦ka\(@5zCÓÚVù5ÿª6ÃV×öƸqG´ZûV÷?ñ'¦èçWãÕÚÖ)W%ë½Dàd²ïS*¬ýì´é\·Wõï‚Õn«Ö}®c½†Ô²Ô으ÌÀÉì+O}ú¿-™®Q«'²/„€8wÐÿ«G|àÄ$!pÖäû& ô¢0ôµâÝþÏbÝh¾Œo$dN…å?EÝ»ÿófMÖ+ûçUcãÿs#Ð}œîY”b ßs ‰Û<Þï‡U@¿e¡ŸÍˆs€ø±~˜ÍŸ‰÷¯¾M¿ÅaȘ„[èÉ_ÒÇ@UéåœýÉGîº1òæRä•nLÕ Œ2; ­Æ¢qúχ€Ëø¦ÉDÊU˜\P•ªO{­ûbÖ |ƒ…“]9¨ö}¸òP[¯Kÿ§Bçð@qŠÃ؉ "=y•©üz£ë(µµëêF1Ú";QÄ÷Œ,i`ß«–#wNotQŸÎÄÄ„é1ôëmbô—ÅååSèê©Ú“=ªq”Æ=eŽªŸýªñšjJ{öþTÉÊÕGVŠÕpx·î?lhNŒO›¶»M¶¢sÐ^å¿ vó:RËŠØ®m»0'/þW ÕWöºÎ#÷±h¿æmäX! Î^=’$Î"‹qÿµ³@¡1~‚T'a¦ád6ého ·=¾–Tûq0´wu/…ÿáÍÆ„&„8¥ð¤9Xÿfò=&Ðdºw7­õŽ"¥\hIy†$Ë™ÔnpsИsë§úÐ¥Ðg´0f”aÑÖݧ/Ó ð×à‰U‚ýh¬V¡‹ÎÄŽw @é ‰QüÕæm-øv¡4q[3Y…-ÖÇAŸ©Æ± nnKqèëF£¥\U¦²ãž)¼²®ÖemÛõ”§`ÁÌîn{Èt2ª~>¦¯‰×¬l>O@Ó«zÊ1ÃÕí¬†ÊûÛ…—&t¦ûà0&‹CCƹ`¯êßwÎäš9^Z¯û̲¼ØYË,}å¡O5ݯù,ºEª! „À)% Ó)Å)†Eà3ãñÔ„ zÓ•c¯ÒW²‘³oí4Lÿ„èÆùÄÉE˜þejuñEús¤ªöSf‹f£‹PUߎèQì©{K©òCwN£Ï-ó“¦xy_/¢G;°æaŠbôGfic™ìè2v/À“ !DãØS»”Ö…ŒU Ú¤¥:÷£w0ŠXô¸WŒõ¡·c+ž~ÂŒqÇgÙ…·`ÒèÜýD ­±TaAm;¦ÜJ¶®›‹µ»Ð<:ŽàK+1ûö*JÓ˜:\Š’§N‰<‡R Áá(óz莔®Ùe ¿z“­­;GÐ>€:ÐÑaæäE¼DRùå.Ïl•ÚžL{7îª~)Æ«uzmZeÊUÉJ,¢šÕ1e¼ÍqdêJ ãK?ÛÎ+L炽ªÜ8³;^×}&Y¦ßnXTe^úTcÑì+7=rN! Î z2Òû%(yÇéÜyxtD[r\«ëÜ­µ%ÞGÉÆÕXoKò…ºdèý•…ZswÌxÿ…Þ½1_¨6Þ1$ÞyŠim+mïÌToëL¨ëÓô3ïÔ”-[LõŒv~O*)3¦µ<Ïeæ»7üAþ(‚©Ñ´>¦íH¼·T¼–ÞË 7ê$0ÚùµÅËÊôv?üg,²5íàfþFú@„SOÝžƒ¦ðÄÖ¡C_JíûÉʳsдðæê$‡âyÆ;Zõaã-"uY:?öK÷#ɘÜS¼ãÄ}ò»ß{÷‡›<ýý¶9uÉqÁï¯ÓûRô&˜+g§=Îqdí[k§¨ú¹jÇv×ñjm˶Xåªd=ùË*Û˜aCåíÔeµÃÞÏýÆ»Piïðq‹sÏ^Õ¿ Vÿì﩯{µ,»ßVÙiLפFoGªþá¶™¯Q»69B@œ+h~óCÊß¡|åùqˆ‚M¾©}¶—¿4a&sß¹5W®ø¼5óyç±yŽ·ªÌŸà2ó#Ö}¾qhó¾Yǹ5ë|…||œêI¡âÑDèW› ò/ÂxùÒŠS y´Êãl@,×GòT÷¨‚uôÙ–Ñ–Çp¼têeq Ðr‰©—uå’ žšcД”1” IodÓ˺<ƒ¦¤žô‹†•<|мÜÜOPÿà¸Ä?Ëé÷´|ÓæÁ¿ì1\O‘WYRÇ)²ã”É;¥öä*ûyèãU-Ëôý¬ð6•§mÏ {Uœ£^¤ ‰ÃÃæ¦’×u¯’•j=ô=/}^ÿ> ]“´B@SE@VœNI‘#.Dƒ=hý]ï÷ bìõ31û†kR WÙ…Èêtû|¾ñ>KöÆIopÿ\5­ãËͧ»D¾B`¸Vœ$pÁX\B@! „€g‚À…8É£zgb$‰! „€B@! Îk8×ݵ%S@IDAT'Æ ! „€B@!p&Hàt&(‹! „€B@! Îk8×Ý'Æ ! „€B@!p&Hàt&(‹Ž ”ýžÍÑ£ô»MÑ Ôq[! „€#‡€N#§/GŽ'ZÖx9á—±æØÀyàW¡íMh?œ :k0#'—Œ‹K |ÈÉ)ÇÎ÷Ìòôú'åd´óéwªù·ªSyjÚégX‡—öÖ¬Õ›Ûíµ— O~6­èGJsükp*G€·Ì(6•æ f¯áµi£w³Ö©ÜÚyÛ%{•ÙkZ²í3{½ìt Ovr­ö{îÐñïé³ ! „ÀY!ñ·7ÏŠU¢ô&ð)š¾†ŠO€ê+æà‘K Îqìº=€cí]Dl´ҥ¨üe vß1èßÿó˜·^3ÝÚp%…3Öú§ÂÁnøQßú ̺ˆácüqÛÿAà¾1>ÁýS‡þc5¾Iw á—çg·×^v*¬WȈñùQÈSûtHÝrà—²Óe‡‹*ã”·½šW™½¦õ(Û>³×‚.¦V;Œý!ÈMoìzfDŽWOå¤B@œM²ât6é‹î4ÑÞF€fŠGá±1™ƒ¦žW7 Ôo¬´Ì(^¢¯êD;6¡¤lSr¥"Þ³óýK¤ †ÊJËŸCÓ ËiE¥ÍíöãVªÓ»wÕ7d–”Õ D z;ÚßP]žXÕ)Á†×{© „%~*È“'Š|(!„Xÿ‡º_³¿: cFçcÌ•…x¤¦•—¢ÿXz}®¬ÖùdJ'ù×ôêVb.þ%Ë PÉV2K´Kn6èS¨ëœÌ³Ð«êÿ¤ÎÄN×®ç’ãg~e ¶PfräÆv¬Lõ}MC*Rpë;›•T)­íŸÝLJ.Ï¥/ø¼Š¿Þ&ñÇÚg^ý’¬çª+ŽÖúå´’j¿Þ¬zlûn~»Êuá¼æ.€ñoƒ&B@!pNÐ4 ^™ŒÏ±d´86‘yÅŠóE‰<ж<ïàÕŸ£<š2Ï~é>8>Oy åq”¿@y<å+(_Iù*Ê_¤<‰ò—(O¡üW”¯§\Hyå"Ê3)ßLù«”gS.¡üw”¿Aù.ÊwSþ&å{)ßGù;”HþI:/œÐßiÒðÖn-üifƒc]õ¯V¼¢^ v¶iuó@Ç µß¿^KÛZ­?!¢¿‹µ–MëÕémø¸zc³öžã¸·{‹^^¶ºQ ¶ïÐ* If`½ÖcÖ Tk-¡ V¿Ì¯¡°VëÓ"ZxOƒVFv”­®×Z‡4­¯E Ð1Û¶pE­Ö¸³Më&ÝFJ¯ˤs^Ö"[æ2?¿C ·6hÅ$?ð|PÓ"m´Oþõ™:4­»u½®¿¶½_39ù+Ök-íÍZ­Îɨ\ zÅZc¨SkÛÆœ UîéÓ fÌ0ÝÞT™æ);É:YÊNÞSÚ džA¯ÞߪþOHgƒîo`Eƒ¦ñS0øÖ3kJúQX©5‡ÃÚ–Õ õvÕ­‡4UßY%¨üso»N{Ã9ž’Ƥ÷…Wß&›ÑŽµÏ’þ¸ôKª^º®HÈÕ›[´Îp³¶’ÇcE£Ö§ŸOñ6õºûÝ“v½¸s°\s#|ü›¼d+„€8ß ðœ›2ϽyÎsqž“óÜœçèÞ¯Þúµ¶øÏpœø@+~«I tÓ~)¸¶˜‚—j ^)Ò©­_µ^ûý©É1—Åb­Í85tÆôFæ$Ò<Öe¢Rëˆhý”…8ñk;[9à2dpÃXØ8æ`Œ"­Ž¬êP„ŒÔש5¬®ÔxQ0¹lÕ–D0g¯¯ÖÉ~”iaÃT-ÌANai3RÛ*¿æ_Õ¦N¸™z’Û@­ÖMU l¥¾¯·Œuj‹Ùža-¸š’õ­Z$цZ´¶N œl“a»½Ö2/ÙVî¬×ÎL·Dÿ£¶AÍÜ[¯Wÿ§Ê î–ñ ëpm{rDéö™cdK¯isLkXH¼W4[æ—>^ŒqaÔWù§nkçmj5¶ö2/ÖvÖ>óêk=縎õµ†ÍA‡c,rHkHÜH)¦ð} J‘¸±ÍÓ71] bÆcqñ£=èÂ5¸·âG y&"ÝØ²v!6.»ë÷P {}@¥ócÒ9¦ÆÐŸÐ–ÐÏ7ZŒÄïx¬ßÓ†`{Ú8‡"²ùýÖ Ž÷ÿ*`ìsõ܉˜1‡¼úðc–ÿuã0oÖdøò|¸{Õo‘7–oØX“Ó^K™‡l­’YJ†ÚêU{O½)Ù^{úøYm?¹“p ÝëJ>ý˜llŒ~ÍH¹¸šïy½´—zĽïZ÷ÓxI$µª¶‡mãÉ”cl}1,\mÊìºrÇÐx{³yô¨^žïrÌ]¤{£ôGlÍj¿ír/ôñïÆNÎ ! „À¹I@§s³_. «.Æý×ÎÂBò¸1~‚T'a¦dÅ ¸«#õå¸hj×àƒö¦yÆ4Ôr2ß1ÙKÇŽwÓÓ~  G­‰Ä(êFó¶Ü3…V}C®»F„\7“þacrž?úJ|cÑ U:—ˆ¸ôöFýáêŒÙlÿß¡ð†"qžzMò]®¬3ùνù„ÞÝ´¾=*G{c¸íñí´,݃¡-¸«{)üoN#f¨2ƒÍ”b/Ùz­ŒÌàmƒ¢½§^;zUŠ÷ÜLöЇ.W}‰oÅ»–qõ ª¸y.RŒ—oò“FR1T¶½4Ñ2·)ÓxBšCpuߦêºì¹úéRO?eØúI殸mÝ}úc ´ ¼£j£î×T`*ã_MOJ„€Bà\$ Ó¹Ø+šMŸ§&Lн^9öªä„?†ko¦Çeçá™íÅÎÚ‡°´ö|ù<Ñ­ÀËûz=Ú5WÐ1?úš9M¹õ[Àº¹X»ëÍMã¾´³o¯Boæ¦ø s?zé7›®új5°{þ}h¡çèýŽS/vÖ­Äj’ñù¼Ôdج2:­fŬ1™¥`Êlò)´UõíˆÅžºG±”ʺsö­†Éã€Ðaºï?¹Ó¿L_„Ï:‚gÚ«ÏÖù%/ÙFÌ•6x4õÒ›—çÑÿ¿tÔOOÒ‡¢ñì©]Jk.‡ÐíØ……ßß„žh={7`öŠ Þ9SãåÅv•™Ú&y[d™»f™³®¾µøm;K«òÛ¼L¹úøwv ! „À¹KÀüعk¡XvA©uG>ÂÌÑgíï˜ÿöš× Àf²Ð;HXßþ®ÿë<4T<‹¹…—ë²Ê–ÑZÏîwSréq,[²L-Ïwà¦S&Ùµ§ _É¥I¢¥žÑÞ Æ|˜~Oôùï߯mÃÎE!øË(ü÷ݼ̤'?j·…Q>½€ŽâŽúÙê$}ãâhà sãøµÇ ©à†ж± 7–݈*zŠSõ¶NÜûÅ\Äÿ¹•-7Á?žCJ… ѼõNøúŸ§}s¥Æîß+s(0I”yÉØÇòt©–?&³Ô©›6äö=«l綾ßIUõžÏn»Þ×÷ùõ€‰üLeÿg1/—ÚÐ7 K>¬ÆDß<½Nñ²¬¢ ¢î}Wh¡òo =îç6Ö s}8lOüά™ì}±s‘ºoͼµú­ŸWô‹½ž]Wcà)/ ƒE$ÂÅËh0­ªÀÏ>Cýį½Ú“ÊoFc¿^ܦ_s#süÛ©É‘B@œËrè54Oûè³Çü¥ 3™ûέ¹rÅç­™Ï;Ís¼Ueþ¿0—™¡°îóÿwÍcÞ7ë8·f¯S=I#•@ôiõŒVœ Sø´‡üxt Å ò‡é­‡l‹lEòÁCoÖý¯Ë ÏïЧã3õQ”8ÑHKSv˜N*ýË¢­)C¹=2”­<¦i¤$® fœë¸î¬µy_éwzEý:6e;‹Oú؃QÖ6ªŒð­j"ç…€#… O“O Lï^àÓÄ–÷™Ÿ‘1ë˜ûæ±Y×lÏ[Uæ Æ,ã}3ó9sßÜÒ)½.où'ç–E7Ï5%pr‘C! „€B@! †FàBœxUF’B@! „€B@xÀÉŽ ! „€B@! ˜€N2„€B@! „€Hà” ! „€B@! $p’1 „€B@! „€È@@§ €¤X! „€B@! “Œ! „À9J N¿ç_¸t† |‚È'üS"’p‚Y! „€`8É88÷h}Xsàä„_ÆšcC°/ŠM¥9¨Ù{TÙf`ßäø×`(R•Â\ N‡|o™î>{·q1ü”œŠ#´½ 퇣§Dš·»®½5ÈÉ©ºçÕÒ¬¬¬ûê'Sb·Û*ÉîC­uåÈËó!ï_[­ÕFì¾Ý§›îãÜYË~<œ6,á¼Z÷cü¼õ»8ËQä_¡ºúW´œ©»'úÚ±æÇÏá@d¤z(~ ! ²' Sö¬¤æ!ð)𾆠ºÛ[}Å2ïÁ¦Êùz»œœXR»ÕXíàˆ)ÔŽuÕ割lx½7)«çõ”M3ŠËÑÔaíØ„’²MÉ•°xÏN²} B.·´½|N*2íX™²£¦!5ñ›(”v~¿dÀE>”¿`èòò·´ìIl09û¦W·âIZ1ä¾àþêЮ\úhÿiºâ‡ÞFãkïCɆžW7$Džѯ,ÌEÖ{ªÕ±Þ“¤-ñŸÝQU=%}ˆw¡¦t*aÕ¿LFåÏÃf}Ë}PJ|’ìr²c^íÒìu\/†ÞåX³Ò÷%0Ç”^Vþš^XNýWŠV·î}?€—`yäO½¯®¡þÞ€cŽ>ôç*[½Ú$zîü»ÿó˜pû­‹^ýù3hx3uýþ%ü+<óünüeðOøÝÞ?ÑÚ”‘úþø*ž«®¦U¨j*ÿºøº=ñžy»»Œ¥šÁwvã™gþ_$qà7/à…ßt9¬ù Zþó]Ëú9ýƒf.ôôîûÿl:üÅx”ð“?½Š#›Ìzÿ?{ïEuîÿRH” @I„¨ €‚5›JÑV‘« ÷ºñ*VM¸Jo‚ü¾¸ögˆ¶ ´’{oMøVˆT…Û&ül£·«üiùÓ mb› »è¦%ÈM(AÍFvaç÷œ™ÝÙÙ™ÙMø—?Ïy½NæÌœsžç9ïsvsž9gfO¼'x~úã:¼ð_Æÿ÷ÒÏIæÏñ—§qLÈù™bëÏU[É Ã6¬»>ë;ÀGobßç:sù” 0&0À°ã4À:¼w7÷Kìhk&‡bíUiQMõ|c³÷WÃÕÜ€©®gPCµ#þÖmHÍÌÔÀѸ7;Š`›¿1lkwÿZÜœ· ¹›ëÐìªÅý(ÃÌŸíà >Å3+wœšlẆãæ[1.>d’óÅEÈ]Ý‚g3¶/@Ù’ÙøÏ·ÄLs0Åõ(üó8Ô9¨Zö)æÿÙ©òÝ‚´i¹pdo@]c-¤­‡}Òý¨§j>Ï'Ø]õIPçø~T:ßÃÉà%aÕæð¢;^Z— [Ë& èAJɉ3cãÖ0f³3;' `m5òHF^Y¾÷­TX¶×ïFMÕ3˜ïÌDƒs'Љ½ý¶Ùè¸w'\õÕ@U–mrÂÐŽçcN—ÏÓŠÊrÅÙ•õÞ6÷WÁAãbQõë˜B|ð®Qï wÊ(¤àƳ†ŒÖ!Og·Vs¨ I¸eQòËÜ*úLuæD~ñÛ·‘”y7æï!Üè{¯¬ÿ>¿dF]êCãʸ<úÞ~ø|Gq M¸8íhl<äQW„™Óö—üñïÀ?ÿÛ¿#÷ž)8æx;?ì‚çÈlx£AÖñ¯ÿv®;ù>^­x¤vº _|ºpæ´7x~æL>;yGÆbŠí&¤zñK!'ýN9©Ÿ­¿®Ãi³6¨Ö ¹t3fŸãcõ ™`’€f*8 ÛϾȼžfûÄäÛ¾Yh¨|™C€)ÿ&¬_ãï]‹qé›/Sbrbæa4¥¦mlÆ¡ªñøù›MX›A´!A8>ˆØògÕfmu5½uçOqÛH:›ø<ª?X9[ÿ†Ù©Æl>蚇id³flº¾¯äÿíLÄÄ[ÿ ·ÊÏgþ ¦ML„³Âª½§HD\ 0‘¾….ý®«>UßË–W ÿkµ óOøLìhEZY~˜.÷þ Ep½Y¤—àµg‘ÇEú‹Íœ¾—Œ˜bØßm ˆºe~ÏÇÙøóWÖ‡Ù²šRb•P„øÜvç¿àÁò…¥’¡ýÛÓ1fRÏäó¢ªv£1õèýJnuó<@wœ9tÁx¬o¸o} ç`߉Åôùr¡² (j¦€'ô,—Õ87cûû¬¤Óøû@µ=ÚÑói „K)%Ç~càØ…¦ÏïÀäAÍx‡V\¾38u4(êãwߣô5Ⱦe<.¥Ô-³¿÷^y®³qý”Qx{Š}!×9úá§Àˆø—á¾q—刄ç3ñâCÛ?:v÷±ð{6 >­;h€_: }'¬r¾~¶æ·xçCn¿DÔÔý¹Ð3çŸp=}?Üúsg˜óÉò6Cû¿Ý?}t)ZÞý 0nÃÍ#…À$¤^ |ð™þVŽF/'™`€;N “{s“F!g óÛëq¨óì¦iAíHáêD>š{ÛÊî'Çréø±Ê¤T>+V«0>yU˜ ¿ÿøÅô†æ§Ãh¢õnr*åsù}0¯™‰òô9øõŸZñ­q;h«kÉІô‚_ âÝžF“( ¶ÜTþß)@ •žƒ ÄXÎçÄälÙVÛe§I®Ÿ†ŒÀsŸÄ>±n³,5ðG8&%ÈN“âqµðÖ^Û‡ÎEÆlêt`Údႚ³‰'·Ô<ø”\Ÿ˜ü¯híMŸŠ´À7ÂSFe«eB"õ 9Ñf}O%eKT]rmåÌhf\$ŽÃ¼¢q´S¯Nƒþ6kSüÙŒ˜1>02ÀHcwxÒ¼}¶‡cÌ¢ž©½¡1!ë5SŸÝ/¬/ÁLuYÖ¢ï×*­|¾¶ÒçkÖ£ñ¢q~­Ç¹1Û}ßjñ}N×ôLv:Æ"UÜ¡pÉÈI´Ò² û>8†1IïѨûÒ¯$×%l‡øtEÕókä:êŸÏܤŒ#ïw×;hþ8‡}£pû·ðÇ÷ãàèkè&Œ èQëŒÉ¾SŽýõÛ_¥HW/¿÷=x·¼Ž0öjÙi’Ë^r ¹C"(Ûõä¤áñ4WAùãvejPΠ+Ó1ƒ¢#¿ÿ#•3nFŠ/³K0r$iôÊ€ 5ñE&À˜À@ À[õB/÷ê6^†y×N“·%Õøi0x,¦Ê^FlF;hňæ×ÐŽ#N%é;ÕäW£S’h{™¶Âµ v{8M¢”óù<ÌY~5ZÚ!Q9×:;è60…a°ÿ(ë7Tâ•_‚}ÝÃ!gGdSèhóᎧvP½NZmÚŠ{Zh+àc›•É|À¥dè¯p UïŸc9 m{hZ3˜,25!A‘¤¹Jšµ9TB¤ÄŠÕ6ê ]= ZQ»e,™°y(]qšD S61Ù©xC–í••„lÓ§T5¦v+<¯à¹’pìn mÁó6¡tI)¶”™õ·®rð´çã Ë”±º5ËØî êh‰žŒ1!Ó¬ž©½¡1a5¦”û‰´IV Ö}? ÷Wæa}õ«øßª*d­»O^T ÌÆ¹Ùgû®Q 0«-!û!‡q\øµr‚Œ[FáÄŸí{bä7¿Žð5"òÇýtã#a þŸ¢"üàE(úÁBÜwÏ?##…¼¢á×ák ŸaÛïv㋯^ Ú.—ðùÛxu×QŒúÆ AFÕÖÕîÁ„Ù P´t!º÷vŒüüoøÝÛ‡å±ìk;æ&)Ÿrdd›ý¡¼3ºÍ§ Ãðwäœ|,{æÄ>TWïA»Ï¢ ²qgp옲b¦ÚÊG&À˜À@$ÀŽÓ@ìõÞÖæ¯¤àÇ£FÉV­~UðåÑÌœ0ý»ÀžùXI/=ðÒó{Ë‹hIY±˜0“òÖÏÁºÝiÙÂÇk+0ý®U '|^Ú2cƒ+‡'¡­iž}´†¼±Ñ3û{°×Ðs$åÀâûé®±.ì_7 ãSž†“ÒÆgâ¦ë©Àeƒè¾¬yíu.ĪªF¸½Ø[ñ8Ѝø¢»'Ñk§…£Sˆ×÷·ÁÛÑ„5ÒùPE˜Æf«6+…µw#ÿ‡›Ðêõ¢ußFL_î@þݘhÂæ¸¦ªXÙ¨¬ùÚº¼°j¯F•eÒÌuj¨êÒ:ž×Þ2 ¨ÉÅÏv¤Imv•/BQ9ŸIkøjåÃz:¢1Ú­m½Öíõn¤{ÊÜìó¢ŠÆcJu˜TS£Ù1îÎù°UÒ6Vž¸w’RMÓ~«qnfëÛÌ¿T»¢“F¤E•~3.óÃÑ“ ˜šy•’/;+J2uÜx[ ØóîÇäxè•ü¯à·o¼NÏp‰oƒË1)ý ø>÷aäõcty®–«% ý†E€æoë[¯à•—7ãÈé$Œ7†^P!Â%øêXÒûɱÛÕ†Ó§?Ç_ÞØŠ/07]•„K‰Õð÷ñåy>?‚ßU¿O«YšÑpM½A±µ–Êž9ÝŽ½[vàÃøqõx«6NãóO€+®ÝxW90&ÀÍ·ë@k:··7H¹Â†ŠO¿ÀÔ!Ê”XlKž¼u/5áfzé²!VTää›yÙãeç„6Ó¡bï|=yms¢-K&ØŒ¬ev¤%-¤3–,ËVâûæâ‰ÉS°|—šÃK15¸ÝM®&ÿ¹å?êP\w3l)Šf¤ç£vÛ݈o_KòCå””â {*`JÞ¬"U"”Ð릸F| DuáZÌIO•¯ç-[BNá!9DNUÀf«6Ë…â…#fGö'%Ô¾\ùjÖ²j¬&G1ÆlÒ5ßfl~åûì´Ú)žƒ¸é~; œ‚÷Ö5`×BóöÊÏ$…q"F#B-‹Ž#h>8á.³>zßÐèzsFˆÑ°o.Fíºƒä(«}Ÿ… $'©YOFö÷¯ýŒø*.¯–µlÍžƒa´-R›ºñ—Ÿ„»w-Ì 6Z¯[ô`h55XLI„±—¢±Hæšz&Ÿí˜P)y›Æ&ë±N’FNE ËÜ– L­ äúïà¾ovà·Û«ð¾Ø^G÷ÌÇÊ2®žtÐXë¯|&^Ÿ@Ï;݈ë†GÞf¹þ;àº_Å+Ï?'‘tʇˇ\þ¸¯oÙ€9ã2|{΃¸JlÁ»êøöÕx›òÞ£ÓËô¾MÀNQmÈu[ƒrFáîïMÇWé9&«6€^ÜÑDØD¹ B&À˜ÀÀ$'¶(Yz5°ö1}5­?ª+Wâº6Šëúsõš8šEñE䉣>-þ˪y"­–ÑÕ2_£6>Eå8ôW~/­àд}Hh«P°©rž C’MV²üpwy‚ùÞ.7â©l<ÚP—ŠcÛ[ðÜâá ãà÷ºés’Å]߃…MB¿&×ɉ/ÆH¬U›uå½d£œš™v("ÌØÐ„>V;… ¨ztGœšÛQT{! 7IîO5£»²ÎrœuÛU»»yì©^‹zâLJ>2Gâ©ÿ=1S«Ï_”vÉötó³mU'Š:‘}lïËøå»×aéc3"¶ÒYV?íA×ir†$u¯žÐÓ­^]‚¤¤ÀÃI2gH‡‡V»’’h¥IWO©3ˆòô9º‚â4`kÙVÚ¤ ÇþLLþ| ÿÇôM 0&`L€\†g)‡–½åÁ_Žb^ýš2jZ”ÑÖQÓâh…£æ‰´Å55­é’\VÅ5ôGñè†zM)¡ûËŽ“Ÿ27ýNÎÐIb•f š}Ï…½†œé <ÂûÚ½¯C3½h—ž½%¼Hÿ8£ß_zù¿~‰Ñ-Ƭ1ì&àÌÇÄ£ ×;˜GÿãÜ &pž Ç)ÊmíóD–Å2^L )5[7ï¤gt¦³ÓÔ‹ûé|›Æã œprú<8œÚêÙÏÃ%£ðpîÝxÏí¦†²ãtúó“H¿÷_1•¦~>ð¹yL€ ÄB€Wœb¡Äe˜`L€ 0&À˜0%0VœÄs@˜`L€ 0&À˜`LÀ‚;Np8‹ 0&À˜`L€ 0& °ãÄ〠0&À˜`L€ 0&…;NQq6`L€ 0&À˜`L€'L€ 0FÀO¿u俜ÁÁ’s²ÄÙL€ 0G€§×å} ÁR;Ö|q®×±æ3ñJ`³à‡sÇ4ž _¿¥ ~ 3ζV5Ì$)×ÃåY—=Û\+]n¼‡Ò}–JÄïêÄŕº”a¥ËXÅÙ³Œ”k-Ó‹M9‘m¶®©#òJxÛÏV^ìÌ#-éWü¨¯(@BBþ»^gÒ¹e¥w=cwá> áöYqÒaë'§áí×7Êøó©/~Þ“:áøŒ 0&ÐÛ°ãÔÛzdÀÛó%¶~…§Ï äÊX|…Õ¯Æø±û.;~÷qšO#¡Ç uòz,'–ŠÖºN}]FÒØÙ¨þÍí1üÒŒµ.CMgÍÒP*à4¹N—Ý䵺¶Ÿ¥¼Ø™´¥W\"‡`ízoo†çñ):‹Î-+á8i?Ÿ=ew¡> áöYqÒaë'§áíl”áç3²XØ•žÔ À'L€ 0^F€§^Ö!Ý†dâ‰aN“׉¥¶$°g2“Pð2ÍÈ…ÇälÄú’Z‰‰£˜ï´‘¶íÛ„¹6q=Ùy¥pj—jŒäÑį¾êIdȲ⑵»ŽzámÚ„œ‚°åå'IV껀#omDN@öÜ/ ´`.6îWÖ¾"ô3°=hed¢õÝYØÒ¤î?þ7Ô¼ý„/ ÛDmÚ¨o»a»4:ü­ØT<7À+KË·)+XQXšÙ$ìÈÎÛ\õó·î"æKá$Fúpd÷ !fÅ¥ØJ]˜¨/¤Ú±"Ô§¥ÕT0"ØFëSUžžS,ò¨LLÌ©õ¯.ÉÆ“ÕU3ÑöÖâ²QæbdsĘṳ́_H¢Qý ¢@°üGPš3 …„oÕÆ£ø—®P5£qr6¬ äE²{kV¨c/Ú~ ž2l‰”ÝýÏBP†'ÒeúY ˜jfc´zÑúU©oÌ,büÐçÍØó±Ù¡ù>M±ú|šÙjU'€‡L€ 0¾M@’$XEj]œ& GKÄK1žŽ" ÄÁtsñsë—RBQÌ~‡R¼œâ0Š#(~•b Å+)ަxÅk(Ž¥xÅ o x#ÅtŠ3)N¥x ÅoSœN1›âw(΢xÅ{)ÞGñŠR|˜âO¨}ú3R͇[$|°Gr}Í`äÚ[-åR^Y•Tç:.u:+$êo ö©Î骖Ù$¤—Kí$ÊײUÎË+«‘;¥âtQnƒÔT)Ïã,—ë”l®“š]µÒŠT§°FjWõ K*©¬•ÚŽTËåì«k$•“e“åí&z×KÕÙ4CNtJåd_‰¨¤F–m+Ü Õ5ÖJå¹dé­£Fu6 ûÊå6˜·=²]Z]ŽuvY^³YjØ®´·xo»5ËmzÉ^7¥ežŠ½žæ³åÕ’«¹A*·‹vAªh õˆ\_e^,Õº\ÒÖ²|¹\Iýq¶Ö}jÎ)–1¢¶'sIj(Ë Ž=’,US¿ÙV×™Úܪ¶30¦Þ2é—è㘴™õOÛq©v{•”OœóV+Ÿ™ÐXˆ'gÇÊ@žÑx5è×Mò¸`Ÿ…àçÉgÅIŒc‹ï3öâójU/ê÷“¦¾³ ìàw’ù÷†ÙØ ¶Ÿ°[}>ÍÆ`[ŒŸéðþå3&Àú1ç¦(æÞb.æâbN.ææbŽ.æêbÎ.æîb/æòbN/æöbŽ/æúbÎ/æþ¾€ð ÆR>‚ð„Ï |áC_Bø·>†ð5„Ï!|áƒ_Dø$Â7QýÕoQý˜¯PžˆA_‡úÃÚ/ŠZ@#, \(Pª¨±ãÔŸ> -ž“$ûoHKþq\’Γ²>Ø"Ù[(SðHÂÁpzäÒÊä!Kj Iº>—˜à(“vÇ:šÈ¢Xjv{¤NŠÇèÜ&Oè•Òâo¸<_›CªÞì i/Éò—ªŽØÑÀ¨ºYäH’,;à É“ á8™ë ×%× þ 9NŠcS,µ¨y¾fi‰˜øVºÂ«¶ëÛ¥ŠG‡˜à‡ªúfÉãóH‡uRC³ê8™±ÎVt›„|­]ZÇIáR";µ¢u–ì fÚ N·¶©WÉ É''ky­[µ¬8†sÖÚ#r»;F´m°’å 8Ó;…Ý>‡d§>«jö˜Ú¼«^™ŒÇ”I¿˜'Ñ%X=µŽr<·¬ôº"ÙA2ê×p›.ÜgAkŸÞv­MVýnÅÞº^ôï'¥¾135/8~dÇÛø3j66µí·ú|šÁ*yÌFÿLkYrš 0þE€üƒ~ï8 'ˆ¸h“F!gДµ×#ç`#vÓMÇGŠ ±N‰b>O 0¥ç`‚¸×@ÁxkX‚|–FWa|r†RLMŸOçÔès•?áòâ‡ÑŒwK‘@[õ’R1gµƒî} ¦%V¡µ3ljû¤žNm ²ä[ò…ái ‰r ˜é=f»ûÄ9áV+É·Gä“S°­¶Ë·Xäóø4dÌ Ë?9,«$¬ÚÞ.mÅô‚_ ¢pr§G½0àÞÕDÂpqÃÆB^Ì6i5…§efew„˜ÅÅ­tŸIy͇¶¬Â:s¤z-W‹ûM¯íC'ÌØš÷©e»b’§Ú!ŽæŒâ¯™I#øõŸZik×VÔ`î'n|Ûü×#ÂæÐ˜2ïãúaãØ²ÌÇä°1iÕ>³v„Ù!š æýúÑEú,M“zÚ\ó~‡%{‹z&ã"œ§9³Ïäž +;ÌÇf¨ÖŸOã1¸ïcl1}¦Cz8ŘèkØqêk=Öïì½ ó®Ú>„ÿZP‹©Š§Ó–*Œ\Ái\ÍwªȯmƒÇã#_«µÛëðPºXáÕEžóù<ÌY~5ZÚåe[×:r‡>TË&Ê{TÕ3Çæ†Ð¤¿½…&ÊJ0×{E „Ð密”±ûòÀµ64R;Ä4ÛGÑQõnð™!»Ð¶‡Ö¦@2i{@(4œ;Ú|¸ã©Ô¾NvnÅ=-E°=¶Y™@›È³´IdjB‚"Is%”tlv„˜¡G õ‰Eìm8Ôªw6ZÜ‹A=èSYŠ¡áwgŒì1‘%vÜ_™‡õկ⫪µî>y_™Žû'ˆ]¡1eÖ/]1ØhÙ?!Œ)Í81iŸY;¬>Oá Íú5¯^¤ÏB¸}QÎ̸P5ËÏ«Y½úUÙmbüYPî…Æõ0›ú›}>Íúþ®Q 0«£—ÍçL€ 0¾J€§¾ÚsýÉàÇ£FÉ-Z1ü*ÙaèNóŽ5@[WäZ…VÆ„™ßÖÏÁºÝôÀ~¼Ž×V`ú]«p\[(Våù¼Ÿö1¸rxÚš¶áÙGÉqŠ^&LÏöÌÇJziAGGÖ,š,M¯¢ë F ϱêwhêð¢uß^¬§ÓÁ ñ˜0ìv.ĪªF¸½Ø[ñ8Š(oÑÝ“¯*¨)zBm—¶äþu“0>åi8OÐÂøLÜt=å^6HÞ‹«-§M[Ù” &Ä…x}¼‚Åc…t.¶SÐ8U²Œ3¯ß½åE´¨8‹rÙ°?»‘ÿÃMhõ 61}¹ùwg`bú4L¬î$Z_ÉÅ5mÐU8wç|ت ‘K+•OÜKýEÁLG›®¶Y¿ÄÒf«þÑ©1<5'ú‚fí°úÍlr}WÅü™ŽÎ’K0&Àz%Ú]iý?ãÔ¿6 öÚÖœ’*š÷H ÊcC1Zé“v.ÏÛ@ÊZ× <óCÏ©¯PöýÛÏ<ù¤º—–ÈeEyñ\OÅÞÃ:=:y®)K.«”_²,O®¿ò7«äÿU=BˆksIPvV®bS•K<{e¦7\—§y«üŒb½H`Yu >©¡²8([ä—lo–íöˆg¸핟O°h»–“\9ðÇ×V'ÏP^Ì ëNÏ—j[|QYšÙ$ÑSKÕ…ôRŽ·¼e‚¹ÒZ{¸ˆ:店Cx\âY4»´$7$3‹Ø(OB™± ká9#Ú6X36tJUâe3*BÏr™Œ½,³~1âf4ŽÍû§Sy.P÷,™B,|Lêm:ÛÏS8;ñL—q¿^¬Ï‚Ö>Ñwò󓜢q1c­^´ï'•¿ÑgA/[Œ3;”¾Ž›áíül…>Ÿ‘yÊŒ¼ª£hå¿L€ ôoô™ÿ Ň)öÛ—CÄQRû̽ºY¼iB jZTW®Äum×õçê5q4‹âå"O} …6-ö‘¨ç"­–ÑÕ2_£6>Eå80zo±—Vn|H’ãÊ–î.O°¼·Ëxª«ÙÌïÑ]Xóæi<ºp–ü:ñjà¤I/¢Á½ ™ç­bÓëEljNZŠaÃÄF=Mè¶Ýšº1$ý^7¨•HNÔ鵪ka“àä‹O"yZRÂdôê›!¡mF¥äK^²ÑG/ɉia‡™,ËëçZž‘²u˜öK,õc)cd[w®õP‡ø!â¡ †ÇQ€x+žˆ±rñ> Ýi¾iÙr±úžˆÎÌÀšžÚ¡Š’ë›|>Íd[ÕQåò‘ 0~I€\†g©aïS¤g/ðeà(Òú(6ï¨eÔ´z®–Uë‹£YNŒš'Òj×Ô´z¤KrYq×DÐÅb’zM)¡ûËŽ“Ÿ2îð·nÔ´Ùp¤ç¡˜^¸¹ju%l˶¢~Õ¬³îjäòL opï+ÅÐL/Ú¥§C/éÛM:ïÖ3³óŽ˜0&p–‚ãåvðYäêL`ˆ= ï¹[Pÿ>jíÂÎÆŸ`úä1a«R7‘ ÄL 9}N¼Bs¥^™ ðÀÍgL W`Ç©WtÑç iYû|C¸LàˆOAúM@ORÁÌúSor[˜è£Äs@˜`L€ 0&À˜`LÀ‚;Np8‹ 0&À˜`L€ 0& °ãÄ〠0&À˜`L€ 0&…;NQq6`L€ 0&À˜`L€'L€ 0&À˜`L€ 0(ØqŠˆ³/©k¾‰8×ëXó™»ÛˆŠŒ³­A÷k𫲖éŦœ8”îë0SŽÎ[ÐxÂSé³)¤m6.ÓÚñ»2qq¥8ÛV‡ëìù™y;z.³{5­yuO—fL€ 0&Àzvœz[ x{¾Ä–Ão£ðô”\9‹¯Hî>Ÿ¨2 ݯi]ÃižíþÐŽ½ÆY•Ô¶G› µ¶'iìlTÿæv$Ë÷‚„a;.”]Ö¼.”¬‡ 0&À˜8?Øq:?\Yj x¿øì´à’5$O ‹â4ù[±©x.­zÄQÌÀÒòmÊê‡ð˜œX_RÈËÆÆwÚ‚µ¾³ sm¢N2² °¥IY3ñ6mBvÞ¦àJ•¿u•[ gW°j0qd÷ È È˜[\Š­4aO æföQvÛ¾ Ùy¥pþÉ¥¶$RÞ3™I(xÙ +{D^NÞ“X³Bm6J«¼?꫞D†ÌH´w)vaEËklONÁ Øòò“Ä.:ô7Ô¼ýd?•ì>òÖÆ“/ ´`.6îwË0¬ò"XPwÈíÓèª×õQY‘æQ…ÛJlTÇñØòÖ6¬¤C1D_4ð˜×/ Õ Œ-^°è™œdL€ 0&ÀúvœúHG 3¿Ä޶fjêP¬½*-j“/.BîêÔ8›Ñ°}Ê–ÌÆ¾%œ Á×£ðÏãPçt jÙ§˜ÿýWd§Êt Ҧ命uµX¶öI÷£žªù<Ÿ`wÕ'A½žãûQé|'ƒW”„÷à«›½¸¿®æLu=ƒÊŒðß“6³Ïߺ ©™¹À‚8wâfGl ë·¶y$'¯¬ ßûVª¥=>¿5U«PøÚÕ¨u¹°µlŠ´¡Tã k½û×âæ¼UÈÝ\‡fW-îGfþlü"Ó*$N@Þ¡sýBØÔ¡¤òq\׊ÊòVYŠÿ(1¹m>[é¹úµ…(Z_‰NŸ–yF,æoD‡N×õCBÆò£:ZßʬŒ,·êÌwf¢Á¹ÅÄÃ~ÛltÜ»®új ªË69Éç1è#Õ.*3_?¶ x™õ¨%œbL€ 0&ÀúvœúRoõC[½žfä¸ÞÄÒã´"ôeÊèn¿ýòI˜CcOuR¡OÑEžÍÙù8ì¬Ã£ÔzYh¨|ÓnJǃÿ¶ˆV 6ãï4³v½ù2(&Gc¦M¾ ‹76c vãço6!bo_‚pÀ"/øýZºZ‚ Ï<€‰ã2±øU—ìðœÒ»#&ö¹¶”Rýb,_p'ÆNø–lÚÔüþ¯ÿnMÒgþ ¦ML‰Tl`ÏÖ?Åm'bVáó¨ÎжþM˜ ñ©Y¨ÞìÀاaÌØpãÍ6`×á0'#X8,‘ˆ‰·êì äW7ïÀ¹·á Í^H×›Ä$½ŠîÅĉ·á§Û¶¥Yæ²xMÔ§"¨º†)§ò_c~¡:¢y™S”›ׯdÞ”ý®ì®Àªïecâ7À­¶áÐ ŸE}!Ýhlð2é!`L€ 0&Ð÷°ãÔ÷ú¬_Yœ˜4 9ƒÎ ¬½9É…„ÇG’ÓCH/ø* G wÚx$%$áÞÕDÂp±½&Çé9˜X¥ð–Wäy>Mfm«í­ÊOCÆ ÀñI`¦®^·8úH¼­ì'óñce‡G¿ÎÜ>±š¶ ã““0”bj:­ÔÀú'„åbéKüDÉdŽT‹ÅãjѨ×ö…½¬!~ØàÝR$Ð6´„¤TÌYí®Ó¯©2ôGŸÎEçÌqá+k¢–ÌdAVˆÉð4K"«<À˜Å_ˆ•Ãé2¯£íC3¹T&}*ÒMðA8ßd¿ü—|ÕDâ%³úd—ÙØ")Úþ3ïÿ€ >0&À˜`}Š;N}ª»ú£±—aÞµÓ@‹%¨ñŸ¡ýnc1U³’aÕâŽ6îxj$©“V›¶âžÚòöØfeòê4®)&ÈŽªwƒÏ1&Îm{€ƒI©:{TMP$ rÐ*NÈQjÇ}föujò«Ñ)Iðx|ä'µ v{J¿" +8«ÓnX Û†Cšýi§A«I·Œ…öÉ0çóy˜³üj4´´' ®uäÎtûEZG)Q·!1d¢csCˆI;m¡ eÁ,ÏgÂâþ —Rmc]Öu¥–e úJ5U=­¯ÈQx™õhܨZùȘ`L€ ôì8õ…^êï6~%?5JnåŠáWE¾dÁ¤ýû×MÂø”§áÍZVÕä$iÃû‘µÌNeèe¤gÉ2jôêBüòðϨ=Š‹©m›¶.èEã7i쩹•r5\µõ’'/†k³“r&Y¹´²EkN_MJBòD«¼K‹¯Å“ƒ§Ñ¥µ+ù&ã:_OÞê#“2‘ri\¨»óH‰XìA¯G4ÓY_X¦Œ-=¯fãSTáÀ˜`L€ ô9qbûŽU WôjÓWÓú£ºr%®k£¸®?W¯‰£Y3:‘'Žú´˜ªy"­–ÑÕ2_£6>Eå8ôS~¯šò&'F¼ܼÅ~/­8ù0$9b…ËÛ农˜äÄpG(B˜,ƒ¦ËCŒ·”©åMí³°A­+ŽFöˆ{úÈ`xˆ'{=–öúáî"B¶ yñ”ŽÒ:­ QÓÞ£»°æÍÓxtá,y« xíwÒ¤ÑàÞ…ÛÍó2Õ·åÅÈ"ÌXêÄR&L¨îälë“8ÓþשâS&À˜`}™¹ Ï’ýïS¤g/ðeà(Òú(ž>W˨iõ\-«ÖG³(œ5O¤Õ(®©iõH—ä²â(®‰ ?ŠÇÔkJ Ý_á\p`}š@|br÷œ&ÑÚøD$8M"+‘®Guš‚2¬&¥˜‰}6ˆzj0´ÇGOÊ8“ÃHM‰jo|X[…¼sé4 ;ããO£êÑÙj›‹'é·µ’&å¶ì ÜHŽ‘UžÚF«þ–Ñ'báK½\íùÙÖ'Y=ŸZ8͘`L€ ô ¼âÔ+º`Ý$àoƒ³ÉƒI79çNP7- ïjEý_ø¨µ ÃoœŠé“5¶Yå…$pŠ 0&À˜è£Š;N}tp²ÙL€ 0&À˜`L ·ŽoÕë-£í`L€ 0&À˜`L ×`Ç©×v Ƙ`L€ 0&À˜@o!ÀŽSoé ¶ƒ 0&À˜`L€ 0^K€§^Û5l`L€ 0&À˜`½…;N½¥'Ø&À˜`L€ 0&Àz-vœzm× `äv¬9ø&â\¯cÍgînƒ?g[ƒî×4We-Ó‹M9q(Ý×a. ×çøáܱ'è÷¡(¸÷•".®ç»EV\­mˆÂ¼«ÙôÛÝâ÷»#c6ê»Â;ÄZWxÙÞqÞ_çߦp}Šóß³¬ 0&Àb'p®3vÍ\’ ø[¿ÂÓ@É•3°øŠdÃR–}"w0, õ Ói^Çý¡y^ßÈñc÷]v|ÖèAæH iìlTÿæ$’ηñ}ÍKæCnÄ—ž„Kq⥘¾àªë×bòPà¤?cÃMWxéÞpÞ_çߢp}Œóßµ¬ 0&Àb&À+N1£â‚‚€÷‹¿ÁN‹YC2ñİ(N“¿›ŠçV2°´|›²B"<&g#Ö—ò²±ñ¶ ù­ïlÂ\›²‘‘U€-MÊºŠ·i²ó6Wªü­»¨ÜR8u«BБÝ/ ' cnq)¶’S¥›‹ËúZßÚ,—‘µ»Ž*+:V6ää=‰5+Ôve£´Zxlmx!/+w·ÊrÅŸŽ}‘‘µýÁKr¢Û²½N,µ%¡j?“™„‚—ðÿjÞþò¼•®[Ë,ÅF#Öfý£5×¢¯ô6X1oÛêÓì¼R8;1fb7û6Ë@IDAT:&އ©ßÊ”5^g›ˆq'"ý¦qHhÞ„œ‚°åå'iŒäàO‡ÂÛ{DÓosW¼€Ò‚¹Ø¸_Yôʋ´ãJ«K¿ÚÕm¶ý%h&G‹Ûªœl§ÑØ3Чï3ÝŠLêØ‰i||fò½¦ïH>gL€ 0 O@’$XE²(N…£%â%(V¬Dˆƒé(æâFõ¥‡P³_ºÏ‹Ë)£8‚âW)¦P¼’âhŠWQ¼†âXŠ×Qœ@ñŠ7RL§˜AQÌ~¦R¼…â·)N§˜Mñ;gQ¼‡â½ï£øÅ)>Lñ'Ô>}‚À©æÃ->Ø#¹¾Œn°c]"Kªq6K ÛË) ©xo»Ôé¬Ó°—HuN‡TµÌ&!½\j'‘¾#5rž­pƒT×X+•çB–QG™BF¹ÔP­œgIunÊs†ò<ÍÕ² ûòjÉÕÜ •Û… HjME€ª+ky•ä r²®|©é … ªíéÅR­Ë%m-Ë—e—Ô—j—S;flØç“¶æ“Þe;Ã@©: Ûg*ûˆäÚ[-åQòʪ¤:×ñ01É4`mÖ?Zƒ­úJÛVÌ}-[eFye5’£q§TœN\ì*'ÑwbÞ2ù^Óö#§™`½‘€˜sSso1sq1'ss1Gsu1gsw1‡sy1§s{1Çs}1çsá_@øc) Aø Âg¾ƒð!„/!| á[CøÂ羇ðA„/"|ᛨ~Šê·¨~ÌW(OÄ ¯C\­ý¢¨4ÂÂ…U¡j€j;N½q$÷b›<'HöÞ–üã¸$9&e}°E²·P:†à(Ë¢ ±Mªªo–<>tØY'54«ŽSh¢ìs)gá)“ùb©E•ïk––‡¡Òæ‰lí„[ë89Ö ½%²#&‹ñ¹d§CL¬µA.—®)çi–6¬Þ ½±F8|f6(NßÖ6U’OªÒòÚÀ¤Ý&íy¤ÓNvopyÔ‚òѺ}æ²%É#UÃQâTä…·7š½&¬MúGk°–±¸®í«pÌ™+ýQ,5»=R'ÅãÎ ò¸ý-‚^Gè¤êf_ LÈ1VúMq´åÌ€C$ú7jõ«ÞŽ]õ wU—,3ð'z³Õ÷—•œîéƒd4öôúÂû†ÇýO”ës1>̾״ýÈi&À˜@o$@ß…ýÞqN&pÑ$&BΠ3(k¯GÎÁF즛7¢‡ô‚_ ¢pr§GRBî]ýG$ 7NÑ=‹L÷(x[ÙÄÉ©NØVÛå[âñiȘ8>9)ŸÆòÇGâmewÈ·8äòñcq+Ý#Q6á…$ÈåhÊ%ŽÃ¼¢y¸úK+H8JäçŒIñ¸ZÜ_ymÜ×ÌDyº¿þS+mÿÚãΉâfŠ&X¶Ï\vmʹðy4ÂÉh2MX›÷Vi5©¯-eÍ<Š®Âøä$ ¥˜š>ŸÎ¨?С¡K+,fŽ÷~ƒÒoY¡þžrRå`•Ûñ×#ÂŽé²VltýeÙGãÅÁ²œÂD<ã¦„ÐØãñ¡2¡a²-8ã#¶ÏMÈN1&À˜À…#ÀŽÓ…cÍš \†y×NC>åÕøÏЂêXL•=ÃÂa;Ú|¸ã©´¤Ú‰Ãέ¸§¥¶Ç6+€x,È øèš£êÝàsL@'ÚöÐZï`R*25!A‘¤¹J:6;4ŽR;Ž˜èsìnBÀo» tI)Säåm8ÔÒu6ZÌKëÏÃ`ÿQ>Öo¨Ä+/¾ûº‡C` ¸eû,e«ú  Ê2·—2MÚnÖ?zÓ¬¾j‘z4cî;ÕäWƒ6JÂãñ‘ïׂÚíux(]¬Þ[…DyŸ±Q Çæ†Pÿ¶·“ fyfvÜ?Aì0ÖeÝ_TÍ„mÈ¥¿¢Ê T°.'6 ˜=U#AÂl XåÅ:>bþܨ]ÂG&À˜¸`Øqº`¨Y‘)¯¤àÇ£FÉÙ+†_eø’£ºû×MÂø”§á_[T©î%‘§ÊPê”ë^!ž ©]§¼ÜA)›%mhÏo™Û Úº$7dGÖ²êÐóTTwk!éÕ¼ü VOeû¤Ëų*²Ö5Húöš1“Ÿu rQŸ'R˜™õäi²HxfȪ¾Þsæ‘ýQ±÷p‹§¹ŠÚzVHdèõ†ë’$׿’`ÿfå*\ªÏ“™çÛ¡×4LNXõ=weÂVŒ!mY©Øõ‰g±ì’ñØ ×Ϋgmàña“Ä8ÕS.áÉgL€ 0^G€æ?¡ø0Å~ûrˆ8¢Ní3ôã‘âMjPÓú£ºr%®k£¸®?W¯‰£Y/ŸyêK(´i±WD=iµŒþ¨–ùµñ)*Ç¡Ÿð{ÝðЯ6%'êž÷±j¯ßK+N>$ IŽXáòv¹á‹O"y‘Û’ÂDÊ2èµ-CŒ·aËt%‘®0‰6ˆüúÈ`xˆ';<v´¡4.Ƕ·à¹;ÅÃO&¡G²Md©— dªYVÇõ™@Ùæ=´O¯Ê{tÖ¼y.œ%¿žG¼R;iÒ‹hpïÂíæy™gêÐ;zRGo¸8UŽA¹ècÏH¡æšLM®i’LJ1šsÊÅX_eL€ œSä2½ªøøÓ¨zt6†ÚæâIú°¤I¹°-{7’cd•”Ó;zR'¨P“ˆUŽQ9‹±§Ñ`ž4’i^:˜Ãã#ˆ",qN¹„Iæ&À˜è)^qê)9®ÇΜMLºiLøêéòÓó6¨m¥ç´¦cܰ°µ«Ø,±›€Tª«õqà£Ö. ¿q*¦OÖô‡U^_FÄã#öÞ³Vy±kà’L€ 0>G` ¬8±ãÔç†%̘`L€ 0&Àzà8ñV½Þ5æØ&À˜`L€ 0&Àz!vœza§°IL€ 0&À˜`L€ ô.ì8õ®þ`k˜`L€ 0&À˜è…Øqê…Â&1&À˜`L€ 0&л°ãÔ»úƒ­a}–€Ÿ~ÇÇ/~Ãù#àí@kks73·nãâL€ 0&`D€'#*|íâÚ±æà›ˆs½Ž5Ÿ¹»m‹ø!Ï8Ût¿¦¹*k™^lʉCé¾sa9~8wlAã úÍ&9èÏà G=±¶-Tݽ¯”~ªŠ•çR§õHHHBÂׇÊ©žê ¯kuÊ£žž/¹Q „·3xÙ,á9„¢´á¸³¢Ñ¤D,c±›:M4ÿËáv†ßnjÊ­›òÎ[ñð6Ÿ75,˜ 0&ÀzD€§aãJçÀ—Ørømž>ƒ’+g`ñÉÝWåU#¡û5­k8ͳÝšçEæø±û.;~÷±š£?W¯ÇxŒ±½Icg£ú7·#I{–:…Œ rœÖ®GñöfxŸ¢3º§ztõbl£Nyl§ÁvÄVüÜ–Òµ3šða™øU{2Þúª~·®Nô±ØM:ùî4ÜÎðñÛM+bàÖM‰ç©xx›Ï“˘`=$ÀŽSÁqµóCÀûÅß`§ aÖL<1,ŠÓäoŦ⹴ŠG1KË·)«)Âcr6b}IA /ßi ÜúÎ&̵‰:qÈÈ*À–&e ÆÛ´ Ùy›‚+UþÖ]Tn)œ]ÁªÁÄ‘Ý/ ' cnq)¶Òä;1˜«&È¡¨z²}B×Rì:ðW,µ%¡Š<“™„‚þ7üüe1‹7¨wT™%·¾µ1¨W–'®GioКãCÍÛÁçuFê4cI•Ûö…xeç•©]XóAiÎ4’Ù«~0Å¿t©ê#=”kÆ?XѨ^”6ZÚÜÓ2b\ää­ÄFuŠP|âÃBíãÐ'œ‘j>Ü"áƒ=’ëËè;ÖÙ%r±¤g³Ô°½œÒŠ÷¶KÎ 9 {‰TçtHUËlÒË¥vé;R#çÙ 7HuµRy.du”ÙÙ(d”KÕÊy–T禯¬Jªs•\açÇ%ãz5’'`{Öò*ÉAz+dÛó¥wß5o¯–b¨}žf,}-[å¶å•ÕHŽÆRq:µÁ¾AjUyøŽKµÛ«¤|ÑžÕ¢=Ç5*#õXñUŒ¬gÙ§&6j{#j;H¹y™ßÜ ©ÁI D?R{—¼´SrÕWKY”¶¿äˆ^?bik>½e; z†/1&À.>1ç¦(æÞb.æâbN.ææbŽ.æêbÎ.æîb/æòbN/æöbŽ/æúbÎ/æþ¾€ð ÆR>‚ð„Ï |áC_Bø·>†ð5„Ï!|áƒ_Dø$Â7QýÕoQý˜¯PžˆA_‡(ZûEQ h„„ ªBÕÕ vœ.þ¸íSxNì¼!-ùM¸Ï“²>Ø"Ù[´“oóæ8ʲhbf“ªê›%Ï#vÖI ͪã”%5Ã#‚Ï%&YФLªŠ¥%‹2›¥%bÒ_é sŽD¶2iRäh'Ç:¡·DvÄd1>—ì•7 ×,|m©z3M¨é’Ïs\ª:p©‚§'P8üܬÞ[BoºF¯§YÚ°zƒôî_•öµ7dM¸ó'Iá:ÍX*m-–šÝ©“âqç™ùÎú#©—¥Õ©Ï³âoUOÛ¢\xŸŠþˆ´Q8¼j0kÇ.M;¬ËäI®€'á{zTBÃj›d[Ý ™×·êŸØúAm‡þ¨èÔŒ ÍX4Gíº¾7+w´¥Yr8]’‹œ Ýœè¤ö[õŸêdlmS­ôIÕb¢¿¼Ö”ÍÎúØÙh?ƒ–ºL¾T«ôG+Yj^u³Òùç§ýTùúϋIc“v ¦Ô·vú®ÚàRGž¾%|Θ¸¸È?è÷Ž“p‚80‹F 1irAY{=r6b7Ýx|¤¸‘=¤ü…#;m<’èÅ÷®þ#†‹› §èžE&ˆ{a!àóʆŸ›ÕûRè] Ñ›8óŠæ‘H‹ö­Ñ'Âuš³L£Š«0>9 C)¦¦Ï§sþzDË+\V¸&]^Ìüuõ¬úÆ6ÖèИb\&¼eÒ§"MÜ&¢àCgà((nx‰`VŸì0º±`ÞŠý_«±h6ŽôãϬ\Û¶ÇaKŸ„I“&Ññ_ðà–ý'Fu 2GªVÆãjqoðµ}DììÙ¨R•£¹®«L¿Â%„ÎÌe}&RK0s\ óÏGû‰YP¾n<Ä_3åéüúO­´=qjPŒ;'Ѝ˜`Làb`ÇébPg—aÞµÓ@[½Pã?C ªc1Uöp4EL’m>ÜñÔZRíÄaçVÜÓRÛc›§Äi\ÉG—UïŸcMéÚöÐZï`R*25!A‘¤¹J:6;4ŽR;Žès>Ÿ‡9˯FCK»¼ìK+À‡!Ê.×Ès«zŽÝM¡WQ{›Pº¤ó>ýZÉæieBhƲëT _ ÚöÇG¾^ j·×aÎõb¼;AÑcÉßP\`Â*òLÚè3±ñ¡t±z¯³2÷OµÃ²Œ‰n!]6=­¯XhÝz§\©£ü5‹VãH«Ó¬ÜõßÛ¬Ù®ð¦Ñëþ¶áPWȺӰÑFŒ±dÒGò8²`«µ3$U¤ÌuùM¾ÌšËRî½$ÊûÑ…ÖóÒ~ÚI¢åB õÊ0Ø”õ*ñÊ‹/Á¾îáÐM¥ ÿeL€ 0 H€§ ›U™øJ ~Ezö_Ž"­bóƒZFM«çjYµ¾8šEáĨyò i:W¯iÏEZQVõ\‹Iê5¥¤îoôù›®Ÿ2ÞF >1Y~ÿd·ìŠOD29°üÏhë+HØN&À˜`L€ 0~E€§~Õ¯1#0"LyÖê:üªèdNLǽ ŸÃÖB rk=ÔÍvJùdL³à©—h«nEþÂy¸íšDÀó>E¦M”™2)“ÒÛp(ÖPkr‚ 0&À˜`L€ œ=vœÎž!KÐè¤óEO »š6‘œ#Ç'ð„]UN|§E _.á>¼´öÌSrÚôœ&À˜`L€ 0&pq°ãtq¸÷s­Y¸.%^×Fá †þª®rš08òrÒeº5­È"|… 0&À˜`L€ œ/ì8/²\®/òg™b'â;QÖ{ØÝtUû潈B| 0&À˜`L€ œ'ì8'°,¶ç’SÅK!>Åš†òùgJs©ç ¸&`L€ 0&À˜è&vœº Œ‹Ÿ{ò“³ mƒW¬T¥L@>=åôçAežG(= ׯú[QÁšœ`L€ 0&À˜`gO€§³gÈ" 5ØR7”~ä6¢ |áڙߧ?”áæ1©XÓHÎRü|‡~·©hëþ@/þ@¿ë„e6 7ÁW™`L€ 0&À˜Ày%'I’¥úÓ8M5­?ª˜¸®âºþ\½&Žfñ’@ž8êÓâý¢ž¸.ÒjýQ-ó5jãSTŽC"àÞ·C3ÿ—ïW˜èÞ‹ŒáÓñ£#>ŠýEj5­ž«eÕúâh…£æ‰´Å55­é’\VÅ5ôGÏ ^SJèþ ç‚èu’'?€¨ÄsoAÓoÿޏ‹¦^×Ol`L€ 0&À ¾}?PzºÏµs4«/Áði¥8Šlpý É}® l0`L€ 0&À˜@!ÀŽSéÉ~ØŽaß|‚–LEÞã&1&À˜`L€ ô%¼U¯/õÛʘ`L€ 0&À˜ÀE!ÀŽÓEÁÎJ™`L€ 0&À˜èKØqêK½Å¶2&À˜`L€ 0&pQ°ãtQ°³R&À˜`L€ 0&ÀúvœúRo±­L€ 0&À˜`L€ \ì8]쬔 0&À˜`L€ 0¾D€§¾Ô[l+`L€ 0&À˜`…ÿŽÓEÁÎJû¿×v·~Ä#99ɉ}­l/`L€ 0&À˜ÀÙà§³¡ÇuÏ?o#²ã²QßuþUiðŸhDiA6’†"5% i)©š‡œâ8x‘l2²³7]s·Ak‡?d’܇9hd^!&œbL€ 0&Àúvœú\—±ÁŠ€¿uîL™‚¢õC±a{ZÚÚÑÞvµ¿)Ç¡Õó1>¹€ƒÎ8ð«±H»ý%¸5yŸâ|šsN2&À˜`L ¯à­z}­Ç¨½ |¤và¥ÜÙØ|4¸_@æü0Ü6g1Ž\;ÇÌÆ”Þ_Ù,ÚÀÇA%péåv`Ä`$¨3ñžÔ žñ‘ 0&À˜`}’¯8õÉnë_F·í߆'s2'ǹbœWÛÆ¡øØ± Of)ùqqXZ¾ Ú"´¾±÷å•´­O-“ƒÒêFz&I„6l\2/¼Ó¦©áÆ–sIÎÞ@%ë`ÍJÌ-~Gwbá`ÅÞkœ¦Põøkfame>P^„Ú¤ÅÛ„•¥Ø»/š!&¥ç’5ÄEư¹©£[Ê—"#N]Ak“ÏÕþˆË*À«ûCì”í‹9ÁþгÍÅÆ·Ž( òæbÙ¯{æcZÕk¢u'YÏOÑìS½MÚ¾"*½–å…é1Ö˜`L€ ôNì8õÎ~0VùnAjúl¼‘ºµNj7—Ã!¶Á}“2¹§u‹¡¨}ÚL|4« .jÖe£lÉl,®:àäÅ–%·bú‚gpóK5¨k¬CuY*Šœ‚;KöR™$ :\‰…/Õ…œ¤ŽwQ¶¼’äT¢9ø8NÞøÑ3¨LŽã¨¡zK{sŠi_L¼;68°ÿc±)í$×az¦•¦¢ÎSFˆKƺ­p»êÕi($.ÿ^Õ$Û¼‡lž4< ö%»póò[0"ÞMy©t^†’ßÔÂá¬Eùõu˜“žŠM B+~*¶/þùZTïmó+²˜ÛXlj»æÜŠä= = fÝ‚ÔKźÓI¼¶þ5|.sÙdÜWEod)ìâÀ˜`L€ dq’$Y¶Ÿî:Çi ¨iýQuÀÄum×õçê5q4‹—òÄQŸ»¢D=q]¤Õ2ú£ZækÔÆ§¨‡^HÀ½o †fb§[Bv`;\Ûî'‘š]‡Ï.d¢9ISйº»Š¦[°mIfROå#ÀÁMHŸ‹»ZðtÖè`™¦ê¥˜ô`¶¶ø`Ûÿ4Òîú.ϯ0‘ވ׶{%éxF.»ÁÕ‰y“»—2ÎN|ë­¹°­ÍF§c1(Ç8ø›07a&½·ü#ª/âë:ˆ-5õè4ƒ"4œÆéÓÃ1㻳0Úc9Ý~A¯ —]Åq˜¹ºíž;0ŸØÖ¤¯@ó;OcèmÚˆ¤IóQ^ߎÅß°Ê9C1H5:VtaØøù¨i‘poõÄŸÆv<1yš^ÎÁ¤²Ùð8 ·Y¼"éXåÞ…ŒãÑûjÖpG÷YFðã L€ 0&À˜À…$@.ó¤ï}Šg(~8Š´>Š[©j5­ž«eÕúâh…£æ‰´Å55­é’\VÅ5ôGÏ ^SJèþê¦Zº\>eç™@ÂЯÊ–.\‰çÏÅä c’õSø|ôâo1:i{W'=<%Ì’´‰ôÍÚOà¡«‡~÷"ý-ÁBÓ$ O¼¯y(Ã;¶cÖÔÙ´:4;\k1qr2_yY«kðýíxqûrœ2Ѻïuª•;ȉ:ù–=\JE¼>åµÑìÔ;NîëQVò"†^7ÔPQçç×"Ý> É1–|K÷ —éOµÀõh†Ñ D(ùŸ¥²Ó$Òìù%ý]‚;'Ä£ãm†Œ§¶% Åmói[bÎÛøüÅ•8ÞbÇðÑ~¸;Üp»ÛñQýkXOµÊ… ¾Ó‚)êÛlfSX_ Þçz¹²BþØ`L€ 0óH€§ó—EG'8îÞ{?\433ŸQ*Ð6¯ªÿ)Á#“Õ%,\—¢ªbr>X^r¼ô«i”þ,RYüXÌœ<÷ö!<}ë×±T¤wÀâÉ#ð[šéç8³0ã`>rsÞ‚»0úe°l'Æ‘*§Xrþít0]qrŽ:Ê_0R8>ŸR´¶“ „…ä‰`—ã‘°k†'±–ÓU6ã?d4& 'Ë{ˆœÒ,Ü>!ÔÂK“3(£Œ¶ï‹ˆ…Ð}¡/¶ü'f>º*˜k›‘LGK˜Ùm_}ClïëËhz9Ÿ 0&À˜`gK@?=[y\Ÿ t€ß‹Ô›çáWŽyøEGhÄ/:¹™•ÔìÁÂ'¢@ P¦áä'-ôLÍÔÐ[Ü‚%ãï{€ìâ+éJ2²åcþƒoá }4­ØáŸŒÑÃR¼{ôVü¾ŠV_ê'˵'Üþ sñëwþ_<ܲ&gÿùÃ+ô„“ ×§†+;ƒÕ„¿NçßieF8 ‘A\¿>=V†b,§û4›réhÂÞ ¸Å©óä'ïÑÅ8ìyÃýbÍ(|nÐÛØá©Y„›­Ä zþéû3¾Ž”‘É伺Q74ðLšZÁøhj´}%œPë>7–ÎW™`L€ 0&pþè¦ZçOKfFœÏOƒmÉtJô,ѰLüæ,üôUêløðSÚˆpœŒêª×®š2‹v—b+­="Ô ÷¾më"UãRå+cf|—Üœ™x|æVa‚(::+Òwãÿ,þ9Ayp؆ÉeÇÍFù  pÚJÌö<‡ôX9­»è% ´*“_ƒ;FÓLj¶v7¸›~[æB‹jvÔ¹7ãÆÃ±•›¦ÛªgÆ¥qýw1}Ù=8îy B÷•¶›éÚõ<1ÃBnzy.&-¸X'œÔ <9ç¶Ð+Ø[w£ˆjUÄðÎx3›ÂûJqœ"Œã L€ 0&À˜¸ˆÄ 80‹F uJ.é.Īª½hózáíjŶçKé÷“€«F$ÅdWÊ­y(I'_hü¿cÛþVxiëȾWaN‰}þYu¦FNÆ¢@M ùYs¾xþ&ÿ´ ŽÒX˜‹IA_aýÏVÚ0V[R6înDkG=÷ÓŠúš5ÈH›Iïú£ßxúï{CDLÖ† %ßT B´ˆ›!œ¡XË…$+©0.MÄÅ놳¦S–9`_÷0ŒÞ8ú¶ô„ÓnL¿ýIÔ퀟X6í~œ&z³áº¨mKt®Eå[á&yGèUòsÓèy3 [ßx[þÑ[ß):q6უmÔrVðO˜MV}¬Á &À˜`L€ ô¼âÔ;úaÀZ‘rëbÔ®;†éyÓ±*OÅ`CÉf—²z$¯ä 5ØÌFøjùÑxâO`¡ ³Ó+Õ‹°åWàðóó4Ï( Ë–ЂÊ.Ü55´”5aæw©În”<æ‰ßjÚÑÖ€Ÿýð˜Ÿ=%(W$ìË6àŸš‡qa«<Ñì qN4\&…¸Ø—WcýBò4émw"„mŒ‡ÿlÙ‰“³fâæ1¡ç˜”:™Hñþ7J¶§×S ´`Ie-½ñé¹§ÙØpg'æÎü>­ìåR}z¥9½ï [  |ÐØdÙW½¥¶ œfL€ 0&À"~ù@ìõÞØfZ½hkwÓO.%aè°aoc‹Õd/='Õîñ#ièp \>еºi9¿·ííøi;Zrr ’ÏhSç2CåŸ4)š-xÿ?{ï^Uuå ¯´‰$Jè+X°‚Ú&´ðZì[¥$LQÚg ÿ´⌠`ü¦Ó÷±o«8m!ÌŸÞ© ýO%|Scߘé€~#0`[h‡Ð&Ôd*TpštˆšØ\ÇD½ßús÷î{rÎÍMH0$k?ÏÎZ{­µ×^ûwö9w¯{î9É4FìʼnéC[cÆ)–éß±Äg…Y Î Æ4ÐÇ*ÓœLg†€!`ƒƒÀHx¹%Nƒ³vÌ«!`†€!`†€!0b ‰“=ã4b–³MÔ0 CÀ0 CÀ0ú‹€%NýEÎú†€!`†€!`†ÀˆAÀ§s¨m¢†€!`†€!`†€!Ð_,qê/rÖÏ0 CÀ0 CÀ0F –8˜Cm5 CÀ0 CÀ0 þ"`‰S‘³~†€!`†€!`†€!0b°ÄiÄj›¨!`†€!`†€!`ôKœú‹œõ3 C`È"Ð-±¶6‰½ÚyÁ#ìüíóòü‹~Ü >QÐ0 C`Ä!`‰Óˆ;äÃ|ÂñVÙ|úŸ%§áeó+±>O6vr³ä”l–¾÷Œ*³ÏNÙµ(G6žhKs;±Qrr6Jº4Íä4R±eO·Ô?µWj{Ù4gÆãü§åúwùó÷|<¼Z+e99züÃj™{5s{6ÊÌœ<ST$c ÔÏr9ð‚ŸÈ :mG¤`µr׸Ùÿbæ8Mk†€!`\lä^l[¼†@4oÉÞ3?’•oˆT^9Oîý½ÂhÓ(M£$/Jß_y}tÇØ¯{ê &/”šÇ_“‚žª *alÙÅÓ-o.—Wj;dÖ½„™^zf§vý»|v½ß^«Ñï—í uÒ‘w©¼ø¯eîÒç¤æØ#òá1"¯uçÉäüèð:Oï’‹ÖÈÚÇÊ¡…3EÚŸ“Çî+‘ù“&JSü+R8Xë;Òþus¥dÓq©žð ™ügOHÇîÛ%C¸Ñ1!`†€!0°;NCð XHýC ó¿þ]Êõ‹õÒѳ侱½$MÝͲkí]‰oõgÊêªýþÝdLõµ²­ryBW&;~Ú’ ¨ù§»ä®ÿNÀÌÒå²·Ñ¿'ÔÙ¸KÊ*v%ïTu7P»ÕRrwàìÁGeQÂÇ]k7Ê>ÝØ7—Ýçþ]öüè?û\ø^Tñ°ì`L¥«eï3ûåa½S…»e¥Qç­&Ór"5ô¯OÜÚŠŠÍG¤[ŽU? w5ˆÃj9ðÜ¿Éê’Y©¾œU Ë¿ëg+Qã B­(“‡6ûMýÛvb‡Ì,}XNw'EÓüÌŽ$f3uþþ”8wVÒ{÷lùX= ›×q ”ÉÆ?fO·üQÙûÝßEÞž°ydòŠ‘Æ–ï|™4½X¦O™"×ÿ÷Y^ð×–L—)Ó§Kñ§H¡~ݵ»Ú_òìç~lŽŒ/c'˽ËÚ•¿'í¸éÔ¯õÝ)O¬*“Õ5>mÇdyI™ìjŒyíØI]ûzÌþý…ý²°J¿´¸c–Lúƒû¤|ÏòTsà@úì¯!`†€!pQ"`‰ÓEyØ,èž¼%OµœRñy䪉=ÕIý·ï‘ÅšdOý)9þäRÙ´j¡üõ3ÈFiÝ&+2EŽÖ×Iõý/Ë’Ïÿƒ—Tu¿°W&ÎY,ueÛåhíaY:q›”ϸMŽi·®Ž—ä`µ¿iÅPçNÊÎú_Èkh8¥óô2¹l…Èm5Òpê¸\ßð ìQý(I¿ùÛÕÑ,;«ü„¢«;&{ª”%õ³äxýÓ²V6IùM ¥íÖ§¥áXHõ¹W½dk×ݼ_ÆÏZ,²tÔÕ>-7Ô­‘’%;äÅ ±¹ñtž|Dn¨X/‹w•S ‡å6gþ7ÏÈÒGj¤BçR±©Zþô¿—¨qR¹ä8yÿ´—åÁ‡ŸJ$œšm]"u7Ü(S8<ÜoZ"í·UKbvÏDoÒJyöç!qüÝSšÖõ^|¬ÖËʼW74ȾMÓdÍ%²Q“dO·m…”/=*•;¿(×¶‡ãÕæ—p¡ilè“…o?%ÑuÅÉêÔ2­ÃÂÉs¤\mNÌ‘åë6ËÞƒµÒ<æ&ùú¦{eº—÷g}ç˵׼,›9*ȽÚ~ù¤l«?(ÿøŒ¶Džýa¥¼îC2®ýWÚª”9”äO–…Å"?üYL¬†€!`Ãx<.™ªÎ2Ç©H´Pß™¨ØÞ ^’¨øTÆÇ3~at©ÖÑZñÕ¿þÈDÞ¥u¬Ö˵¾[ë8­WjÅÇìUZ¯Ö:YëµZ§i}ŸÖ÷kÕ_™©_½^¯õ£Z?¦u®Ö2­ŸÐz‹ÖOi½Uë§µÞ®õN­ŸÓúUŸ•aˆ@ÇkÏÅËŸýa|Õž‹Çßüm¼ôÙ½ñò&å³(u›Jã"%ñêc§â]ñ3õGãÇOµÆÛë·ª¼4~<æ;éjðÛGµ]·¥\ukãMôßu*¾J$^±³AûU©®*ޞй~\]ÝŒ[oMúhˆW¨ªÚ¤ÄÓ¸}|¾"ÞÐåwj@Å[ã Ç7”ÄK6OÄлÃÚø©XG¼]ë¹úí“báa›OWK]¼fw]átuœ‹×Ü_¢ñTéœ:â[‹%^YïG5Îc)¬ºÎÖxc?Ýg qÝôÇ·7pfþ=?ÅN\§âÛ7l7¾Ç αpãNÀåÿøH|ÆõJW¼f™Äå¡Ã‰5 ñšS>àÑóÀÚ÷…Ñ ÞúêÝ7ÖŠ»Ž|IæuèÙ´žŠ×lZ/×cøP+6ìóÖfÐ_¶ë»£k¤<Þ ߀ó@ý–WëhW*¿öȹø©Ç—yëÀ?:â5‹E×åQ†mÔ0 C`˜# Ÿ _ÕŠ½7öàØ‹cO޽9öèØ«cÏŽ½;öðØËcO½=öøØëcϽ?räÈ &kEŽ€\9räÈ%S ·@Ž\9rä ÈE“ 7ažÂ¼…yÌ;T‡šÌuôeÌ‹`lŸ(È/x,ºäMÙÔzL®•ƒz^|ñ œK½—âåß’­+/—Ås¦JA^ܺá_%¯çÛëzÚ.’i8í´t$¾éÏCãõv)ÙPîµhJîD™9O¤î¥×¼f6ºÔ}ɦß÷ÎrÏ>w²Ü¨— |“Ÿ±_/qºké’öõˆäå㺑(YÙáŽÜz™ª/ÀËÆ/ÑvœøMWV±åŽÕñ~¾Qòô§zyãåŽ uziÃ=³. ‡Ûoø«%|œ;›Â+÷êùRU\'ßÿq³þŒí)½û¶Vø·F|ú×Ãl©ƒYþ¹{ÍÝò¾÷DÅ‘ìšA¤•γX¹ò^\ŽpB^ñfQ)ó“·½¢æÑé#‰‘?no¾=ß%Ã:ìnk–³2In_ùuÑÜV:bM²oË2ÙyÿBÙ~"¦uü~¬ïüé7É2=:GOž–Ÿí^¶Ù£?ÅûWihþ¹ì—R)ÿÐ8ù]ósêŸO(ùòÁK•zgŽ'±?†€!`†ÀÅŽ€%NûÑñ_&w_3G7t"{ºßÔ=Ûd¹>Ë}Z[K—üþ—žÒoÚåLý>ùT“þ\í »ý}8¨]*®«þyò9&}ò^Zé×£tP(’ç{r$)¶nw“(µÊÙˆñR=”Ë`“6tv]¯7‰,«½3 ]šç4Éá'ÊÍïÉ“lb«ÿf…ÜñÐ{åxS«÷­ŒÞùµ­ŸáEsÛ4|Ä2VÊ¿¼L¶mß)ÿðíïHù–Ï¥Sš(­;ؘú ^g£l\µQönê-ÇAüýòü«)ÅR¢ß}Mö¾ªÂÆ?‘§jâŽ×mÓð%W¸³1êÝ÷g‹á;¼dZ‡uÛ&Êä?Ü™\_ù£'È-+½3ª²Ä·k$“_‘)ò™ûKäzŒ¾è¹é†›¤¬ø¨üýÿÞ&ËÿXfê ïš0MGñRgo´_8>“†€!`)–8]¤ÎÂN ðŽqòWïy×XWt•wO6lNn™!SÇ}Eêõ•ɧΒ^§½.»Äû jTÿis?£ Ì Y_]+±Î69²õ‹²Fïùä ÉËÃF|¥üãÉélk”Í_X©mÜ5Öâd6žCKäa}A§>ïr¤jÞûñï%{¶üãô¡h è´ù:mwÈ–ƒ§õ®Y·Ôý`̽y½Œ¾IåQ±9ñtu¾¬¿Úš$WHKã~ùÚŸïÑìñunËå·§ž“ýÿAQãhΚV&-üS½{±F–T‰Ü{›Þ~ ”k>ªw÷÷,–¿{ê´tw·Éª{dM•ÆÞ‡ëßå~EïQ.û_»¤¹³SšOì¹ÕɲOÎL&L4œ‡gîã­^0êÍ÷9$‘¤@2­Ã«>¦?œÓcøgú²“涘þ§9°u>…¦‰MSÁ”/—Ëäv¾s©ÔU­—ƒ‹?.“rÇʜŗ˶ ;eÙ’Rï¼›8ãz~0=ë’ßþJï®^å&ÉîhƆ€!`™?I/¾ùXÄ#q¿W"[_þ/¹~ôeYÏþ£yTÖ½AJÆ!mÑR¼Lïÿ¤ä¶>âÿÂÖ—&þú PᇗÊñgevÅlY¯&¡T>yJn¿§ÑR³ò¹£x¼'¯¸_¿ã?ô¼ÇçhRUìG¿Ó(7è‹ü‘õ.‡WÒOE·§NË'4žËÝ”èý.¹¿âEÉ®ðƒ‰ʦz‰Ÿnoe둽rÃõ#csã™VþWRz¹L,X¡–ȪûŒ +å['>'ÿí¶rYyçlùÅ–ãr`Eø8*ÜŸÄËyôlY¡yæž3«åúטýȽrxËiMîo©l¯Õ ŽJé=ãxìù¿Sÿøù²bã`ï Òþ”KÙK•:Åž´ôþÙ  ¡œÔ¦ƒc^ÈÕyè«Â|ä¾/£ zÔ‹SÉD”ïâÄrÈ+ÀO¸ÓKÆuxõ}R÷x§”ܹPvâ6“WJ¤êÉYþÁB‰ææë³Yßú#ò¥ÞË?dá,/¹¼®t‘vY>óß3-ùSoÔíÍ–#Í)·Žk’g‰Ìß2*+†€!`†À°@ Ae*úºc<0ÅB>Hyç r·BlSU±ëÎ}x‹<¶Ô§´X&ÎzXÎ&† c\‡úín”‡*vJUí×dÓÎ Y9ë[b©Ó€m. CÀ0 CÀ,qPÍe߸ô]å"—’¼d×NÙµz®ì‘r9Ür@–/˜#®'®ž"e‹¿"­Ç¶ŠÔ?(_¯9ì1LÏ8«H˜ß–#ß“²JÊ?\(ÓËÿBJdìiì˜Í‹!`†€!`†À€"`‰Ó€Â9rµœÜ/,š)999^½kí9–´ÈÞªÕI}Néryâd‹Hg£<\q—ÜÿýçE-‘9‹TÞ“îæC²¸ZdÕî*¹éŠž¸ŽýÈŸHÍ2‘m{މ?LLŽ|÷a)KŒŸ“³H6ÖÔJò×|gùF9râ€+“àgôLùòb‘%ßÿZV CÀ0 CÀ0†–8 ±r1†ÓýÂ^_¼P~8~©®¯“ÚìÔmX"S?¿+™Ôìª/å«6Iå㇥®þ°T]wTî(/»Î¼Kn¾ãF)(7|g­=*5›ÆËš;gË‚Ê#‰¾¯Ií¶52wÖ|ù[jäxCìÙR&›V-”{«õ®UþÄÐ8D<»&x"ýôÛùœ|oÈÒ×%âË——k&øÐODÓI+†€!`†€!`C œx<ž1$½ƒãR&`»ò`›2Шú΄4ÈãÅcè9xÚ)m> sü’ÚY$b'6˘Y+åéX\ÊFûƒ´|@Æ—•ãäýgvHÁŒ%Ru¬UîýÈØD1Ù±hŒ,]#;o—3ß]$36-”Žºåš‰ÔV•Éìï|FÚµ]ØKܧwIÁÔŲî@“|¥tBÒº±fµÌ¸s“ìkê’[ŠêdQÁlißpT¬™“´Ù¿*G¾T­1ü‘7nc ŽÎÆ^bÿöµòÙ~ø•¶#2³èAÙ; s˜ÅN>*cŠ¿/GY2Pc CÀ0 CÀÂhÊð5 ï—ZßÔúV‚‚Vü ˆ6äÙ¦-ûƒFU$1Ôg…Œ<©Š<[PÈP‚T4g Ì·üEraÅ8/òƼÛë¿zÅÃràÄii{µ[Æ•~]ººž’Yš={è{ª_% ¦åJÛ‹mÒÖÖ¢6yrÓ½ÃRý#9§§L×íž®~Dòì?}[{UÊ 'i‚›éŸ^.JúëV4#Üó¹ÙÏ?§ë³Uu/IGBŒ#›Øûã7væ„àžZê™.‘‰ï×眬†€!`†€!` E,qŠGå"‹)ÊÉ™#Û¥¤îA™?kªæINÉ]òx½ÿ£³K gêŒ6ÉŒ¢1R¤¯/*¯62uÑ6•ÿBþ3íY(òWÍž§/Ø'Ͻê·ÃþžÖ;Jek÷Ê;ß=QÕ¯ô4É,óç‰üàGÏ't¥rí¸àJBÚ3*òÿ'e{ßýJÞ¨žñ\&—÷”šÄ0 CÀ0 C` `‰Ó8}Ý2þ†»å±º¸t´ž“†cûdíµ;eñ¬‰ò„¾!âµ—~¡S\'g::¤=Öžª­MrêÔN™ø©š‹CÑÕÒæyâgÍ®ØáõeÕ›ä`C«úoÒ磮L»{ãž“_)ûð•É~]zw«/%ÛØûêWº^ïFç™:9¨R÷.T#†€!`†€!`¼-Xâô¶À>¼­ÿæ)ÈÛìý¦ü±ãdúGn‘¯?Q§¯vùõËreÉ Ê’:ò¥pta²6ýß{dêÔ¿}BîÕ¥²]E·¾lkë‰WË3[d‰¾\aí= dÊì[ôîÔJÙ—þ?‰Ø/ëµëõSÆ÷t¥¤?±gãºpüujö²ü—óÛÄ®n?™rDÙ¸2CÀ0 CÀ0 €€%Näá>ÄøÙ‹uŠ+e}õiéì”ÎW›eÿ77zwO®º¼@&Ü´TŸp:(s?þ€{¡MºõUãÁGeÆRý/M[n¼ÎÁ»Sß(ϾÐ"Þ]¡B¹û[‡õ¿8픊Êäѧj¥¹MŸzñ¬ø®¾xâ¦5"å[å.˜ ãn¬Êb‘ÅSÿLöŸlÖþröÄR>k…Úl—?˜‚×MdW‚qd{6žƒ~eÜ4Y¦O9ýä¹TVØ¡s¹E® ¹—Ífc†€!`†€!0xXâ4xØŽÏãn¼WoY%ë+æÊø‚)(œ( WÕIåîù#$-¹S䯛žÖDa½Ü0©Hòò dFÙ )¨F¶­˜åátÍüÏë‹6©~¼l®M$WÜ$»[dëÊ1²âæÙ2±HŸ§Ï--]/Ú÷Üîåâ¿£o‚Ü÷coñNYXý/Õ˜ì7GÈŒmš†€!`†€!`\œØË!.ÎãfQ†€!`†€!`†ÀDÀ§ ¶ e†€!`†€!`'–8]œÇÍ¢6 CÀ0 CÀ0 ˆ€%NlÊ0 CÀ0 CÀ0.N,qº8›Em†€!`†€!`Kœ. Ø6”!` mº»;¥»{hÇhц€!`†ÀÛƒ€%Noî6j&â­²ùô?KNÃ?ÊæWb™,Cu±“›%§d³ô½g¨;O˜Ùg§ìZ”#O´E;8/M6þ»¥þ©½RûbgFJï“yŽ}p;`¦éñõÏm´Ø‰’“³Qü£Ö-Ƕ.—¼¼ÉûÛc¡¢} 36ÓñM÷™KF7CP˜ËÙ`âÚ¤ã›S&]º¥µ CÀ0 h,qŠÆÆ4o oÉÞ3?’•o¼)•WΓ{¯°ïQt¡Ë(Éë{ÏÌ=ê£Õ±_GëBÓ»ÿn9xs¹üÓoú2Z Ï`áÖ—Òlñ¥é²mDû(˜¼Pjÿ¸x®4qzd›¬}ò”t|qvÀy´€aïÍäJ÷™Kïn†–Eú\¼Ø’óì¤Ù`’fÓÛú€˜ú?ëi†€!0°Äi8Åa4‡Îÿúw)×›&¥£gÉ}c{Išº›e×Ú»ô®AŽÖ™²ºj¿÷S}­l«\žÐ•ÉŽŸ¶$Qjþé.¹«}rdférÙÛèßsèlÜ%e»’wªº›¨Ýj©5Ù5Éœ=ø¨,Jø¸kíFÙ§›²ü¤Ög2ùƒnQŲyã/“5©]´ÝàW? 3½9#þÕr๓Õ%²R‡}pV,ÿ®ï§åDjže¥Þ½!ÖYß³O/¸eô—˜{ó3;’¸x±½àßË„ù"mGðX…ŧc„Åàc™½D¨Ò}îßeÏþCººÏÊÆEsd¥Â¶þL•µßk ‰HDQóAÇL:ÏqˆÏd,jÐÛÚð|$þ„áÝëº[þ¨ìýîºþÉáZ]‡Nû˜®õøE­(“‡6'Cn;±C×ìÃr:ùsȘ<±ªL¨9´iyf³ž‡;¤ÇšˆsÝÅÍû¦çýºÔyïžSÉ” ›£«7Þ0 CÀE K¦ªrœŠD õ‰š«õ’D¥ûG|‰{©ÖÑZ±û£õ]ZÇj½\뻵ŽÓz¥Ö Z¯ÒzµÖÉZ¯Õ:Mëû´¾_k±Ö™Zgi½^ëGµ~Lë\­eZ?¡õ­ŸÒz«ÖOk½]ëZ?§õ«:?+oÆ÷üzo\ž=ox«÷€ë¶”Ç5ÅŠï©??þd•ò_{¤5Þ^¿Õ㥼2~´¾.^}I\Š«â­ê²ëìOW²r{ühíáxÕbñ|Ue{-|TÅÛCûíÒøÑ˜êêSºŽS5žò‡jâ §ŽÇ«ÊáCâ[kÙÓwÙ_"Æâµñà ñ}›–y>*‹gòßáÅ!ñÊÝGã§Ç×ÍÓ±WÖÄëÔÄ+4†ŠMÕñ£ çâ]Mû<›öÄëjŸŽ¯-V»òíɹÅãñ†@ŸŒ¸õê/…méCÕñ:Åe«‡í²xãé ˜G«žñEÍ©¹>ÜU•<>]ç⇟¬Ž/~|üRv!qdXC×Wr õô™ŒEN‡µ‘Š+ï_ü4µVaŸ¾ŽëNϛʇã/»D»%â8÷c÷\9üž{ó¸îºâû–é:¼ÿiwñã›J“ç§Î*^£ë¦dÃÑ´ó1ò\wÎÙL¸¹1E­£ô³7-Dk†€!`döÜZ±÷Æ{qìɱ7Ç{uìÙ±wÇ{yìé±·Ç{}ìù±÷G€\9Ád­È+ g@r äÈ1k ç@î¹rä&ÌS˜·0y‡êP“¹ŽN3s^Ô«ã,áp@À€,qÊba™I Ž×ž‹—?ûÃøªÿ<¿ùÛxé³{ãåMÊgQê°á’’xõ±Sñޮ޸™ú£ñ㧘8•ÆkƒÒՀ͢Ÿù°µñ&_¥ÊSñUØ0ïlHKŽ ö7b¾wãU·ãVz‰˜ç¦«ÁKZªj‘š¥ŠÛÒtþv_ íuÈMåC‡ã™üwµÔÅkv×éöRCï8¯I&…ñ­šUÖwx}kã§bñv­çê·{X! L•ô>n|°IÇ sÎìϳØÁ¥ãT|û†íñnF‚…¹lÂŽ’»lætàXö>RsÇñpŒô±\»žqDÏ'ûõ•>ž €°µáÆ…÷/þÍWøº«9…DÄÙŽZ7}ÁØK×Y|ÉPë\Ï“r=×¶7økÔ bÏF6užMõ)]·Îñ‰>×SsÍ„[š/ïüͼ–›QCÀ0 ìÐü`Ø'NH‚¬oùï‘E—¼)›ZÉ¢ÓµrP¿øâø"¡÷R¼ü[²uåå²xÎT)ЇúoÝð¯’W„/^×ï,É4|ç ¥#ñ³ <4^o—’ åÞWhJîD™9O¤î¥×¼f6ºÔ}ɦß÷¾âðìs'Ëú‰ÿ£´l<ÀFH¥Ìº‚ö¹ò^|òƒòrÿ¹cõË•Ÿo”<ý©^^Áx¹cC~3Joûvy¥«#áp¢Òõ2µ°@Æh_¼DÛurì¹¶„$Ø'nÒ»?—¥.ùSäî5wË{ßÊ„y¦1ƒñ…ÇðoguNQÇ»Çé§±Á±\e@—i eÒ¹.3ƽ6ÒŽÖIÞ×àë«Èâûž?ßy¡Û‹qîÕ󥪸N¾ÿãfý âS²GÖÊ‚éø0U`S©MßfŸÚ¬“ߟ’n}®§üp.açÔ+®Yk9Í܆€!`†@Kœl)¼Í\&w_3GôgR²§ûM½¡:Y®÷2œÞÃjké’ßÿÒSzKµ]ÎÔï“O5­‘’/ìö}^%¬t©°®úçÉç˜DÚ¥åÞ륃Bé”<ß“#I±u»ëœD©UΆ—Ñv·ûåùWS>ß½i=Y.SQ”ÿúoVȽWŽ7µz·’¶èwø¿Nùð9«Sy½IdYèϤ££Kó©&9üäQùl1îh 7Ñ*›‡Š³õWw°Qy*Ö‘«6ÊsŠC$æ%bL¨üâÇÃmÓôŽ|–>è±4‡vŽšOÆõ:¨ƒ}R½6ðµ€[Âðþ•³¦`Ûsç{¿¯NùIµã±Rþåe²mûNù‡oGÊ·|.õ¥E2€±rÛÎ ÙVó„üŸêj)Ýòiï7Iµ2Ïõ¤a4n‰ïP<˨9†ŸIçÆ†€!`Þïú CàíEàãä¯Þó/†uEWõxÉBTp'·Ì©ã¾"õ/ŠLœ:K>xZ^v‰÷;Ò¨>Óæ~F7Ù+d}u­Ä:ÛäÈÖ/Ê5¾ç“3ôUÔØx­”<Ù"m²ù +µŸÌjq’ ÏÇ¡%ò°¾Ì¡³;&GªÖ轞/‡ÈèÏszP–ý¯]ÒÜÙ)Í'vÈ܇êdÙ'gÊtÄá¿«óe‘òIreQ´4î—¯ýùÍú^O&+¿=õœ´¼Ú)Óæ«mwÈ–ƒúÐ}n·Ôý`̽y½œóÆMÿÃ>éÒôV6þ®ù¨þ|yÏbù»§NëÿBj“U÷ÈšªÓ2õãј§Þb|Q1´„wK“ÒGšÐ9¦iòˆ}dZC™tîâôÙS¾6Ü4+ ï‚ü ë˜GÐÁ8€ë¤…*å{ÖÈ’*‘{oÓ[³!eÊ‚%RR½RëÔûná[8~"ÏuÇÆï›c5ǰs#$T†€!`Œdô—‹™‚²gœ²ÿq§Yž¯Ç·ž:?î?z‘•Ÿ®–£ñµóô¹ }n«ÅË⇛ºüg#ôe|ØÛö¡<ñÌSWüøÎµ©>Ú·òÉS‰ñZã5+õaö„¿ŠûW)ï÷ëÀsRIŸ]ñ£ßŽcû}ª/‡ˆëSPQþӪũñJï¯I<7í¿½aO¼ÔwÕý^•µ-ñ§³7/Ýr\çÓÓÇÖ#g¸v¥õñžIΑϿ¤p ι§¿Žøá-þK.|lJãÛkñ¼Z4潙͜úæ#Aú1m÷Ÿ§ <§æ[§ã”i>™téã¥ûtu™×F*~<{Žw¦u§Ï¥ãôvÔºé Æî\ˆß¾•z®¤½œÄøöx5^&2okòÙA×OÔ¹îÚt4à9¾òxØ9åÚEÍ1‘µ CÀ0ú†€~öUëç´Û—Cä($:¿è¢¯lÆ›&XÈ)ò¹[!¶)ªxùt| …ËãKW¶ÁÓ&Hióã—ÔÎÊ0E »3&úƒ¤Âüôç"2N·»Sï8uIÞèÂw¸:_IWnús¿ßñæùÐ×¶ŒNýÔ)ÄJÂüárŽù£QÒQ·\ru¼Ž°ñ"ýwKìUq"vøÏU>4Ú ó ‹µWY6þ6Á˜²éÛkj0P~²+“M¦82é2ùT]VkÃõ‘+ˆwغs»eäÏ#þž~[dcÎxùí“Mòx¯ÿ%Ûs½S¯ ]úB¥Œçð€Î±ÿs²ž†€!` 4eøšÎå—ZõÙ y+AÁ+~ÕOòlÓ–ýA£*’ê¼/µM™Û[¶ƒ7“(ó-C÷ZkCÜüBïý“} 27_ 5á +ù!ÉT˜x>B5iÂP]ú*‰úW4áÓ÷hêxÁgW<‘þs5öTø,æÙ'“"Q6QòLã…éÊO˜ï¾È2Å‘I×ÛÙ¬ ×GÄX¡ëÎí—‰ð™©K˜.¦ÿ¯ľŪZ%§ÊÎ/i‚ÿlÏõ|½&„ŸÝN”4GÇ£±†€!`ÃKœ†ù¶é M ‹ï–ºúŽð„ih†lQ] †ÓÚ(?Köí~Z¦Í+Éù] mCÀ0 C` °Äi 5†@6䎓âfch6#a´6rÇN—[ʧ¸Ch6 CÀžà9 +†€!`†€!`†€!`°Ä)8¦2 CÀ0 CÀ0 CXâdëÀ0 CÀ0 CÀ0 ^°Ä©€Lm†€!`†€!`†€%N¶ CÀ0 CÀ0 CÀèKœzÈÔ†€!`†€!`†€!`ØëÈm †@îΘ´ÆbÚ.‚±c¥pØ\!º¥¥¹YÞÌ)”+Þ3V†Í´’GÎCÀ0 CÀlìŽÓ`#lþ/1y´4G6žhËj¬XóYinëÎÊÖ3ê>-”äHNNT-“c/ÕJYÎ"©}5{·o‡eäÜÛåÑU‹$¯`ŒŒ7Qk‘ŒÉË‘»Öí’æ>@•íœ"ãÈÖA„]”ßÓÕKdüÄ¿‘%Šä‘,×IÄ&6 CÀ0 Š€}ñ:Büp›öë/g?£ç›,³«·J{Ýr)̦[çïäÙz‘òM{ä+sÇKWWz§7ÞÈ“ëò!k—€*Ýp´BçþâY4n®ì‘RÙúäQùƒ_#Ò“Æ#Õ2¿b±ìüÁ)9S÷™4€ñ‡Æ1þCýv7ÊC;¥ª¶]<Û&3f}KîŠß'c`ð´Tßò’Ì:Y–ñï4Ë×ÇÍ–5?¹FjŽ—ºúòµ¬N–Ü4Yv5½[n¾ãF)çΚ/ÿqKo¨“=[ÊdÓª…roõigbèÜc¿Q,ô'zŸõC¼|¹ýѸtí¸Sñþ7ÊÜ¥Ê ßÙ#GkJͦñãlYPy$Œ?·¾ÆÑû1è§ßÎçä{{Ò×%âË——k&øÐO4U¶b†€!`†@ˆÇã’©ª«§"ÑB}g¢â§~¨—$ê(¥Ø¿b‡y©ÖÑZñÉ­ïÒŠÇ poàÝZÇi½Rë­Wi½Zëd­×j¦õ}Z߯µXëL­³´^¯õ£Z?¦u®Ö2­ŸÐz‹ÖOi½Uë§µÞ®õN­ŸÓúUŸ•·ŽãñR)¥Q·¥4.Å[ãí«þ€.^òоx—cÖuv_¼D嫞<ï:[×ã_w É±ˆÇo©ðäUµ­ñŽSÛ=~OšÉ™¸n•㕪GiøN¹7n‡×Ò¡ü>UÇ|½/no/—¸,®‰w$b“âÒxé¼@-–xņ§ã]γõW¾åx"%±ÃŠ‘Îå¾”,~.^©²Ò-uYÇXºá¨Ó?ß·s¨Žs®Á¹ß䃴ž=§ªCñox|•'ßפG.U_ãȳ¾ú·Öõ“¾öÚë·j¼é²ž³5‰!`†€!`ôì¹{oìÁ±Çž{sìѱWÇž{wìá±—Çž{{ìñ±×Çž{äÈLÖŠ¹räÈ!K §@n¹räÈA‹ 'AnÂ<…y ó˜w¨5™ëè|3æEp`Å´kKoûXÚ«¢s¯ž'k4£ªlxYÎþîÿS‹µòùRœ7©2«â/¤ôÏwz‚üI·É¹¦r)šÐ-±¶˜Äb­òÇ~ ÛT[•èÒõFïE8£ž=ô=ý»JLË•¶Ûô«€.½»4FnZ¢éÖ¢ɹ­8oEJÊÉ={·¼ñ†×Lüùcyã’ËR?USi6þÁ=ŸÔ”%÷2åOæP¢´@ÆÍyùõ®ì}~n¶Ó_dâtï‘—?2Ä\ƒsO3î¥ñì?}[-*eEÿéŸ^.²I~úëV¹¥Èìž>Æ‘5f}ô;sBê4ê?ïC2îŠBMb²1gLâå=çðÚK¿Pá:9ÓqŸuëÝ&–®˜´´ŠLýŸžäõÞ·¡A8ÍÖ_Wwxÿ0é`øÄ8EWHÿ>(Oü¬Yfî$ùqèË ª7ÉA½ƒþÚ•Mzýú´»7¾Í9ùÕ!½÷¾wÏ_öD}™: Öü¤ ©gz鼟ü‹¾NÛ/]1lî·ÊwÜ$¼¤IåÍe’wEdnW–Ü ÚCòBG¾Ž.LÖ¦ÿ{Lú÷©—dùrˆ¬ýù!gõw0|bàÜ«KEŸå’õekä˜þJ1XZžÙ"Kܵ÷,)³oQüWʾô×JìÄ~Áý½ë§ŒvϺ=Xó+Æð²ü—›wûÉ”#Ê:N34 CÀ0 ‘‹€%N#÷Ø_¸™ç_ê=áWù¿wÊé¶Néîl‘ý•ËdÍ¡ž!ìYuƒ9]ò§/J}lðŽ©ÿ8Ý"ÝÝrú™ò Ýô£Œò#M¿ê‘Ïœ–XgLΞÜ/wMÔÌ@˾þÈ{õ¹w¢¾Qž}¡Et™pÓR}Âé Ìýørì…6ÏoãÁGe†¾Ý®|ËíÞ“ˆHêžÿé¥þD­ûé1§úíÓ¯¼é?ÙøKgÁàÎ@ù ÎÏQÞý­Ãú_œvÊ EeòèSµÒÜÖ¦Ïz•ß}@Æß¤Ø–o•ÿ¹`‚Œ»±ÂÃñÔ?“ý'›»N9{â )ŸµBm¶ËL þÐ0zrÁ8m~ã¦É2}Êé'Ï¥²ÂžQ½&⧉ÑQ›Æ0 CÀ0F2½þxj$ƒcs r§Ëƒªdb™¾Z¼j‰ïtÞ:Ù·{–,ürê§Tíš U?ùÇòí›o}Ç@¢”KMÃv™3Í rß¿—Wþp¶ÌŸŠ×=ø¥r÷Ó²tû|ùþ>¬øî¿•ÊýSõÕÞZúU;ËÓ±ÿ£?á[(Û´Ë]ó?¯/X,7LÒ×k•û>2Eþºéiyí–ù*K=UþPl[1Kß‚^ë=Wµié|}*¼TÆ¿%·w°ÄÓ@nAræ'®T_Jñn}9LV>Çôðé½dƹ«wM¹+°WÜ$»[äÑu÷ËŠ›g‹¦AÉR¡ü탷{¯¬ñðÿ±þlrE‰,,Þ™´)Y¶UÎ|ónçÙ³þÄ‘ fýñ;I>±X“í}'õ8ߤ1wÊ¿èÿu’û÷9k,9c CÀ0 CÀˆD ¯ÝËTôiæ8zòAÊ;W»ò`›2ШŠ×Bç¾.<’=êÀS¤´ù€ÎñKjgePè–æÎJGäïžreÜ”Iþ¦º[Ÿj‰iÆPè={”Ž&'eÿCþ¦ã€ÌÊïÔ;íúÖ»<)ºblè‹ bm-Ó»E…cÇIaHú}‡ê UŸý‰½¨~5+3NÆŽqœtïö‡Ã'gÒ­wéZc1}Ž,W 3`שø¶*ÀcЧ>Ì2О_ìÄf3ëgÒÐõ˜L‘™EsåËg»äö«Ïÿøf˜†© CÀ0 …€¦ _Ó ÿR+~†óV‚‚VFòrfÊÆ=!¶}¥Ç˜W_} ûîfÙµv‘䌑¢¢"S'3+6Jã«ç;·tœûçm |ôodëe†€!ðö#`‰ÓÛ ,‚4Þ’½g~$+ßxS*¯œ'÷þ^aš6«þ—®Œ’¼¬Œû`Tmûu´nèjºåàÍåòO¿ID8X¸õ€@|ýòí£`òB©yüãRàùÕÄé‘m²öÉSÒñÅÙ‘ºåHå)ù+‘º¦sÒôí¿•íû[¥©á¯¤zÑ ¹ë»FÀSx3=Æô¸Â{ _i›ì¸}¢,Þ0^öÔŸ‘öŽvÅù°|ªnÌ(Ü(Íç5ñtœûçj |ôodëe†€!ðö#÷ÿ+dd$9Z%ù e¹[!¶)ªïLè@ƒ<þi/úAž6AJ›|ñ‹_üçùŽw¼CÞzë-í¦éÔ '%l` Ý›o¾ Q²@Æ>‚gA¿w¾óÉ>ð¿¨ôöqÇÚ‚¢ÀýP}@OìÊ8Ú”ÑgÐŽ1ÂnnnrØ¡õh3^ðð뎃þÁžvnœ”±|PŠê– ŽðÍc1X\:Ø£¢ÐwPïö%{ÆêŽ 9 ýÒ'Ç€ý‚qÃcÃÖ¿;úÓÖõ͹Úñ·ãÏ5„õÁuÇ5ƒõC×Ú”qMíà:;ÿS˜ºç%¯9À …˜Oâ úÙùo×®ž[X+¸Ø1méãs\úGŒ ŸyyyòÆox&Ñ(JWW—?Ç£>O2ÈYáö2ö…?ÄIŸÐƒÇ¸(œ xôAýAyòrîÁ†1cLÚBÝ믿.ùùùOŸ³°?û¢?ÆÄ¶8œ Æe< (œ#°¤2Œ_´¥Œcƒ¢¢` ر;þ\[X£vþûçΞ'vþû_,ñzå^Ox­ñ..ÎõØ7¬)»þû8àÈ#vØrlö…xb _Ô¡?xô…<çÏqц¶B†qÑmêárØAG“2ÆCŸnŒèà {öµãï7`ÆcîòvüSßbý;ÿý/Kx¾y'“þA›·óß®ÿ¸Öb-Øõ?õ+àë?ƒ@qí…œŸeü,´Ï'ûü¿8÷Þ"æFDâÄ Ž%“wÃ9.`(¼¸Ç†€r\ܸ)@_PØ£r ÷Cö(Á¾PáöôÍ1au> ‡dž^`Ñ>Ñ<+} o¤à}7üCߌ8A9 äô6çþP`ž}°Ù9 tè‡8蔕1yÆ {ðs®ð8pŠñ@à†‚1¡ã|xl ³ãoÇëkëÂ]›Xlƒ‡×6ÖÖ×ô<Їk zôAö(ÁrTø…ž¾9&ìÙ”cÂڰØ(ðÁsýè}À³ÒÚvþÛùu„Š5ÃuËõÄë%ävý·óë× \GxmA›×>ðXO(°Ï>öù?2¯ÿÞbæü¯á‡ù$ùm1Nlð8éq‚ã§c(Á l`Ë7&ü0¡>PÑŸ|GG‡çßýâxìÇ‹( Æ‚ .8ðà (ûÒ?ڨܘ±}1VøtÇO|aÓÅq1_7Èaƒ‚P!C77Ú²/( 0C?úCÜðb¢΃ýÐfa7Žƒy@Nÿì}Úñ÷?ôìøÛùÏsÅλþãZ‰k¤]ÿS¿h À×K^7íóß>ÿÝu=*ö1ämÿçïû¸w®tD$N¸àq#ŽEŽ‚€<.ŒØH`ƒ;ð¸£Á“ýQð=ä8QH!G… >@Q@±Qá7½ðà 7öð‡¾Ð• ãƒ-ä,ðË1ж¡íVÄÅ ?©;6ú¡Â}m9È8&°àt¨(£/íá—ñ`È¡‡ ¶¨Ä 2âè9Kø£Œ…±Q` èÏ1ÀKŒÁØíøûw$xL1µãŸº£‰u\ìü·óß®ÿþ5ƒ×PœàQìúoŸÿø ±Ï`ÿÁ} ÷28Oxýæ>Üˈø©7Ó8Ù™€àƒj,nwC=NÚƒ¢¢`ÃŽ>n„þÜô£?l)o! GE_TØC b„OÈ G!…-*Ûð07¾àq‚Â:|ÀAÏ9æÆqЦ-ìè?H郶¾¿;7Úà °FÜè(Úˆ™›Töô…È©ƒöðGß hÃ>AᕱÙñ÷ƒ‡‰ÿ|³óßÿ`Çy‚‚óçΡ åùG[;ÿíú5c×ÿ³–Ÿ=Äçeàíóß>ÿ±AåÞ„×YwÂ}dУbñº 9ü ÕýâîåbOœð©ïò§)Ê=ÊoF° qA㦠]ÀcqBŽ…Ëd mèÉÃP û¡ äìË8Ùzôç<ØmT´¡‡P`A[RèÈÃ/ cÞ˜7åˆ)h9Á7bCE›xÁ} t(Œ rÈìø§0ç1´ãŸz[$לÿþuÊλþóú`×ÿÔç'Î |¦ â3× ûü·Ïœ+î…këkmØ]¬û? ?mÿíM(ýõéÒ‹¨5”'·ž^À´#EÚ‘¦yÁ‹ ‹’ Öë¬:.f^ìÐfáæ>P©ãBg_ê°‚DãQG}@‡=7íuvvz2È«|²Í¹ Í1Áó‚ =Ç‚}9x|{Œ :^Ž‹=lÐ:ôƒPöO9lGåÅŸŒýÑã ×'x$A ýÆ€OTŒ9mІ6Ñca Ìà ý]{â‚þС/cäxðÅ9{Jýƒ~}À³ü°/uvüíøsm¹ëë2òX‹\KvþÛùkÖ„]ÿíúk*>cÜÏ \?ØægÚ¼æ€Ç:B?èy­}y½oŸÿþÞ‹Ÿáöùþû?o¥ÿᾜ”Zæïß) ÚQG{¶ß6:'‚”ÊTz €h×g°¸Qå¦' *.2(Ôç”dƒGá‡z\ ¨£_ØÁ§KaËtl£?âB ?(H,d@:Êà‹þpD<¨(£Æaœàiç&. sBð v‡qPŽ8!G&+Ðc×ü`Ž»<Ûð9 }r<ʉú P6xèQxâˆ8;΃zöEØ¡Pz´A?°@bÇߎ?×5(×6ÖÖ×(Ö )l±Þ@!cý¹nÁ£ÒÖ®ÿþ5XžÃÄÖλþc-ð<²ë¿}þÛçÿÛ³ÿÃuº%jïoüR£ìR€K=38ƒ'íŽ@˜ÌíÓ/ÞÝøâƒ—›ePèPqÁE››fȰ±A蹩ŒzøD›zúá‡<‚†?öA›!lÀ!C¤mŽþŒ—¾Ø® ñ±}¢qaü3èÐrÚÚ@‡ù¡/ä°aóCA Ã*ä°'E?´Ñ2؃‡=.l°Auý‘‡ 㥌mŒíÎ>9tà1xôA Æ>С"´Ý>ôÆbÜÄ“z¶©§ÈY7ú Øñ·ãÏsëÁÎÿÔõx༵óß®ÿ¼nrM°m×ûü·ÏÏ ìWPxýäþ„{;è¡Cð´Çˆ6Ðq¿9lØÆþç }ÁäîžÇ3˜?ayA˜ÌÍÁ• ?˜wœxjç˜ :Jž²èç¾GÅ…w¸áÅÁFÁÁÇG‹ ‚‹ j.ÚP‡…B_äá<#úc|¶]ŠÍ3Ú”á@Ac 0Fððß ö Áã"e_Îó€=lч'í  ;Ä~Î (•2ôaìc Úa,Ä =ü` öE?ð(èÃqòâw¾6ÑŽs†_èè6ð‹xö±ãoÇkëk…km;ÿíüÇõ ׬ ^;Ý5B¯UÐ‘çµ 2ô·ë¿ÿå›]ÿýk ÖÖ‡}þû{~nžGÀ×jûü÷?£€ ®%À˜ ÕýŸ†Úcža(þÅÑçâo”¿(ùy™ÚŸ·«¤‚–$˜óûÓ?)Ü»|p\/kÂBÃ7ìÜ4јtüÐå" ,ZÚyƒ&>á•2|°ÒÈP`DZ1 Nž  Ð#VôEa_Pôa…/ØP~8™ CÌ(°Åˆc ~´i‹6ç {ððË9Øq ÊØ~P``‹Šq!ã@a‡8 ã±€/øáŒ öH~ ã†–óÀ8èK 9q  ú1&øâ˜n¬žÇã…ŽMžcr\PøF¥Œóf;þ©D;þvþÛùï_' ¯W¸†€Ç5Ë®ÿvýÇg ?×@±fX±^`C=?;ù™…¾°µÏÿ3Ú>ÿý_= öþO—§ 0½¸ûtò¤°ô7té}úÒ ëïúŒ¶8 tàœ4ý’fœ”*Ý~­Ÿþô§¿Š‹‹{‡‹\Xøa=dÜlcãË‹7|zôƒ6¨¡¢? }B‡}q1ƒã²@9|"1 äHÀ³À†cº2ŒƒÊ@é…ãºÃû`¨”wy8&æ…J[Ê] 6ˆóÁ\9ξ¡cAô ¾ÁSÊ~Áxq÷¾P1úÒ(*ú2^P;þ©Žñ>À’ÇÓŽ¿Ÿ˜`…5 ŠœÀC¼ˆäX¿(°'žvþ§®{Àç& °³óß®ÿ¼vÛõß>ÿyMµÏÿJ‰Ï~æðÚ‰6>gPùŠŠó ×\àx!ö·ÞzëWuÈV­îaôVü`ûÞ/è—ã†Éƒ²~·*qâ¤ûˆvt}DM>èŸvAêÚ½¢v= _ÇbÂ"Ã] ÞÁàÆ § 7’Xœ,\”A =ìQÑ‹”w~(w7÷°ç&‹-.rê°È+ŠÚö°B›ã¢/ÚŒöˆƒý`‡ov ƒà€øá›}#Ú.[Ü¢G`?ŒŸn,ŒÃú"ŒáÎÛŽêv?ñ~vüíüçylç¿Íp¯½¸…U\§p¡âú íúo׬® ûü·Ï^p½À~ûTîqÀCÇë/Úî5m¬+صý_yyù×5¼v­Øs»%¸?gÛµ ãƒvhŸo’ã°°ˆô`»Ï)‘£® <*VyPd®œzPVØ€w)ûá÷gà©sÛ”SGli¿‰Zƒã°ŒrÆäèª=¿ Ð³¸Ø?JïÚº|_íݾr¾‰Sš³,¶¯ ûàd©#el»”ÉÇwu.Ïq˜4‘Ò·QCÀ0 CÀ0 C`¨"€}- y—ºû^—gÒDêêÂxŒ9J”>kž…¾Ñvyê/8íoâ„à™€d šv¤Q¶a`DÉ g…?ò.å8®,Ègê [&MlûRûk†€!`†€!` MÜ}+y—‚ª}MšÂü•lu´'E¿¾ö!í­¶vi~ú›8¥99F0h´Y]·”1YcÅmgËóTОþ<Çú ˆãRfÔ0 CÀ0 CÀŠpŒØÈ»4¸÷eÛMš\žú󥌇~ˆÛ ,a2è\Ú^0:X‰&•)Ùê ŽÛ‡2P”`Û•¹|ÐÎm»<Ÿ_råðExè{+°a2F[w>”5 CÀ0 CÀ0 wßêòíÁ¬Qc¸rð(n¾$%cÛµ ÊÜvÎ;¨ïW»¯‰‚8Ÿd ¬˜Ì ô¨,lSÆ6ôä3Q$EœCÐŽ:&T“‰ìÑ—zðôJ½²V CÀ0 CÀ0 Žö£,ä] Þ­°Å^ו“¹6½éi ÿaЦŒmPê\ž²Þ(ú¸‰í)s}‚GáÂÀ<4¡Í„IY+†€!`†€!`†À@{[ò.åÞ”{\òèçê)ÏF´ k»þÁ£Ð.Œ§ ŵõ%¾Œ:Ê…d℉“‰0'´å ˆ«‡ …º(žú(Êä(¨wåôÍäq Yb2èg†2ðV CÀ0 CÀ0 ÁFû\ò.Ïý,øl*ìÃì‚ò`;¬d(Ôù­ô¿a:öcßô~˵¡>LF]Ÿè@%N(›$vA[¶ƒ:¶1!òaã†É!ÃÁ‹ÒCÇŸÞÑò`²?n…­kƒñ wK˜ÌÕo†€!`†€!` Ø{ºÅÝïBÎý1h¦Š~¨® eA¹k“‰Wwiþ‚¶®< müVúß(äÁ& ÚôÚ¨Ä)l L$\;WäÙEEq©ËSGÛ(ŠƒŒx Ïd‰ö”©*iÃD),A¢/Αþ؆Ú€·b†€!`†€!` 6ØÛ²Ç>…û^RWÊ]&we.ïö ò‹z—§½+ó-ü¸ÂxÊ.ˆÄ “t“…`àò0;ö'XA› ~hK”á¢0qA›‰M÷ =|¢¸ÉúÀ+ô(Œ<¨¿ë:+†€!`†€!`†À`"À}0Æà¾6ŒBUá•z¶ƒ2Wïò®åAªî“þɃ¢À…}È{ÂÀÚ°O@lö¦OF1½&Nq-9Z¢„ÈT&{WOž”îÐvk”œ6|âÀE%M®œcÀú €G¥Û.… ÆEŽ…2¶†€!`†€!`ƒ‰€»ÿ ã! VÄã&;A>Øfÿ(9õ¤ðO>Œõh»}PHƒ¼§ üqmªô&òtIx«×Ä Ýú‘<…–’28$à™lPF! «8`ô½Ûã!CA2ÆÃuà)Æ œTEI;èY؇m£†€!`†€!`†À`"àîE9e Á Ȱ/vul»4Šg?ê]”‘Ò–”ã©«ÓAvAKV‰SDD˜L01pe}áa‹êòðO™Ka ðy'ÈÕ‘‡ýAQ˜ ±ûõœìPàrêÈ“RêÚ»2ã CÀ0 CÀ0 ÁB€{W×?eÜ'“†<÷ÄhƒGuul»ºL2öU7I?ô”…ÙÒ&Œº²ÞxøvK°íê2•Æ Ž&IDATòç“8#ˆ°DÁ•»|TÚ€¢€ù°6d8xˆ”‰ÚAŠ’zÚQFßh£/ý‘§?·M[P·ÀÆŠ!`†€!`†€!p¡p÷²“2PVèÈ)“#؇M§Œý¡welSF1åäÃ(dÁ‚~,.OÙ€ÒLœÜÀ¸›`@G™Ës‚¤Ô‘f’Ó?lpP˜È‡œ:øc‚D ›  >Pè3Hƒ:¶AÝBÿ®ÌxCÀ0 CÀ0 C`°p÷σ2îÃÚ®ÎMxȃº<ìݶËS‡ñÉÓ?elƒelû߇+cWæò®ž>ΛVâ Á“Ê\Š~°ãd]]GˆöäUäÉAQ ‡Î-Œ%˜0Á:êIa”³MôEqÛ.ïkí¯!`†€!`†€!0xp\žmÈX]÷ËЧ y—y·Õ?(G…ã¸|”Ž6 (®/Ä¿ýIœ`ö%ÅÔÈ»4È£Uq ôàßéðCÆ)ØVUr.œ(ù žrÚ°´CÅÕûûk†€!`†€!` س'…<«ÛfòyØ‘ï+òñ£(úQGÞ¥AíþŒÑ§ÒŸÄ)ÓÀMÜ6ù …¿  mаŠÇq g›<%ÈY`Ï û‡QÊ\;òôA›( {+†€!`†€!`†ÀÛ…öÆ(a2VØ01ryè)Ï†ÒÆíäÃÚ±b|ð(A&£«âê|Éyü=ßÄ Á0qèOœ |§O· ßh»2ôC’9Ú,Œ‰6 î]'ØÑ&ŒBŸ AÞµ§^Í’þÀ³Ð–m£†€!`†€!`†À`"Àý²;e ¬Ð“£Ü[ƒBEÃt”¡ûq ¶U•ßåa—©P÷JèÇ5 “¹úŒüù&NtŽ ˜$£ ¶Ažýá:·?m)wm àO¶Ý»N®oòQ¾Ñú° =åäÃ(dV CÀ0 CÀ0 · wÜ6ø°6åØ_£0ÑÉD©C_—w}‘ÏD1õàY Cquä]m:R—ÊÐv«kKÿÁ>£POêKý¿®ÌµwûÑžz¶„dâ„Ý$#*À ÛfW4Xº[ü@†8Üļ«ƒ&JäIU•ÔÑlQ\¿.OKÁ³ÐÛF CÀ0 CÀ0 BûذB9)lÀ³íòÜWSÆ6(d¤AÞmÆv.¥œ2ŽFÕE2Fê) £…ôE RWædû'ëÄ)®%GKÂ1ãƒãÒ.HÃì(ƒ_Ø£¢¸})è(üÉåì=ãƒy$@ôG9Çsu´Žzú Ìíž…vh»<õF CÀ0 CÀ0 ÁB€ûaøwy¶) ò”©›ð¸<|¢M™Ë}p¬0ø Úeh }iÐ.²'RPd8úõÖDÁ¤²¨à`õ®=eš~!C ( Û´ƒœ<ú@ò¦VÈÑåxà)WÖã)Ea›¼KÁ³Ðžm£†€!`†€!`†À`"À}³;e. òhS†½5Û.¥¾!gÛ¥ä©G›2Rú ¶é—zÐ0õÔùV©¿ì—’ 7Љ‚d²àòQ¡ÒÔåáƒ2ô¨Lx GŒvlƒ¢Ð6(´ƒý™,AL `K{PÊH) £±°?ÛF CÀ0 CÀ0 ÁD€{ew ÊÂ(d¬èCÞ¥Lp\=e¤°òhS¤aþ)ã8¤“O°‘„¶ÙÚG: *:q úgÀH 0 RÚ±¤œ0©ë 3ñL” ƒOÈ‘Ñ^Ùd Ôƒ¢0B;¬Â†ròa2úfÛ¨!`†€!`†€!0˜¸ûgŽC™K]vhGUWψ¶ls_î¶É»¶ôE{ê@ƒö´ Rö ÊÑ´r>‰Î61 mº#ðI;€Ç¤‡à¢Æ£Ÿ«£ÊÜ6x¶ÉƒÂc£¸rð(”‘wikCfÅ0 CÀ0 CÀ,¸—¥·MÞ¥AmÊà#˜ÌP ÷ålSÏ~aÔ•¹ýÑÅ¥ä}ÿ—² um¢xö‰ÒGÊÏ'qr"&”3¨ <¨gvì@d"ãò´Œ¾©' »Ë[ŽAc°Mß¡° = íÈ»< mýVÏ6åF CÀ0 CÀ0 D€{WúŒjSêòn?ì«Qh ™ÛòÔ³/(eìï¶!C¡Ìåé2ò¤¡°¿ßJÙuA;Ú÷‰TâäŠÀ‚ÉônÀгMž¶äiyËĆ Ú£ h° YX…ß œ2U%uäAQÐ…ÔoõlSnÔ0 CÀ0 CÀ¸pÿÌ1Ù&…œüíËõà¶O‰œ;¯$GÎÄ!ŒçÄhÃ> AÏ~.uyØ¢\&LAzèоQ!sŸ]B›:Rõ…éhF]x+†€!`†€!`†ÀPA€{dÄC>Œº2ðÁÊþ®ÜM€ wÛ}åƒãs<Ò0=t(Œ‰¼'LÈÃxʲ¦}Jœ²öÚÓA2Vu°s#ÊA]y‡$F3ñ¡LEI0© £°ƒ¾PhG>Œº2ð,ôŶQCÀ0 CÀ0 C`0î­1–+#F)Ã~…mÐL•¶è´ Êܶ˻ý Gqeà£J&]TŸ>Ë"qB L\žÁ¸2ò (èGÞ$þDÉ¡LjÀÃmúqÛô”«È“Q¤¸SÅâê C›Åå! ¶igÔ0 CÀ0 CÀ¸pÌ1Ù&…¦§† Nƒ›èÂ,T’qõ•w­s²Z9”tñRt­›–|–¬ýÓ±÷Ëfo×ÙÖ|îËš¬“ïUk¬Ë®å²€ @Gð÷½]¯™œkªu?陳¯|Í¥æºZ“qÖÛ—ÕªuÖ–ä5o¿æ}ÏO›Ô`×Gõ–_Ÿ×[nòó±¥eÞ¾íÒöÚNZÕS«¾÷zOZû×ÖK_kÕºÆýÒ:ç=£Ø:€ @¯$à¡ÅwÅUW½µ´ök¾êŽÓVß±{9¶µžvͯ9ÅËzùà¤[Lü®ÓR¶Üøû‘ƒ‡}Û¬·–V~Æ£z׌òÒµ\g›Zõ{e½µ´[ù¬Å‡ @€À^9pt½FùÔ;M«9ÇkV¹µ¼ï^k¤[«~Ýãx×ï6¹ÉÕso½Pk±s¶êa_ÖKý;ï\µÎçTcÝ6÷IóÊ}#ßõ™÷~YçSÇ @€À³ ÔïK×â™\ÖØ—µ¯÷³Ÿ6}×Xs,«eÝ6µ¥ ydm“~\:spên¥É!#ã|I×tyå²¶;GšëÜÃ6ëÝÇçy_ÖÈwõ¬·&;Ò³€ @Ï P¿‡Í3grY“¾ú8®v-§Z×»®ÆÒµj­µ%y}äÞÔOñwÿŽ“o5ø¸žÒÝ0Qµ.N­ó«æØÖgglMVË9Û‹zyVm+νø€ @xWuàØŠõ®©6ßQ9çëž‘žuîUûŒj\o›gX;äczjvØà´4ëÿPÄ’Ò£¬­AÄy[m¯~ÆÎ[³õ±Žm­{_Úêgmú]¯{òY‹@€ ½Úá!šnåUš5öm£Õ­®æËÚϾ6ʧ._+÷_”^;lhÒ!‡NKÃ}ÃÓÒBëò`b+9}Çæ\ZùZYŸþ%{y¦žþ¨&u|@€ ¼#™¡£«Ñ»¤ž~æ¬Ûv¹Ôäk¹Þ6µ¥àúȼõN;thÒAÏœ–óüva»¡¤jŽm»^ÎÙúǶÝÞªe­ûT;SS÷C€ @àÕÚA£\*kÒw™5[éég<ÒgkT§UûŒ´Kñ×ß_œƒ‡Nº×Êï;-éÁÝë 2ŠGºÛf>ýzöZνêž=kð!@€ ðnFÅŒž5éûSK_ùQ<Ò»žÖº~·ÜÞÿ³éÖ(œS'õ?hxZZÅ}3ž|²&ýlYõ­8÷®ùµÏZ-9@€ E "³}ë¾­Ø}³.}åkœZÍÕ8kåçêj—üC“Ÿ68-ÍǿﴤõhV7p¬ik¹Ú>kÓ¯uŠGù‘~O® € @{ Цñ¨v¤»EæÓw^¶Ó­ÙÎÖgݨ÷RsÖФæ§NËëÃÓR¢G³ºeKÛÊ7Çüºݾª=º¯ö!† @€À‘ºAe¦ÝWãì1Ê¥ž¾÷ÎjªïjÝçð?qk|uNœtÎÆÇö–’ë}:Ó $VûŒjj]wæVÍZïQ?t@€ ¼ µ!d-çû¯Õd.}ï•íôNóžµÜéC“.ñ”Ái9hû'OK™ƒ5VfõQ]7S“õD®/ @€î!°:lL6šéQkjì£îÕµo´Ç=Ÿ24é°§ NËasÃÓRªÇ`“‘î6]¾Ó\¿fÝ·Ö“ @€žE`s \¤Û×iÞ~FνŸ64éÀ§N~Éî-wsýÀn /[y·]«[Ëy?€ @ŸBàÑA'ß­‡êÖòk¹ÛgþˆÛ!ÅyÉà¤;LO¾îÖ³•Ÿíãºjgû×}Ä€ @ø ¦–æEf÷mÕmå—£_10ù_68Ý.0ÿñ=m™`fën×°ƒ… @€~˜lb×lýlÝS?–ïqs_>8ù&wþJÛîŽî©õ•FöÈ^£3Ð!@€ p&éeâ÷öš®åO˜ê{¿Íà”;yˆÊ£ì3 ™€ @¿ L;¿·.Ê]ûßi`òû¼åàäËÉ>0DyûÙÃÐÙýýX@€ Ià®!æƒêÿŽÃR¾ûÛN?.{ßïCåÖê3ôT"Ä€ @˜'ðÐpTÛ¿û°”÷ýSƒÓ‹7DeÛÎgÈꨠA€ |C¡- iPªïòg§ú"Šw|¬¯k‡@€  // The index.js file for component var Opentip = require("./lib/opentip.js"); var Adapter = require("./lib/adapter-component.js"); // Add the adapter to the list Opentip.addAdapter(new Adapter()); // Exposing the Opentip class module.exports = Opentip;opentip-2.4.6/lib/000077500000000000000000000000001213277401600137525ustar00rootroot00000000000000opentip-2.4.6/lib/adapter-component.js000066400000000000000000000104021213277401600177250ustar00rootroot00000000000000var $, Adapter, _ref, __slice = [].slice; $ = (_ref = window.jQuery) != null ? _ref : require("jquery"); module.exports = Adapter = (function() { function Adapter() {} Adapter.prototype.name = "component"; Adapter.prototype.domReady = function(callback) { return $(callback); }; Adapter.prototype.create = function(html) { return $(html); }; Adapter.prototype.wrap = function(element) { element = $(element); if (element.length > 1) { throw new Error("Multiple elements provided."); } return element; }; Adapter.prototype.unwrap = function(element) { return $(element)[0]; }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function() { var args, element, _ref1; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref1 = $(element)).attr.apply(_ref1, args); }; Adapter.prototype.data = function() { var args, element, _ref1; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref1 = $(element)).data.apply(_ref1, args); }; Adapter.prototype.find = function(element, selector) { return $(element).find(selector)[0]; }; Adapter.prototype.findAll = function(element, selector) { return $(element).find(selector); }; Adapter.prototype.update = function(element, content, escape) { element = $(element); if (escape) { return element.text(content); } else { return element.html(content); } }; Adapter.prototype.append = function(element, child) { return $(element).append(child); }; Adapter.prototype.remove = function(element) { return $(element).remove(); }; Adapter.prototype.addClass = function(element, className) { return $(element).addClass(className); }; Adapter.prototype.removeClass = function(element, className) { return $(element).removeClass(className); }; Adapter.prototype.css = function(element, properties) { return $(element).css(properties); }; Adapter.prototype.dimensions = function(element) { return { width: $(element).outerWidth(), height: $(element).outerHeight() }; }; Adapter.prototype.scrollOffset = function() { return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; }; Adapter.prototype.viewportDimensions = function() { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; }; Adapter.prototype.mousePosition = function(e) { if (e == null) { return null; } return { x: e.pageX, y: e.pageY }; }; Adapter.prototype.offset = function(element) { var offset; offset = $(element).offset(); return { left: offset.left, top: offset.top }; }; Adapter.prototype.observe = function(element, eventName, observer) { return $(element).bind(eventName, observer); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return $(element).unbind(eventName, observer); }; Adapter.prototype.ajax = function(options) { var _ref1, _ref2; if (options.url == null) { throw new Error("No url provided"); } return $.ajax({ url: options.url, type: (_ref1 = (_ref2 = options.method) != null ? _ref2.toUpperCase() : void 0) != null ? _ref1 : "GET" }).done(function(content) { return typeof options.onSuccess === "function" ? options.onSuccess(content) : void 0; }).fail(function(request) { return typeof options.onError === "function" ? options.onError("Server responded with status " + request.status) : void 0; }).always(function() { return typeof options.onComplete === "function" ? options.onComplete() : void 0; }); }; Adapter.prototype.clone = function(object) { return $.extend({}, object); }; Adapter.prototype.extend = function() { var sources, target; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return $.extend.apply($, [target].concat(__slice.call(sources))); }; return Adapter; })(); opentip-2.4.6/lib/adapter-ender.js000066400000000000000000000127571213277401600170370ustar00rootroot00000000000000var __slice = [].slice, __hasProp = {}.hasOwnProperty; (function($) { var Adapter, bean, reqwest; bean = require("bean"); reqwest = require("reqwest"); $.ender({ opentip: function(content, title, options) { return new Opentip(this, content, title, options); } }, true); Adapter = (function() { function Adapter() {} Adapter.prototype.name = "ender"; Adapter.prototype.domReady = function(callback) { return $.domReady(callback); }; Adapter.prototype.create = function(html) { return $(html); }; Adapter.prototype.wrap = function(element) { element = $(element); if (element.length > 1) { throw new Error("Multiple elements provided."); } return element; }; Adapter.prototype.unwrap = function(element) { return $(element).get(0); }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref = $(element)).attr.apply(_ref, args); }; Adapter.prototype.data = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref = $(element)).data.apply(_ref, args); }; Adapter.prototype.find = function(element, selector) { return $(element).find(selector)[0]; }; Adapter.prototype.findAll = function(element, selector) { return $(element).find(selector); }; Adapter.prototype.update = function(element, content, escape) { element = $(element); if (escape) { return element.text(content); } else { return element.html(content); } }; Adapter.prototype.append = function(element, child) { return $(element).append(child); }; Adapter.prototype.remove = function(element) { return $(element).remove(); }; Adapter.prototype.addClass = function(element, className) { return $(element).addClass(className); }; Adapter.prototype.removeClass = function(element, className) { return $(element).removeClass(className); }; Adapter.prototype.css = function(element, properties) { return $(element).css(properties); }; Adapter.prototype.dimensions = function(element) { return $(element).dim(); }; Adapter.prototype.scrollOffset = function() { return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; }; Adapter.prototype.viewportDimensions = function() { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; }; Adapter.prototype.mousePosition = function(e) { var pos; pos = { x: 0, y: 0 }; if (e == null) { e = window.event; } if (e == null) { return; } if (e.pageX || e.pageY) { pos.x = e.pageX; pos.y = e.pageY; } else if (e.clientX || e.clientY) { pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; } return pos; }; Adapter.prototype.offset = function(element) { var offset; offset = $(element).offset(); return { top: offset.top, left: offset.left }; }; Adapter.prototype.observe = function(element, eventName, observer) { return $(element).on(eventName, observer); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return $(element).unbind(eventName, observer); }; Adapter.prototype.ajax = function(options) { var _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } return reqwest({ url: options.url, type: 'html', method: (_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET", error: function(resp) { return typeof options.onError === "function" ? options.onError("Server responded with status " + resp.status) : void 0; }, success: function(resp) { return typeof options.onSuccess === "function" ? options.onSuccess(resp) : void 0; }, complete: function() { return typeof options.onComplete === "function" ? options.onComplete() : void 0; } }); }; Adapter.prototype.clone = function(object) { var key, newObject, val; newObject = {}; for (key in object) { if (!__hasProp.call(object, key)) continue; val = object[key]; newObject[key] = val; } return newObject; }; Adapter.prototype.extend = function() { var key, source, sources, target, val, _i, _len; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; for (_i = 0, _len = sources.length; _i < _len; _i++) { source = sources[_i]; for (key in source) { if (!__hasProp.call(source, key)) continue; val = source[key]; target[key] = val; } } return target; }; return Adapter; })(); return Opentip.addAdapter(new Adapter); })(ender); opentip-2.4.6/lib/adapter-jquery.js000066400000000000000000000111251213277401600172450ustar00rootroot00000000000000var __slice = [].slice; (function($) { var Adapter; $.fn.opentip = function(content, title, options) { return new Opentip(this, content, title, options); }; Adapter = (function() { function Adapter() {} Adapter.prototype.name = "jquery"; Adapter.prototype.domReady = function(callback) { return $(callback); }; Adapter.prototype.create = function(html) { return $(html); }; Adapter.prototype.wrap = function(element) { element = $(element); if (element.length > 1) { throw new Error("Multiple elements provided."); } return element; }; Adapter.prototype.unwrap = function(element) { return $(element)[0]; }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref = $(element)).attr.apply(_ref, args); }; Adapter.prototype.data = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return (_ref = $(element)).data.apply(_ref, args); }; Adapter.prototype.find = function(element, selector) { return $(element).find(selector).get(0); }; Adapter.prototype.findAll = function(element, selector) { return $(element).find(selector); }; Adapter.prototype.update = function(element, content, escape) { element = $(element); if (escape) { return element.text(content); } else { return element.html(content); } }; Adapter.prototype.append = function(element, child) { return $(element).append(child); }; Adapter.prototype.remove = function(element) { return $(element).remove(); }; Adapter.prototype.addClass = function(element, className) { return $(element).addClass(className); }; Adapter.prototype.removeClass = function(element, className) { return $(element).removeClass(className); }; Adapter.prototype.css = function(element, properties) { return $(element).css(properties); }; Adapter.prototype.dimensions = function(element) { return { width: $(element).outerWidth(), height: $(element).outerHeight() }; }; Adapter.prototype.scrollOffset = function() { return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; }; Adapter.prototype.viewportDimensions = function() { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; }; Adapter.prototype.mousePosition = function(e) { if (e == null) { return null; } return { x: e.pageX, y: e.pageY }; }; Adapter.prototype.offset = function(element) { var offset; offset = $(element).offset(); return { left: offset.left, top: offset.top }; }; Adapter.prototype.observe = function(element, eventName, observer) { return $(element).bind(eventName, observer); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return $(element).unbind(eventName, observer); }; Adapter.prototype.ajax = function(options) { var _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } return $.ajax({ url: options.url, type: (_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET" }).done(function(content) { return typeof options.onSuccess === "function" ? options.onSuccess(content) : void 0; }).fail(function(request) { return typeof options.onError === "function" ? options.onError("Server responded with status " + request.status) : void 0; }).always(function() { return typeof options.onComplete === "function" ? options.onComplete() : void 0; }); }; Adapter.prototype.clone = function(object) { return $.extend({}, object); }; Adapter.prototype.extend = function() { var sources, target; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return $.extend.apply($, [target].concat(__slice.call(sources))); }; return Adapter; })(); return Opentip.addAdapter(new Adapter); })(jQuery); opentip-2.4.6/lib/adapter-native.js000066400000000000000000000233031213277401600172150ustar00rootroot00000000000000var Adapter, __hasProp = {}.hasOwnProperty, __slice = [].slice; Adapter = (function() { var dataValues, lastDataId; function Adapter() {} Adapter.prototype.name = "native"; Adapter.prototype.domReady = function(callback) { var add, doc, done, init, poll, pre, rem, root, top, win, _ref; done = false; top = true; win = window; doc = document; if ((_ref = doc.readyState) === "complete" || _ref === "loaded") { return callback(); } root = doc.documentElement; add = (doc.addEventListener ? "addEventListener" : "attachEvent"); rem = (doc.addEventListener ? "removeEventListener" : "detachEvent"); pre = (doc.addEventListener ? "" : "on"); init = function(e) { if (e.type === "readystatechange" && doc.readyState !== "complete") { return; } (e.type === "load" ? win : doc)[rem](pre + e.type, init, false); if (!done) { done = true; return callback(); } }; poll = function() { var e; try { root.doScroll("left"); } catch (_error) { e = _error; setTimeout(poll, 50); return; } return init("poll"); }; if (doc.readyState !== "complete") { if (doc.createEventObject && root.doScroll) { try { top = !win.frameElement; } catch (_error) {} if (top) { poll(); } } doc[add](pre + "DOMContentLoaded", init, false); doc[add](pre + "readystatechange", init, false); return win[add](pre + "load", init, false); } }; Adapter.prototype.create = function(htmlString) { var div; div = document.createElement("div"); div.innerHTML = htmlString; return this.wrap(div.childNodes); }; Adapter.prototype.wrap = function(element) { var el; if (!element) { element = []; } else if (typeof element === "string") { element = this.find(document.body, element); element = element ? [element] : []; } else if (element instanceof NodeList) { element = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = element.length; _i < _len; _i++) { el = element[_i]; _results.push(el); } return _results; })(); } else if (!(element instanceof Array)) { element = [element]; } return element; }; Adapter.prototype.unwrap = function(element) { return this.wrap(element)[0]; }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function(element, attr, value) { if (arguments.length === 3) { return this.unwrap(element).setAttribute(attr, value); } else { return this.unwrap(element).getAttribute(attr); } }; lastDataId = 0; dataValues = {}; Adapter.prototype.data = function(element, name, value) { var dataId; dataId = this.attr(element, "data-id"); if (!dataId) { dataId = ++lastDataId; this.attr(element, "data-id", dataId); dataValues[dataId] = {}; } if (arguments.length === 3) { return dataValues[dataId][name] = value; } else { value = dataValues[dataId][name]; if (value != null) { return value; } value = this.attr(element, "data-" + (Opentip.prototype.dasherize(name))); if (value) { dataValues[dataId][name] = value; } return value; } }; Adapter.prototype.find = function(element, selector) { return this.unwrap(element).querySelector(selector); }; Adapter.prototype.findAll = function(element, selector) { return this.unwrap(element).querySelectorAll(selector); }; Adapter.prototype.update = function(element, content, escape) { element = this.unwrap(element); if (escape) { element.innerHTML = ""; return element.appendChild(document.createTextNode(content)); } else { return element.innerHTML = content; } }; Adapter.prototype.append = function(element, child) { var unwrappedChild, unwrappedElement; unwrappedChild = this.unwrap(child); unwrappedElement = this.unwrap(element); return unwrappedElement.appendChild(unwrappedChild); }; Adapter.prototype.remove = function(element) { var parentNode; element = this.unwrap(element); parentNode = element.parentNode; if (parentNode != null) { return parentNode.removeChild(element); } }; Adapter.prototype.addClass = function(element, className) { return this.unwrap(element).classList.add(className); }; Adapter.prototype.removeClass = function(element, className) { return this.unwrap(element).classList.remove(className); }; Adapter.prototype.css = function(element, properties) { var key, value, _results; element = this.unwrap(this.wrap(element)); _results = []; for (key in properties) { if (!__hasProp.call(properties, key)) continue; value = properties[key]; _results.push(element.style[key] = value); } return _results; }; Adapter.prototype.dimensions = function(element) { var dimensions, revert; element = this.unwrap(this.wrap(element)); dimensions = { width: element.offsetWidth, height: element.offsetHeight }; if (!(dimensions.width && dimensions.height)) { revert = { position: element.style.position || '', visibility: element.style.visibility || '', display: element.style.display || '' }; this.css(element, { position: "absolute", visibility: "hidden", display: "block" }); dimensions = { width: element.offsetWidth, height: element.offsetHeight }; this.css(element, revert); } return dimensions; }; Adapter.prototype.scrollOffset = function() { return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; }; Adapter.prototype.viewportDimensions = function() { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; }; Adapter.prototype.mousePosition = function(e) { var pos; pos = { x: 0, y: 0 }; if (e == null) { e = window.event; } if (e == null) { return; } try { if (e.pageX || e.pageY) { pos.x = e.pageX; pos.y = e.pageY; } else if (e.clientX || e.clientY) { pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; } } catch (_error) { e = _error; } return pos; }; Adapter.prototype.offset = function(element) { var offset; element = this.unwrap(element); offset = { top: element.offsetTop, left: element.offsetLeft }; while (element = element.offsetParent) { offset.top += element.offsetTop; offset.left += element.offsetLeft; if (element !== document.body) { offset.top -= element.scrollTop; offset.left -= element.scrollLeft; } } return offset; }; Adapter.prototype.observe = function(element, eventName, observer) { return this.unwrap(element).addEventListener(eventName, observer, false); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return this.unwrap(element).removeEventListener(eventName, observer, false); }; Adapter.prototype.ajax = function(options) { var e, request, _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } if (window.XMLHttpRequest) { request = new XMLHttpRequest; } else if (window.ActiveXObject) { try { request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (_error) { e = _error; try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (_error) { e = _error; } } } if (!request) { throw new Error("Can't create XMLHttpRequest"); } request.onreadystatechange = function() { if (request.readyState === 4) { try { if (request.status === 200) { if (typeof options.onSuccess === "function") { options.onSuccess(request.responseText); } } else { if (typeof options.onError === "function") { options.onError("Server responded with status " + request.status); } } } catch (_error) { e = _error; if (typeof options.onError === "function") { options.onError(e.message); } } return typeof options.onComplete === "function" ? options.onComplete() : void 0; } }; request.open((_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET", options.url); return request.send(); }; Adapter.prototype.clone = function(object) { var key, newObject, val; newObject = {}; for (key in object) { if (!__hasProp.call(object, key)) continue; val = object[key]; newObject[key] = val; } return newObject; }; Adapter.prototype.extend = function() { var key, source, sources, target, val, _i, _len; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; for (_i = 0, _len = sources.length; _i < _len; _i++) { source = sources[_i]; for (key in source) { if (!__hasProp.call(source, key)) continue; val = source[key]; target[key] = val; } } return target; }; return Adapter; })(); Opentip.addAdapter(new Adapter); opentip-2.4.6/lib/adapter-prototype.js000066400000000000000000000132361213277401600200000ustar00rootroot00000000000000var __slice = [].slice; (function() { var Adapter, isArrayOrNodeList; Element.addMethods({ addTip: function(element, content, title, options) { return new Opentip(element, content, title, options); } }); isArrayOrNodeList = function(element) { if ((element instanceof Array) || ((element != null) && typeof element.length === 'number' && typeof element.item === 'function' && typeof element.nextNode === 'function' && typeof element.reset === 'function')) { return true; } return false; }; Adapter = (function() { function Adapter() {} Adapter.prototype.name = "prototype"; Adapter.prototype.domReady = function(callback) { if (document.loaded) { return callback(); } else { return $(document).observe("dom:loaded", callback); } }; Adapter.prototype.create = function(html) { return new Element('div').update(html).childElements(); }; Adapter.prototype.wrap = function(element) { if (isArrayOrNodeList(element)) { if (element.length > 1) { throw new Error("Multiple elements provided."); } element = this.unwrap(element); } else if (typeof element === "string") { element = $$(element)[0]; } return $(element); }; Adapter.prototype.unwrap = function(element) { if (isArrayOrNodeList(element)) { return element[0]; } else { return element; } }; Adapter.prototype.tagName = function(element) { return this.unwrap(element).tagName; }; Adapter.prototype.attr = function() { var args, element, _ref; element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; if (args.length === 1) { return this.wrap(element).readAttribute(args[0]); } else { return (_ref = this.wrap(element)).writeAttribute.apply(_ref, args); } }; Adapter.prototype.data = function(element, name, value) { var arg; this.wrap(element); if (arguments.length > 2) { return element.store(name, value); } else { arg = element.readAttribute("data-" + (name.underscore().dasherize())); if (arg != null) { return arg; } return element.retrieve(name); } }; Adapter.prototype.find = function(element, selector) { return this.wrap(element).select(selector)[0]; }; Adapter.prototype.findAll = function(element, selector) { return this.wrap(element).select(selector); }; Adapter.prototype.update = function(element, content, escape) { return this.wrap(element).update(escape ? content.escapeHTML() : content); }; Adapter.prototype.append = function(element, child) { return this.wrap(element).insert(this.wrap(child)); }; Adapter.prototype.remove = function(element) { return this.wrap(element).remove(); }; Adapter.prototype.addClass = function(element, className) { return this.wrap(element).addClassName(className); }; Adapter.prototype.removeClass = function(element, className) { return this.wrap(element).removeClassName(className); }; Adapter.prototype.css = function(element, properties) { return this.wrap(element).setStyle(properties); }; Adapter.prototype.dimensions = function(element) { return this.wrap(element).getDimensions(); }; Adapter.prototype.scrollOffset = function() { var offsets; offsets = document.viewport.getScrollOffsets(); return [offsets.left, offsets.top]; }; Adapter.prototype.viewportDimensions = function() { return document.viewport.getDimensions(); }; Adapter.prototype.mousePosition = function(e) { if (e == null) { return null; } return { x: Event.pointerX(e), y: Event.pointerY(e) }; }; Adapter.prototype.offset = function(element) { var offset; offset = this.wrap(element).cumulativeOffset(); return { left: offset.left, top: offset.top }; }; Adapter.prototype.observe = function(element, eventName, observer) { return Event.observe(this.wrap(element), eventName, observer); }; Adapter.prototype.stopObserving = function(element, eventName, observer) { return Event.stopObserving(this.wrap(element), eventName, observer); }; Adapter.prototype.ajax = function(options) { var _ref, _ref1; if (options.url == null) { throw new Error("No url provided"); } return new Ajax.Request(options.url, { method: (_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET", onSuccess: function(response) { return typeof options.onSuccess === "function" ? options.onSuccess(response.responseText) : void 0; }, onFailure: function(response) { return typeof options.onError === "function" ? options.onError("Server responded with status " + response.status) : void 0; }, onComplete: function() { return typeof options.onComplete === "function" ? options.onComplete() : void 0; } }); }; Adapter.prototype.clone = function(object) { return Object.clone(object); }; Adapter.prototype.extend = function() { var source, sources, target, _i, _len; target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; for (_i = 0, _len = sources.length; _i < _len; _i++) { source = sources[_i]; Object.extend(target, source); } return target; }; return Adapter; })(); return Opentip.addAdapter(new Adapter); })(); opentip-2.4.6/lib/opentip.js000066400000000000000000001544611213277401600160010ustar00rootroot00000000000000/* # # Opentip v2.4.6 # # More info at [www.opentip.org](http://www.opentip.org) # # Copyright (c) 2012, Matias Meno # Graphics by Tjandra Mayerhold # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # */ var Opentip, firstAdapter, i, mouseMoved, mousePosition, mousePositionObservers, position, vendors, _i, _len, _ref, __slice = [].slice, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __hasProp = {}.hasOwnProperty; Opentip = (function() { Opentip.prototype.STICKS_OUT_TOP = 1; Opentip.prototype.STICKS_OUT_BOTTOM = 2; Opentip.prototype.STICKS_OUT_LEFT = 1; Opentip.prototype.STICKS_OUT_RIGHT = 2; Opentip.prototype["class"] = { container: "opentip-container", opentip: "opentip", header: "ot-header", content: "ot-content", loadingIndicator: "ot-loading-indicator", close: "ot-close", goingToHide: "ot-going-to-hide", hidden: "ot-hidden", hiding: "ot-hiding", goingToShow: "ot-going-to-show", showing: "ot-showing", visible: "ot-visible", loading: "ot-loading", ajaxError: "ot-ajax-error", fixed: "ot-fixed", showEffectPrefix: "ot-show-effect-", hideEffectPrefix: "ot-hide-effect-", stylePrefix: "style-" }; function Opentip(element, content, title, options) { var elementsOpentips, hideTrigger, methodToBind, optionSources, prop, styleName, _i, _j, _len, _len1, _ref, _ref1, _ref2, _tmpStyle, _this = this; this.id = ++Opentip.lastId; this.debug("Creating Opentip."); Opentip.tips.push(this); this.adapter = Opentip.adapter; elementsOpentips = this.adapter.data(element, "opentips") || []; elementsOpentips.push(this); this.adapter.data(element, "opentips", elementsOpentips); this.triggerElement = this.adapter.wrap(element); if (this.triggerElement.length > 1) { throw new Error("You can't call Opentip on multiple elements."); } if (this.triggerElement.length < 1) { throw new Error("Invalid element."); } this.loaded = false; this.loading = false; this.visible = false; this.waitingToShow = false; this.waitingToHide = false; this.currentPosition = { left: 0, top: 0 }; this.dimensions = { width: 100, height: 50 }; this.content = ""; this.redraw = true; this.currentObservers = { showing: false, visible: false, hiding: false, hidden: false }; options = this.adapter.clone(options); if (typeof content === "object") { options = content; content = title = void 0; } else if (typeof title === "object") { options = title; title = void 0; } if (title != null) { options.title = title; } if (content != null) { this.setContent(content); } if (options["extends"] == null) { if (options.style != null) { options["extends"] = options.style; } else { options["extends"] = Opentip.defaultStyle; } } optionSources = [options]; _tmpStyle = options; while (_tmpStyle["extends"]) { styleName = _tmpStyle["extends"]; _tmpStyle = Opentip.styles[styleName]; if (_tmpStyle == null) { throw new Error("Invalid style: " + styleName); } optionSources.unshift(_tmpStyle); if (!((_tmpStyle["extends"] != null) || styleName === "standard")) { _tmpStyle["extends"] = "standard"; } } options = (_ref = this.adapter).extend.apply(_ref, [{}].concat(__slice.call(optionSources))); options.hideTriggers = (function() { var _i, _len, _ref1, _results; _ref1 = options.hideTriggers; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { hideTrigger = _ref1[_i]; _results.push(hideTrigger); } return _results; })(); if (options.hideTrigger && options.hideTriggers.length === 0) { options.hideTriggers.push(options.hideTrigger); } _ref1 = ["tipJoint", "targetJoint", "stem"]; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { prop = _ref1[_i]; if (options[prop] && typeof options[prop] === "string") { options[prop] = new Opentip.Joint(options[prop]); } } if (options.ajax && (options.ajax === true || !options.ajax)) { if (this.adapter.tagName(this.triggerElement) === "A") { options.ajax = this.adapter.attr(this.triggerElement, "href"); } else { options.ajax = false; } } if (options.showOn === "click" && this.adapter.tagName(this.triggerElement) === "A") { this.adapter.observe(this.triggerElement, "click", function(e) { e.preventDefault(); e.stopPropagation(); return e.stopped = true; }); } if (options.target) { options.fixed = true; } if (options.stem === true) { options.stem = new Opentip.Joint(options.tipJoint); } if (options.target === true) { options.target = this.triggerElement; } else if (options.target) { options.target = this.adapter.wrap(options.target); } this.currentStem = options.stem; if (options.delay == null) { options.delay = options.showOn === "mouseover" ? 0.2 : 0; } if (options.targetJoint == null) { options.targetJoint = new Opentip.Joint(options.tipJoint).flip(); } this.showTriggers = []; this.showTriggersWhenVisible = []; this.hideTriggers = []; if (options.showOn && options.showOn !== "creation") { this.showTriggers.push({ element: this.triggerElement, event: options.showOn }); } if (options.ajaxCache != null) { options.cache = options.ajaxCache; delete options.ajaxCache; } this.options = options; this.bound = {}; _ref2 = ["prepareToShow", "prepareToHide", "show", "hide", "reposition"]; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { methodToBind = _ref2[_j]; this.bound[methodToBind] = (function(methodToBind) { return function() { return _this[methodToBind].apply(_this, arguments); }; })(methodToBind); } this.adapter.domReady(function() { _this.activate(); if (_this.options.showOn === "creation") { return _this.prepareToShow(); } }); } Opentip.prototype._setup = function() { var hideOn, hideTrigger, hideTriggerElement, i, _i, _j, _len, _len1, _ref, _ref1, _results; this.debug("Setting up the tooltip."); this._buildContainer(); this.hideTriggers = []; _ref = this.options.hideTriggers; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { hideTrigger = _ref[i]; hideTriggerElement = null; hideOn = this.options.hideOn instanceof Array ? this.options.hideOn[i] : this.options.hideOn; if (typeof hideTrigger === "string") { switch (hideTrigger) { case "trigger": hideOn = hideOn || "mouseout"; hideTriggerElement = this.triggerElement; break; case "tip": hideOn = hideOn || "mouseover"; hideTriggerElement = this.container; break; case "target": hideOn = hideOn || "mouseover"; hideTriggerElement = this.options.target; break; case "closeButton": break; default: throw new Error("Unknown hide trigger: " + hideTrigger + "."); } } else { hideOn = hideOn || "mouseover"; hideTriggerElement = this.adapter.wrap(hideTrigger); } if (hideTriggerElement) { this.hideTriggers.push({ element: hideTriggerElement, event: hideOn, original: hideTrigger }); } } _ref1 = this.hideTriggers; _results = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { hideTrigger = _ref1[_j]; _results.push(this.showTriggersWhenVisible.push({ element: hideTrigger.element, event: "mouseover" })); } return _results; }; Opentip.prototype._buildContainer = function() { this.container = this.adapter.create("

"); this.adapter.css(this.container, { position: "absolute" }); if (this.options.ajax) { this.adapter.addClass(this.container, this["class"].loading); } if (this.options.fixed) { this.adapter.addClass(this.container, this["class"].fixed); } if (this.options.showEffect) { this.adapter.addClass(this.container, "" + this["class"].showEffectPrefix + this.options.showEffect); } if (this.options.hideEffect) { return this.adapter.addClass(this.container, "" + this["class"].hideEffectPrefix + this.options.hideEffect); } }; Opentip.prototype._buildElements = function() { var headerElement, titleElement; this.tooltipElement = this.adapter.create("
"); this.backgroundCanvas = this.adapter.wrap(document.createElement("canvas")); this.adapter.css(this.backgroundCanvas, { position: "absolute" }); if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)); } headerElement = this.adapter.find(this.tooltipElement, "." + this["class"].header); if (this.options.title) { titleElement = this.adapter.create("

"); this.adapter.update(titleElement, this.options.title, this.options.escapeTitle); this.adapter.append(headerElement, titleElement); } if (this.options.ajax && !this.loaded) { this.adapter.append(this.tooltipElement, this.adapter.create("
↻
")); } if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { this.closeButtonElement = this.adapter.create("Close"); this.adapter.append(headerElement, this.closeButtonElement); } this.adapter.append(this.container, this.backgroundCanvas); this.adapter.append(this.container, this.tooltipElement); this.adapter.append(document.body, this.container); this._newContent = true; return this.redraw = true; }; Opentip.prototype.setContent = function(content) { this.content = content; this._newContent = true; if (typeof this.content === "function") { this._contentFunction = this.content; this.content = ""; } else { this._contentFunction = null; } if (this.visible) { return this._updateElementContent(); } }; Opentip.prototype._updateElementContent = function() { var contentDiv; if (this._newContent || (!this.options.cache && this._contentFunction)) { contentDiv = this.adapter.find(this.container, "." + this["class"].content); if (contentDiv != null) { if (this._contentFunction) { this.debug("Executing content function."); this.content = this._contentFunction(this); } this.adapter.update(contentDiv, this.content, this.options.escapeContent); } this._newContent = false; } this._storeAndLockDimensions(); return this.reposition(); }; Opentip.prototype._storeAndLockDimensions = function() { var prevDimension; if (!this.container) { return; } prevDimension = this.dimensions; this.adapter.css(this.container, { width: "auto", left: "0px", top: "0px" }); this.dimensions = this.adapter.dimensions(this.container); this.dimensions.width += 1; this.adapter.css(this.container, { width: "" + this.dimensions.width + "px", top: "" + this.currentPosition.top + "px", left: "" + this.currentPosition.left + "px" }); if (!this._dimensionsEqual(this.dimensions, prevDimension)) { this.redraw = true; return this._draw(); } }; Opentip.prototype.activate = function() { return this._setupObservers("hidden", "hiding"); }; Opentip.prototype.deactivate = function() { this.debug("Deactivating tooltip."); this.hide(); return this._setupObservers("-showing", "-visible", "-hidden", "-hiding"); }; Opentip.prototype._setupObservers = function() { var observeOrStop, removeObserver, state, states, trigger, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _this = this; states = 1 <= arguments.length ? __slice.call(arguments, 0) : []; for (_i = 0, _len = states.length; _i < _len; _i++) { state = states[_i]; removeObserver = false; if (state.charAt(0) === "-") { removeObserver = true; state = state.substr(1); } if (this.currentObservers[state] === !removeObserver) { continue; } this.currentObservers[state] = !removeObserver; observeOrStop = function() { var args, _ref, _ref1; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (removeObserver) { return (_ref = _this.adapter).stopObserving.apply(_ref, args); } else { return (_ref1 = _this.adapter).observe.apply(_ref1, args); } }; switch (state) { case "showing": _ref = this.hideTriggers; for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { trigger = _ref[_j]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToHide); } observeOrStop((document.onresize != null ? document : window), "resize", this.bound.reposition); observeOrStop(window, "scroll", this.bound.reposition); break; case "visible": _ref1 = this.showTriggersWhenVisible; for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { trigger = _ref1[_k]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hiding": _ref2 = this.showTriggers; for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { trigger = _ref2[_l]; observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); } break; case "hidden": break; default: throw new Error("Unknown state: " + state); } } return null; }; Opentip.prototype.prepareToShow = function() { this._abortHiding(); this._abortShowing(); if (this.visible) { return; } this.debug("Showing in " + this.options.delay + "s."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._abortShowingGroup(this.options.group, this); } this.preparingToShow = true; this._setupObservers("-hidden", "-hiding", "showing"); this._followMousePosition(); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); return this._showTimeoutId = this.setTimeout(this.bound.show, this.options.delay || 0); }; Opentip.prototype.show = function() { var _this = this; this._abortHiding(); if (this.visible) { return; } this._clearTimeouts(); if (!this._triggerElementExists()) { return this.deactivate(); } this.debug("Showing now."); if (this.container == null) { this._setup(); } if (this.options.group) { Opentip._hideGroup(this.options.group, this); } this.visible = true; this.preparingToShow = false; if (this.tooltipElement == null) { this._buildElements(); } this._updateElementContent(); if (this.options.ajax && (!this.loaded || !this.options.cache)) { this._loadAjax(); } this._searchAndActivateCloseButtons(); this._startEnsureTriggerElement(); this.adapter.css(this.container, { zIndex: Opentip.lastZIndex++ }); this._setupObservers("-hidden", "-hiding", "-showing", "-visible", "showing", "visible"); if (this.options.fixed && !this.options.target) { this.initialMousePosition = mousePosition; } this.reposition(); this.adapter.removeClass(this.container, this["class"].hiding); this.adapter.removeClass(this.container, this["class"].hidden); this.adapter.addClass(this.container, this["class"].goingToShow); this.setCss3Style(this.container, { transitionDuration: "0s" }); this.defer(function() { var delay; if (!_this.visible || _this.preparingToHide) { return; } _this.adapter.removeClass(_this.container, _this["class"].goingToShow); _this.adapter.addClass(_this.container, _this["class"].showing); delay = 0; if (_this.options.showEffect && _this.options.showEffectDuration) { delay = _this.options.showEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + delay + "s" }); _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].showing); return _this.adapter.addClass(_this.container, _this["class"].visible); }, delay); return _this._activateFirstInput(); }); return this._draw(); }; Opentip.prototype._abortShowing = function() { if (this.preparingToShow) { this.debug("Aborting showing."); this._clearTimeouts(); this._stopFollowingMousePosition(); this.preparingToShow = false; return this._setupObservers("-showing", "-visible", "hiding", "hidden"); } }; Opentip.prototype.prepareToHide = function() { this._abortShowing(); this._abortHiding(); if (!this.visible) { return; } this.debug("Hiding in " + this.options.hideDelay + "s"); this.preparingToHide = true; this._setupObservers("-showing", "visible", "-hidden", "hiding"); return this._hideTimeoutId = this.setTimeout(this.bound.hide, this.options.hideDelay); }; Opentip.prototype.hide = function() { var _this = this; this._abortShowing(); if (!this.visible) { return; } this._clearTimeouts(); this.debug("Hiding!"); this.visible = false; this.preparingToHide = false; this._stopEnsureTriggerElement(); this._setupObservers("-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden"); if (!this.options.fixed) { this._stopFollowingMousePosition(); } if (!this.container) { return; } this.adapter.removeClass(this.container, this["class"].visible); this.adapter.removeClass(this.container, this["class"].showing); this.adapter.addClass(this.container, this["class"].goingToHide); this.setCss3Style(this.container, { transitionDuration: "0s" }); return this.defer(function() { var hideDelay; _this.adapter.removeClass(_this.container, _this["class"].goingToHide); _this.adapter.addClass(_this.container, _this["class"].hiding); hideDelay = 0; if (_this.options.hideEffect && _this.options.hideEffectDuration) { hideDelay = _this.options.hideEffectDuration; } _this.setCss3Style(_this.container, { transitionDuration: "" + hideDelay + "s" }); return _this._visibilityStateTimeoutId = _this.setTimeout(function() { _this.adapter.removeClass(_this.container, _this["class"].hiding); _this.adapter.addClass(_this.container, _this["class"].hidden); _this.setCss3Style(_this.container, { transitionDuration: "0s" }); if (_this.options.removeElementsOnHide) { _this.debug("Removing HTML elements."); _this.adapter.remove(_this.container); delete _this.container; return delete _this.tooltipElement; } }, hideDelay); }); }; Opentip.prototype._abortHiding = function() { if (this.preparingToHide) { this.debug("Aborting hiding."); this._clearTimeouts(); this.preparingToHide = false; return this._setupObservers("-hiding", "showing", "visible"); } }; Opentip.prototype.reposition = function() { var position, stem, _ref, _this = this; position = this.getPosition(); if (position == null) { return; } stem = this.options.stem; if (this.options.containInViewport) { _ref = this._ensureViewportContainment(position), position = _ref.position, stem = _ref.stem; } if (this._positionsEqual(position, this.currentPosition)) { return; } if (!(!this.options.stem || stem.eql(this.currentStem))) { this.redraw = true; } this.currentPosition = position; this.currentStem = stem; this._draw(); this.adapter.css(this.container, { left: "" + position.left + "px", top: "" + position.top + "px" }); return this.defer(function() { var rawContainer, redrawFix; rawContainer = _this.adapter.unwrap(_this.container); rawContainer.style.visibility = "hidden"; redrawFix = rawContainer.offsetHeight; return rawContainer.style.visibility = "visible"; }); }; Opentip.prototype.getPosition = function(tipJoint, targetJoint, stem) { var additionalHorizontal, additionalVertical, offsetDistance, position, stemLength, targetDimensions, targetPosition, unwrappedTarget, _ref; if (!this.container) { return; } if (tipJoint == null) { tipJoint = this.options.tipJoint; } if (targetJoint == null) { targetJoint = this.options.targetJoint; } position = {}; if (this.options.target) { targetPosition = this.adapter.offset(this.options.target); targetDimensions = this.adapter.dimensions(this.options.target); position = targetPosition; if (targetJoint.right) { unwrappedTarget = this.adapter.unwrap(this.options.target); if (unwrappedTarget.getBoundingClientRect != null) { position.left = unwrappedTarget.getBoundingClientRect().right + ((_ref = window.pageXOffset) != null ? _ref : document.body.scrollLeft); } else { position.left += targetDimensions.width; } } else if (targetJoint.center) { position.left += Math.round(targetDimensions.width / 2); } if (targetJoint.bottom) { position.top += targetDimensions.height; } else if (targetJoint.middle) { position.top += Math.round(targetDimensions.height / 2); } if (this.options.borderWidth) { if (this.options.tipJoint.left) { position.left += this.options.borderWidth; } if (this.options.tipJoint.right) { position.left -= this.options.borderWidth; } if (this.options.tipJoint.top) { position.top += this.options.borderWidth; } else if (this.options.tipJoint.bottom) { position.top -= this.options.borderWidth; } } } else { if (this.initialMousePosition) { position = { top: this.initialMousePosition.y, left: this.initialMousePosition.x }; } else { position = { top: mousePosition.y, left: mousePosition.x }; } } if (this.options.autoOffset) { stemLength = this.options.stem ? this.options.stemLength : 0; offsetDistance = stemLength && this.options.fixed ? 2 : 10; additionalHorizontal = tipJoint.middle && !this.options.fixed ? 15 : 0; additionalVertical = tipJoint.center && !this.options.fixed ? 15 : 0; if (tipJoint.right) { position.left -= offsetDistance + additionalHorizontal; } else if (tipJoint.left) { position.left += offsetDistance + additionalHorizontal; } if (tipJoint.bottom) { position.top -= offsetDistance + additionalVertical; } else if (tipJoint.top) { position.top += offsetDistance + additionalVertical; } if (stemLength) { if (stem == null) { stem = this.options.stem; } if (stem.right) { position.left -= stemLength; } else if (stem.left) { position.left += stemLength; } if (stem.bottom) { position.top -= stemLength; } else if (stem.top) { position.top += stemLength; } } } position.left += this.options.offset[0]; position.top += this.options.offset[1]; if (tipJoint.right) { position.left -= this.dimensions.width; } else if (tipJoint.center) { position.left -= Math.round(this.dimensions.width / 2); } if (tipJoint.bottom) { position.top -= this.dimensions.height; } else if (tipJoint.middle) { position.top -= Math.round(this.dimensions.height / 2); } return position; }; Opentip.prototype._ensureViewportContainment = function(position) { var needsRepositioning, newSticksOut, originals, revertedX, revertedY, scrollOffset, stem, sticksOut, targetJoint, tipJoint, viewportDimensions, viewportPosition; stem = this.options.stem; originals = { position: position, stem: stem }; if (!(this.visible && position)) { return originals; } sticksOut = this._sticksOut(position); if (!(sticksOut[0] || sticksOut[1])) { return originals; } tipJoint = new Opentip.Joint(this.options.tipJoint); if (this.options.targetJoint) { targetJoint = new Opentip.Joint(this.options.targetJoint); } scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); viewportPosition = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; needsRepositioning = false; if (viewportDimensions.width >= this.dimensions.width) { if (sticksOut[0]) { needsRepositioning = true; switch (sticksOut[0]) { case this.STICKS_OUT_LEFT: tipJoint.setHorizontal("left"); if (this.options.targetJoint) { targetJoint.setHorizontal("right"); } break; case this.STICKS_OUT_RIGHT: tipJoint.setHorizontal("right"); if (this.options.targetJoint) { targetJoint.setHorizontal("left"); } } } } if (viewportDimensions.height >= this.dimensions.height) { if (sticksOut[1]) { needsRepositioning = true; switch (sticksOut[1]) { case this.STICKS_OUT_TOP: tipJoint.setVertical("top"); if (this.options.targetJoint) { targetJoint.setVertical("bottom"); } break; case this.STICKS_OUT_BOTTOM: tipJoint.setVertical("bottom"); if (this.options.targetJoint) { targetJoint.setVertical("top"); } } } } if (!needsRepositioning) { return originals; } if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); newSticksOut = this._sticksOut(position); revertedX = false; revertedY = false; if (newSticksOut[0] && (newSticksOut[0] !== sticksOut[0])) { revertedX = true; tipJoint.setHorizontal(this.options.tipJoint.horizontal); if (this.options.targetJoint) { targetJoint.setHorizontal(this.options.targetJoint.horizontal); } } if (newSticksOut[1] && (newSticksOut[1] !== sticksOut[1])) { revertedY = true; tipJoint.setVertical(this.options.tipJoint.vertical); if (this.options.targetJoint) { targetJoint.setVertical(this.options.targetJoint.vertical); } } if (revertedX && revertedY) { return originals; } if (revertedX || revertedY) { if (this.options.stem) { stem = tipJoint; } position = this.getPosition(tipJoint, targetJoint, stem); } return { position: position, stem: stem }; }; Opentip.prototype._sticksOut = function(position) { var positionOffset, scrollOffset, sticksOut, viewportDimensions; scrollOffset = this.adapter.scrollOffset(); viewportDimensions = this.adapter.viewportDimensions(); positionOffset = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; sticksOut = [false, false]; if (positionOffset[0] < 0) { sticksOut[0] = this.STICKS_OUT_LEFT; } else if (positionOffset[0] + this.dimensions.width > viewportDimensions.width) { sticksOut[0] = this.STICKS_OUT_RIGHT; } if (positionOffset[1] < 0) { sticksOut[1] = this.STICKS_OUT_TOP; } else if (positionOffset[1] + this.dimensions.height > viewportDimensions.height) { sticksOut[1] = this.STICKS_OUT_BOTTOM; } return sticksOut; }; Opentip.prototype._draw = function() { var backgroundCanvas, bulge, canvasDimensions, canvasPosition, closeButton, closeButtonInner, closeButtonOuter, ctx, drawCorner, drawLine, hb, position, stemBase, stemLength, _i, _len, _ref, _ref1, _ref2, _this = this; if (!(this.backgroundCanvas && this.redraw)) { return; } this.debug("Drawing background."); this.redraw = false; if (this.currentStem) { _ref = ["top", "right", "bottom", "left"]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { position = _ref[_i]; this.adapter.removeClass(this.container, "stem-" + position); } this.adapter.addClass(this.container, "stem-" + this.currentStem.horizontal); this.adapter.addClass(this.container, "stem-" + this.currentStem.vertical); } closeButtonInner = [0, 0]; closeButtonOuter = [0, 0]; if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { closeButton = new Opentip.Joint(((_ref1 = this.currentStem) != null ? _ref1.toString() : void 0) === "top right" ? "top left" : "top right"); closeButtonInner = [this.options.closeButtonRadius + this.options.closeButtonOffset[0], this.options.closeButtonRadius + this.options.closeButtonOffset[1]]; closeButtonOuter = [this.options.closeButtonRadius - this.options.closeButtonOffset[0], this.options.closeButtonRadius - this.options.closeButtonOffset[1]]; } canvasDimensions = this.adapter.clone(this.dimensions); canvasPosition = [0, 0]; if (this.options.borderWidth) { canvasDimensions.width += this.options.borderWidth * 2; canvasDimensions.height += this.options.borderWidth * 2; canvasPosition[0] -= this.options.borderWidth; canvasPosition[1] -= this.options.borderWidth; } if (this.options.shadow) { canvasDimensions.width += this.options.shadowBlur * 2; canvasDimensions.width += Math.max(0, this.options.shadowOffset[0] - this.options.shadowBlur * 2); canvasDimensions.height += this.options.shadowBlur * 2; canvasDimensions.height += Math.max(0, this.options.shadowOffset[1] - this.options.shadowBlur * 2); canvasPosition[0] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[0]); canvasPosition[1] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[1]); } bulge = { left: 0, right: 0, top: 0, bottom: 0 }; if (this.currentStem) { if (this.currentStem.left) { bulge.left = this.options.stemLength; } else if (this.currentStem.right) { bulge.right = this.options.stemLength; } if (this.currentStem.top) { bulge.top = this.options.stemLength; } else if (this.currentStem.bottom) { bulge.bottom = this.options.stemLength; } } if (closeButton) { if (closeButton.left) { bulge.left = Math.max(bulge.left, closeButtonOuter[0]); } else if (closeButton.right) { bulge.right = Math.max(bulge.right, closeButtonOuter[0]); } if (closeButton.top) { bulge.top = Math.max(bulge.top, closeButtonOuter[1]); } else if (closeButton.bottom) { bulge.bottom = Math.max(bulge.bottom, closeButtonOuter[1]); } } canvasDimensions.width += bulge.left + bulge.right; canvasDimensions.height += bulge.top + bulge.bottom; canvasPosition[0] -= bulge.left; canvasPosition[1] -= bulge.top; if (this.currentStem && this.options.borderWidth) { _ref2 = this._getPathStemMeasures(this.options.stemBase, this.options.stemLength, this.options.borderWidth), stemLength = _ref2.stemLength, stemBase = _ref2.stemBase; } backgroundCanvas = this.adapter.unwrap(this.backgroundCanvas); backgroundCanvas.width = canvasDimensions.width; backgroundCanvas.height = canvasDimensions.height; this.adapter.css(this.backgroundCanvas, { width: "" + backgroundCanvas.width + "px", height: "" + backgroundCanvas.height + "px", left: "" + canvasPosition[0] + "px", top: "" + canvasPosition[1] + "px" }); ctx = backgroundCanvas.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height); ctx.beginPath(); ctx.fillStyle = this._getColor(ctx, this.dimensions, this.options.background, this.options.backgroundGradientHorizontal); ctx.lineJoin = "miter"; ctx.miterLimit = 500; hb = this.options.borderWidth / 2; if (this.options.borderWidth) { ctx.strokeStyle = this.options.borderColor; ctx.lineWidth = this.options.borderWidth; } else { stemLength = this.options.stemLength; stemBase = this.options.stemBase; } if (stemBase == null) { stemBase = 0; } drawLine = function(length, stem, first) { if (first) { ctx.moveTo(Math.max(stemBase, _this.options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb); } if (stem) { ctx.lineTo(length / 2 - stemBase / 2, -hb); ctx.lineTo(length / 2, -stemLength - hb); return ctx.lineTo(length / 2 + stemBase / 2, -hb); } }; drawCorner = function(stem, closeButton, i) { var angle1, angle2, innerWidth, offset; if (stem) { ctx.lineTo(-stemBase + hb, 0 - hb); ctx.lineTo(stemLength + hb, -stemLength - hb); return ctx.lineTo(hb, stemBase - hb); } else if (closeButton) { offset = _this.options.closeButtonOffset; innerWidth = closeButtonInner[0]; if (i % 2 !== 0) { offset = [offset[1], offset[0]]; innerWidth = closeButtonInner[1]; } angle1 = Math.acos(offset[1] / _this.options.closeButtonRadius); angle2 = Math.acos(offset[0] / _this.options.closeButtonRadius); ctx.lineTo(-innerWidth + hb, -hb); return ctx.arc(hb - offset[0], -hb + offset[1], _this.options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, false); } else { ctx.lineTo(-_this.options.borderRadius + hb, -hb); return ctx.quadraticCurveTo(hb, -hb, hb, _this.options.borderRadius - hb); } }; ctx.translate(-canvasPosition[0], -canvasPosition[1]); ctx.save(); (function() { var cornerStem, i, lineLength, lineStem, positionIdx, positionX, positionY, rotation, _j, _ref3, _results; _results = []; for (i = _j = 0, _ref3 = Opentip.positions.length / 2; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) { positionIdx = i * 2; positionX = i === 0 || i === 3 ? 0 : _this.dimensions.width; positionY = i < 2 ? 0 : _this.dimensions.height; rotation = (Math.PI / 2) * i; lineLength = i % 2 === 0 ? _this.dimensions.width : _this.dimensions.height; lineStem = new Opentip.Joint(Opentip.positions[positionIdx]); cornerStem = new Opentip.Joint(Opentip.positions[positionIdx + 1]); ctx.save(); ctx.translate(positionX, positionY); ctx.rotate(rotation); drawLine(lineLength, lineStem.eql(_this.currentStem), i === 0); ctx.translate(lineLength, 0); drawCorner(cornerStem.eql(_this.currentStem), cornerStem.eql(closeButton), i); _results.push(ctx.restore()); } return _results; })(); ctx.closePath(); ctx.save(); if (this.options.shadow) { ctx.shadowColor = this.options.shadowColor; ctx.shadowBlur = this.options.shadowBlur; ctx.shadowOffsetX = this.options.shadowOffset[0]; ctx.shadowOffsetY = this.options.shadowOffset[1]; } ctx.fill(); ctx.restore(); if (this.options.borderWidth) { ctx.stroke(); } ctx.restore(); if (closeButton) { return (function() { var crossCenter, crossHeight, crossWidth, hcs, linkCenter; crossWidth = crossHeight = _this.options.closeButtonRadius * 2; if (closeButton.toString() === "top right") { linkCenter = [_this.dimensions.width - _this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] + hb, linkCenter[1] - hb]; } else { linkCenter = [_this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; crossCenter = [linkCenter[0] - hb, linkCenter[1] - hb]; } ctx.translate(crossCenter[0], crossCenter[1]); hcs = _this.options.closeButtonCrossSize / 2; ctx.save(); ctx.beginPath(); ctx.strokeStyle = _this.options.closeButtonCrossColor; ctx.lineWidth = _this.options.closeButtonCrossLineWidth; ctx.lineCap = "round"; ctx.moveTo(-hcs, -hcs); ctx.lineTo(hcs, hcs); ctx.stroke(); ctx.beginPath(); ctx.moveTo(hcs, -hcs); ctx.lineTo(-hcs, hcs); ctx.stroke(); ctx.restore(); return _this.adapter.css(_this.closeButtonElement, { left: "" + (linkCenter[0] - hcs - _this.options.closeButtonLinkOverscan) + "px", top: "" + (linkCenter[1] - hcs - _this.options.closeButtonLinkOverscan) + "px", width: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px", height: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px" }); })(); } }; Opentip.prototype._getPathStemMeasures = function(outerStemBase, outerStemLength, borderWidth) { var angle, distanceBetweenTips, halfAngle, hb, rhombusSide, stemBase, stemLength; hb = borderWidth / 2; halfAngle = Math.atan((outerStemBase / 2) / outerStemLength); angle = halfAngle * 2; rhombusSide = hb / Math.sin(angle); distanceBetweenTips = 2 * rhombusSide * Math.cos(halfAngle); stemLength = hb + outerStemLength - distanceBetweenTips; if (stemLength < 0) { throw new Error("Sorry but your stemLength / stemBase ratio is strange."); } stemBase = (Math.tan(halfAngle) * stemLength) * 2; return { stemLength: stemLength, stemBase: stemBase }; }; Opentip.prototype._getColor = function(ctx, dimensions, color, horizontal) { var colorStop, gradient, i, _i, _len; if (horizontal == null) { horizontal = false; } if (typeof color === "string") { return color; } if (horizontal) { gradient = ctx.createLinearGradient(0, 0, dimensions.width, 0); } else { gradient = ctx.createLinearGradient(0, 0, 0, dimensions.height); } for (i = _i = 0, _len = color.length; _i < _len; i = ++_i) { colorStop = color[i]; gradient.addColorStop(colorStop[0], colorStop[1]); } return gradient; }; Opentip.prototype._searchAndActivateCloseButtons = function() { var element, _i, _len, _ref; _ref = this.adapter.findAll(this.container, "." + this["class"].close); for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; this.hideTriggers.push({ element: this.adapter.wrap(element), event: "click" }); } if (this.currentObservers.showing) { this._setupObservers("-showing", "showing"); } if (this.currentObservers.visible) { return this._setupObservers("-visible", "visible"); } }; Opentip.prototype._activateFirstInput = function() { var input; input = this.adapter.unwrap(this.adapter.find(this.container, "input, textarea")); return input != null ? typeof input.focus === "function" ? input.focus() : void 0 : void 0; }; Opentip.prototype._followMousePosition = function() { if (!this.options.fixed) { return Opentip._observeMousePosition(this.bound.reposition); } }; Opentip.prototype._stopFollowingMousePosition = function() { if (!this.options.fixed) { return Opentip._stopObservingMousePosition(this.bound.reposition); } }; Opentip.prototype._clearShowTimeout = function() { return clearTimeout(this._showTimeoutId); }; Opentip.prototype._clearHideTimeout = function() { return clearTimeout(this._hideTimeoutId); }; Opentip.prototype._clearTimeouts = function() { clearTimeout(this._visibilityStateTimeoutId); this._clearShowTimeout(); return this._clearHideTimeout(); }; Opentip.prototype._triggerElementExists = function() { var el; el = this.adapter.unwrap(this.triggerElement); while (el.parentNode) { if (el.parentNode.tagName === "BODY") { return true; } el = el.parentNode; } return false; }; Opentip.prototype._loadAjax = function() { var _this = this; if (this.loading) { return; } this.loaded = false; this.loading = true; this.adapter.addClass(this.container, this["class"].loading); this.setContent(""); this.debug("Loading content from " + this.options.ajax); return this.adapter.ajax({ url: this.options.ajax, method: this.options.ajaxMethod, onSuccess: function(responseText) { _this.debug("Loading successful."); _this.adapter.removeClass(_this.container, _this["class"].loading); return _this.setContent(responseText); }, onError: function(error) { var message; message = _this.options.ajaxErrorMessage; _this.debug(message, error); _this.setContent(message); return _this.adapter.addClass(_this.container, _this["class"].ajaxError); }, onComplete: function() { _this.adapter.removeClass(_this.container, _this["class"].loading); _this.loading = false; _this.loaded = true; _this._searchAndActivateCloseButtons(); _this._activateFirstInput(); return _this.reposition(); } }); }; Opentip.prototype._ensureTriggerElement = function() { if (!this._triggerElementExists()) { this.deactivate(); return this._stopEnsureTriggerElement(); } }; Opentip.prototype._ensureTriggerElementInterval = 1000; Opentip.prototype._startEnsureTriggerElement = function() { var _this = this; return this._ensureTriggerElementTimeoutId = setInterval((function() { return _this._ensureTriggerElement(); }), this._ensureTriggerElementInterval); }; Opentip.prototype._stopEnsureTriggerElement = function() { return clearInterval(this._ensureTriggerElementTimeoutId); }; return Opentip; })(); vendors = ["khtml", "ms", "o", "moz", "webkit"]; Opentip.prototype.setCss3Style = function(element, styles) { var prop, value, vendor, vendorProp, _results; element = this.adapter.unwrap(element); _results = []; for (prop in styles) { if (!__hasProp.call(styles, prop)) continue; value = styles[prop]; if (element.style[prop] != null) { _results.push(element.style[prop] = value); } else { _results.push((function() { var _i, _len, _results1; _results1 = []; for (_i = 0, _len = vendors.length; _i < _len; _i++) { vendor = vendors[_i]; vendorProp = "" + (this.ucfirst(vendor)) + (this.ucfirst(prop)); if (element.style[vendorProp] != null) { _results1.push(element.style[vendorProp] = value); } else { _results1.push(void 0); } } return _results1; }).call(this)); } } return _results; }; Opentip.prototype.defer = function(func) { return setTimeout(func, 0); }; Opentip.prototype.setTimeout = function(func, seconds) { return setTimeout(func, seconds ? seconds * 1000 : 0); }; Opentip.prototype.ucfirst = function(string) { if (string == null) { return ""; } return string.charAt(0).toUpperCase() + string.slice(1); }; Opentip.prototype.dasherize = function(string) { return string.replace(/([A-Z])/g, function(_, character) { return "-" + (character.toLowerCase()); }); }; mousePositionObservers = []; mousePosition = { x: 0, y: 0 }; mouseMoved = function(e) { var observer, _i, _len, _results; mousePosition = Opentip.adapter.mousePosition(e); _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; _results.push(observer()); } return _results; }; Opentip.followMousePosition = function() { return Opentip.adapter.observe(document.body, "mousemove", mouseMoved); }; Opentip._observeMousePosition = function(observer) { return mousePositionObservers.push(observer); }; Opentip._stopObservingMousePosition = function(removeObserver) { var observer; return mousePositionObservers = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { observer = mousePositionObservers[_i]; if (observer !== removeObserver) { _results.push(observer); } } return _results; })(); }; Opentip.Joint = (function() { function Joint(pointerString) { if (pointerString == null) { return; } if (pointerString instanceof Opentip.Joint) { pointerString = pointerString.toString(); } this.set(pointerString); this; } Joint.prototype.set = function(string) { string = string.toLowerCase(); this.setHorizontal(string); this.setVertical(string); return this; }; Joint.prototype.setHorizontal = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["left", "center", "right"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.horizontal = i.toLowerCase(); } } if (this.horizontal == null) { this.horizontal = "center"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.horizontal === i ? i : void 0); } return _results; }; Joint.prototype.setVertical = function(string) { var i, valid, _i, _j, _len, _len1, _results; valid = ["top", "middle", "bottom"]; for (_i = 0, _len = valid.length; _i < _len; _i++) { i = valid[_i]; if (~string.indexOf(i)) { this.vertical = i.toLowerCase(); } } if (this.vertical == null) { this.vertical = "middle"; } _results = []; for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { i = valid[_j]; _results.push(this[i] = this.vertical === i ? i : void 0); } return _results; }; Joint.prototype.eql = function(pointer) { return (pointer != null) && this.horizontal === pointer.horizontal && this.vertical === pointer.vertical; }; Joint.prototype.flip = function() { var flippedIndex, positionIdx; positionIdx = Opentip.position[this.toString(true)]; flippedIndex = (positionIdx + 4) % 8; this.set(Opentip.positions[flippedIndex]); return this; }; Joint.prototype.toString = function(camelized) { var horizontal, vertical; if (camelized == null) { camelized = false; } vertical = this.vertical === "middle" ? "" : this.vertical; horizontal = this.horizontal === "center" ? "" : this.horizontal; if (vertical && horizontal) { if (camelized) { horizontal = Opentip.prototype.ucfirst(horizontal); } else { horizontal = " " + horizontal; } } return "" + vertical + horizontal; }; return Joint; })(); Opentip.prototype._positionsEqual = function(posA, posB) { return (posA != null) && (posB != null) && posA.left === posB.left && posA.top === posB.top; }; Opentip.prototype._dimensionsEqual = function(dimA, dimB) { return (dimA != null) && (dimB != null) && dimA.width === dimB.width && dimA.height === dimB.height; }; Opentip.prototype.debug = function() { var args; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if (Opentip.debug && ((typeof console !== "undefined" && console !== null ? console.debug : void 0) != null)) { args.unshift("#" + this.id + " |"); return console.debug.apply(console, args); } }; Opentip.findElements = function() { var adapter, content, element, optionName, optionValue, options, _i, _len, _ref, _results; adapter = Opentip.adapter; _ref = adapter.findAll(document.body, "[data-ot]"); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { element = _ref[_i]; options = {}; content = adapter.data(element, "ot"); if (content === "" || content === "true" || content === "yes") { content = adapter.attr(element, "title"); adapter.attr(element, "title", ""); } content = content || ""; for (optionName in Opentip.styles.standard) { optionValue = adapter.data(element, "ot" + (Opentip.prototype.ucfirst(optionName))); if (optionValue != null) { if (optionValue === "yes" || optionValue === "true" || optionValue === "on") { optionValue = true; } else if (optionValue === "no" || optionValue === "false" || optionValue === "off") { optionValue = false; } options[optionName] = optionValue; } } _results.push(new Opentip(element, content, options)); } return _results; }; Opentip.version = "2.4.6"; Opentip.debug = false; Opentip.lastId = 0; Opentip.lastZIndex = 100; Opentip.tips = []; Opentip._abortShowingGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip._abortShowing()); } else { _results.push(void 0); } } return _results; }; Opentip._hideGroup = function(group, originatingOpentip) { var opentip, _i, _len, _ref, _results; _ref = Opentip.tips; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { opentip = _ref[_i]; if (opentip !== originatingOpentip && opentip.options.group === group) { _results.push(opentip.hide()); } else { _results.push(void 0); } } return _results; }; Opentip.adapters = {}; Opentip.adapter = null; firstAdapter = true; Opentip.addAdapter = function(adapter) { Opentip.adapters[adapter.name] = adapter; if (firstAdapter) { Opentip.adapter = adapter; adapter.domReady(Opentip.findElements); adapter.domReady(Opentip.followMousePosition); return firstAdapter = false; } }; Opentip.positions = ["top", "topRight", "right", "bottomRight", "bottom", "bottomLeft", "left", "topLeft"]; Opentip.position = {}; _ref = Opentip.positions; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { position = _ref[i]; Opentip.position[position] = i; } Opentip.styles = { standard: { "extends": null, title: void 0, escapeTitle: true, escapeContent: false, className: "standard", stem: true, delay: null, hideDelay: 0.1, fixed: false, showOn: "mouseover", hideTrigger: "trigger", hideTriggers: [], hideOn: null, removeElementsOnHide: false, offset: [0, 0], containInViewport: true, autoOffset: true, showEffect: "appear", hideEffect: "fade", showEffectDuration: 0.3, hideEffectDuration: 0.2, stemLength: 5, stemBase: 8, tipJoint: "top left", target: null, targetJoint: null, cache: true, ajax: false, ajaxMethod: "GET", ajaxErrorMessage: "There was a problem downloading the content.", group: null, style: null, background: "#fff18f", backgroundGradientHorizontal: false, closeButtonOffset: [5, 5], closeButtonRadius: 7, closeButtonCrossSize: 4, closeButtonCrossColor: "#d2c35b", closeButtonCrossLineWidth: 1.5, closeButtonLinkOverscan: 6, borderRadius: 5, borderWidth: 1, borderColor: "#f2e37b", shadow: true, shadowBlur: 10, shadowOffset: [3, 3], shadowColor: "rgba(0, 0, 0, 0.1)" }, glass: { "extends": "standard", className: "glass", background: [[0, "rgba(252, 252, 252, 0.8)"], [0.5, "rgba(255, 255, 255, 0.8)"], [0.5, "rgba(250, 250, 250, 0.9)"], [1, "rgba(245, 245, 245, 0.9)"]], borderColor: "#eee", closeButtonCrossColor: "rgba(0, 0, 0, 0.2)", borderRadius: 15, closeButtonRadius: 10, closeButtonOffset: [8, 8] }, dark: { "extends": "standard", className: "dark", borderRadius: 13, borderColor: "#444", closeButtonCrossColor: "rgba(240, 240, 240, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(30, 30, 30, 0.7)"], [0.5, "rgba(30, 30, 30, 0.8)"], [0.5, "rgba(10, 10, 10, 0.8)"], [1, "rgba(10, 10, 10, 0.9)"]] }, alert: { "extends": "standard", className: "alert", borderRadius: 1, borderColor: "#AE0D11", closeButtonCrossColor: "rgba(255, 255, 255, 1)", shadowColor: "rgba(0, 0, 0, 0.3)", shadowOffset: [2, 2], background: [[0, "rgba(203, 15, 19, 0.7)"], [0.5, "rgba(203, 15, 19, 0.8)"], [0.5, "rgba(189, 14, 18, 0.8)"], [1, "rgba(179, 14, 17, 0.9)"]] } }; Opentip.defaultStyle = "standard"; if (typeof module !== "undefined" && module !== null) { module.exports = Opentip; } else { window.Opentip = Opentip; } opentip-2.4.6/package.json000066400000000000000000000025551213277401600155010ustar00rootroot00000000000000{ "name": "opentip", "version": "2.4.6", "description": "Free opensource tooltip class.", "keywords": [ "tooltip" ], "homepage": "http://www.opentip.org", "main": [ "./lib/opentip.js", "./lib/adapter.ender.js" ], "maintainers": [ { "name": "Matias Meno", "email": "m@tias.me", "web": "http://www.matiasmeno.com" } ], "contributors": [ { "name": "Matias Meno", "email": "m@tias.me", "web": "http://www.matiasmeno.com" } ], "bugs": { "mail": "m@tias.me" }, "licenses": [ { "type": "MIT", "url": "http://www.opensource.org/licenses/MIT" } ], "repositories": [ { "type": "git", "url": "https://github.com/enyo/opentip.git" } ], "scripts": { "test": "node_modules/mocha-phantomjs/bin/mocha-phantomjs test/test.html" }, "dependencies": { "qwery": "3.x", "domready": "0.x", "bean": "0.x", "bonzo": "1.x", "reqwest": "0.x" }, "devDependencies": { "grunt": "*", "grunt-contrib-stylus": "*", "grunt-contrib-watch": "*", "grunt-contrib-coffee": "*", "grunt-contrib-concat": "*", "grunt-contrib-uglify": "*", "grunt-contrib-clean": "*", "grunt-curl": "*", "mocha": "*", "expect.js": "*", "mocha-phantomjs": "*", "uglify-js2": "*", "request": "*" }, "ender": "noop" } opentip-2.4.6/src/000077500000000000000000000000001213277401600137735ustar00rootroot00000000000000opentip-2.4.6/src/adapter-component.coffee000066400000000000000000000072711213277401600205730ustar00rootroot00000000000000# Component Opentip Adapter # ====================== # # Uses github.com/component components $ = window.jQuery ? require "jquery" # The adapter class module.exports = class Adapter name: "component" # Simply using $.domReady domReady: (callback) -> $ callback # DOM # === # Using bonzo to create html create: (html) -> $ html # Element handling # ---------------- # Wraps the element in ender wrap: (element) -> element = $ element throw new Error "Multiple elements provided." if element.length > 1 element # Returns the unwrapped element unwrap: (element) -> $(element)[0] # Returns the tag name of the element tagName: (element) -> @unwrap(element).tagName # Returns or sets the given attribute of element # # It's important not to simply forward name and value because the value # is set whether or not the value argument is present attr: (element, args...) -> $(element).attr args... # Returns or sets the given data of element # It's important not to simply forward name and value because the value # is set whether or not the value argument is present data: (element, args...) -> $(element).data args... # Finds elements by selector find: (element, selector) -> $(element).find(selector)[0] # Finds all elements by selector findAll: (element, selector) -> $(element).find selector # Updates the content of the element update: (element, content, escape) -> element = $ element if escape element.text content else element.html content # Appends given child to element append: (element, child) -> $(element).append child # Removes element remove: (element) -> $(element).remove() # Add a class addClass: (element, className) -> $(element).addClass className # Remove a class removeClass: (element, className) -> $(element).removeClass className # Set given css properties css: (element, properties) -> $(element).css properties # Returns an object with given dimensions dimensions: (element) -> { width: $(element).outerWidth() height: $(element).outerHeight() } # Returns the scroll offsets of current document scrollOffset: -> [ window.pageXOffset or document.documentElement.scrollLeft or document.body.scrollLeft window.pageYOffset or document.documentElement.scrollTop or document.body.scrollTop ] # Returns the dimensions of the viewport (currently visible browser area) viewportDimensions: -> { width: document.documentElement.clientWidth height: document.documentElement.clientHeight } # Returns an object with x and y mousePosition: (e) -> return null unless e? x: e.pageX, y: e.pageY # Returns the offset of the element offset: (element) -> offset = $(element).offset() { left: offset.left top: offset.top } # Observe given eventName observe: (element, eventName, observer) -> $(element).bind eventName, observer # Stop observing event stopObserving: (element, eventName, observer) -> $(element).unbind eventName, observer # Perform an AJAX request and call the appropriate callbacks. ajax: (options) -> throw new Error "No url provided" unless options.url? $.ajax( url: options.url type: options.method?.toUpperCase() ? "GET" ) .done((content) -> options.onSuccess? content) .fail((request) -> options.onError? "Server responded with status #{request.status}") .always(-> options.onComplete?()) # Utility functions # ================= # Creates a shallow copy of the object clone: (object) -> $.extend { }, object # Copies all properties from sources to target extend: (target, sources...) -> $.extend target, sources... opentip-2.4.6/src/adapter-ender.coffee000066400000000000000000000110661213277401600176630ustar00rootroot00000000000000# Ender Opentip Adapter # ===================== # # Uses ender packages # Because $ is my favorite character (($) -> # Using bean as event handler bean = require "bean" # Using reqwest as AJAX lib reqwest = require "reqwest" # Augment ender $.ender { opentip: (content, title, options) -> new Opentip this, content, title, options }, true # And now the class class Adapter name: "ender" # Simply using $.domReady domReady: (callback) -> $.domReady callback # DOM # === # Using bonzo to create html create: (html) -> $ html # Element handling # ---------------- # Wraps the element in ender wrap: (element) -> element = $ element throw new Error "Multiple elements provided." if element.length > 1 element # Returns the unwrapped element unwrap: (element) -> $(element).get 0 # Returns the tag name of the element tagName: (element) -> @unwrap(element).tagName # Returns or sets the given attribute of element # It's important not to simply forward name and value because the value # is set whether or not the value argument is present attr: (element, args...) -> $(element).attr args... # Returns or sets the given data of element # It's important not to simply forward name and value because the value # is set whether or not the value argument is present data: (element, args...) -> $(element).data args... # Finds elements by selector find: (element, selector) -> $(element).find(selector)[0] # Finds all elements by selector findAll: (element, selector) -> $(element).find selector # Updates the content of the element update: (element, content, escape) -> element = $ element if escape element.text content else element.html content # Appends given child to element append: (element, child) -> $(element).append child # Removes element remove: (element) -> $(element).remove() # Add a class addClass: (element, className) -> $(element).addClass className # Remove a class removeClass: (element, className) -> $(element).removeClass className # Set given css properties css: (element, properties) -> $(element).css properties # Returns an object with given dimensions dimensions: (element) -> $(element).dim() # Returns the scroll offsets of current document scrollOffset: -> [ window.pageXOffset or document.documentElement.scrollLeft or document.body.scrollLeft window.pageYOffset or document.documentElement.scrollTop or document.body.scrollTop ] # Returns the dimensions of the viewport (currently visible browser area) viewportDimensions: -> { width: document.documentElement.clientWidth height: document.documentElement.clientHeight } # Returns an object with x and y mousePosition: (e) -> pos = x: 0, y: 0 e ?= window.event return unless e? if e.pageX or e.pageY pos.x = e.pageX pos.y = e.pageY else if e.clientX or e.clientY pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop pos # Returns the offset of the element offset: (element) -> offset = $(element).offset() { top: offset.top left: offset.left } # Observe given eventName observe: (element, eventName, observer) -> $(element).on eventName, observer # Stop observing event stopObserving: (element, eventName, observer) -> $(element).unbind eventName, observer # Perform an AJAX request and call the appropriate callbacks. ajax: (options) -> throw new Error "No url provided" unless options.url? reqwest url: options.url type: 'html' method: options.method?.toUpperCase() ? "GET" error: (resp) -> options.onError? "Server responded with status #{resp.status}" success: (resp) -> options.onSuccess? resp complete: -> options.onComplete?() # Utility functions # ================= # Creates a shallow copy of the object clone: (object) -> newObject = { } for own key, val of object newObject[key] = val newObject # Copies all properties from sources to target extend: (target, sources...) -> for source in sources for own key, val of source target[key] = val target # Add the adapter to the list Opentip.addAdapter new Adapter )(ender) opentip-2.4.6/src/adapter-jquery.coffee000066400000000000000000000100301213277401600200730ustar00rootroot00000000000000# jQuery Opentip Adapter # ====================== # # Uses jQuery # Because $ is my favorite character (($) -> # Augment jQuery $.fn.opentip = (content, title, options) -> new Opentip this, content, title, options # And now the class class Adapter name: "jquery" # Simply using $.domReady domReady: (callback) -> $ callback # DOM # === # Using bonzo to create html create: (html) -> $ html # Element handling # ---------------- # Wraps the element in ender wrap: (element) -> element = $ element throw new Error "Multiple elements provided." if element.length > 1 element # Returns the unwrapped element unwrap: (element) -> $(element)[0] # Returns the tag name of the element tagName: (element) -> @unwrap(element).tagName # Returns or sets the given attribute of element # # It's important not to simply forward name and value because the value # is set whether or not the value argument is present attr: (element, args...) -> $(element).attr args... # Returns or sets the given data of element # It's important not to simply forward name and value because the value # is set whether or not the value argument is present data: (element, args...) -> $(element).data args... # Finds elements by selector find: (element, selector) -> $(element).find(selector).get(0) # Finds all elements by selector findAll: (element, selector) -> $(element).find selector # Updates the content of the element update: (element, content, escape) -> element = $ element if escape element.text content else element.html content # Appends given child to element append: (element, child) -> $(element).append child # Removes element remove: (element) -> $(element).remove() # Add a class addClass: (element, className) -> $(element).addClass className # Remove a class removeClass: (element, className) -> $(element).removeClass className # Set given css properties css: (element, properties) -> $(element).css properties # Returns an object with given dimensions dimensions: (element) -> { width: $(element).outerWidth() height: $(element).outerHeight() } # Returns the scroll offsets of current document scrollOffset: -> [ window.pageXOffset or document.documentElement.scrollLeft or document.body.scrollLeft window.pageYOffset or document.documentElement.scrollTop or document.body.scrollTop ] # Returns the dimensions of the viewport (currently visible browser area) viewportDimensions: -> { width: document.documentElement.clientWidth height: document.documentElement.clientHeight } # Returns an object with x and y mousePosition: (e) -> return null unless e? x: e.pageX, y: e.pageY # Returns the offset of the element offset: (element) -> offset = $(element).offset() { left: offset.left top: offset.top } # Observe given eventName observe: (element, eventName, observer) -> $(element).bind eventName, observer # Stop observing event stopObserving: (element, eventName, observer) -> $(element).unbind eventName, observer # Perform an AJAX request and call the appropriate callbacks. ajax: (options) -> throw new Error "No url provided" unless options.url? $.ajax( url: options.url type: options.method?.toUpperCase() ? "GET" ) .done((content) -> options.onSuccess? content) .fail((request) -> options.onError? "Server responded with status #{request.status}") .always(-> options.onComplete?()) # Utility functions # ================= # Creates a shallow copy of the object clone: (object) -> $.extend { }, object # Copies all properties from sources to target extend: (target, sources...) -> $.extend target, sources... # Add the adapter to the list Opentip.addAdapter new Adapter )(jQuery) opentip-2.4.6/src/adapter-native.coffee000066400000000000000000000176111213277401600200560ustar00rootroot00000000000000 # Native Opentip Adapter # ====================== # # Use this adapter if you don't use a framework like jQuery and you don't # really care about oldschool browser compatibility. class Adapter name: "native" # Invoke callback as soon as dom is ready # Source: https://github.com/dperini/ContentLoaded/blob/master/src/contentloaded.js domReady: (callback) -> done = no top = true win = window doc = document return callback() if doc.readyState in [ "complete", "loaded" ] root = doc.documentElement add = (if doc.addEventListener then "addEventListener" else "attachEvent") rem = (if doc.addEventListener then "removeEventListener" else "detachEvent") pre = (if doc.addEventListener then "" else "on") init = (e) -> return if e.type is "readystatechange" and doc.readyState isnt "complete" (if e.type is "load" then win else doc)[rem] pre + e.type, init, false unless done done = yes callback() poll = -> try root.doScroll "left" catch e setTimeout poll, 50 return init "poll" unless doc.readyState is "complete" if doc.createEventObject and root.doScroll try top = not win.frameElement poll() if top doc[add] pre + "DOMContentLoaded", init, false doc[add] pre + "readystatechange", init, false win[add] pre + "load", init, false # DOM # === # Create the HTML passed as string create: (htmlString) -> div = document.createElement "div" div.innerHTML = htmlString @wrap div.childNodes # Element handling # ---------------- # Wrap the element in the framework wrap: (element) -> if !element element = [ ] else if typeof element == "string" element = @find document.body, element element = if element then [ element ] else [ ] else if element instanceof NodeList element = (el for el in element) else if element not instanceof Array element = [ element ] element # Returns the unwrapped element unwrap: (element) -> @wrap(element)[0] # Returns the tag name of the element tagName: (element) -> @unwrap(element).tagName # Returns or sets the given attribute of element attr: (element, attr, value) -> if arguments.length == 3 @unwrap(element).setAttribute attr, value else @unwrap(element).getAttribute attr lastDataId = 0 dataValues = { } # Returns or sets the given data of element data: (element, name, value) -> dataId = @attr element, "data-id" unless dataId dataId = ++lastDataId @attr element, "data-id", dataId dataValues[dataId] = { } if arguments.length == 3 # Setter dataValues[dataId][name] = value else value = dataValues[dataId][name] return value if value? value = @attr element, "data-#{Opentip::dasherize name}" if value dataValues[dataId][name] = value return value # Finds elements by selector find: (element, selector) -> @unwrap(element).querySelector selector # Finds all elements by selector findAll: (element, selector) -> @unwrap(element).querySelectorAll selector # Updates the content of the element update: (element, content, escape) -> element = @unwrap element if escape element.innerHTML = "" # Clearing the content element.appendChild document.createTextNode content else element.innerHTML = content # Appends given child to element append: (element, child) -> unwrappedChild = @unwrap child unwrappedElement = @unwrap element unwrappedElement.appendChild unwrappedChild # Removes element remove: (element) -> element = @unwrap element parentNode = element.parentNode parentNode.removeChild element if parentNode? # Add a class addClass: (element, className) -> @unwrap(element).classList.add className # Remove a class removeClass: (element, className) -> @unwrap(element).classList.remove className # Set given css properties css: (element, properties) -> element = @unwrap @wrap element for own key, value of properties element.style[key] = value # Returns an object with given dimensions dimensions: (element) -> element = @unwrap @wrap element dimensions = width: element.offsetWidth height: element.offsetHeight unless dimensions.width and dimensions.height # The element is probably invisible. So make it visible revert = position: element.style.position || '' visibility: element.style.visibility || '' display: element.style.display || '' @css element, position: "absolute" visibility: "hidden" display: "block" dimensions = width: element.offsetWidth height: element.offsetHeight @css element, revert dimensions # Returns the scroll offsets of current document scrollOffset: -> [ window.pageXOffset or document.documentElement.scrollLeft or document.body.scrollLeft window.pageYOffset or document.documentElement.scrollTop or document.body.scrollTop ] # Returns the dimensions of the viewport (currently visible browser area) viewportDimensions: -> { width: document.documentElement.clientWidth height: document.documentElement.clientHeight } # Returns an object with x and y mousePosition: (e) -> pos = x: 0, y: 0 e ?= window.event return unless e? try if e.pageX or e.pageY pos.x = e.pageX pos.y = e.pageY else if e.clientX or e.clientY pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop catch e pos # Returns the offset of the element offset: (element) -> element = @unwrap element offset = { top: element.offsetTop left: element.offsetLeft } while element = element.offsetParent offset.top += element.offsetTop offset.left += element.offsetLeft if element != document.body offset.top -= element.scrollTop offset.left -= element.scrollLeft offset # Observe given eventName observe: (element, eventName, observer) -> # Firefox <= 3.6 needs the last optional parameter `useCapture` @unwrap(element).addEventListener eventName, observer, false # Stop observing event stopObserving: (element, eventName, observer) -> # Firefox <= 3.6 needs the last optional parameter `useCapture` @unwrap(element).removeEventListener eventName, observer, false # Perform an AJAX request and call the appropriate callbacks. ajax: (options) -> throw new Error "No url provided" unless options.url? if window.XMLHttpRequest # Mozilla, Safari, ... request = new XMLHttpRequest else if window.ActiveXObject # IE try request = new ActiveXObject "Msxml2.XMLHTTP" catch e try request = new ActiveXObject "Microsoft.XMLHTTP" catch e throw new Error "Can't create XMLHttpRequest" unless request request.onreadystatechange = -> if request.readyState == 4 try if request.status == 200 options.onSuccess? request.responseText else options.onError? "Server responded with status #{request.status}" catch e options.onError? e.message options.onComplete?() request.open options.method?.toUpperCase() ? "GET", options.url request.send() # Utility functions # ================= # Creates a shallow copy of the object clone: (object) -> newObject = { } for own key, val of object newObject[key] = val newObject # Copies all properties from sources to target extend: (target, sources...) -> for source in sources for own key, val of source target[key] = val target # Add the adapter to the list Opentip.addAdapter new Adapter opentip-2.4.6/src/adapter-prototype.coffee000066400000000000000000000114221213277401600206270ustar00rootroot00000000000000# Prototype Opentip Adapter # ====================== # # Uses the prototype framework do -> Element.addMethods addTip: (element, content, title, options) -> new Opentip element, content, title, options # Needs this function because of IE8 isArrayOrNodeList = (element) -> if (element instanceof Array) or (element? and typeof element.length == 'number' and typeof element.item == 'function' and typeof element.nextNode == 'function' and typeof element.reset == 'function') return yes return no # And now the class class Adapter name: "prototype" domReady: (callback) -> if document.loaded callback() else $(document).observe "dom:loaded", callback # DOM # === # Using bonzo to create html create: (html) -> new Element('div').update(html).childElements() # Element handling # ---------------- # Wraps the element wrap: (element) -> if isArrayOrNodeList element throw new Error "Multiple elements provided." if element.length > 1 element = @unwrap element else if typeof element == "string" element = $$(element)[0] $ element # Returns the unwrapped element unwrap: (element) -> if isArrayOrNodeList element element[0] else element # Returns the tag name of the element tagName: (element) -> @unwrap(element).tagName # Returns or sets the given attribute of element # # It's important not to simply forward name and value because the value # is set whether or not the value argument is present attr: (element, args...) -> if args.length == 1 @wrap(element).readAttribute args[0] else @wrap(element).writeAttribute args... # Returns or sets the given data of element # It's important not to simply forward name and value because the value # is set whether or not the value argument is present data: (element, name, value) -> @wrap(element) if arguments.length > 2 element.store name, value else arg = element.readAttribute "data-#{name.underscore().dasherize()}" return arg if arg? element.retrieve name # Finds elements by selector find: (element, selector) -> @wrap(element).select(selector)[0] # Finds all elements by selector findAll: (element, selector) -> @wrap(element).select selector # Updates the content of the element update: (element, content, escape) -> @wrap(element).update if escape then content.escapeHTML() else content # Appends given child to element append: (element, child) -> @wrap(element).insert @wrap child # Removes element remove: (element) -> @wrap(element).remove() # Add a class addClass: (element, className) -> @wrap(element).addClassName className # Remove a class removeClass: (element, className) -> @wrap(element).removeClassName className # Set given css properties css: (element, properties) -> @wrap(element).setStyle properties # Returns an object with given dimensions dimensions: (element) -> @wrap(element).getDimensions() # Returns the scroll offsets of current document scrollOffset: -> offsets = document.viewport.getScrollOffsets() [ offsets.left, offsets.top ] # Returns the dimensions of the viewport (currently visible browser area) viewportDimensions: -> document.viewport.getDimensions() # Returns an object with x and y mousePosition: (e) -> return null unless e? x: Event.pointerX(e), y: Event.pointerY(e) # Returns the offset of the element offset: (element) -> offset = @wrap(element).cumulativeOffset() left: offset.left, top: offset.top # Observe given eventName observe: (element, eventName, observer) -> Event.observe @wrap(element), eventName, observer # Stop observing event stopObserving: (element, eventName, observer) -> Event.stopObserving @wrap(element), eventName, observer # Perform an AJAX request and call the appropriate callbacks. ajax: (options) -> throw new Error "No url provided" unless options.url? new Ajax.Request options.url, { method: options.method?.toUpperCase() ? "GET" onSuccess: (response) -> options.onSuccess? response.responseText onFailure: (response) -> options.onError? "Server responded with status #{response.status}" onComplete: -> options.onComplete?() } # Utility functions # ================= # Creates a shallow copy of the object clone: (object) -> Object.clone(object) # Copies all properties from sources to target extend: (target, sources...) -> for source in sources Object.extend target, source target # Add the adapter to the list Opentip.addAdapter new Adapter opentip-2.4.6/src/opentip.coffee000066400000000000000000001531771213277401600166400ustar00rootroot00000000000000### # # Opentip v2.4.6 # # More info at [www.opentip.org](http://www.opentip.org) # # Copyright (c) 2012, Matias Meno # Graphics by Tjandra Mayerhold # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # ### # Opentip # ------- # # Usage: # #
# # or externally: # # new Opentip(element, content, title, options); # # For a full documentation, please visit [www.opentip.org](http://www.opentip.org) class Opentip STICKS_OUT_TOP: 1 STICKS_OUT_BOTTOM: 2 STICKS_OUT_LEFT: 1 STICKS_OUT_RIGHT: 2 class: container: "opentip-container" opentip: "opentip" header: "ot-header" content: "ot-content" loadingIndicator: "ot-loading-indicator" close: "ot-close" goingToHide: "ot-going-to-hide" hidden: "ot-hidden" hiding: "ot-hiding" goingToShow: "ot-going-to-show" showing: "ot-showing" visible: "ot-visible" loading: "ot-loading" ajaxError: "ot-ajax-error" fixed: "ot-fixed" showEffectPrefix: "ot-show-effect-" hideEffectPrefix: "ot-hide-effect-" stylePrefix: "style-" # Sets up and configures the tooltip but does **not** build the html elements. # # `content`, `title` and `options` are optional but have to be in this order. constructor: (element, content, title, options) -> @id = ++Opentip.lastId @debug "Creating Opentip." Opentip.tips.push this @adapter = Opentip.adapter # Add the ID to the element elementsOpentips = @adapter.data(element, "opentips") || [ ] elementsOpentips.push this @adapter.data element, "opentips", elementsOpentips @triggerElement = @adapter.wrap element throw new Error "You can't call Opentip on multiple elements." if @triggerElement.length > 1 throw new Error "Invalid element." if @triggerElement.length < 1 # AJAX @loaded = no @loading = no @visible = no @waitingToShow = no @waitingToHide = no # Some initial values @currentPosition = left: 0, top: 0 @dimensions = width: 100, height: 50 @content = "" @redraw = on @currentObservers = showing: no visible: no hiding: no hidden: no # Make sure to not overwrite the users options object options = @adapter.clone options if typeof content == "object" options = content content = title = undefined else if typeof title == "object" options = title title = undefined # Now build the complete options object from the styles options.title = title if title? @setContent content if content? unless options.extends? if options.style? options.extends = options.style else options.extends = Opentip.defaultStyle optionSources = [ options ] # Now add go through the theme hierarchy and apply the options _tmpStyle = options while _tmpStyle.extends styleName = _tmpStyle.extends _tmpStyle = Opentip.styles[styleName] throw new Error "Invalid style: #{styleName}" unless _tmpStyle? optionSources.unshift _tmpStyle # Now making sure that all styles result in the standard style, even when not # specified _tmpStyle.extends = "standard" unless _tmpStyle.extends? or styleName == "standard" options = @adapter.extend { }, optionSources... # Deep copying the hideTriggers array options.hideTriggers = (hideTrigger for hideTrigger in options.hideTriggers) options.hideTriggers.push options.hideTrigger if options.hideTrigger and options.hideTriggers.length == 0 # Sanitize all positions options[prop] = new Opentip.Joint(options[prop]) for prop in [ "tipJoint" "targetJoint" "stem" ] when options[prop] and typeof options[prop] == "string" # If the url of an Ajax request is not set, get it from the link it's attached to. if options.ajax and (options.ajax == on or not options.ajax) if @adapter.tagName(@triggerElement) == "A" options.ajax = @adapter.attr @triggerElement, "href" else options.ajax = off # If the event is 'click', no point in following a link if options.showOn == "click" && @adapter.tagName(@triggerElement) == "A" @adapter.observe @triggerElement, "click", (e) -> e.preventDefault() e.stopPropagation() e.stopped = yes # Doesn't make sense to use a target without the opentip being fixed options.fixed = yes if options.target options.stem = new Opentip.Joint(options.tipJoint) if options.stem == yes if options.target == yes options.target = @triggerElement else if options.target options.target = @adapter.wrap options.target @currentStem = options.stem unless options.delay? options.delay = if options.showOn == "mouseover" then 0.2 else 0 unless options.targetJoint? options.targetJoint = new Opentip.Joint(options.tipJoint).flip() # Used to show the opentip obviously @showTriggers = [ ] # Those ensure that opentip doesn't disappear when hovering other related elements @showTriggersWhenVisible = [ ] # Elements that hide Opentip @hideTriggers = [ ] # The obvious showTriggerELementWhenHidden is the options.showOn if options.showOn and options.showOn != "creation" @showTriggers.push element: @triggerElement event: options.showOn # Backwards compatibility if options.ajaxCache? options.cache = options.ajaxCache delete options.ajaxCache @options = options @bound = { } @bound[methodToBind] = (do (methodToBind) => return => @[methodToBind](arguments...)) for methodToBind in [ "prepareToShow" "prepareToHide" "show" "hide" "reposition" ] # Build the HTML elements when the dom is ready. @adapter.domReady => @activate() @prepareToShow() if @options.showOn == "creation" # Initializes the tooltip by creating the container and setting up the event # listeners. # # This does not yet create all elements. They are created when the tooltip # actually shows for the first time. _setup: -> @debug "Setting up the tooltip." @_buildContainer() @hideTriggers = [ ] for hideTrigger, i in @options.hideTriggers hideTriggerElement = null hideOn = if @options.hideOn instanceof Array then @options.hideOn[i] else @options.hideOn if typeof hideTrigger == "string" switch hideTrigger when "trigger" hideOn = hideOn || "mouseout" hideTriggerElement = @triggerElement when "tip" hideOn = hideOn || "mouseover" hideTriggerElement = @container when "target" hideOn = hideOn || "mouseover" hideTriggerElement = this.options.target when "closeButton" # The close button gets handled later else throw new Error "Unknown hide trigger: #{hideTrigger}." else hideOn = hideOn || "mouseover" hideTriggerElement = @adapter.wrap hideTrigger if hideTriggerElement @hideTriggers.push element: hideTriggerElement event: hideOn original: hideTrigger # Now setup the events that make sure opentips don't appear when mouseover # another hideTrigger # # This also solves the problem of the tooltip disappearing when hovering child # elements (Hovering children fires a mouseout mouseover event) for hideTrigger in @hideTriggers @showTriggersWhenVisible.push element: hideTrigger.element event: "mouseover" # This just builds the opentip container, which is the absolute minimum to # attach events to it. # # The actual creation of the elements is in buildElements() _buildContainer: -> @container = @adapter.create """
""" @adapter.css @container, position: "absolute" @adapter.addClass @container, @class.loading if @options.ajax @adapter.addClass @container, @class.fixed if @options.fixed @adapter.addClass @container, "#{@class.showEffectPrefix}#{@options.showEffect}" if @options.showEffect @adapter.addClass @container, "#{@class.hideEffectPrefix}#{@options.hideEffect}" if @options.hideEffect # Builds all elements inside the container and put the container in body. _buildElements: -> # The actual content will be set by `_updateElementContent()` @tooltipElement = @adapter.create """
""" @backgroundCanvas = @adapter.wrap document.createElement "canvas" @adapter.css @backgroundCanvas, position: "absolute" G_vmlCanvasManager?.initElement @adapter.unwrap @backgroundCanvas headerElement = @adapter.find @tooltipElement, ".#{@class.header}" if @options.title # Create the title element and append it to the header titleElement = @adapter.create """

""" @adapter.update titleElement, @options.title, @options.escapeTitle @adapter.append headerElement, titleElement if @options.ajax and !@loaded @adapter.append @tooltipElement, @adapter.create """
↻
""" if "closeButton" in @options.hideTriggers @closeButtonElement = @adapter.create """Close""" @adapter.append headerElement, @closeButtonElement # Now put the tooltip and the canvas in the container and the container in the body @adapter.append @container, @backgroundCanvas @adapter.append @container, @tooltipElement @adapter.append document.body, @container # Makes sure that the content is redrawn. @_newContent = yes @redraw = on # Sets the content and updates the HTML element if currently visible # # This can be a function or a string. The function will be executed, and the # result used as new content of the tooltip. setContent: (@content) -> @_newContent = yes if typeof @content == "function" @_contentFunction = @content @content = "" else @_contentFunction = null @_updateElementContent() if @visible # Actually updates the content. # # If content is a function it is evaluated here. _updateElementContent: -> if @_newContent or (!@options.cache and @_contentFunction) contentDiv = @adapter.find @container, ".#{@class.content}" if contentDiv? if @_contentFunction @debug "Executing content function." @content = @_contentFunction this @adapter.update contentDiv, @content, @options.escapeContent @_newContent = no @_storeAndLockDimensions() @reposition() # Sets width auto to the element so it uses the appropriate width, gets the # dimensions and sets them so the tolltip won't change in size (which can be # annoying when the tooltip gets too close to the browser edge) _storeAndLockDimensions: -> return unless @container prevDimension = @dimensions @adapter.css @container, width: "auto" left: "0px" # So it doesn't force wrapping top: "0px" @dimensions = @adapter.dimensions @container # Firefox <=3.6 has a strange wrapping proplem when taking the exact width @dimensions.width += 1 @adapter.css @container, width: "#{@dimensions.width}px" top: "#{@currentPosition.top}px" left: "#{@currentPosition.left}px" unless @_dimensionsEqual @dimensions, prevDimension @redraw = on @_draw() # Sets up appropriate observers activate: -> @_setupObservers "hidden", "hiding" # Hides the tooltip and sets up appropriate observers deactivate: -> @debug "Deactivating tooltip." @hide() @_setupObservers "-showing", "-visible", "-hidden", "-hiding" # If a state starts with a minus all observers are removed instead of set. _setupObservers: (states...) -> for state in states removeObserver = no if state.charAt(0) == "-" removeObserver = yes state = state.substr 1 # Remove leading - # Do nothing if the state is already achieved continue if @currentObservers[state] is not removeObserver @currentObservers[state] = not removeObserver observeOrStop = (args...) => if removeObserver then @adapter.stopObserving args... else @adapter.observe args... switch state when "showing" # Setup the triggers to hide the tip for trigger in @hideTriggers observeOrStop trigger.element, trigger.event, @bound.prepareToHide # Start listening to window changes observeOrStop (if document.onresize? then document else window), "resize", @bound.reposition observeOrStop window, "scroll", @bound.reposition when "visible" # Most of the observers have already been handled by "showing" # Add the triggers that make sure opentip doesn't hide prematurely for trigger in @showTriggersWhenVisible observeOrStop trigger.element, trigger.event, @bound.prepareToShow when "hiding" # Setup the triggers to show the tip for trigger in @showTriggers observeOrStop trigger.element, trigger.event, @bound.prepareToShow when "hidden" # Nothing to do since all observers are setup in "hiding" else throw new Error "Unknown state: #{state}" null # No unnecessary array collection prepareToShow: -> @_abortHiding() @_abortShowing() return if @visible @debug "Showing in #{@options.delay}s." @_setup() unless @container? Opentip._abortShowingGroup @options.group, this if @options.group @preparingToShow = true # Even though it is not yet visible, I already attach the observers, so the # tooltip won't show if a hideEvent is triggered. @_setupObservers "-hidden", "-hiding", "showing" # Making sure the tooltip is at the right position as soon as it shows @_followMousePosition() @initialMousePosition = mousePosition if @options.fixed and !@options.target # Used in reposition @reposition() @_showTimeoutId = @setTimeout @bound.show, @options.delay || 0 show: -> @_abortHiding() return if @visible @_clearTimeouts() return @deactivate() unless @_triggerElementExists() @debug "Showing now." @_setup() unless @container? Opentip._hideGroup @options.group, this if @options.group @visible = yes @preparingToShow = no @_buildElements() unless @tooltipElement? @_updateElementContent() @_loadAjax() if @options.ajax and (not @loaded or not @options.cache) @_searchAndActivateCloseButtons() @_startEnsureTriggerElement() @adapter.css @container, zIndex: Opentip.lastZIndex++ # The order is important here! Do not reverse. # Removing the showing and visible triggers as well in case they have been # removed by -hidden or -hiding @_setupObservers "-hidden", "-hiding", "-showing", "-visible", "showing", "visible" @initialMousePosition = mousePosition if @options.fixed and !@options.target # Used in reposition @reposition() @adapter.removeClass @container, @class.hiding @adapter.removeClass @container, @class.hidden @adapter.addClass @container, @class.goingToShow @setCss3Style @container, transitionDuration: "0s" @defer => # Since this function is deferred, a hide() call could have already been made return if !@visible or @preparingToHide @adapter.removeClass @container, @class.goingToShow @adapter.addClass @container, @class.showing delay = 0 delay = @options.showEffectDuration if @options.showEffect and @options.showEffectDuration @setCss3Style @container, transitionDuration: "#{delay}s" @_visibilityStateTimeoutId = @setTimeout => @adapter.removeClass @container, @class.showing @adapter.addClass @container, @class.visible , delay @_activateFirstInput() # Just making sure the canvas has been drawn initially. # It could happen that the canvas isn't drawn yet when reposition is called # once before the canvas element has been created. If the position # doesn't change after it will never call @_draw() again. @_draw() _abortShowing: -> if @preparingToShow @debug "Aborting showing." @_clearTimeouts() @_stopFollowingMousePosition() @preparingToShow = false @_setupObservers "-showing", "-visible", "hiding", "hidden" prepareToHide: -> @_abortShowing() @_abortHiding() return unless @visible @debug "Hiding in #{@options.hideDelay}s" @preparingToHide = yes # We start observing even though it is not yet hidden, so the tooltip does # not disappear when a showEvent is triggered. @_setupObservers "-showing", "visible", "-hidden", "hiding" @_hideTimeoutId = @setTimeout @bound.hide, @options.hideDelay hide: -> @_abortShowing() return unless @visible @_clearTimeouts() @debug "Hiding!" @visible = no @preparingToHide = no @_stopEnsureTriggerElement() # Removing hiding and hidden as well in case some events have been removed # by -showing or -visible @_setupObservers "-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden" @_stopFollowingMousePosition() unless @options.fixed return unless @container @adapter.removeClass @container, @class.visible @adapter.removeClass @container, @class.showing @adapter.addClass @container, @class.goingToHide @setCss3Style @container, transitionDuration: "0s" @defer => @adapter.removeClass @container, @class.goingToHide @adapter.addClass @container, @class.hiding hideDelay = 0 hideDelay = @options.hideEffectDuration if @options.hideEffect and @options.hideEffectDuration @setCss3Style @container, { transitionDuration: "#{hideDelay}s" } @_visibilityStateTimeoutId = @setTimeout => @adapter.removeClass @container, @class.hiding @adapter.addClass @container, @class.hidden @setCss3Style @container, { transitionDuration: "0s" } if @options.removeElementsOnHide @debug "Removing HTML elements." @adapter.remove @container delete @container delete @tooltipElement , hideDelay _abortHiding: -> if @preparingToHide @debug "Aborting hiding." @_clearTimeouts() @preparingToHide = no @_setupObservers "-hiding", "showing", "visible" reposition: -> position = @getPosition() return unless position? stem = @options.stem {position, stem} = @_ensureViewportContainment position if @options.containInViewport # If the position didn't change, no need to do anything return if @_positionsEqual position, @currentPosition # The only time the canvas has to bee redrawn is when the stem changes. @redraw = on unless !@options.stem or stem.eql @currentStem @currentPosition = position @currentStem = stem # _draw() itself tests if it has to be redrawn. @_draw() @adapter.css @container, { left: "#{position.left}px", top: "#{position.top}px" } # Following is a redraw fix, because I noticed some drawing errors in # some browsers when tooltips where overlapping. @defer => rawContainer = @adapter.unwrap @container # I chose visibility instead of display so that I don't interfere with # appear/disappear effects. rawContainer.style.visibility = "hidden" redrawFix = rawContainer.offsetHeight rawContainer.style.visibility = "visible" getPosition: (tipJoint, targetJoint, stem) -> return unless @container tipJoint ?= @options.tipJoint targetJoint ?= @options.targetJoint position = { } if @options.target # Position is fixed targetPosition = @adapter.offset @options.target targetDimensions = @adapter.dimensions @options.target position = targetPosition if targetJoint.right # For wrapping inline elements, left + width does not give the right # border, because left is where the element started, not its most left # position. unwrappedTarget = @adapter.unwrap @options.target if unwrappedTarget.getBoundingClientRect? # TODO: make sure this actually works. position.left = unwrappedTarget.getBoundingClientRect().right + (window.pageXOffset ? document.body.scrollLeft) else # Well... browser doesn't support it position.left += targetDimensions.width else if targetJoint.center # Center position.left += Math.round targetDimensions.width / 2 if targetJoint.bottom position.top += targetDimensions.height else if targetJoint.middle # Middle position.top += Math.round targetDimensions.height / 2 if @options.borderWidth if @options.tipJoint.left position.left += @options.borderWidth if @options.tipJoint.right position.left -= @options.borderWidth if @options.tipJoint.top position.top += @options.borderWidth else if @options.tipJoint.bottom position.top -= @options.borderWidth else if @initialMousePosition # When the tooltip is fixed and has no target the position is stored at the beginning. position = top: @initialMousePosition.y, left: @initialMousePosition.x else # Follow mouse position = top: mousePosition.y, left: mousePosition.x if @options.autoOffset stemLength = if @options.stem then @options.stemLength else 0 # If there is as stem offsets dont need to be that big if fixed. offsetDistance = if stemLength and @options.fixed then 2 else 10 # Corners can be closer but when middle or center they are too close additionalHorizontal = if tipJoint.middle and not @options.fixed then 15 else 0 additionalVertical = if tipJoint.center and not @options.fixed then 15 else 0 if tipJoint.right then position.left -= offsetDistance + additionalHorizontal else if tipJoint.left then position.left += offsetDistance + additionalHorizontal if tipJoint.bottom then position.top -= offsetDistance + additionalVertical else if tipJoint.top then position.top += offsetDistance + additionalVertical if stemLength stem ?= @options.stem if stem.right then position.left -= stemLength else if stem.left then position.left += stemLength if stem.bottom then position.top -= stemLength else if stem.top then position.top += stemLength position.left += @options.offset[0] position.top += @options.offset[1] if tipJoint.right then position.left -= @dimensions.width else if tipJoint.center then position.left -= Math.round @dimensions.width / 2 if tipJoint.bottom then position.top -= @dimensions.height else if tipJoint.middle then position.top -= Math.round @dimensions.height / 2 position _ensureViewportContainment: (position) -> stem = @options.stem originals = { position: position stem: stem } # Sometimes the element is theoretically visible, but an effect is not yet showing it. # So the calculation of the offsets is incorrect sometimes, which results in faulty repositioning. return originals unless @visible and position sticksOut = @_sticksOut position return originals unless sticksOut[0] or sticksOut[1] tipJoint = new Opentip.Joint @options.tipJoint targetJoint = new Opentip.Joint @options.targetJoint if @options.targetJoint scrollOffset = @adapter.scrollOffset() viewportDimensions = @adapter.viewportDimensions() # The opentip's position inside the viewport viewportPosition = [ position.left - scrollOffset[0] position.top - scrollOffset[1] ] needsRepositioning = no if viewportDimensions.width >= @dimensions.width # Well if the viewport is smaller than the tooltip there's not much to do if sticksOut[0] needsRepositioning = yes switch sticksOut[0] when @STICKS_OUT_LEFT tipJoint.setHorizontal "left" targetJoint.setHorizontal "right" if @options.targetJoint when @STICKS_OUT_RIGHT tipJoint.setHorizontal "right" targetJoint.setHorizontal "left" if @options.targetJoint if viewportDimensions.height >= @dimensions.height # Well if the viewport is smaller than the tooltip there's not much to do if sticksOut[1] needsRepositioning = yes switch sticksOut[1] when @STICKS_OUT_TOP tipJoint.setVertical "top" targetJoint.setVertical "bottom" if @options.targetJoint when @STICKS_OUT_BOTTOM tipJoint.setVertical "bottom" targetJoint.setVertical "top" if @options.targetJoint return originals unless needsRepositioning # Needs to reposition # TODO: actually handle the stem here stem = tipJoint if @options.stem position = @getPosition tipJoint, targetJoint, stem newSticksOut = @_sticksOut position revertedX = no revertedY = no if newSticksOut[0] and (newSticksOut[0] isnt sticksOut[0]) # The tooltip changed sides, but now is sticking out the other side of # the window. revertedX = yes tipJoint.setHorizontal @options.tipJoint.horizontal targetJoint.setHorizontal @options.targetJoint.horizontal if @options.targetJoint if newSticksOut[1] and (newSticksOut[1] isnt sticksOut[1]) revertedY = yes tipJoint.setVertical @options.tipJoint.vertical targetJoint.setVertical @options.targetJoint.vertical if @options.targetJoint return originals if revertedX and revertedY if revertedX or revertedY # One of the positions have been reverted. So get the position again. stem = tipJoint if @options.stem position = @getPosition tipJoint, targetJoint, stem { position: position stem: stem } _sticksOut: (position) -> scrollOffset = @adapter.scrollOffset() viewportDimensions = @adapter.viewportDimensions() positionOffset = [ position.left - scrollOffset[0] position.top - scrollOffset[1] ] sticksOut = [ no, no ] if positionOffset[0] < 0 sticksOut[0] = @STICKS_OUT_LEFT else if positionOffset[0] + @dimensions.width > viewportDimensions.width sticksOut[0] = @STICKS_OUT_RIGHT if positionOffset[1] < 0 sticksOut[1] = @STICKS_OUT_TOP else if positionOffset[1] + @dimensions.height > viewportDimensions.height sticksOut[1] = @STICKS_OUT_BOTTOM sticksOut # This is by far the most complex and difficult function to understand. It # actually draws the canvas. # # I tried to comment everything as good as possible. _draw: -> # This function could be called before _buildElements() return unless @backgroundCanvas and @redraw @debug "Drawing background." @redraw = off # Take care of the classes if @currentStem @adapter.removeClass @container, "stem-#{position}" for position in [ "top", "right", "bottom", "left" ] @adapter.addClass @container, "stem-#{@currentStem.horizontal}" @adapter.addClass @container, "stem-#{@currentStem.vertical}" # Prepare for the close button closeButtonInner = [ 0, 0 ] closeButtonOuter = [ 0, 0 ] if "closeButton" in @options.hideTriggers closeButton = new Opentip.Joint(if @currentStem?.toString() == "top right" then "top left" else "top right") closeButtonInner = [ @options.closeButtonRadius + @options.closeButtonOffset[0] @options.closeButtonRadius + @options.closeButtonOffset[1] ] closeButtonOuter = [ @options.closeButtonRadius - @options.closeButtonOffset[0] @options.closeButtonRadius - @options.closeButtonOffset[1] ] # Now for the canvas dimensions and position canvasDimensions = @adapter.clone @dimensions canvasPosition = [ 0, 0 ] # Account for border if @options.borderWidth canvasDimensions.width += @options.borderWidth * 2 canvasDimensions.height += @options.borderWidth * 2 canvasPosition[0] -= @options.borderWidth canvasPosition[1] -= @options.borderWidth # Account for the shadow if @options.shadow canvasDimensions.width += @options.shadowBlur * 2 # If the shadow offset is bigger than the actual shadow blur, the whole canvas gets bigger canvasDimensions.width += Math.max 0, @options.shadowOffset[0] - @options.shadowBlur * 2 canvasDimensions.height += @options.shadowBlur * 2 canvasDimensions.height += Math.max 0, @options.shadowOffset[1] - @options.shadowBlur * 2 canvasPosition[0] -= Math.max 0, @options.shadowBlur - @options.shadowOffset[0] canvasPosition[1] -= Math.max 0, @options.shadowBlur - @options.shadowOffset[1] # * * * # Bulges could be caused by stems or close buttons bulge = left: 0, right: 0, top: 0, bottom: 0 # Account for the stem if @currentStem if @currentStem.left then bulge.left = @options.stemLength else if @currentStem.right then bulge.right = @options.stemLength if @currentStem.top then bulge.top = @options.stemLength else if @currentStem.bottom then bulge.bottom = @options.stemLength # Account for the close button if closeButton if closeButton.left then bulge.left = Math.max bulge.left, closeButtonOuter[0] else if closeButton.right then bulge.right = Math.max bulge.right, closeButtonOuter[0] if closeButton.top then bulge.top = Math.max bulge.top, closeButtonOuter[1] else if closeButton.bottom then bulge.bottom = Math.max bulge.bottom, closeButtonOuter[1] canvasDimensions.width += bulge.left + bulge.right canvasDimensions.height += bulge.top + bulge.bottom canvasPosition[0] -= bulge.left canvasPosition[1] -= bulge.top if @currentStem and @options.borderWidth {stemLength, stemBase} = @_getPathStemMeasures @options.stemBase, @options.stemLength, @options.borderWidth # Need to draw on the DOM canvas element itself backgroundCanvas = @adapter.unwrap @backgroundCanvas backgroundCanvas.width = canvasDimensions.width backgroundCanvas.height = canvasDimensions.height @adapter.css @backgroundCanvas, width: "#{backgroundCanvas.width}px" height: "#{backgroundCanvas.height}px" left: "#{canvasPosition[0]}px" top: "#{canvasPosition[1]}px" ctx = backgroundCanvas.getContext "2d" ctx.setTransform 1, 0, 0, 1, 0, 0 ctx.clearRect 0, 0, backgroundCanvas.width, backgroundCanvas.height ctx.beginPath() ctx.fillStyle = @_getColor ctx, @dimensions, @options.background, @options.backgroundGradientHorizontal ctx.lineJoin = "miter" ctx.miterLimit = 500 # Since borders are always in the middle and I want them outside I need to # draw the actual path half the border width outset. # # (hb = half border) hb = @options.borderWidth / 2 if @options.borderWidth ctx.strokeStyle = @options.borderColor ctx.lineWidth = @options.borderWidth else stemLength = @options.stemLength stemBase = @options.stemBase stemBase ?= 0 # Draws a line with stem if necessary drawLine = (length, stem, first) => if first # This ensures that the outline is properly closed ctx.moveTo Math.max(stemBase, @options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb if stem ctx.lineTo length / 2 - stemBase / 2, -hb ctx.lineTo length / 2, - stemLength - hb ctx.lineTo length / 2 + stemBase / 2, -hb # Draws a corner with stem if necessary drawCorner = (stem, closeButton, i) => if stem ctx.lineTo -stemBase + hb, 0 - hb ctx.lineTo stemLength + hb, -stemLength - hb ctx.lineTo hb, stemBase - hb else if closeButton offset = @options.closeButtonOffset innerWidth = closeButtonInner[0] if i % 2 != 0 # Since the canvas gets rotated for every corner, but the close button # is always defined as [ horizontal, vertical ] offsets, I have to switch # the offsets in case the canvas is rotated by 90degs offset = [ offset[1], offset[0] ] innerWidth = closeButtonInner[1] # Basic math # # I added a graphical explanation since it's sometimes hard to understand # geometrical calculations without visualization: # https://raw.github.com/enyo/opentip/develop/files/close-button-angle.png angle1 = Math.acos(offset[1] / @options.closeButtonRadius) angle2 = Math.acos(offset[0] / @options.closeButtonRadius) ctx.lineTo -innerWidth + hb, -hb # Firefox 3.6 requires the last boolean parameter (anticlockwise) ctx.arc hb-offset[0], -hb+offset[1], @options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, no else ctx.lineTo -@options.borderRadius + hb, -hb ctx.quadraticCurveTo hb, -hb, hb, @options.borderRadius - hb # Start drawing without caring about the shadows or stems # The canvas position is exactly the amount that has been moved to account # for shadows and stems ctx.translate -canvasPosition[0], -canvasPosition[1] ctx.save() do => # Wrapping variables # This part is a bit funky... # All in all I just iterate over all four corners, translate the canvas # to it and rotate it so the next line goes to the right. # This way I can call drawLine and drawCorner withouth them knowing which # line their actually currently drawing. for i in [0...Opentip.positions.length/2] positionIdx = i * 2 positionX = if i == 0 or i == 3 then 0 else @dimensions.width positionY = if i < 2 then 0 else @dimensions.height rotation = (Math.PI / 2) * i lineLength = if i % 2 == 0 then @dimensions.width else @dimensions.height lineStem = new Opentip.Joint Opentip.positions[positionIdx] cornerStem = new Opentip.Joint Opentip.positions[positionIdx + 1] ctx.save() ctx.translate positionX, positionY ctx.rotate rotation drawLine lineLength, lineStem.eql(@currentStem), i == 0 ctx.translate lineLength, 0 drawCorner cornerStem.eql(@currentStem), cornerStem.eql(closeButton), i ctx.restore() ctx.closePath() ctx.save() if @options.shadow ctx.shadowColor = @options.shadowColor ctx.shadowBlur = @options.shadowBlur ctx.shadowOffsetX = @options.shadowOffset[0] ctx.shadowOffsetY = @options.shadowOffset[1] ctx.fill() ctx.restore() # Without shadow ctx.stroke() if @options.borderWidth ctx.restore() # Without shadow if closeButton do => # Draw the cross crossWidth = crossHeight = @options.closeButtonRadius * 2 if closeButton.toString() == "top right" linkCenter = [ @dimensions.width - @options.closeButtonOffset[0] @options.closeButtonOffset[1] ] crossCenter = [ linkCenter[0] + hb linkCenter[1] - hb ] else linkCenter = [ @options.closeButtonOffset[0] @options.closeButtonOffset[1] ] crossCenter = [ linkCenter[0] - hb linkCenter[1] - hb ] ctx.translate crossCenter[0], crossCenter[1] hcs = @options.closeButtonCrossSize / 2 ctx.save() ctx.beginPath() ctx.strokeStyle = @options.closeButtonCrossColor ctx.lineWidth = @options.closeButtonCrossLineWidth ctx.lineCap = "round" ctx.moveTo -hcs, -hcs ctx.lineTo hcs, hcs ctx.stroke() ctx.beginPath() ctx.moveTo hcs, -hcs ctx.lineTo -hcs, hcs ctx.stroke() ctx.restore() # Position the link @adapter.css @closeButtonElement, left: "#{linkCenter[0] - hcs - @options.closeButtonLinkOverscan}px" top: "#{linkCenter[1] - hcs - @options.closeButtonLinkOverscan}px" width: "#{@options.closeButtonCrossSize + @options.closeButtonLinkOverscan * 2}px" height: "#{@options.closeButtonCrossSize + @options.closeButtonLinkOverscan * 2}px" # I have to account for the border width when implementing the stems. The # tip height & width obviously should be added to the outer border, but # the path is drawn in the middle of the border. # If I just draw the stem size specified on the path, the stem will be # bigger than requested. # # So I have to calculate the stemBase and stemLength of the **path** # stem. _getPathStemMeasures: (outerStemBase, outerStemLength, borderWidth) -> # Now for some math! # # / # /|\ # / | angle # / | \ # / | \ # /____|____\ hb = borderWidth / 2 # This is the angle of the tip halfAngle = Math.atan (outerStemBase / 2) / outerStemLength angle = halfAngle * 2 # The rhombus from the border tip to the path tip rhombusSide = hb / Math.sin angle distanceBetweenTips = 2 * rhombusSide * Math.cos halfAngle stemLength = hb + outerStemLength - distanceBetweenTips throw new Error "Sorry but your stemLength / stemBase ratio is strange." if stemLength < 0 # Now calculate the new base stemBase = (Math.tan(halfAngle) * stemLength) * 2 { stemLength: stemLength, stemBase: stemBase } # Turns a color string into a possible gradient _getColor: (ctx, dimensions, color, horizontal = no) -> # There is no comma so just return return color if typeof color == "string" # Create gradient if horizontal gradient = ctx.createLinearGradient 0, 0, dimensions.width, 0 else gradient = ctx.createLinearGradient 0, 0, 0, dimensions.height for colorStop, i in color gradient.addColorStop colorStop[0], colorStop[1] gradient _searchAndActivateCloseButtons: -> for element in @adapter.findAll @container, ".#{@class.close}" @hideTriggers.push element: @adapter.wrap element event: "click" # Creating the observers for the new close buttons @_setupObservers "-showing", "showing" if @currentObservers.showing @_setupObservers "-visible", "visible" if @currentObservers.visible _activateFirstInput: -> input = @adapter.unwrap @adapter.find @container, "input, textarea" input?.focus?() # Calls reposition() everytime the mouse moves _followMousePosition: -> Opentip._observeMousePosition @bound.reposition unless @options.fixed # Removes observer _stopFollowingMousePosition: -> Opentip._stopObservingMousePosition @bound.reposition unless @options.fixed # I thinks those are self explanatory _clearShowTimeout: -> clearTimeout @_showTimeoutId _clearHideTimeout: -> clearTimeout @_hideTimeoutId _clearTimeouts: -> clearTimeout @_visibilityStateTimeoutId @_clearShowTimeout() @_clearHideTimeout() # Makes sure the trigger element exists, is visible, and part of this world. _triggerElementExists: -> el = @adapter.unwrap @triggerElement while el.parentNode return yes if el.parentNode.tagName == "BODY" el = el.parentNode # TODO: Add a check if the element is actually visible return no _loadAjax: -> return if @loading @loaded = no @loading = yes @adapter.addClass @container, @class.loading # This will reset the dimensions so it has to be AFTER the `addClass` call # since the `loading` class might show a loading indicator that will change # the dimensions of the tooltip @setContent "" @debug "Loading content from #{@options.ajax}" @adapter.ajax url: @options.ajax method: @options.ajaxMethod onSuccess: (responseText) => @debug "Loading successful." # This has to happen before setting the content since loading indicators # may still be visible. @adapter.removeClass @container, @class.loading @setContent responseText onError: (error) => message = @options.ajaxErrorMessage @debug message, error @setContent message @adapter.addClass @container, @class.ajaxError onComplete: => @adapter.removeClass @container, @class.loading @loading = no @loaded = yes @_searchAndActivateCloseButtons() @_activateFirstInput() @reposition() # Regularely checks if the element is still in the dom. _ensureTriggerElement: -> unless @_triggerElementExists() @deactivate() @_stopEnsureTriggerElement() # In milliseconds, how often opentip should check for the existance of the element _ensureTriggerElementInterval: 1000 # Sets up an interval to call _ensureTriggerElement regularely _startEnsureTriggerElement: -> @_ensureTriggerElementTimeoutId = setInterval (=> @_ensureTriggerElement()), @_ensureTriggerElementInterval # Stops the interval _stopEnsureTriggerElement: -> clearInterval @_ensureTriggerElementTimeoutId # Utils # ----- vendors = [ "khtml" "ms" "o" "moz" "webkit" ] # Sets a sepcific css3 value for all vendors Opentip::setCss3Style = (element, styles) -> element = @adapter.unwrap element for own prop, value of styles if element.style[prop]? element.style[prop] = value else for vendor in vendors vendorProp = "#{@ucfirst vendor}#{@ucfirst prop}" element.style[vendorProp] = value if element.style[vendorProp]? # Defers the call Opentip::defer = (func) -> setTimeout func, 0 # Changes seconds to milliseconds Opentip::setTimeout = (func, seconds) -> setTimeout func, if seconds then seconds * 1000 else 0 # Turns only the first character uppercase Opentip::ucfirst = (string) -> return "" unless string? string.charAt(0).toUpperCase() + string.slice(1) # Converts a camelized string into a dasherized one Opentip::dasherize = (string) -> string.replace /([A-Z])/g, (_, character) -> "-#{character.toLowerCase()}" # Mouse position stuff. mousePositionObservers = [ ] mousePosition = { x: 0, y: 0 } mouseMoved = (e) -> mousePosition = Opentip.adapter.mousePosition e observer() for observer in mousePositionObservers Opentip.followMousePosition = -> Opentip.adapter.observe document.body, "mousemove", mouseMoved # Called by opentips if they want updates on mouse position Opentip._observeMousePosition = (observer) -> mousePositionObservers.push observer Opentip._stopObservingMousePosition = (removeObserver) -> mousePositionObservers = (observer for observer in mousePositionObservers when observer != removeObserver) # Every position is converted to this class class Opentip.Joint # Accepts pointer in nearly every form. # # - "top left" # - "topLeft" # - "top-left" # - "RIGHT to TOP" # # All that counts is that the words top, bottom, left or right are present. # # It also accepts a Pointer object, creating a new object then constructor: (pointerString) -> return unless pointerString? if pointerString instanceof Opentip.Joint pointerString = pointerString.toString() @set pointerString @ set: (string) -> string = string.toLowerCase() @setHorizontal string @setVertical string @ setHorizontal: (string) -> valid = [ "left", "center", "right" ] @horizontal = i.toLowerCase() for i in valid when ~string.indexOf i @horizontal = "center" unless @horizontal? for i in valid this[i] = if @horizontal == i then i else undefined setVertical: (string) -> valid = [ "top", "middle", "bottom" ] @vertical = i.toLowerCase() for i in valid when ~string.indexOf i @vertical = "middle" unless @vertical? for i in valid this[i] = if @vertical == i then i else undefined # Checks if two pointers point in the same direction eql: (pointer) -> pointer? and @horizontal == pointer.horizontal and @vertical == pointer.vertical # Turns topLeft into bottomRight flip: -> positionIdx = Opentip.position[@toString yes] # There are 8 positions, and smart as I am I layed them out in a circle. flippedIndex = (positionIdx + 4) % 8 @set Opentip.positions[flippedIndex] @ toString: (camelized = no) -> vertical = if @vertical == "middle" then "" else @vertical horizontal = if @horizontal == "center" then "" else @horizontal if vertical and horizontal if camelized then horizontal = Opentip::ucfirst horizontal else horizontal = " #{horizontal}" "#{vertical}#{horizontal}" # Returns true if top and left are equal Opentip::_positionsEqual = (posA, posB) -> posA? and posB? and posA.left == posB.left and posA.top == posB.top # Returns true if width and height are equal Opentip::_dimensionsEqual = (dimA, dimB) -> dimA? and dimB? and dimA.width == dimB.width and dimA.height == dimB.height # Just forwards to console.debug if Opentip.debug is true and console.debug exists. Opentip::debug = (args...) -> if Opentip.debug and console?.debug? args.unshift "##{@id} |" console.debug args... # Startup # ------- Opentip.findElements = -> adapter = Opentip.adapter # Go through all elements with `data-ot="[...]"` for element in adapter.findAll document.body, "[data-ot]" options = { } content = adapter.data element, "ot" if content in [ "", "true", "yes"] # Take the content from the title attribute content = adapter.attr element, "title" adapter.attr element, "title", "" content = content || "" for optionName of Opentip.styles.standard optionValue = adapter.data element, "ot#{Opentip::ucfirst optionName}" if optionValue? if optionValue in [ "yes", "true", "on" ] then optionValue = true else if optionValue in [ "no", "false", "off" ] then optionValue = false options[optionName] = optionValue new Opentip element, content, options # Publicly available # ------------------ Opentip.version = "2.4.6" Opentip.debug = off Opentip.lastId = 0 Opentip.lastZIndex = 100 Opentip.tips = [ ] Opentip._abortShowingGroup = (group, originatingOpentip) -> for opentip in Opentip.tips opentip._abortShowing() if opentip != originatingOpentip and opentip.options.group == group Opentip._hideGroup = (group, originatingOpentip) -> for opentip in Opentip.tips opentip.hide() if opentip != originatingOpentip and opentip.options.group == group # A list of possible adapters. Used for testing Opentip.adapters = { } # The current adapter used. Opentip.adapter = null firstAdapter = yes Opentip.addAdapter = (adapter) -> Opentip.adapters[adapter.name] = adapter if firstAdapter Opentip.adapter = adapter adapter.domReady Opentip.findElements adapter.domReady Opentip.followMousePosition firstAdapter = no Opentip.positions = [ "top" "topRight" "right" "bottomRight" "bottom" "bottomLeft" "left" "topLeft" ] Opentip.position = { } for position, i in Opentip.positions Opentip.position[position] = i # The standard style. Opentip.styles = standard: # This config is not based on anything extends: null # This style also contains all default values for other styles. # # Following abbreviations are used: # # - `POINTER` : a string that contains at least one of top, bottom, right or left # - `OFFSET` : [ XVALUE, YVALUE ] (integers) # - `ELEMENT` : element or element id # Will be set if provided in constructor title: undefined # Whether the provided title should be html escaped escapeTitle: yes # Whether the content should be html escaped escapeContent: no # The class name to be added to the HTML element className: "standard" # - `false` (no stem) # - `true` (stem at tipJoint position) # - `POINTER` (for stems in other directions) stem: yes # `float` (in seconds) # If null, the default is used: 0.2 for mouseover, 0 for click delay: null # See delay hideDelay: 0.1 # If target is not null, elements are always fixed. fixed: no # - eventname (eg: `"click"`, `"mouseover"`, etc..) # - `"creation"` (the tooltip will show when being created) # - `null` if you want to handle it yourself (Opentip will not register for any events) showOn: "mouseover" # - `"trigger"` # - `"tip"` # - `"target"` # - `"closeButton"` # - `"outside"` Somewhere outside the trigger or tip (Makes really only sense with the click event) # - `ELEMENT` # # This is just a shortcut, and will be added to hideTriggers if hideTrigger # is an empty array hideTrigger: "trigger" # An array of hideTriggers. hideTriggers: [ ] # - eventname (eg: `"click"`) # - array of event strings if multiple hideTriggers # - `null` (let Opentip decide) hideOn: null # Removes all HTML elements from DOM when an Opentip is hidden if true removeElementsOnHide: off # `OFFSET` offset: [ 0, 0 ] # Whether the targetJoint/tipJoint should be changed if the tooltip is not in the viewport anymore. containInViewport: true # If set to true, offsets are calculated automatically to position the tooltip. (pixels are added if there are stems for example) autoOffset: true showEffect: "appear" hideEffect: "fade" showEffectDuration: 0.3 hideEffectDuration: 0.2 # integer stemLength: 5 # integer stemBase: 8 # `POINTER` tipJoint: "top left" # - `null` (no target, opentip uses mouse as target) # - `true` (target is the triggerElement) # - `ELEMENT` (for another element) target: null # - `POINTER` (Ignored if target == `null`) # - `null` (targetJoint is the opposite of tipJoint) targetJoint: null # If off and the content gets downloaded with AJAX, it will be downloaded # every time the tooltip is shown. If the content is a function, the function # will be executed every time. cache: on # ajaxCache: on # Deprecated in favor of cache. # AJAX URL # Set to `false` if no AJAX or `true` if it's attached to an `` # element. In the latter case the `href` attribute will be used. ajax: off # Which method should AJAX use. ajaxMethod: "GET" # The message that gets displayed if the content couldn't be downloaded. ajaxErrorMessage: "There was a problem downloading the content." # You can group opentips together. So when a tooltip shows, it looks if there are others in the same group, and hides them. group: null # Will be set automatically in constructor style: null # The background color of the tip background: "#fff18f" # Whether the gradient should be horizontal. backgroundGradientHorizontal: no # Positive values offset inside the tooltip closeButtonOffset: [ 5, 5 ] # The little circle that stick out of a tip closeButtonRadius: 7 # Size of the cross closeButtonCrossSize: 4 # Color of the cross closeButtonCrossColor: "#d2c35b" # The stroke width of the cross closeButtonCrossLineWidth: 1.5 # You will most probably never want to change this. # It specifies how many pixels the invisible element should be larger # than the actual cross closeButtonLinkOverscan: 6 # Border radius... borderRadius: 5 # Set to 0 or false if you don't want a border borderWidth: 1 # Normal CSS value borderColor: "#f2e37b" # Set to false if you don't want a shadow shadow: yes # How the shadow should be blurred. Set to 0 if you want a hard drop shadow shadowBlur: 10 # Shadow offset... shadowOffset: [ 3, 3 ] # Shadow color... shadowColor: "rgba(0, 0, 0, 0.1)" glass: extends: "standard" className: "glass" background: [ [ 0, "rgba(252, 252, 252, 0.8)" ] [ 0.5, "rgba(255, 255, 255, 0.8)" ] [ 0.5, "rgba(250, 250, 250, 0.9)" ] [ 1, "rgba(245, 245, 245, 0.9)" ] ] borderColor: "#eee" closeButtonCrossColor: "rgba(0, 0, 0, 0.2)" borderRadius: 15 closeButtonRadius: 10 closeButtonOffset: [ 8, 8 ] dark: extends: "standard" className: "dark" borderRadius: 13 borderColor: "#444" closeButtonCrossColor: "rgba(240, 240, 240, 1)" shadowColor: "rgba(0, 0, 0, 0.3)" shadowOffset: [ 2, 2 ] background: [ [ 0, "rgba(30, 30, 30, 0.7)" ] [ 0.5, "rgba(30, 30, 30, 0.8)" ] [ 0.5, "rgba(10, 10, 10, 0.8)" ] [ 1, "rgba(10, 10, 10, 0.9)" ] ] alert: extends: "standard" className: "alert" borderRadius: 1 borderColor: "#AE0D11" closeButtonCrossColor: "rgba(255, 255, 255, 1)" shadowColor: "rgba(0, 0, 0, 0.3)" shadowOffset: [ 2, 2 ] background: [ [ 0, "rgba(203, 15, 19, 0.7)" ] [ 0.5, "rgba(203, 15, 19, 0.8)" ] [ 0.5, "rgba(189, 14, 18, 0.8)" ] [ 1, "rgba(179, 14, 17, 0.9)" ] ] # Change this to the style name you want all your tooltips to have as default. Opentip.defaultStyle = "standard" if module? module.exports = Opentip else window.Opentip = Opentip opentip-2.4.6/test/000077500000000000000000000000001213277401600141635ustar00rootroot00000000000000opentip-2.4.6/test/.gitignore000066400000000000000000000000151213277401600161470ustar00rootroot00000000000000ender.min.js opentip-2.4.6/test/ender.js000066400000000000000000003016631213277401600156270ustar00rootroot00000000000000/*! * ============================================================= * Ender: open module JavaScript framework (https://ender.no.de) * Build: ender build qwery domready bonzo bean reqwest * ============================================================= */ /*! * Ender: open module JavaScript framework (client-lib) * copyright Dustin Diaz & Jacob Thornton 2011-2012 (@ded @fat) * http://ender.no.de * License MIT */ (function (context) { // a global object for node.js module compatiblity // ============================================ context['global'] = context // Implements simple module system // losely based on CommonJS Modules spec v1.1.1 // ============================================ var modules = {} , old = context['$'] , oldEnder = context['ender'] , oldRequire = context['require'] , oldProvide = context['provide'] function require (identifier) { // modules can be required from ender's build system, or found on the window var module = modules['$' + identifier] || window[identifier] if (!module) throw new Error("Ender Error: Requested module '" + identifier + "' has not been defined.") return module } function provide (name, what) { return (modules['$' + name] = what) } context['provide'] = provide context['require'] = require function aug(o, o2) { for (var k in o2) k != 'noConflict' && k != '_VERSION' && (o[k] = o2[k]) return o } /** * main Ender return object * @constructor * @param {Array|Node|string} s a CSS selector or DOM node(s) * @param {Array.|Node} r a root node(s) */ function Ender(s, r) { var elements , i this.selector = s // string || node || nodelist || window if (typeof s == 'undefined') { elements = [] this.selector = '' } else if (typeof s == 'string' || s.nodeName || (s.length && 'item' in s) || s == window) { elements = ender._select(s, r) } else { elements = isFinite(s.length) ? s : [s] } this.length = elements.length for (i = this.length; i--;) this[i] = elements[i] } /** * @param {function(el, i, inst)} fn * @param {Object} opt_scope * @returns {Ender} */ Ender.prototype['forEach'] = function (fn, opt_scope) { var i, l // opt out of native forEach so we can intentionally call our own scope // defaulting to the current item and be able to return self for (i = 0, l = this.length; i < l; ++i) i in this && fn.call(opt_scope || this[i], this[i], i, this) // return self for chaining return this } Ender.prototype.$ = ender // handy reference to self function ender(s, r) { return new Ender(s, r) } ender['_VERSION'] = '0.4.3-dev' ender.fn = Ender.prototype // for easy compat to jQuery plugins ender.ender = function (o, chain) { aug(chain ? Ender.prototype : ender, o) } ender._select = function (s, r) { if (typeof s == 'string') return (r || document).querySelectorAll(s) if (s.nodeName) return [s] return s } // use callback to receive Ender's require & provide and remove them from global ender.noConflict = function (callback) { context['$'] = old if (callback) { context['provide'] = oldProvide context['require'] = oldRequire context['ender'] = oldEnder if (typeof callback == 'function') callback(require, provide, this) } return this } if (typeof module !== 'undefined' && module.exports) module.exports = ender // use subscript notation as extern for Closure compilation context['ender'] = context['$'] = ender }(this)); (function () { var module = { exports: {} }, exports = module.exports; /*! * @preserve Qwery - A Blazing Fast query selector engine * https://github.com/ded/qwery * copyright Dustin Diaz & Jacob Thornton 2012 * MIT License */ (function (name, definition, context) { if (typeof module != 'undefined' && module.exports) module.exports = definition() else if (typeof context['define'] == 'function' && context['define']['amd']) define(name, definition) else context[name] = definition() })('qwery', function () { var doc = document , html = doc.documentElement , byClass = 'getElementsByClassName' , byTag = 'getElementsByTagName' , qSA = 'querySelectorAll' , useNativeQSA = 'useNativeQSA' , tagName = 'tagName' , nodeType = 'nodeType' , select // main select() method, assign later , id = /#([\w\-]+)/ , clas = /\.[\w\-]+/g , idOnly = /^#([\w\-]+)$/ , classOnly = /^\.([\w\-]+)$/ , tagOnly = /^([\w\-]+)$/ , tagAndOrClass = /^([\w]+)?\.([\w\-]+)$/ , splittable = /(^|,)\s*[>~+]/ , normalizr = /^\s+|\s*([,\s\+\~>]|$)\s*/g , splitters = /[\s\>\+\~]/ , splittersMore = /(?![\s\w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^'"]*\]|[\s\w\+\-]*\))/ , specialChars = /([.*+?\^=!:${}()|\[\]\/\\])/g , simple = /^(\*|[a-z0-9]+)?(?:([\.\#]+[\w\-\.#]+)?)/ , attr = /\[([\w\-]+)(?:([\|\^\$\*\~]?\=)['"]?([ \w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^]+)["']?)?\]/ , pseudo = /:([\w\-]+)(\(['"]?([^()]+)['"]?\))?/ , easy = new RegExp(idOnly.source + '|' + tagOnly.source + '|' + classOnly.source) , dividers = new RegExp('(' + splitters.source + ')' + splittersMore.source, 'g') , tokenizr = new RegExp(splitters.source + splittersMore.source) , chunker = new RegExp(simple.source + '(' + attr.source + ')?' + '(' + pseudo.source + ')?') , walker = { ' ': function (node) { return node && node !== html && node.parentNode } , '>': function (node, contestant) { return node && node.parentNode == contestant.parentNode && node.parentNode } , '~': function (node) { return node && node.previousSibling } , '+': function (node, contestant, p1, p2) { if (!node) return false return (p1 = previous(node)) && (p2 = previous(contestant)) && p1 == p2 && p1 } } function cache() { this.c = {} } cache.prototype = { g: function (k) { return this.c[k] || undefined } , s: function (k, v, r) { v = r ? new RegExp(v) : v return (this.c[k] = v) } } var classCache = new cache() , cleanCache = new cache() , attrCache = new cache() , tokenCache = new cache() function classRegex(c) { return classCache.g(c) || classCache.s(c, '(^|\\s+)' + c + '(\\s+|$)', 1) } // not quite as fast as inline loops in older browsers so don't use liberally function each(a, fn) { var i = 0, l = a.length for (; i < l; i++) fn(a[i]) } function flatten(ar) { for (var r = [], i = 0, l = ar.length; i < l; ++i) arrayLike(ar[i]) ? (r = r.concat(ar[i])) : (r[r.length] = ar[i]) return r } function arrayify(ar) { var i = 0, l = ar.length, r = [] for (; i < l; i++) r[i] = ar[i] return r } function previous(n) { while (n = n.previousSibling) if (n[nodeType] == 1) break; return n } function q(query) { return query.match(chunker) } // called using `this` as element and arguments from regex group results. // given => div.hello[title="world"]:foo('bar') // div.hello[title="world"]:foo('bar'), div, .hello, [title="world"], title, =, world, :foo('bar'), foo, ('bar'), bar] function interpret(whole, tag, idsAndClasses, wholeAttribute, attribute, qualifier, value, wholePseudo, pseudo, wholePseudoVal, pseudoVal) { var i, m, k, o, classes if (this[nodeType] !== 1) return false if (tag && tag !== '*' && this[tagName] && this[tagName].toLowerCase() !== tag) return false if (idsAndClasses && (m = idsAndClasses.match(id)) && m[1] !== this.id) return false if (idsAndClasses && (classes = idsAndClasses.match(clas))) { for (i = classes.length; i--;) if (!classRegex(classes[i].slice(1)).test(this.className)) return false } if (pseudo && qwery.pseudos[pseudo] && !qwery.pseudos[pseudo](this, pseudoVal)) return false if (wholeAttribute && !value) { // select is just for existance of attrib o = this.attributes for (k in o) { if (Object.prototype.hasOwnProperty.call(o, k) && (o[k].name || k) == attribute) { return this } } } if (wholeAttribute && !checkAttr(qualifier, getAttr(this, attribute) || '', value)) { // select is for attrib equality return false } return this } function clean(s) { return cleanCache.g(s) || cleanCache.s(s, s.replace(specialChars, '\\$1')) } function checkAttr(qualify, actual, val) { switch (qualify) { case '=': return actual == val case '^=': return actual.match(attrCache.g('^=' + val) || attrCache.s('^=' + val, '^' + clean(val), 1)) case '$=': return actual.match(attrCache.g('$=' + val) || attrCache.s('$=' + val, clean(val) + '$', 1)) case '*=': return actual.match(attrCache.g(val) || attrCache.s(val, clean(val), 1)) case '~=': return actual.match(attrCache.g('~=' + val) || attrCache.s('~=' + val, '(?:^|\\s+)' + clean(val) + '(?:\\s+|$)', 1)) case '|=': return actual.match(attrCache.g('|=' + val) || attrCache.s('|=' + val, '^' + clean(val) + '(-|$)', 1)) } return 0 } // given a selector, first check for simple cases then collect all base candidate matches and filter function _qwery(selector, _root) { var r = [], ret = [], i, l, m, token, tag, els, intr, item, root = _root , tokens = tokenCache.g(selector) || tokenCache.s(selector, selector.split(tokenizr)) , dividedTokens = selector.match(dividers) if (!tokens.length) return r token = (tokens = tokens.slice(0)).pop() // copy cached tokens, take the last one if (tokens.length && (m = tokens[tokens.length - 1].match(idOnly))) root = byId(_root, m[1]) if (!root) return r intr = q(token) // collect base candidates to filter els = root !== _root && root[nodeType] !== 9 && dividedTokens && /^[+~]$/.test(dividedTokens[dividedTokens.length - 1]) ? function (r) { while (root = root.nextSibling) { root[nodeType] == 1 && (intr[1] ? intr[1] == root[tagName].toLowerCase() : 1) && (r[r.length] = root) } return r }([]) : root[byTag](intr[1] || '*') // filter elements according to the right-most part of the selector for (i = 0, l = els.length; i < l; i++) { if (item = interpret.apply(els[i], intr)) r[r.length] = item } if (!tokens.length) return r // filter further according to the rest of the selector (the left side) each(r, function(e) { if (ancestorMatch(e, tokens, dividedTokens)) ret[ret.length] = e }) return ret } // compare element to a selector function is(el, selector, root) { if (isNode(selector)) return el == selector if (arrayLike(selector)) return !!~flatten(selector).indexOf(el) // if selector is an array, is el a member? var selectors = selector.split(','), tokens, dividedTokens while (selector = selectors.pop()) { tokens = tokenCache.g(selector) || tokenCache.s(selector, selector.split(tokenizr)) dividedTokens = selector.match(dividers) tokens = tokens.slice(0) // copy array if (interpret.apply(el, q(tokens.pop())) && (!tokens.length || ancestorMatch(el, tokens, dividedTokens, root))) { return true } } return false } // given elements matching the right-most part of a selector, filter out any that don't match the rest function ancestorMatch(el, tokens, dividedTokens, root) { var cand // recursively work backwards through the tokens and up the dom, covering all options function crawl(e, i, p) { while (p = walker[dividedTokens[i]](p, e)) { if (isNode(p) && (interpret.apply(p, q(tokens[i])))) { if (i) { if (cand = crawl(p, i - 1, p)) return cand } else return p } } } return (cand = crawl(el, tokens.length - 1, el)) && (!root || isAncestor(cand, root)) } function isNode(el, t) { return el && typeof el === 'object' && (t = el[nodeType]) && (t == 1 || t == 9) } function uniq(ar) { var a = [], i, j o: for (i = 0; i < ar.length; ++i) { for (j = 0; j < a.length; ++j) if (a[j] == ar[i]) continue o a[a.length] = ar[i] } return a } function arrayLike(o) { return (typeof o === 'object' && isFinite(o.length)) } function normalizeRoot(root) { if (!root) return doc if (typeof root == 'string') return qwery(root)[0] if (!root[nodeType] && arrayLike(root)) return root[0] return root } function byId(root, id, el) { // if doc, query on it, else query the parent doc or if a detached fragment rewrite the query and run on the fragment return root[nodeType] === 9 ? root.getElementById(id) : root.ownerDocument && (((el = root.ownerDocument.getElementById(id)) && isAncestor(el, root) && el) || (!isAncestor(root, root.ownerDocument) && select('[id="' + id + '"]', root)[0])) } function qwery(selector, _root) { var m, el, root = normalizeRoot(_root) // easy, fast cases that we can dispatch with simple DOM calls if (!root || !selector) return [] if (selector === window || isNode(selector)) { return !_root || (selector !== window && isNode(root) && isAncestor(selector, root)) ? [selector] : [] } if (selector && arrayLike(selector)) return flatten(selector) if (m = selector.match(easy)) { if (m[1]) return (el = byId(root, m[1])) ? [el] : [] if (m[2]) return arrayify(root[byTag](m[2])) if (hasByClass && m[3]) return arrayify(root[byClass](m[3])) } return select(selector, root) } // where the root is not document and a relationship selector is first we have to // do some awkward adjustments to get it to work, even with qSA function collectSelector(root, collector) { return function(s) { var oid, nid if (splittable.test(s)) { if (root[nodeType] !== 9) { // make sure the el has an id, rewrite the query, set root to doc and run it if (!(nid = oid = root.getAttribute('id'))) root.setAttribute('id', nid = '__qwerymeupscotty') s = '[id="' + nid + '"]' + s // avoid byId and allow us to match context element collector(root.parentNode || root, s, true) oid || root.removeAttribute('id') } return; } s.length && collector(root, s, false) } } var isAncestor = 'compareDocumentPosition' in html ? function (element, container) { return (container.compareDocumentPosition(element) & 16) == 16 } : 'contains' in html ? function (element, container) { container = container[nodeType] === 9 || container == window ? html : container return container !== element && container.contains(element) } : function (element, container) { while (element = element.parentNode) if (element === container) return 1 return 0 } , getAttr = function() { // detect buggy IE src/href getAttribute() call var e = doc.createElement('p') return ((e.innerHTML = 'x') && e.firstChild.getAttribute('href') != '#x') ? function(e, a) { return a === 'class' ? e.className : (a === 'href' || a === 'src') ? e.getAttribute(a, 2) : e.getAttribute(a) } : function(e, a) { return e.getAttribute(a) } }() , hasByClass = !!doc[byClass] // has native qSA support , hasQSA = doc.querySelector && doc[qSA] // use native qSA , selectQSA = function (selector, root) { var result = [], ss, e try { if (root[nodeType] === 9 || !splittable.test(selector)) { // most work is done right here, defer to qSA return arrayify(root[qSA](selector)) } // special case where we need the services of `collectSelector()` each(ss = selector.split(','), collectSelector(root, function(ctx, s) { e = ctx[qSA](s) if (e.length == 1) result[result.length] = e.item(0) else if (e.length) result = result.concat(arrayify(e)) })) return ss.length > 1 && result.length > 1 ? uniq(result) : result } catch(ex) { } return selectNonNative(selector, root) } // no native selector support , selectNonNative = function (selector, root) { var result = [], items, m, i, l, r, ss selector = selector.replace(normalizr, '$1') if (m = selector.match(tagAndOrClass)) { r = classRegex(m[2]) items = root[byTag](m[1] || '*') for (i = 0, l = items.length; i < l; i++) { if (r.test(items[i].className)) result[result.length] = items[i] } return result } // more complex selector, get `_qwery()` to do the work for us each(ss = selector.split(','), collectSelector(root, function(ctx, s, rewrite) { r = _qwery(s, ctx) for (i = 0, l = r.length; i < l; i++) { if (ctx[nodeType] === 9 || rewrite || isAncestor(r[i], root)) result[result.length] = r[i] } })) return ss.length > 1 && result.length > 1 ? uniq(result) : result } , configure = function (options) { // configNativeQSA: use fully-internal selector or native qSA where present if (typeof options[useNativeQSA] !== 'undefined') select = !options[useNativeQSA] ? selectNonNative : hasQSA ? selectQSA : selectNonNative } configure({ useNativeQSA: true }) qwery.configure = configure qwery.uniq = uniq qwery.is = is qwery.pseudos = {} return qwery }, this); provide("qwery", module.exports); (function ($) { var q = function () { var r try { r = require('qwery') } catch (ex) { r = require('qwery-mobile') } finally { return r } }() $.pseudos = q.pseudos $._select = function (s, r) { // detect if sibling module 'bonzo' is available at run-time // rather than load-time since technically it's not a dependency and // can be loaded in any order // hence the lazy function re-definition return ($._select = (function () { var b if (typeof $.create == 'function') return function (s, r) { return /^\s*', '', 1] , td = ['', '
', 3] , option = ['', 1] , noscope = ['_', '', 0, 1] , tagMap = { // tags that we have trouble *inserting* thead: table, tbody: table, tfoot: table, colgroup: table, caption: table , tr: ['', '
', 2] , th: td , td: td , col: ['', '
', 2] , fieldset: ['
', '
', 1] , legend: ['
', '
', 2] , option: option, optgroup: option , script: noscope, style: noscope, link: noscope, param: noscope, base: noscope } , stateAttributes = /^(checked|selected|disabled)$/ , ie = /msie/i.test(navigator.userAgent) , hasClass, addClass, removeClass , uidMap = {} , uuids = 0 , digit = /^-?[\d\.]+$/ , dattr = /^data-(.+)$/ , px = 'px' , setAttribute = 'setAttribute' , getAttribute = 'getAttribute' , byTag = 'getElementsByTagName' , features = function() { var e = doc.createElement('p') e.innerHTML = 'x
' return { hrefExtended: e[byTag]('a')[0][getAttribute]('href') != '#x' // IE < 8 , autoTbody: e[byTag]('tbody').length !== 0 // IE < 8 , computedStyle: doc.defaultView && doc.defaultView.getComputedStyle , cssFloat: e[byTag]('table')[0].style.styleFloat ? 'styleFloat' : 'cssFloat' , transform: function () { var props = ['webkitTransform', 'MozTransform', 'OTransform', 'msTransform', 'Transform'], i for (i = 0; i < props.length; i++) { if (props[i] in e.style) return props[i] } }() , classList: 'classList' in e , opasity: function () { return typeof doc.createElement('a').style.opacity !== 'undefined' }() } }() , trimReplace = /(^\s*|\s*$)/g , whitespaceRegex = /\s+/ , toString = String.prototype.toString , unitless = { lineHeight: 1, zoom: 1, zIndex: 1, opacity: 1, boxFlex: 1, WebkitBoxFlex: 1, MozBoxFlex: 1 } , trim = String.prototype.trim ? function (s) { return s.trim() } : function (s) { return s.replace(trimReplace, '') } /** * @param {string} c a class name to test * @return {boolean} */ function classReg(c) { return new RegExp("(^|\\s+)" + c + "(\\s+|$)") } /** * @param {Bonzo|Array} ar * @param {function(Object, number, (Bonzo|Array))} fn * @param {Object=} opt_scope * @param {boolean=} opt_rev * @return {Bonzo|Array} */ function each(ar, fn, opt_scope, opt_rev) { var ind, i = 0, l = ar.length for (; i < l; i++) { ind = opt_rev ? ar.length - i - 1 : i fn.call(opt_scope || ar[ind], ar[ind], ind, ar) } return ar } /** * @param {Bonzo|Array} ar * @param {function(Object, number, (Bonzo|Array))} fn * @param {Object=} opt_scope * @return {Bonzo|Array} */ function deepEach(ar, fn, opt_scope) { for (var i = 0, l = ar.length; i < l; i++) { if (isNode(ar[i])) { deepEach(ar[i].childNodes, fn, opt_scope) fn.call(opt_scope || ar[i], ar[i], i, ar) } } return ar } /** * @param {string} s * @return {string} */ function camelize(s) { return s.replace(/-(.)/g, function (m, m1) { return m1.toUpperCase() }) } /** * @param {string} s * @return {string} */ function decamelize(s) { return s ? s.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase() : s } /** * @param {Element} el * @return {*} */ function data(el) { el[getAttribute]('data-node-uid') || el[setAttribute]('data-node-uid', ++uuids) var uid = el[getAttribute]('data-node-uid') return uidMap[uid] || (uidMap[uid] = {}) } /** * removes the data associated with an element * @param {Element} el */ function clearData(el) { var uid = el[getAttribute]('data-node-uid') if (uid) delete uidMap[uid] } function dataValue(d) { var f try { return (d === null || d === undefined) ? undefined : d === 'true' ? true : d === 'false' ? false : d === 'null' ? null : (f = parseFloat(d)) == d ? f : d; } catch(e) {} return undefined } function isNode(node) { return node && node.nodeName && (node.nodeType == 1 || node.nodeType == 11) } /** * @param {Bonzo|Array} ar * @param {function(Object, number, (Bonzo|Array))} fn * @param {Object=} opt_scope * @return {boolean} whether `some`thing was found */ function some(ar, fn, opt_scope) { for (var i = 0, j = ar.length; i < j; ++i) if (fn.call(opt_scope || null, ar[i], i, ar)) return true return false } /** * this could be a giant enum of CSS properties * but in favor of file size sans-closure deadcode optimizations * we're just asking for any ol string * then it gets transformed into the appropriate style property for JS access * @param {string} p * @return {string} */ function styleProperty(p) { (p == 'transform' && (p = features.transform)) || (/^transform-?[Oo]rigin$/.test(p) && (p = features.transform + "Origin")) || (p == 'float' && (p = features.cssFloat)) return p ? camelize(p) : null } var getStyle = features.computedStyle ? function (el, property) { var value = null , computed = doc.defaultView.getComputedStyle(el, '') computed && (value = computed[property]) return el.style[property] || value } : (ie && html.currentStyle) ? /** * @param {Element} el * @param {string} property * @return {string|number} */ function (el, property) { if (property == 'opacity' && !features.opasity) { var val = 100 try { val = el['filters']['DXImageTransform.Microsoft.Alpha'].opacity } catch (e1) { try { val = el['filters']('alpha').opacity } catch (e2) {} } return val / 100 } var value = el.currentStyle ? el.currentStyle[property] : null return el.style[property] || value } : function (el, property) { return el.style[property] } // this insert method is intense function insert(target, host, fn, rev) { var i = 0, self = host || this, r = [] // target nodes could be a css selector if it's a string and a selector engine is present // otherwise, just use target , nodes = query && typeof target == 'string' && target.charAt(0) != '<' ? query(target) : target // normalize each node in case it's still a string and we need to create nodes on the fly each(normalize(nodes), function (t, j) { each(self, function (el) { fn(t, r[i++] = j > 0 ? cloneNode(self, el) : el) }, null, rev) }, this, rev) self.length = i each(r, function (e) { self[--i] = e }, null, !rev) return self } /** * sets an element to an explicit x/y position on the page * @param {Element} el * @param {?number} x * @param {?number} y */ function xy(el, x, y) { var $el = bonzo(el) , style = $el.css('position') , offset = $el.offset() , rel = 'relative' , isRel = style == rel , delta = [parseInt($el.css('left'), 10), parseInt($el.css('top'), 10)] if (style == 'static') { $el.css('position', rel) style = rel } isNaN(delta[0]) && (delta[0] = isRel ? 0 : el.offsetLeft) isNaN(delta[1]) && (delta[1] = isRel ? 0 : el.offsetTop) x != null && (el.style.left = x - offset.left + delta[0] + px) y != null && (el.style.top = y - offset.top + delta[1] + px) } // classList support for class management // altho to be fair, the api sucks because it won't accept multiple classes at once if (features.classList) { hasClass = function (el, c) { return el.classList.contains(c) } addClass = function (el, c) { el.classList.add(c) } removeClass = function (el, c) { el.classList.remove(c) } } else { hasClass = function (el, c) { return classReg(c).test(el.className) } addClass = function (el, c) { el.className = trim(el.className + ' ' + c) } removeClass = function (el, c) { el.className = trim(el.className.replace(classReg(c), ' ')) } } /** * this allows method calling for setting values * * @example * bonzo(elements).css('color', function (el) { * return el.getAttribute('data-original-color') * }) * * @param {Element} el * @param {function (Element)|string} * @return {string} */ function setter(el, v) { return typeof v == 'function' ? v(el) : v } /** * @constructor * @param {Array.|Element|Node|string} elements */ function Bonzo(elements) { this.length = 0 if (elements) { elements = typeof elements !== 'string' && !elements.nodeType && typeof elements.length !== 'undefined' ? elements : [elements] this.length = elements.length for (var i = 0; i < elements.length; i++) this[i] = elements[i] } } Bonzo.prototype = { /** * @param {number} index * @return {Element|Node} */ get: function (index) { return this[index] || null } // itetators /** * @param {function(Element|Node)} fn * @param {Object=} opt_scope * @return {Bonzo} */ , each: function (fn, opt_scope) { return each(this, fn, opt_scope) } /** * @param {Function} fn * @param {Object=} opt_scope * @return {Bonzo} */ , deepEach: function (fn, opt_scope) { return deepEach(this, fn, opt_scope) } /** * @param {Function} fn * @param {Function=} opt_reject * @return {Array} */ , map: function (fn, opt_reject) { var m = [], n, i for (i = 0; i < this.length; i++) { n = fn.call(this, this[i], i) opt_reject ? (opt_reject(n) && m.push(n)) : m.push(n) } return m } // text and html inserters! /** * @param {string} h the HTML to insert * @param {boolean=} opt_text whether to set or get text content * @return {Bonzo|string} */ , html: function (h, opt_text) { var method = opt_text ? html.textContent === undefined ? 'innerText' : 'textContent' : 'innerHTML' , that = this , append = function (el, i) { each(normalize(h, that, i), function (node) { el.appendChild(node) }) } , updateElement = function (el, i) { try { if (opt_text || (typeof h == 'string' && !specialTags.test(el.tagName))) { return el[method] = h } } catch (e) {} append(el, i) } return typeof h != 'undefined' ? this.empty().each(updateElement) : this[0] ? this[0][method] : '' } /** * @param {string=} opt_text the text to set, otherwise this is a getter * @return {Bonzo|string} */ , text: function (opt_text) { return this.html(opt_text, true) } // more related insertion methods /** * @param {Bonzo|string|Element|Array} node * @return {Bonzo} */ , append: function (node) { var that = this return this.each(function (el, i) { each(normalize(node, that, i), function (i) { el.appendChild(i) }) }) } /** * @param {Bonzo|string|Element|Array} node * @return {Bonzo} */ , prepend: function (node) { var that = this return this.each(function (el, i) { var first = el.firstChild each(normalize(node, that, i), function (i) { el.insertBefore(i, first) }) }) } /** * @param {Bonzo|string|Element|Array} target the location for which you'll insert your new content * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) * @return {Bonzo} */ , appendTo: function (target, opt_host) { return insert.call(this, target, opt_host, function (t, el) { t.appendChild(el) }) } /** * @param {Bonzo|string|Element|Array} target the location for which you'll insert your new content * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) * @return {Bonzo} */ , prependTo: function (target, opt_host) { return insert.call(this, target, opt_host, function (t, el) { t.insertBefore(el, t.firstChild) }, 1) } /** * @param {Bonzo|string|Element|Array} node * @return {Bonzo} */ , before: function (node) { var that = this return this.each(function (el, i) { each(normalize(node, that, i), function (i) { el[parentNode].insertBefore(i, el) }) }) } /** * @param {Bonzo|string|Element|Array} node * @return {Bonzo} */ , after: function (node) { var that = this return this.each(function (el, i) { each(normalize(node, that, i), function (i) { el[parentNode].insertBefore(i, el.nextSibling) }, null, 1) }) } /** * @param {Bonzo|string|Element|Array} target the location for which you'll insert your new content * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) * @return {Bonzo} */ , insertBefore: function (target, opt_host) { return insert.call(this, target, opt_host, function (t, el) { t[parentNode].insertBefore(el, t) }) } /** * @param {Bonzo|string|Element|Array} target the location for which you'll insert your new content * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) * @return {Bonzo} */ , insertAfter: function (target, opt_host) { return insert.call(this, target, opt_host, function (t, el) { var sibling = t.nextSibling sibling ? t[parentNode].insertBefore(el, sibling) : t[parentNode].appendChild(el) }, 1) } /** * @param {Bonzo|string|Element|Array} node * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) * @return {Bonzo} */ , replaceWith: function (node, opt_host) { var ret = bonzo(normalize(node)).insertAfter(this, opt_host) this.remove() Bonzo.call(opt_host || this, ret) return opt_host || this } // class management /** * @param {string} c * @return {Bonzo} */ , addClass: function (c) { c = toString.call(c).split(whitespaceRegex) return this.each(function (el) { // we `each` here so you can do $el.addClass('foo bar') each(c, function (c) { if (c && !hasClass(el, setter(el, c))) addClass(el, setter(el, c)) }) }) } /** * @param {string} c * @return {Bonzo} */ , removeClass: function (c) { c = toString.call(c).split(whitespaceRegex) return this.each(function (el) { each(c, function (c) { if (c && hasClass(el, setter(el, c))) removeClass(el, setter(el, c)) }) }) } /** * @param {string} c * @return {boolean} */ , hasClass: function (c) { c = toString.call(c).split(whitespaceRegex) return some(this, function (el) { return some(c, function (c) { return c && hasClass(el, c) }) }) } /** * @param {string} c classname to toggle * @param {boolean=} opt_condition whether to add or remove the class straight away * @return {Bonzo} */ , toggleClass: function (c, opt_condition) { c = toString.call(c).split(whitespaceRegex) return this.each(function (el) { each(c, function (c) { if (c) { typeof opt_condition !== 'undefined' ? opt_condition ? addClass(el, c) : removeClass(el, c) : hasClass(el, c) ? removeClass(el, c) : addClass(el, c) } }) }) } // display togglers /** * @param {string=} opt_type useful to set back to anything other than an empty string * @return {Bonzo} */ , show: function (opt_type) { opt_type = typeof opt_type == 'string' ? opt_type : '' return this.each(function (el) { el.style.display = opt_type }) } /** * @return {Bonzo} */ , hide: function () { return this.each(function (el) { el.style.display = 'none' }) } /** * @param {Function=} opt_callback * @param {string=} opt_type * @return {Bonzo} */ , toggle: function (opt_callback, opt_type) { opt_type = typeof opt_type == 'string' ? opt_type : ''; typeof opt_callback != 'function' && (opt_callback = null) return this.each(function (el) { el.style.display = (el.offsetWidth || el.offsetHeight) ? 'none' : opt_type; opt_callback && opt_callback.call(el) }) } // DOM Walkers & getters /** * @return {Element|Node} */ , first: function () { return bonzo(this.length ? this[0] : []) } /** * @return {Element|Node} */ , last: function () { return bonzo(this.length ? this[this.length - 1] : []) } /** * @return {Element|Node} */ , next: function () { return this.related('nextSibling') } /** * @return {Element|Node} */ , previous: function () { return this.related('previousSibling') } /** * @return {Element|Node} */ , parent: function() { return this.related(parentNode) } /** * @private * @param {string} method the directional DOM method * @return {Element|Node} */ , related: function (method) { return this.map( function (el) { el = el[method] while (el && el.nodeType !== 1) { el = el[method] } return el || 0 }, function (el) { return el } ) } /** * @return {Bonzo} */ , focus: function () { this.length && this[0].focus() return this } /** * @return {Bonzo} */ , blur: function () { this.length && this[0].blur() return this } // style getter setter & related methods /** * @param {Object|string} o * @param {string=} opt_v * @return {Bonzo|string} */ , css: function (o, opt_v) { var p, iter = o // is this a request for just getting a style? if (opt_v === undefined && typeof o == 'string') { // repurpose 'v' opt_v = this[0] if (!opt_v) return null if (opt_v === doc || opt_v === win) { p = (opt_v === doc) ? bonzo.doc() : bonzo.viewport() return o == 'width' ? p.width : o == 'height' ? p.height : '' } return (o = styleProperty(o)) ? getStyle(opt_v, o) : null } if (typeof o == 'string') { iter = {} iter[o] = opt_v } if (ie && iter.opacity) { // oh this 'ol gamut iter.filter = 'alpha(opacity=' + (iter.opacity * 100) + ')' // give it layout iter.zoom = o.zoom || 1; delete iter.opacity; } function fn(el, p, v) { for (var k in iter) { if (iter.hasOwnProperty(k)) { v = iter[k]; // change "5" to "5px" - unless you're line-height, which is allowed (p = styleProperty(k)) && digit.test(v) && !(p in unitless) && (v += px) try { el.style[p] = setter(el, v) } catch(e) {} } } } return this.each(fn) } /** * @param {number=} opt_x * @param {number=} opt_y * @return {Bonzo|number} */ , offset: function (opt_x, opt_y) { if (typeof opt_x == 'number' || typeof opt_y == 'number') { return this.each(function (el) { xy(el, opt_x, opt_y) }) } if (!this[0]) return { top: 0 , left: 0 , height: 0 , width: 0 } var el = this[0] , width = el.offsetWidth , height = el.offsetHeight , top = el.offsetTop , left = el.offsetLeft while (el = el.offsetParent) { top = top + el.offsetTop left = left + el.offsetLeft if (el != doc.body) { top -= el.scrollTop left -= el.scrollLeft } } return { top: top , left: left , height: height , width: width } } /** * @return {number} */ , dim: function () { if (!this.length) return { height: 0, width: 0 } var el = this[0] , orig = !el.offsetWidth && !el.offsetHeight ? // el isn't visible, can't be measured properly, so fix that function (t) { var s = { position: el.style.position || '' , visibility: el.style.visibility || '' , display: el.style.display || '' } t.first().css({ position: 'absolute' , visibility: 'hidden' , display: 'block' }) return s }(this) : null , width = el.offsetWidth , height = el.offsetHeight orig && this.first().css(orig) return { height: height , width: width } } // attributes are hard. go shopping /** * @param {string} k an attribute to get or set * @param {string=} opt_v the value to set * @return {Bonzo|string} */ , attr: function (k, opt_v) { var el = this[0] if (typeof k != 'string' && !(k instanceof String)) { for (var n in k) { k.hasOwnProperty(n) && this.attr(n, k[n]) } return this } return typeof opt_v == 'undefined' ? !el ? null : specialAttributes.test(k) ? stateAttributes.test(k) && typeof el[k] == 'string' ? true : el[k] : (k == 'href' || k =='src') && features.hrefExtended ? el[getAttribute](k, 2) : el[getAttribute](k) : this.each(function (el) { specialAttributes.test(k) ? (el[k] = setter(el, opt_v)) : el[setAttribute](k, setter(el, opt_v)) }) } /** * @param {string} k * @return {Bonzo} */ , removeAttr: function (k) { return this.each(function (el) { stateAttributes.test(k) ? (el[k] = false) : el.removeAttribute(k) }) } /** * @param {string=} opt_s * @return {Bonzo|string} */ , val: function (s) { return (typeof s == 'string') ? this.attr('value', s) : this.length ? this[0].value : null } // use with care and knowledge. this data() method uses data attributes on the DOM nodes // to do this differently costs a lot more code. c'est la vie /** * @param {string|Object=} opt_k the key for which to get or set data * @param {Object=} opt_v * @return {Bonzo|Object} */ , data: function (opt_k, opt_v) { var el = this[0], o, m if (typeof opt_v === 'undefined') { if (!el) return null o = data(el) if (typeof opt_k === 'undefined') { each(el.attributes, function (a) { (m = ('' + a.name).match(dattr)) && (o[camelize(m[1])] = dataValue(a.value)) }) return o } else { if (typeof o[opt_k] === 'undefined') o[opt_k] = dataValue(this.attr('data-' + decamelize(opt_k))) return o[opt_k] } } else { return this.each(function (el) { data(el)[opt_k] = opt_v }) } } // DOM detachment & related /** * @return {Bonzo} */ , remove: function () { this.deepEach(clearData) return this.each(function (el) { el[parentNode] && el[parentNode].removeChild(el) }) } /** * @return {Bonzo} */ , empty: function () { return this.each(function (el) { deepEach(el.childNodes, clearData) while (el.firstChild) { el.removeChild(el.firstChild) } }) } /** * @return {Bonzo} */ , detach: function () { return this.each(function (el) { el[parentNode].removeChild(el) }) } // who uses a mouse anyway? oh right. /** * @param {number} y */ , scrollTop: function (y) { return scroll.call(this, null, y, 'y') } /** * @param {number} x */ , scrollLeft: function (x) { return scroll.call(this, x, null, 'x') } } function normalize(node, host, clone) { var i, l, ret if (typeof node == 'string') return bonzo.create(node) if (isNode(node)) node = [ node ] if (clone) { ret = [] // don't change original array for (i = 0, l = node.length; i < l; i++) ret[i] = cloneNode(host, node[i]) return ret } return node } function cloneNode(host, el) { var c = el.cloneNode(true) , cloneElems , elElems // check for existence of an event cloner // preferably https://github.com/fat/bean // otherwise Bonzo won't do this for you if (host.$ && typeof host.cloneEvents == 'function') { host.$(c).cloneEvents(el) // clone events from every child node cloneElems = host.$(c).find('*') elElems = host.$(el).find('*') for (var i = 0; i < elElems.length; i++) host.$(cloneElems[i]).cloneEvents(elElems[i]) } return c } function scroll(x, y, type) { var el = this[0] if (!el) return this if (x == null && y == null) { return (isBody(el) ? getWindowScroll() : { x: el.scrollLeft, y: el.scrollTop })[type] } if (isBody(el)) { win.scrollTo(x, y) } else { x != null && (el.scrollLeft = x) y != null && (el.scrollTop = y) } return this } function isBody(element) { return element === win || (/^(?:body|html)$/i).test(element.tagName) } function getWindowScroll() { return { x: win.pageXOffset || html.scrollLeft, y: win.pageYOffset || html.scrollTop } } /** * @param {Array.|Element|Node|string} els * @return {Bonzo} */ function bonzo(els) { return new Bonzo(els) } bonzo.setQueryEngine = function (q) { query = q; delete bonzo.setQueryEngine } bonzo.aug = function (o, target) { // for those standalone bonzo users. this love is for you. for (var k in o) { o.hasOwnProperty(k) && ((target || Bonzo.prototype)[k] = o[k]) } } bonzo.create = function (node) { // hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh return typeof node == 'string' && node !== '' ? function () { var tag = /^\s*<([^\s>]+)/.exec(node) , el = doc.createElement('div') , els = [] , p = tag ? tagMap[tag[1].toLowerCase()] : null , dep = p ? p[2] + 1 : 1 , ns = p && p[3] , pn = parentNode , tb = features.autoTbody && p && p[0] == '' && !(/,
, etc. if ((!tag || el.nodeType == 1) && (!tb || el.tagName.toLowerCase() != 'tbody')) { els.push(el) } } while (el = el.nextSibling) // IE < 9 gives us a parentNode which messes up insert() check for cloning // `dep` > 1 can also cause problems with the insert() check (must do this last) each(els, function(el) { el[pn] && el[pn].removeChild(el) }) return els }() : isNode(node) ? [node.cloneNode(true)] : [] } bonzo.doc = function () { var vp = bonzo.viewport() return { width: Math.max(doc.body.scrollWidth, html.scrollWidth, vp.width) , height: Math.max(doc.body.scrollHeight, html.scrollHeight, vp.height) } } bonzo.firstChild = function (el) { for (var c = el.childNodes, i = 0, j = (c && c.length) || 0, e; i < j; i++) { if (c[i].nodeType === 1) e = c[j = i] } return e } bonzo.viewport = function () { return { width: ie ? html.clientWidth : self.innerWidth , height: ie ? html.clientHeight : self.innerHeight } } bonzo.isAncestor = 'compareDocumentPosition' in html ? function (container, element) { return (container.compareDocumentPosition(element) & 16) == 16 } : 'contains' in html ? function (container, element) { return container !== element && container.contains(element); } : function (container, element) { while (element = element[parentNode]) { if (element === container) { return true } } return false } return bonzo }, this); // the only line we care about using a semi-colon. placed here for concatenation tools provide("bonzo", module.exports); (function ($) { var b = require('bonzo') b.setQueryEngine($) $.ender(b) $.ender(b(), true) $.ender({ create: function (node) { return $(b.create(node)) } }) $.id = function (id) { return $([document.getElementById(id)]) } function indexOf(ar, val) { for (var i = 0; i < ar.length; i++) if (ar[i] === val) return i return -1 } function uniq(ar) { var r = [], i = 0, j = 0, k, item, inIt for (; item = ar[i]; ++i) { inIt = false for (k = 0; k < r.length; ++k) { if (r[k] === item) { inIt = true; break } } if (!inIt) r[j++] = item } return r } $.ender({ parents: function (selector, closest) { if (!this.length) return this var collection = $(selector), j, k, p, r = [] for (j = 0, k = this.length; j < k; j++) { p = this[j] while (p = p.parentNode) { if (~indexOf(collection, p)) { r.push(p) if (closest) break; } } } return $(uniq(r)) } , parent: function() { return $(uniq(b(this).parent())) } , closest: function (selector) { return this.parents(selector, true) } , first: function () { return $(this.length ? this[0] : this) } , last: function () { return $(this.length ? this[this.length - 1] : []) } , next: function () { return $(b(this).next()) } , previous: function () { return $(b(this).previous()) } , appendTo: function (t) { return b(this.selector).appendTo(t, this) } , prependTo: function (t) { return b(this.selector).prependTo(t, this) } , insertAfter: function (t) { return b(this.selector).insertAfter(t, this) } , insertBefore: function (t) { return b(this.selector).insertBefore(t, this) } , replaceWith: function (t) { return b(this.selector).replaceWith(t, this) } , siblings: function () { var i, l, p, r = [] for (i = 0, l = this.length; i < l; i++) { p = this[i] while (p = p.previousSibling) p.nodeType == 1 && r.push(p) p = this[i] while (p = p.nextSibling) p.nodeType == 1 && r.push(p) } return $(r) } , children: function () { var i, l, el, r = [] for (i = 0, l = this.length; i < l; i++) { if (!(el = b.firstChild(this[i]))) continue; r.push(el) while (el = el.nextSibling) el.nodeType == 1 && r.push(el) } return $(uniq(r)) } , height: function (v) { return dimension.call(this, 'height', v) } , width: function (v) { return dimension.call(this, 'width', v) } }, true) /** * @param {string} type either width or height * @param {number=} opt_v becomes a setter instead of a getter * @return {number} */ function dimension(type, opt_v) { return typeof opt_v == 'undefined' ? b(this).dim()[type] : this.css(type, opt_v) } }(ender)); }()); (function () { var module = { exports: {} }, exports = module.exports; /*! * bean.js - copyright Jacob Thornton 2011 * https://github.com/fat/bean * MIT License * special thanks to: * dean edwards: http://dean.edwards.name/ * dperini: https://github.com/dperini/nwevents * the entire mootools team: github.com/mootools/mootools-core */ !function (name, context, definition) { if (typeof module !== 'undefined') module.exports = definition(name, context); else if (typeof define === 'function' && typeof define.amd === 'object') define(definition); else context[name] = definition(name, context); }('bean', this, function (name, context) { var win = window , old = context[name] , overOut = /over|out/ , namespaceRegex = /[^\.]*(?=\..*)\.|.*/ , nameRegex = /\..*/ , addEvent = 'addEventListener' , attachEvent = 'attachEvent' , removeEvent = 'removeEventListener' , detachEvent = 'detachEvent' , ownerDocument = 'ownerDocument' , targetS = 'target' , qSA = 'querySelectorAll' , doc = document || {} , root = doc.documentElement || {} , W3C_MODEL = root[addEvent] , eventSupport = W3C_MODEL ? addEvent : attachEvent , slice = Array.prototype.slice , mouseTypeRegex = /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i , mouseWheelTypeRegex = /mouse.*(wheel|scroll)/i , textTypeRegex = /^text/i , touchTypeRegex = /^touch|^gesture/i , ONE = {} // singleton for quick matching making add() do one() , nativeEvents = (function (hash, events, i) { for (i = 0; i < events.length; i++) hash[events[i]] = 1 return hash }({}, ( 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement 'keydown keypress keyup ' + // keyboard 'orientationchange ' + // mobile 'focus blur change reset select submit ' + // form elements 'load unload beforeunload resize move DOMContentLoaded '+ // window 'readystatechange message ' + // window 'error abort scroll ' + // misc (W3C_MODEL ? // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event // that doesn't actually exist, so make sure we only do these on newer browsers 'show ' + // mouse buttons 'input invalid ' + // form elements 'touchstart touchmove touchend touchcancel ' + // touch 'gesturestart gesturechange gestureend ' + // gesture 'readystatechange pageshow pagehide popstate ' + // window 'hashchange offline online ' + // window 'afterprint beforeprint ' + // printing 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd 'loadstart progress suspend emptied stalled loadmetadata ' + // media 'loadeddata canplay canplaythrough playing waiting seeking ' + // media 'seeked ended durationchange timeupdate play pause ratechange ' + // media 'volumechange cuechange ' + // media 'checking noupdate downloading cached updateready obsolete ' + // appcache '' : '') ).split(' ') )) , customEvents = (function () { var cdp = 'compareDocumentPosition' , isAncestor = cdp in root ? function (element, container) { return container[cdp] && (container[cdp](element) & 16) === 16 } : 'contains' in root ? function (element, container) { container = container.nodeType === 9 || container === window ? root : container return container !== element && container.contains(element) } : function (element, container) { while (element = element.parentNode) if (element === container) return 1 return 0 } function check(event) { var related = event.relatedTarget return !related ? related === null : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString()) && !isAncestor(related, this)) } return { mouseenter: { base: 'mouseover', condition: check } , mouseleave: { base: 'mouseout', condition: check } , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' } } }()) , fixEvent = (function () { var commonProps = 'altKey attrChange attrName bubbles cancelable ctrlKey currentTarget detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey srcElement target timeStamp type view which'.split(' ') , mouseProps = commonProps.concat('button buttons clientX clientY dataTransfer fromElement offsetX offsetY pageX pageY screenX screenY toElement'.split(' ')) , mouseWheelProps = mouseProps.concat('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ axis'.split(' ')) // 'axis' is FF specific , keyProps = commonProps.concat('char charCode key keyCode keyIdentifier keyLocation'.split(' ')) , textProps = commonProps.concat(['data']) , touchProps = commonProps.concat('touches targetTouches changedTouches scale rotation'.split(' ')) , messageProps = commonProps.concat(['data', 'origin', 'source']) , preventDefault = 'preventDefault' , createPreventDefault = function (event) { return function () { if (event[preventDefault]) event[preventDefault]() else event.returnValue = false } } , stopPropagation = 'stopPropagation' , createStopPropagation = function (event) { return function () { if (event[stopPropagation]) event[stopPropagation]() else event.cancelBubble = true } } , createStop = function (synEvent) { return function () { synEvent[preventDefault]() synEvent[stopPropagation]() synEvent.stopped = true } } , copyProps = function (event, result, props) { var i, p for (i = props.length; i--;) { p = props[i] if (!(p in result) && p in event) result[p] = event[p] } } return function (event, isNative) { var result = { originalEvent: event, isNative: isNative } if (!event) return result var props , type = event.type , target = event[targetS] || event.srcElement result[preventDefault] = createPreventDefault(event) result[stopPropagation] = createStopPropagation(event) result.stop = createStop(result) result[targetS] = target && target.nodeType === 3 ? target.parentNode : target if (isNative) { // we only need basic augmentation on custom events, the rest is too expensive if (type.indexOf('key') !== -1) { props = keyProps result.keyCode = event.keyCode || event.which } else if (mouseTypeRegex.test(type)) { props = mouseProps result.rightClick = event.which === 3 || event.button === 2 result.pos = { x: 0, y: 0 } if (event.pageX || event.pageY) { result.clientX = event.pageX result.clientY = event.pageY } else if (event.clientX || event.clientY) { result.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft result.clientY = event.clientY + doc.body.scrollTop + root.scrollTop } if (overOut.test(type)) result.relatedTarget = event.relatedTarget || event[(type === 'mouseover' ? 'from' : 'to') + 'Element'] } else if (touchTypeRegex.test(type)) { props = touchProps } else if (mouseWheelTypeRegex.test(type)) { props = mouseWheelProps } else if (textTypeRegex.test(type)) { props = textProps } else if (type === 'message') { props = messageProps } copyProps(event, result, props || commonProps) } return result } }()) // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both , targetElement = function (element, isNative) { return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element } // we use one of these per listener, of any type , RegEntry = (function () { function entry(element, type, handler, original, namespaces) { var isNative = this.isNative = nativeEvents[type] && element[eventSupport] this.element = element this.type = type this.handler = handler this.original = original this.namespaces = namespaces this.custom = customEvents[type] this.eventType = W3C_MODEL || isNative ? type : 'propertychange' this.customType = !W3C_MODEL && !isNative && type this[targetS] = targetElement(element, isNative) this[eventSupport] = this[targetS][eventSupport] } entry.prototype = { // given a list of namespaces, is our entry in any of them? inNamespaces: function (checkNamespaces) { var i, j if (!checkNamespaces) return true if (!this.namespaces) return false for (i = checkNamespaces.length; i--;) { for (j = this.namespaces.length; j--;) { if (checkNamespaces[i] === this.namespaces[j]) return true } } return false } // match by element, original fn (opt), handler fn (opt) , matches: function (checkElement, checkOriginal, checkHandler) { return this.element === checkElement && (!checkOriginal || this.original === checkOriginal) && (!checkHandler || this.handler === checkHandler) } } return entry }()) , registry = (function () { // our map stores arrays by event type, just because it's better than storing // everything in a single array. uses '$' as a prefix for the keys for safety var map = {} // generic functional search of our registry for matching listeners, // `fn` returns false to break out of the loop , forAll = function (element, type, original, handler, fn) { if (!type || type === '*') { // search the whole registry for (var t in map) { if (t.charAt(0) === '$') forAll(element, t.substr(1), original, handler, fn) } } else { var i = 0, l, list = map['$' + type], all = element === '*' if (!list) return for (l = list.length; i < l; i++) { if (all || list[i].matches(element, original, handler)) if (!fn(list[i], list, i, type)) return } } } , has = function (element, type, original) { // we're not using forAll here simply because it's a bit slower and this // needs to be fast var i, list = map['$' + type] if (list) { for (i = list.length; i--;) { if (list[i].matches(element, original, null)) return true } } return false } , get = function (element, type, original) { var entries = [] forAll(element, type, original, null, function (entry) { return entries.push(entry) }) return entries } , put = function (entry) { (map['$' + entry.type] || (map['$' + entry.type] = [])).push(entry) return entry } , del = function (entry) { forAll(entry.element, entry.type, null, entry.handler, function (entry, list, i) { list.splice(i, 1) if (list.length === 0) delete map['$' + entry.type] return false }) } // dump all entries, used for onunload , entries = function () { var t, entries = [] for (t in map) { if (t.charAt(0) === '$') entries = entries.concat(map[t]) } return entries } return { has: has, get: get, put: put, del: del, entries: entries } }()) , selectorEngine = doc[qSA] ? function (s, r) { return r[qSA](s) } : function () { throw new Error('Bean: No selector engine installed') // eeek } , setSelectorEngine = function (e) { selectorEngine = e } // add and remove listeners to DOM elements , listener = W3C_MODEL ? function (element, type, fn, add) { element[add ? addEvent : removeEvent](type, fn, false) } : function (element, type, fn, add, custom) { if (custom && add && element['_on' + custom] === null) element['_on' + custom] = 0 element[add ? attachEvent : detachEvent]('on' + type, fn) } , nativeHandler = function (element, fn, args) { var beanDel = fn.__beanDel , handler = function (event) { event = fixEvent(event || ((this[ownerDocument] || this.document || this).parentWindow || win).event, true) if (beanDel) // delegated event, fix the fix event.currentTarget = beanDel.ft(event[targetS], element) return fn.apply(element, [event].concat(args)) } handler.__beanDel = beanDel return handler } , customHandler = function (element, fn, type, condition, args, isNative) { var beanDel = fn.__beanDel , handler = function (event) { var target = beanDel ? beanDel.ft(event[targetS], element) : this // deleated event if (condition ? condition.apply(target, arguments) : W3C_MODEL ? true : event && event.propertyName === '_on' + type || !event) { if (event) { event = fixEvent(event || ((this[ownerDocument] || this.document || this).parentWindow || win).event, isNative) event.currentTarget = target } fn.apply(element, event && (!args || args.length === 0) ? arguments : slice.call(arguments, event ? 0 : 1).concat(args)) } } handler.__beanDel = beanDel return handler } , once = function (rm, element, type, fn, originalFn) { // wrap the handler in a handler that does a remove as well return function () { rm(element, type, originalFn) fn.apply(this, arguments) } } , removeListener = function (element, orgType, handler, namespaces) { var i, l, entry , type = (orgType && orgType.replace(nameRegex, '')) , handlers = registry.get(element, type, handler) for (i = 0, l = handlers.length; i < l; i++) { if (handlers[i].inNamespaces(namespaces)) { if ((entry = handlers[i])[eventSupport]) listener(entry[targetS], entry.eventType, entry.handler, false, entry.type) // TODO: this is problematic, we have a registry.get() and registry.del() that // both do registry searches so we waste cycles doing this. Needs to be rolled into // a single registry.forAll(fn) that removes while finding, but the catch is that // we'll be splicing the arrays that we're iterating over. Needs extra tests to // make sure we don't screw it up. @rvagg registry.del(entry) } } } , addListener = function (element, orgType, fn, originalFn, args) { var entry , type = orgType.replace(nameRegex, '') , namespaces = orgType.replace(namespaceRegex, '').split('.') if (registry.has(element, type, fn)) return element // no dupe if (type === 'unload') fn = once(removeListener, element, type, fn, originalFn) // self clean-up if (customEvents[type]) { if (customEvents[type].condition) fn = customHandler(element, fn, type, customEvents[type].condition, args, true) type = customEvents[type].base || type } entry = registry.put(new RegEntry(element, type, fn, originalFn, namespaces[0] && namespaces)) entry.handler = entry.isNative ? nativeHandler(element, entry.handler, args) : customHandler(element, entry.handler, type, false, args, false) if (entry[eventSupport]) listener(entry[targetS], entry.eventType, entry.handler, true, entry.customType) } , del = function (selector, fn, $) { //TODO: findTarget (therefore $) is called twice, once for match and once for // setting e.currentTarget, fix this so it's only needed once var findTarget = function (target, root) { var i, array = typeof selector === 'string' ? $(selector, root) : selector for (; target && target !== root; target = target.parentNode) { for (i = array.length; i--;) { if (array[i] === target) return target } } } , handler = function (e) { var match = findTarget(e[targetS], this) match && fn.apply(match, arguments) } handler.__beanDel = { ft: findTarget // attach it here for customEvents to use too , selector: selector , $: $ } return handler } , remove = function (element, typeSpec, fn) { var k, type, namespaces, i , rm = removeListener , isString = typeSpec && typeof typeSpec === 'string' if (isString && typeSpec.indexOf(' ') > 0) { // remove(el, 't1 t2 t3', fn) or remove(el, 't1 t2 t3') typeSpec = typeSpec.split(' ') for (i = typeSpec.length; i--;) remove(element, typeSpec[i], fn) return element } type = isString && typeSpec.replace(nameRegex, '') if (type && customEvents[type]) type = customEvents[type].type if (!typeSpec || isString) { // remove(el) or remove(el, t1.ns) or remove(el, .ns) or remove(el, .ns1.ns2.ns3) if (namespaces = isString && typeSpec.replace(namespaceRegex, '')) namespaces = namespaces.split('.') rm(element, type, fn, namespaces) } else if (typeof typeSpec === 'function') { // remove(el, fn) rm(element, null, typeSpec) } else { // remove(el, { t1: fn1, t2, fn2 }) for (k in typeSpec) { if (typeSpec.hasOwnProperty(k)) remove(element, k, typeSpec[k]) } } return element } // 5th argument, $=selector engine, is deprecated and will be removed , add = function (element, events, fn, delfn, $) { var type, types, i, args , originalFn = fn , isDel = fn && typeof fn === 'string' if (events && !fn && typeof events === 'object') { for (type in events) { if (events.hasOwnProperty(type)) add.apply(this, [ element, type, events[type] ]) } } else { args = arguments.length > 3 ? slice.call(arguments, 3) : [] types = (isDel ? fn : events).split(' ') isDel && (fn = del(events, (originalFn = delfn), $ || selectorEngine)) && (args = slice.call(args, 1)) // special case for one() this === ONE && (fn = once(remove, element, events, fn, originalFn)) for (i = types.length; i--;) addListener(element, types[i], fn, originalFn, args) } return element } , one = function () { return add.apply(ONE, arguments) } , fireListener = W3C_MODEL ? function (isNative, type, element) { var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents') evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1) element.dispatchEvent(evt) } : function (isNative, type, element) { element = targetElement(element, isNative) // if not-native then we're using onpropertychange so we just increment a custom property isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++ } , fire = function (element, type, args) { var i, j, l, names, handlers , types = type.split(' ') for (i = types.length; i--;) { type = types[i].replace(nameRegex, '') if (names = types[i].replace(namespaceRegex, '')) names = names.split('.') if (!names && !args && element[eventSupport]) { fireListener(nativeEvents[type], type, element) } else { // non-native event, either because of a namespace, arguments or a non DOM element // iterate over all listeners and manually 'fire' handlers = registry.get(element, type) args = [false].concat(args) for (j = 0, l = handlers.length; j < l; j++) { if (handlers[j].inNamespaces(names)) handlers[j].handler.apply(element, args) } } } return element } , clone = function (element, from, type) { var i = 0 , handlers = registry.get(from, type) , l = handlers.length , args, beanDel for (;i < l; i++) { if (handlers[i].original) { beanDel = handlers[i].handler.__beanDel if (beanDel) { args = [ element, beanDel.selector, handlers[i].type, handlers[i].original, beanDel.$] } else args = [ element, handlers[i].type, handlers[i].original ] add.apply(null, args) } } return element } , bean = { add: add , one: one , remove: remove , clone: clone , fire: fire , setSelectorEngine: setSelectorEngine , noConflict: function () { context[name] = old return this } } if (win[attachEvent]) { // for IE, clean up on unload to avoid leaks var cleanup = function () { var i, entries = registry.entries() for (i in entries) { if (entries[i].type && entries[i].type !== 'unload') remove(entries[i].element, entries[i].type) } win[detachEvent]('onunload', cleanup) win.CollectGarbage && win.CollectGarbage() } win[attachEvent]('onunload', cleanup) } return bean }) provide("bean", module.exports); !function ($) { var b = require('bean') , integrate = function (method, type, method2) { var _args = type ? [type] : [] return function () { for (var i = 0, l = this.length; i < l; i++) { if (!arguments.length && method == 'add' && type) method = 'fire' b[method].apply(this, [this[i]].concat(_args, Array.prototype.slice.call(arguments, 0))) } return this } } , add = integrate('add') , remove = integrate('remove') , fire = integrate('fire') , methods = { on: add // NOTE: .on() is likely to change in the near future, don't rely on this as-is see https://github.com/fat/bean/issues/55 , addListener: add , bind: add , listen: add , delegate: add , one: integrate('one') , off: remove , unbind: remove , unlisten: remove , removeListener: remove , undelegate: remove , emit: fire , trigger: fire , cloneEvents: integrate('clone') , hover: function (enter, leave, i) { // i for internal for (i = this.length; i--;) { b.add.call(this, this[i], 'mouseenter', enter) b.add.call(this, this[i], 'mouseleave', leave) } return this } } , shortcuts = ('blur change click dblclick error focus focusin focusout keydown keypress ' + 'keyup load mousedown mouseenter mouseleave mouseout mouseover mouseup ' + 'mousemove resize scroll select submit unload').split(' ') for (var i = shortcuts.length; i--;) { methods[shortcuts[i]] = integrate('add', shortcuts[i]) } b.setSelectorEngine($) $.ender(methods, true) }(ender) }()); (function () { var module = { exports: {} }, exports = module.exports; /*! * Reqwest! A general purpose XHR connection manager * (c) Dustin Diaz 2011 * https://github.com/ded/reqwest * license MIT */ !function (name, definition) { if (typeof module != 'undefined') module.exports = definition() else if (typeof define == 'function' && define.amd) define(name, definition) else this[name] = definition() }('reqwest', function () { var win = window , doc = document , twoHundo = /^20\d$/ , byTag = 'getElementsByTagName' , readyState = 'readyState' , contentType = 'Content-Type' , requestedWith = 'X-Requested-With' , head = doc[byTag]('head')[0] , uniqid = 0 , lastValue // data stored by the most recent JSONP callback , xmlHttpRequest = 'XMLHttpRequest' , isArray = typeof Array.isArray == 'function' ? Array.isArray : function (a) { return a instanceof Array } , defaultHeaders = { contentType: 'application/x-www-form-urlencoded' , accept: { '*': 'text/javascript, text/html, application/xml, text/xml, */*' , xml: 'application/xml, text/xml' , html: 'text/html' , text: 'text/plain' , json: 'application/json, text/javascript' , js: 'application/javascript, text/javascript' } , requestedWith: xmlHttpRequest } , xhr = win[xmlHttpRequest] ? function () { return new XMLHttpRequest() } : function () { return new ActiveXObject('Microsoft.XMLHTTP') } function handleReadyState(o, success, error) { return function () { if (o && o[readyState] == 4) { if (twoHundo.test(o.status)) { success(o) } else { error(o) } } } } function setHeaders(http, o) { var headers = o.headers || {}, h headers.Accept = headers.Accept || defaultHeaders.accept[o.type] || defaultHeaders.accept['*'] // breaks cross-origin requests with legacy browsers if (!o.crossOrigin && !headers[requestedWith]) headers[requestedWith] = defaultHeaders.requestedWith if (!headers[contentType]) headers[contentType] = o.contentType || defaultHeaders.contentType for (h in headers) { headers.hasOwnProperty(h) && http.setRequestHeader(h, headers[h]) } } function generalCallback(data) { lastValue = data } function urlappend(url, s) { return url + (/\?/.test(url) ? '&' : '?') + s } function handleJsonp(o, fn, err, url) { var reqId = uniqid++ , cbkey = o.jsonpCallback || 'callback' // the 'callback' key , cbval = o.jsonpCallbackName || ('reqwest_' + reqId) // the 'callback' value , cbreg = new RegExp('((^|\\?|&)' + cbkey + ')=([^&]+)') , match = url.match(cbreg) , script = doc.createElement('script') , loaded = 0 if (match) { if (match[3] === '?') { url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name } else { cbval = match[3] // provided callback func name } } else { url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em } win[cbval] = generalCallback script.type = 'text/javascript' script.src = url script.async = true if (typeof script.onreadystatechange !== 'undefined') { // need this for IE due to out-of-order onreadystatechange(), binding script // execution to an event listener gives us control over when the script // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html script.event = 'onclick' script.htmlFor = script.id = '_reqwest_' + reqId } script.onload = script.onreadystatechange = function () { if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) { return false } script.onload = script.onreadystatechange = null script.onclick && script.onclick() // Call the user callback with the last value stored and clean up values and scripts. o.success && o.success(lastValue) lastValue = undefined head.removeChild(script) loaded = 1 } // Add the script to the DOM head head.appendChild(script) } function getRequest(o, fn, err) { var method = (o.method || 'GET').toUpperCase() , url = typeof o === 'string' ? o : o.url // convert non-string objects to query-string form unless o.processData is false , data = (o.processData !== false && o.data && typeof o.data !== 'string') ? reqwest.toQueryString(o.data) : (o.data || null) , http // if we're working on a GET request and we have data then we should append // query string to end of URL and not post data if ((o.type == 'jsonp' || method == 'GET') && data) { url = urlappend(url, data) data = null } if (o.type == 'jsonp') return handleJsonp(o, fn, err, url) http = xhr() http.open(method, url, true) setHeaders(http, o) http.onreadystatechange = handleReadyState(http, fn, err) o.before && o.before(http) http.send(data) return http } function Reqwest(o, fn) { this.o = o this.fn = fn init.apply(this, arguments) } function setType(url) { var m = url.match(/\.(json|jsonp|html|xml)(\?|$)/) return m ? m[1] : 'js' } function init(o, fn) { this.url = typeof o == 'string' ? o : o.url this.timeout = null var type = o.type || setType(this.url) , self = this fn = fn || function () {} if (o.timeout) { this.timeout = setTimeout(function () { self.abort() }, o.timeout) } function complete(resp) { o.timeout && clearTimeout(self.timeout) self.timeout = null o.complete && o.complete(resp) } function success(resp) { var r = resp.responseText if (r) { switch (type) { case 'json': try { resp = win.JSON ? win.JSON.parse(r) : eval('(' + r + ')') } catch (err) { return error(resp, 'Could not parse JSON in response', err) } break; case 'js': resp = eval(r) break; case 'html': resp = r break; } } fn(resp) o.success && o.success(resp) complete(resp) } function error(resp, msg, t) { o.error && o.error(resp, msg, t) complete(resp) } this.request = getRequest(o, success, error) } Reqwest.prototype = { abort: function () { this.request.abort() } , retry: function () { init.call(this, this.o, this.fn) } } function reqwest(o, fn) { return new Reqwest(o, fn) } // normalize newline variants according to spec -> CRLF function normalize(s) { return s ? s.replace(/\r?\n/g, '\r\n') : '' } function serial(el, cb) { var n = el.name , t = el.tagName.toLowerCase() , optCb = function(o) { // IE gives value="" even where there is no value attribute // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273 if (o && !o.disabled) cb(n, normalize(o.attributes.value && o.attributes.value.specified ? o.value : o.text)) } // don't serialize elements that are disabled or without a name if (el.disabled || !n) return; switch (t) { case 'input': if (!/reset|button|image|file/i.test(el.type)) { var ch = /checkbox/i.test(el.type) , ra = /radio/i.test(el.type) , val = el.value; // WebKit gives us "" instead of "on" if a checkbox has no value, so correct it here (!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val)) } break; case 'textarea': cb(n, normalize(el.value)) break; case 'select': if (el.type.toLowerCase() === 'select-one') { optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null) } else { for (var i = 0; el.length && i < el.length; i++) { el.options[i].selected && optCb(el.options[i]) } } break; } } // collect up all form elements found from the passed argument elements all // the way down to child elements; pass a '
' or form fields. // called with 'this'=callback to use for serial() on each element function eachFormElement() { var cb = this , e, i, j , serializeSubtags = function(e, tags) { for (var i = 0; i < tags.length; i++) { var fa = e[byTag](tags[i]) for (j = 0; j < fa.length; j++) serial(fa[j], cb) } } for (i = 0; i < arguments.length; i++) { e = arguments[i] if (/input|select|textarea/i.test(e.tagName)) serial(e, cb) serializeSubtags(e, [ 'input', 'select', 'textarea' ]) } } // standard query string style serialization function serializeQueryString() { return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments)) } // { 'name': 'value', ... } style serialization function serializeHash() { var hash = {} eachFormElement.apply(function (name, value) { if (name in hash) { hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]]) hash[name].push(value) } else hash[name] = value }, arguments) return hash } // [ { name: 'name', value: 'value' }, ... ] style serialization reqwest.serializeArray = function () { var arr = [] eachFormElement.apply(function(name, value) { arr.push({name: name, value: value}) }, arguments) return arr } reqwest.serialize = function () { if (arguments.length === 0) return '' var opt, fn , args = Array.prototype.slice.call(arguments, 0) opt = args.pop() opt && opt.nodeType && args.push(opt) && (opt = null) opt && (opt = opt.type) if (opt == 'map') fn = serializeHash else if (opt == 'array') fn = reqwest.serializeArray else fn = serializeQueryString return fn.apply(null, args) } reqwest.toQueryString = function (o) { var qs = '', i , enc = encodeURIComponent , push = function (k, v) { qs += enc(k) + '=' + enc(v) + '&' } if (isArray(o)) { for (i = 0; o && i < o.length; i++) push(o[i].name, o[i].value) } else { for (var k in o) { if (!Object.hasOwnProperty.call(o, k)) continue; var v = o[k] if (isArray(v)) { for (i = 0; i < v.length; i++) push(k, v[i]) } else push(k, o[k]) } } // spaces should be + according to spec return qs.replace(/&$/, '').replace(/%20/g,'+') } // jQuery and Zepto compatibility, differences can be remapped here so you can call // .ajax.compat(options, callback) reqwest.compat = function (o, fn) { if (o) { o.type && (o.method = o.type) && delete o.type o.dataType && (o.type = o.dataType) o.jsonpCallback && (o.jsonpCallbackName = o.jsonpCallback) && delete o.jsonpCallback o.jsonp && (o.jsonpCallback = o.jsonp) } return new Reqwest(o, fn) } return reqwest }) provide("reqwest", module.exports); !function ($) { var r = require('reqwest') , integrate = function(method) { return function() { var args = Array.prototype.slice.call(arguments, 0) , i = (this && this.length) || 0 while (i--) args.unshift(this[i]) return r[method].apply(null, args) } } , s = integrate('serialize') , sa = integrate('serializeArray') $.ender({ ajax: r , serialize: r.serialize , serializeArray: r.serializeArray , toQueryString: r.toQueryString }) $.ender({ serialize: s , serializeArray: sa }, true) }(ender); }());opentip-2.4.6/test/readme.md000066400000000000000000000003671213277401600157500ustar00rootroot00000000000000# Tests The tests are writte in coffeescript and are in the `src/` folder. To compile them, launch `grunt js` in the project root folder. To execute the tests, simply open the `test.html` file in a browser, or run `npm test` in the root folder.opentip-2.4.6/test/src/000077500000000000000000000000001213277401600147525ustar00rootroot00000000000000opentip-2.4.6/test/src/010-opentip.coffee000066400000000000000000000402041213277401600200770ustar00rootroot00000000000000 $ = jQuery describe "Opentip", -> adapter = null beforeEach -> adapter = Opentip.adapter afterEach -> elements = $(".opentip-container") elements.remove() describe "constructor()", -> before -> sinon.stub Opentip::, "_setup" after -> Opentip::_setup.restore() it "arguments should be optional", -> element = adapter.create "
" opentip = new Opentip element, "content" expect(opentip.content).to.equal "content" expect(adapter.unwrap(opentip.triggerElement)).to.equal adapter.unwrap element opentip = new Opentip element, "content", "title", { hideOn: "click" } expect(opentip.content).to.equal "content" expect(adapter.unwrap opentip.triggerElement).to.equal adapter.unwrap element expect(opentip.options.hideOn).to.equal "click" expect(opentip.options.title).to.equal "title" opentip = new Opentip element, { hideOn: "click" } expect(adapter.unwrap opentip.triggerElement).to.equal adapter.unwrap element expect(opentip.options.hideOn).to.equal "click" expect(opentip.content).to.equal "" expect(opentip.options.title).to.equal undefined it "should always use the next tip id", -> element = document.createElement "div" Opentip.lastId = 0 opentip = new Opentip element, "Test" opentip2 = new Opentip element, "Test" opentip3 = new Opentip element, "Test" expect(opentip.id).to.be 1 expect(opentip2.id).to.be 2 expect(opentip3.id).to.be 3 it "should use the href attribute if AJAX and an A element", -> element = $("""link""")[0] opentip = new Opentip element, ajax: on expect(opentip.options.ajax).to.equal "http://testlink" it "should disable AJAX if neither URL or a link HREF is provided", -> element = $("""
text
""")[0] opentip = new Opentip element, ajax: on expect(opentip.options.ajax).to.be false it "should disable a link if the event is onClick", -> sinon.stub adapter, "observe" element = $("""link""")[0] sinon.stub Opentip::, "_setupObservers" opentip = new Opentip element, showOn: "click" expect(adapter.observe.calledOnce).to.be.ok() expect(adapter.observe.getCall(0).args[1]).to.equal "click" Opentip::_setupObservers.restore() adapter.observe.restore() it "should take all options from selected style", -> element = document.createElement "div" opentip = new Opentip element, style: "glass", showOn: "click" # Should have been set by the options expect(opentip.options.showOn).to.equal "click" # Should have been set by the glass theme expect(opentip.options.className).to.equal "glass" # Should have been set by the standard theme expect(opentip.options.stemLength).to.equal 5 it "the property 'style' should be handled the same as 'extends'", -> element = document.createElement "div" opentip = new Opentip element, extends: "glass", showOn: "click" # Should have been set by the options expect(opentip.options.showOn).to.equal "click" # Should have been set by the glass theme expect(opentip.options.className).to.equal "glass" # Should have been set by the standard theme expect(opentip.options.stemLength).to.equal 5 it "chaining incorrect styles should throw an exception", -> element = document.createElement "div" expect(-> new Opentip element, { extends: "invalidstyle" }).to.throwException /Invalid style\: invalidstyle/ it "chaining styles should work", -> element = document.createElement "div" Opentip.styles.test1 = stemLength: 40 Opentip.styles.test2 = extends: "test1", title: "overwritten title" Opentip.styles.test3 = extends: "test2", className: "test5", title: "some title" opentip = new Opentip element, { extends: "test3", stemBase: 20 } expect(opentip.options.className).to.equal "test5" expect(opentip.options.title).to.equal "some title" expect(opentip.options.stemLength).to.equal 40 expect(opentip.options.stemBase).to.equal 20 it "should set the options to fixed if a target is provided", -> element = document.createElement "div" opentip = new Opentip element, target: yes, fixed: no expect(opentip.options.fixed).to.be.ok() it "should use provided stem", -> element = document.createElement "div" opentip = new Opentip element, stem: "bottom", tipJoin: "topLeft" expect(opentip.options.stem.toString()).to.eql "bottom" it "should take the tipJoint as stem if stem is just true", -> element = document.createElement "div" opentip = new Opentip element, stem: yes, tipJoint: "top left" expect(opentip.options.stem.toString()).to.eql "top left" it "should use provided target", -> element = adapter.create "
" element2 = adapter.create "
" opentip = new Opentip element, target: element2 expect(adapter.unwrap opentip.options.target).to.equal adapter.unwrap element2 it "should take the triggerElement as target if target is just true", -> element = adapter.create "
" opentip = new Opentip element, target: yes expect(adapter.unwrap opentip.options.target).to.equal adapter.unwrap element it "currentStemPosition should be set to inital stemPosition", -> element = adapter.create "
" opentip = new Opentip element, stem: "topLeft" expect(opentip.currentStem.toString()).to.eql "top left" it "delay should be automatically set if none provided", -> element = document.createElement "div" opentip = new Opentip element, delay: null, showOn: "click" expect(opentip.options.delay).to.equal 0 opentip = new Opentip element, delay: null, showOn: "mouseover" expect(opentip.options.delay).to.equal 0.2 it "the targetJoint should be the inverse of the tipJoint if none provided", -> element = document.createElement "div" opentip = new Opentip element, tipJoint: "left" expect(opentip.options.targetJoint.toString()).to.eql "right" opentip = new Opentip element, tipJoint: "top" expect(opentip.options.targetJoint.toString()).to.eql "bottom" opentip = new Opentip element, tipJoint: "bottom right" expect(opentip.options.targetJoint.toString()).to.eql "top left" it "should setup all trigger elements", -> element = adapter.create "
" opentip = new Opentip element, showOn: "click" expect(opentip.showTriggers[0].event).to.eql "click" expect(adapter.unwrap opentip.showTriggers[0].element).to.equal adapter.unwrap element expect(opentip.showTriggersWhenVisible).to.eql [ ] expect(opentip.hideTriggers).to.eql [ ] opentip = new Opentip element, showOn: "creation" expect(opentip.showTriggers).to.eql [ ] expect(opentip.showTriggersWhenVisible).to.eql [ ] expect(opentip.hideTriggers).to.eql [ ] it "should copy options.hideTrigger onto options.hideTriggers", -> element = adapter.create "
" opentip = new Opentip element, hideTrigger: "closeButton", hideTriggers: [ ] expect(opentip.options.hideTriggers).to.eql [ "closeButton"] it "should NOT copy options.hideTrigger onto options.hideTriggers when hideTriggers are set", -> element = adapter.create "
" opentip = new Opentip element, hideTrigger: "closeButton", hideTriggers: [ "tip", "trigger" ] expect(opentip.options.hideTriggers).to.eql [ "tip", "trigger" ] it "should attach itself to the elements `data-opentips` property", -> element = $("
")[0] expect(adapter.data element, "opentips").to.not.be.ok() opentip = new Opentip element expect(adapter.data element, "opentips").to.eql [ opentip ] opentip2 = new Opentip element opentip3 = new Opentip element expect(adapter.data element, "opentips").to.eql [ opentip, opentip2, opentip3 ] it "should add itself to the Opentip.tips list", -> element = $("
")[0] Opentip.tips = [ ] opentip1 = new Opentip element opentip2 = new Opentip element expect(Opentip.tips.length).to.equal 2 expect(Opentip.tips[0]).to.equal opentip1 expect(Opentip.tips[1]).to.equal opentip2 it "should rename ajaxCache to cache for backwards compatibility", -> element = $("
")[0] opentip1 = new Opentip element, ajaxCache: off opentip2 = new Opentip element, ajaxCache: on expect(opentip1.options.ajaxCache == opentip2.options.ajaxCache == undefined).to.be.ok() expect(opentip1.options.cache).to.not.be.ok() expect(opentip2.options.cache).to.be.ok() describe "init()", -> describe "showOn == creation", -> element = document.createElement "div" beforeEach -> sinon.stub Opentip::, "prepareToShow" afterEach -> Opentip::prepareToShow.restore() it "should immediately call prepareToShow()", -> opentip = new Opentip element, showOn: "creation" expect(opentip.prepareToShow.callCount).to.equal 1 describe "setContent()", -> it "should update the content if tooltip currently visible", -> element = document.createElement "div" opentip = new Opentip element, showOn: "click" sinon.stub opentip, "_updateElementContent" opentip.visible = no opentip.setContent "TEST" expect(opentip.content).to.equal "TEST" opentip.visible = yes opentip.setContent "TEST2" expect(opentip.content).to.equal "TEST2" expect(opentip._updateElementContent.callCount).to.equal 1 opentip._updateElementContent.restore() it "should not set the content directly if function", -> element = document.createElement "div" opentip = new Opentip element, showOn: "click" sinon.stub opentip, "_updateElementContent" opentip.setContent -> "TEST" expect(opentip.content).to.equal "" describe "_updateElementContent()", -> it "should escape the content if @options.escapeContent", -> element = document.createElement "div" opentip = new Opentip element, "
", escapeContent: yes sinon.stub opentip, "_triggerElementExists", -> yes opentip.show() expect($(opentip.container).find(".ot-content").html()).to.be """<div><span></span></div>""" it "should not escape the content if not @options.escapeContent", -> element = document.createElement "div" opentip = new Opentip element, "
", escapeContent: no sinon.stub opentip, "_triggerElementExists", -> yes opentip.show() expect($(opentip.container).find(".ot-content > div > span").length).to.be 1 it "should storeAndLock dimensions and reposition the element", -> element = document.createElement "div" opentip = new Opentip element, showOn: "click" sinon.stub opentip, "_storeAndLockDimensions" sinon.stub opentip, "reposition" opentip.visible = yes opentip._updateElementContent() expect(opentip._storeAndLockDimensions.callCount).to.equal 1 expect(opentip.reposition.callCount).to.equal 1 it "should execute the content function", -> element = document.createElement "div" opentip = new Opentip element, showOn: "click" sinon.stub opentip.adapter, "find", -> "element" opentip.visible = yes opentip.setContent -> "BLA TEST" expect(opentip.content).to.be "BLA TEST" opentip.adapter.find.restore() it "should only execute the content function once if cache:true", -> element = document.createElement "div" opentip = new Opentip element, showOn: "click", cache: yes sinon.stub opentip.adapter, "find", -> "element" opentip.visible = yes counter = 0 opentip.setContent -> "count#{counter++}" expect(opentip.content).to.be "count0" opentip._updateElementContent() opentip._updateElementContent() expect(opentip.content).to.be "count0" opentip.adapter.find.restore() it "should execute the content function multiple times if cache:false", -> element = document.createElement "div" opentip = new Opentip element, showOn: "click", cache: no sinon.stub opentip.adapter, "find", -> "element" opentip.visible = yes counter = 0 opentip.setContent -> "count#{counter++}" expect(opentip.content).to.be "count0" opentip._updateElementContent() opentip._updateElementContent() expect(opentip.content).to.be "count2" opentip.adapter.find.restore() it "should only update the HTML elements if the content has been changed", -> element = document.createElement "div" opentip = new Opentip element, showOn: "click" sinon.stub opentip.adapter, "find", -> "element" sinon.stub opentip.adapter, "update", -> opentip.visible = yes opentip.setContent "TEST" expect(opentip.adapter.update.callCount).to.be 1 opentip._updateElementContent() opentip._updateElementContent() expect(opentip.adapter.update.callCount).to.be 1 opentip.setContent "TEST2" expect(opentip.adapter.update.callCount).to.be 2 opentip.adapter.find.restore() opentip.adapter.update.restore() describe "_buildContainer()", -> element = document.createElement "div" opentip = null beforeEach -> opentip = new Opentip element, style: "glass" showEffect: "appear" hideEffect: "fade" opentip._setup() it "should set the id", -> expect(adapter.attr opentip.container, "id").to.equal "opentip-" + opentip.id it "should set the classes", -> enderElement = $ adapter.unwrap opentip.container expect(enderElement.hasClass "opentip-container").to.be.ok() expect(enderElement.hasClass "ot-hidden").to.be.ok() expect(enderElement.hasClass "style-glass").to.be.ok() expect(enderElement.hasClass "ot-show-effect-appear").to.be.ok() expect(enderElement.hasClass "ot-hide-effect-fade").to.be.ok() describe "_buildElements()", -> element = opentip = null beforeEach -> element = document.createElement "div" opentip = new Opentip element, "the content", "the title", hideTrigger: "closeButton", stem: "top left", ajax: "bla" opentip._setup() opentip._buildElements() it "should add a h1 if title is provided", -> enderElement = $ adapter.unwrap opentip.container headerElement = enderElement.find "> .opentip > .ot-header > h1" expect(headerElement.length).to.be.ok() expect(headerElement.html()).to.be "the title" it "should add a loading indicator if ajax", -> enderElement = $ adapter.unwrap opentip.container loadingElement = enderElement.find "> .opentip > .ot-loading-indicator > span" expect(loadingElement.length).to.be.ok() expect(loadingElement.html()).to.be "↻" it "should add a close button if hideTrigger = close", -> enderElement = $ adapter.unwrap opentip.container closeButton = enderElement.find "> .opentip > .ot-header > a.ot-close > span" expect(closeButton.length).to.be.ok() expect(closeButton.html()).to.be "Close" describe "addAdapter()", -> it "should set the current adapter, and add the adapter to the list", -> expect(Opentip.adapters.testa).to.not.be.ok() testAdapter = { name: "testa" } Opentip.addAdapter testAdapter expect(Opentip.adapters.testa).to.equal testAdapter it "should use adapter.domReady to call findElements() with it" describe "_setupObservers()", -> it "should never setup the same observers twice" describe "_searchAndActivateCloseButtons()", -> it "should do what it says" describe "_activateFirstInput()", -> it "should do what it says", -> element = document.createElement "div" opentip = new Opentip element, "