diff options
| -rw-r--r-- | g.raphael.js | 1657 | ||||
| -rw-r--r-- | raphael.js | 5462 | ||||
| -rw-r--r-- | test/g.raphael-min.js | bin | 0 -> 3467 bytes | |||
| -rw-r--r-- | test/raphael-min.js | bin | 0 -> 29364 bytes | |||
| -rw-r--r-- | thoughts.schoolties.txt | 71 |
5 files changed, 7190 insertions, 0 deletions
diff --git a/g.raphael.js b/g.raphael.js new file mode 100644 index 0000000..a017899 --- /dev/null +++ b/g.raphael.js @@ -0,0 +1,1657 @@ + + + +<!DOCTYPE html> +<html> + <head> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="chrome=1"> + <title>g.raphael.js at master from DmitryBaranovskiy/g.raphael - GitHub</title> + <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" /> + <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" /> + + + + + <meta content="authenticity_token" name="csrf-param" /> +<meta content="r+WYTW5WE7hgPQzmVimKTsCnmUagzAFJXWioLVR5am4=" name="csrf-token" /> + + <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github-37638de9697c8782cfc0e9bab54110e31406f528.css" media="screen" rel="stylesheet" type="text/css" /> + + + <script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/jquery-6c2aad85e5c2becfaac6d62ce0f290d10fa1725e.js" type="text/javascript"></script> + <script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/github-724a1478428e953614c0459ba27f5d900fc109be.js" type="text/javascript"></script> + + + <link rel='permalink' href='/DmitryBaranovskiy/g.raphael/blob/1828dc56656c452e8795a4218842d6f5585adced/g.raphael.js'> + + + <meta name="description" content="g.raphael - Charts for RaphaΓ«l" /> + <link href="https://github.com/DmitryBaranovskiy/g.raphael/commits/master.atom" rel="alternate" title="Recent Commits to g.raphael:master" type="application/atom+xml" /> + + </head> + + + <body class="logged_out page-blob vis-public env-production "> + + + + + + <div id="header" class="true clearfix"> + <div class="container" class="clearfix"> + <a class="site-logo" href="https://github.com"> + <!--[if IE]> + <img alt="GitHub" class="github-logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7.png?1323882736" /> + <img alt="GitHub" class="github-logo-hover" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7-hover.png?1324325373" /> + <![endif]--> + <img alt="GitHub" class="github-logo-4x" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x.png?1323882736" /> + <img alt="GitHub" class="github-logo-4x-hover" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x-hover.png?1324325373" /> + </a> + + <!-- + make sure to use fully qualified URLs here since this nav + is used on error pages on other domains + --> + <ul class="top-nav logged_out"> + <li class="pricing"><a href="https://github.com/plans">Signup and Pricing</a></li> + <li class="explore"><a href="https://github.com/explore">Explore GitHub</a></li> + <li class="features"><a href="https://github.com/features">Features</a></li> + <li class="blog"><a href="https://github.com/blog">Blog</a></li> + <li class="login"><a href="https://github.com/login?return_to=%2FDmitryBaranovskiy%2Fg.raphael%2Fblob%2Fmaster%2Fg.raphael.js">Login</a></li> + </ul> + + + + + </div> + </div> + + + + <div class="site"> + <div class="container"> + <div class="pagehead repohead instapaper_ignore readability-menu"> + + + <div class="title-actions-bar"> + <h1> + <a href="/DmitryBaranovskiy">DmitryBaranovskiy</a> / + <strong><a href="/DmitryBaranovskiy/g.raphael" class="js-current-repository">g.raphael</a></strong> + </h1> + + + + + <ul class="pagehead-actions"> + + + <li><a href="/login?return_to=%2FDmitryBaranovskiy%2Fg.raphael" class="minibutton btn-watch watch-button entice tooltipped leftwards" rel="nofollow" title="You must be logged in to use this feature"><span><span class="icon"></span>Watch</span></a></li> + <li><a href="/login?return_to=%2FDmitryBaranovskiy%2Fg.raphael" class="minibutton btn-fork fork-button entice tooltipped leftwards" rel="nofollow" title="You must be logged in to use this feature"><span><span class="icon"></span>Fork</span></a></li> + + + <li class="repostats"> + <ul class="repo-stats"> + <li class="watchers "> + <a href="/DmitryBaranovskiy/g.raphael/watchers" title="Watchers" class="tooltipped downwards"> + 834 + </a> + </li> + <li class="forks"> + <a href="/DmitryBaranovskiy/g.raphael/network" title="Forks" class="tooltipped downwards"> + 191 + </a> + </li> + </ul> + </li> + </ul> + + </div> + + + + <ul class="tabs"> + <li><a href="/DmitryBaranovskiy/g.raphael" class="selected" highlight="repo_sourcerepo_downloadsrepo_commitsrepo_tagsrepo_branches">Code</a></li> + <li><a href="/DmitryBaranovskiy/g.raphael/network" highlight="repo_networkrepo_fork_queue">Network</a> + <li><a href="/DmitryBaranovskiy/g.raphael/pulls" highlight="repo_pulls">Pull Requests <span class='counter'>37</span></a></li> + + <li><a href="/DmitryBaranovskiy/g.raphael/issues" highlight="repo_issues">Issues <span class='counter'>114</span></a></li> + + + <li><a href="/DmitryBaranovskiy/g.raphael/graphs" highlight="repo_graphsrepo_contributors">Stats & Graphs</a></li> + + </ul> + + +<div class="frame frame-center tree-finder" style="display:none" + data-tree-list-url="/DmitryBaranovskiy/g.raphael/tree-list/1828dc56656c452e8795a4218842d6f5585adced" + data-blob-url-prefix="/DmitryBaranovskiy/g.raphael/blob/1828dc56656c452e8795a4218842d6f5585adced" + > + + <div class="breadcrumb"> + <b><a href="/DmitryBaranovskiy/g.raphael">g.raphael</a></b> / + <input class="tree-finder-input js-navigation-enable" type="text" name="query" autocomplete="off" spellcheck="false"> + </div> + + <div class="octotip"> + <p> + <a href="/DmitryBaranovskiy/g.raphael/dismiss-tree-finder-help" class="dismiss js-dismiss-tree-list-help" title="Hide this notice forever" rel="nofollow">Dismiss</a> + <strong>Octotip:</strong> You've activated the <em>file finder</em> + by pressing <span class="kbd">t</span> Start typing to filter the + file list. Use <span class="kbd badmono">β</span> and + <span class="kbd badmono">β</span> to navigate, + <span class="kbd">enter</span> to view files. + </p> + </div> + + <table class="tree-browser" cellpadding="0" cellspacing="0"> + <tr class="js-header"><th> </th><th>name</th></tr> + <tr class="js-no-results no-results" style="display: none"> + <th colspan="2">No matching files</th> + </tr> + <tbody class="js-results-list js-navigation-container" data-navigation-enable-mouse> + </tbody> + </table> +</div> + +<div id="jump-to-line" style="display:none"> + <h2>Jump to Line</h2> + <form> + <input class="textfield" type="text"> + <div class="full-button"> + <button type="submit" class="classy"> + <span>Go</span> + </button> + </div> + </form> +</div> + + +<div class="subnav-bar"> + + <ul class="actions"> + + <li class="switcher"> + + <div class="context-menu-container js-menu-container"> + <span class="text">Current branch:</span> + <a href="#" + class="minibutton bigger switcher context-menu-button js-menu-target js-commitish-button btn-branch repo-tree" + data-master-branch="master" + data-ref="master"> + <span><span class="icon"></span>master</span> + </a> + + <div class="context-pane commitish-context js-menu-content"> + <a href="javascript:;" class="close js-menu-close"></a> + <div class="title">Switch Branches/Tags</div> + <div class="body pane-selector commitish-selector js-filterable-commitishes"> + <div class="filterbar"> + <div class="placeholder-field js-placeholder-field"> + <label class="placeholder" for="context-commitish-filter-field" data-placeholder-mode="sticky">Filter branches/tags</label> + <input type="text" id="context-commitish-filter-field" class="commitish-filter" /> + </div> + + <ul class="tabs"> + <li><a href="#" data-filter="branches" class="selected">Branches</a></li> + <li><a href="#" data-filter="tags">Tags</a></li> + </ul> + </div> + + <div class="commitish-item branch-commitish selector-item"> + <h4> + <a href="/DmitryBaranovskiy/g.raphael/blob/dr_js_docs/g.raphael.js" data-name="dr_js_docs">dr_js_docs</a> + </h4> + </div> + <div class="commitish-item branch-commitish selector-item"> + <h4> + <a href="/DmitryBaranovskiy/g.raphael/blob/g.dot_dr.js_docs/g.raphael.js" data-name="g.dot_dr.js_docs">g.dot_dr.js_docs</a> + </h4> + </div> + <div class="commitish-item branch-commitish selector-item"> + <h4> + <a href="/DmitryBaranovskiy/g.raphael/blob/master/g.raphael.js" data-name="master">master</a> + </h4> + </div> + <div class="commitish-item branch-commitish selector-item"> + <h4> + <a href="/DmitryBaranovskiy/g.raphael/blob/raphael2_port/g.raphael.js" data-name="raphael2_port">raphael2_port</a> + </h4> + </div> + + <div class="commitish-item tag-commitish selector-item"> + <h4> + <a href="/DmitryBaranovskiy/g.raphael/blob/v0.5/g.raphael.js" data-name="v0.5">v0.5</a> + </h4> + </div> + <div class="commitish-item tag-commitish selector-item"> + <h4> + <a href="/DmitryBaranovskiy/g.raphael/blob/v0.4.1/g.raphael.js" data-name="v0.4.1">v0.4.1</a> + </h4> + </div> + + <div class="no-results" style="display:none">Nothing to show</div> + </div> + </div><!-- /.commitish-context-context --> + </div> + + </li> + </ul> + + <ul class="subnav"> + <li><a href="/DmitryBaranovskiy/g.raphael" class="selected" highlight="repo_source">Files</a></li> + <li><a href="/DmitryBaranovskiy/g.raphael/commits/master" highlight="repo_commits">Commits</a></li> + <li><a href="/DmitryBaranovskiy/g.raphael/branches" class="" highlight="repo_branches" rel="nofollow">Branches <span class="counter">4</span></a></li> + <li><a href="/DmitryBaranovskiy/g.raphael/tags" class="" highlight="repo_tags">Tags <span class="counter">2</span></a></li> + <li><a href="/DmitryBaranovskiy/g.raphael/downloads" class="blank" highlight="repo_downloads">Downloads <span class="counter">0</span></a></li> + </ul> + +</div> + + + + + + + + + </div><!-- /.repohead --> + + + + + + + + <p class="last-commit">Latest commit to the <strong>master</strong> branch</p> + +<div class="commit commit-tease js-details-container"> + <p class="commit-title "> + <a href="/DmitryBaranovskiy/g.raphael/commit/1828dc56656c452e8795a4218842d6f5585adced" class="message">Adding minified files</a> + + </p> + <div class="commit-meta"> + <a href="/DmitryBaranovskiy/g.raphael/commit/1828dc56656c452e8795a4218842d6f5585adced" class="sha-block">commit <span class="sha">1828dc5665</span></a> + + <div class="authorship"> + <img class="gravatar" height="20" src="https://secure.gravatar.com/avatar/fad5ce9e4a9c756abe504ded667b6cd1?s=140&d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png" width="20" /> + <span class="author-name"><a href="/rzurad">rzurad</a></span> + authored <time class="js-relative-date" datetime="2011-11-02T00:38:12-07:00" title="2011-11-02 00:38:12">November 02, 2011</time> + + </div> + </div> +</div> + + +<!-- block_view_fragment_key: views4/v8/blob:v14:230249:DmitryBaranovskiy/g.raphael:f49ffb5102eabb5d97335ef7a30205697e029729:1bd0f16e1a14002b583a5a55787bb2aa --> + <div id="slider"> + + <div class="breadcrumb" data-path="g.raphael.js/"> + <b><a href="/DmitryBaranovskiy/g.raphael/tree/1828dc56656c452e8795a4218842d6f5585adced" class="js-rewrite-sha">g.raphael</a></b> / g.raphael.js <span style="display:none" id="clippy_764" class="clippy-text">g.raphael.js</span> + + <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" + width="110" + height="14" + class="clippy" + id="clippy" > + <param name="movie" value="https://a248.e.akamai.net/assets.github.com/flash/clippy.swf?1261951368?v5"/> + <param name="allowScriptAccess" value="always" /> + <param name="quality" value="high" /> + <param name="scale" value="noscale" /> + <param NAME="FlashVars" value="id=clippy_764&copied=copied!&copyto=copy to clipboard"> + <param name="bgcolor" value="#FFFFFF"> + <param name="wmode" value="opaque"> + <embed src="https://a248.e.akamai.net/assets.github.com/flash/clippy.swf?1261951368?v5" + width="110" + height="14" + name="clippy" + quality="high" + allowScriptAccess="always" + type="application/x-shockwave-flash" + pluginspage="http://www.macromedia.com/go/getflashplayer" + FlashVars="id=clippy_764&copied=copied!&copyto=copy to clipboard" + bgcolor="#FFFFFF" + wmode="opaque" + /> + </object> + + + </div> + + <div class="frames"> + <div class="frame frame-center" data-path="g.raphael.js/" data-permalink-url="/DmitryBaranovskiy/g.raphael/blob/1828dc56656c452e8795a4218842d6f5585adced/g.raphael.js" data-title="g.raphael.js at master from DmitryBaranovskiy/g.raphael - GitHub" data-type="blob"> + <ul class="big-actions"> + <li><a class="file-edit-link minibutton js-rewrite-sha" href="/DmitryBaranovskiy/g.raphael/edit/1828dc56656c452e8795a4218842d6f5585adced/g.raphael.js" data-method="post" rel="nofollow"><span>Edit this file</span></a></li> + </ul> + + <div id="files"> + <div class="file"> + <div class="meta"> + <div class="info"> + <span class="icon"><img alt="Txt" height="16" src="https://a248.e.akamai.net/assets.github.com/images/icons/txt.png?1252203928" width="16" /></span> + <span class="mode" title="File Mode">100644</span> + <span>888 lines (782 sloc)</span> + <span>28.174 kb</span> + </div> + <ul class="actions"> + <li><a href="/DmitryBaranovskiy/g.raphael/raw/master/g.raphael.js" id="raw-url">raw</a></li> + <li><a href="/DmitryBaranovskiy/g.raphael/blame/master/g.raphael.js">blame</a></li> + <li><a href="/DmitryBaranovskiy/g.raphael/commits/master/g.raphael.js" rel="nofollow">history</a></li> + </ul> + </div> + <div class="data type-javascript"> + <table cellpadding="0" cellspacing="0" class="lines"> + <tr> + <td> + <pre class="line_numbers"><span id="L1" rel="#L1">1</span> +<span id="L2" rel="#L2">2</span> +<span id="L3" rel="#L3">3</span> +<span id="L4" rel="#L4">4</span> +<span id="L5" rel="#L5">5</span> +<span id="L6" rel="#L6">6</span> +<span id="L7" rel="#L7">7</span> +<span id="L8" rel="#L8">8</span> +<span id="L9" rel="#L9">9</span> +<span id="L10" rel="#L10">10</span> +<span id="L11" rel="#L11">11</span> +<span id="L12" rel="#L12">12</span> +<span id="L13" rel="#L13">13</span> +<span id="L14" rel="#L14">14</span> +<span id="L15" rel="#L15">15</span> +<span id="L16" rel="#L16">16</span> +<span id="L17" rel="#L17">17</span> +<span id="L18" rel="#L18">18</span> +<span id="L19" rel="#L19">19</span> +<span id="L20" rel="#L20">20</span> +<span id="L21" rel="#L21">21</span> +<span id="L22" rel="#L22">22</span> +<span id="L23" rel="#L23">23</span> +<span id="L24" rel="#L24">24</span> +<span id="L25" rel="#L25">25</span> +<span id="L26" rel="#L26">26</span> +<span id="L27" rel="#L27">27</span> +<span id="L28" rel="#L28">28</span> +<span id="L29" rel="#L29">29</span> +<span id="L30" rel="#L30">30</span> +<span id="L31" rel="#L31">31</span> +<span id="L32" rel="#L32">32</span> +<span id="L33" rel="#L33">33</span> +<span id="L34" rel="#L34">34</span> +<span id="L35" rel="#L35">35</span> +<span id="L36" rel="#L36">36</span> +<span id="L37" rel="#L37">37</span> +<span id="L38" rel="#L38">38</span> +<span id="L39" rel="#L39">39</span> +<span id="L40" rel="#L40">40</span> +<span id="L41" rel="#L41">41</span> +<span id="L42" rel="#L42">42</span> +<span id="L43" rel="#L43">43</span> +<span id="L44" rel="#L44">44</span> +<span id="L45" rel="#L45">45</span> +<span id="L46" rel="#L46">46</span> +<span id="L47" rel="#L47">47</span> +<span id="L48" rel="#L48">48</span> +<span id="L49" rel="#L49">49</span> +<span id="L50" rel="#L50">50</span> +<span id="L51" rel="#L51">51</span> +<span id="L52" rel="#L52">52</span> +<span id="L53" rel="#L53">53</span> +<span id="L54" rel="#L54">54</span> +<span id="L55" rel="#L55">55</span> +<span id="L56" rel="#L56">56</span> +<span id="L57" rel="#L57">57</span> +<span id="L58" rel="#L58">58</span> +<span id="L59" rel="#L59">59</span> +<span id="L60" rel="#L60">60</span> +<span id="L61" rel="#L61">61</span> +<span id="L62" rel="#L62">62</span> +<span id="L63" rel="#L63">63</span> +<span id="L64" rel="#L64">64</span> +<span id="L65" rel="#L65">65</span> +<span id="L66" rel="#L66">66</span> +<span id="L67" rel="#L67">67</span> +<span id="L68" rel="#L68">68</span> +<span id="L69" rel="#L69">69</span> +<span id="L70" rel="#L70">70</span> +<span id="L71" rel="#L71">71</span> +<span id="L72" rel="#L72">72</span> +<span id="L73" rel="#L73">73</span> +<span id="L74" rel="#L74">74</span> +<span id="L75" rel="#L75">75</span> +<span id="L76" rel="#L76">76</span> +<span id="L77" rel="#L77">77</span> +<span id="L78" rel="#L78">78</span> +<span id="L79" rel="#L79">79</span> +<span id="L80" rel="#L80">80</span> +<span id="L81" rel="#L81">81</span> +<span id="L82" rel="#L82">82</span> +<span id="L83" rel="#L83">83</span> +<span id="L84" rel="#L84">84</span> +<span id="L85" rel="#L85">85</span> +<span id="L86" rel="#L86">86</span> +<span id="L87" rel="#L87">87</span> +<span id="L88" rel="#L88">88</span> +<span id="L89" rel="#L89">89</span> +<span id="L90" rel="#L90">90</span> +<span id="L91" rel="#L91">91</span> +<span id="L92" rel="#L92">92</span> +<span id="L93" rel="#L93">93</span> +<span id="L94" rel="#L94">94</span> +<span id="L95" rel="#L95">95</span> +<span id="L96" rel="#L96">96</span> +<span id="L97" rel="#L97">97</span> +<span id="L98" rel="#L98">98</span> +<span id="L99" rel="#L99">99</span> +<span id="L100" rel="#L100">100</span> +<span id="L101" rel="#L101">101</span> +<span id="L102" rel="#L102">102</span> +<span id="L103" rel="#L103">103</span> +<span id="L104" rel="#L104">104</span> +<span id="L105" rel="#L105">105</span> +<span id="L106" rel="#L106">106</span> +<span id="L107" rel="#L107">107</span> +<span id="L108" rel="#L108">108</span> +<span id="L109" rel="#L109">109</span> +<span id="L110" rel="#L110">110</span> +<span id="L111" rel="#L111">111</span> +<span id="L112" rel="#L112">112</span> +<span id="L113" rel="#L113">113</span> +<span id="L114" rel="#L114">114</span> +<span id="L115" rel="#L115">115</span> +<span id="L116" rel="#L116">116</span> +<span id="L117" rel="#L117">117</span> +<span id="L118" rel="#L118">118</span> +<span id="L119" rel="#L119">119</span> +<span id="L120" rel="#L120">120</span> +<span id="L121" rel="#L121">121</span> +<span id="L122" rel="#L122">122</span> +<span id="L123" rel="#L123">123</span> +<span id="L124" rel="#L124">124</span> +<span id="L125" rel="#L125">125</span> +<span id="L126" rel="#L126">126</span> +<span id="L127" rel="#L127">127</span> +<span id="L128" rel="#L128">128</span> +<span id="L129" rel="#L129">129</span> +<span id="L130" rel="#L130">130</span> +<span id="L131" rel="#L131">131</span> +<span id="L132" rel="#L132">132</span> +<span id="L133" rel="#L133">133</span> +<span id="L134" rel="#L134">134</span> +<span id="L135" rel="#L135">135</span> +<span id="L136" rel="#L136">136</span> +<span id="L137" rel="#L137">137</span> +<span id="L138" rel="#L138">138</span> +<span id="L139" rel="#L139">139</span> +<span id="L140" rel="#L140">140</span> +<span id="L141" rel="#L141">141</span> +<span id="L142" rel="#L142">142</span> +<span id="L143" rel="#L143">143</span> +<span id="L144" rel="#L144">144</span> +<span id="L145" rel="#L145">145</span> +<span id="L146" rel="#L146">146</span> +<span id="L147" rel="#L147">147</span> +<span id="L148" rel="#L148">148</span> +<span id="L149" rel="#L149">149</span> +<span id="L150" rel="#L150">150</span> +<span id="L151" rel="#L151">151</span> +<span id="L152" rel="#L152">152</span> +<span id="L153" rel="#L153">153</span> +<span id="L154" rel="#L154">154</span> +<span id="L155" rel="#L155">155</span> +<span id="L156" rel="#L156">156</span> +<span id="L157" rel="#L157">157</span> +<span id="L158" rel="#L158">158</span> +<span id="L159" rel="#L159">159</span> +<span id="L160" rel="#L160">160</span> +<span id="L161" rel="#L161">161</span> +<span id="L162" rel="#L162">162</span> +<span id="L163" rel="#L163">163</span> +<span id="L164" rel="#L164">164</span> +<span id="L165" rel="#L165">165</span> +<span id="L166" rel="#L166">166</span> +<span id="L167" rel="#L167">167</span> +<span id="L168" rel="#L168">168</span> +<span id="L169" rel="#L169">169</span> +<span id="L170" rel="#L170">170</span> +<span id="L171" rel="#L171">171</span> +<span id="L172" rel="#L172">172</span> +<span id="L173" rel="#L173">173</span> +<span id="L174" rel="#L174">174</span> +<span id="L175" rel="#L175">175</span> +<span id="L176" rel="#L176">176</span> +<span id="L177" rel="#L177">177</span> +<span id="L178" rel="#L178">178</span> +<span id="L179" rel="#L179">179</span> +<span id="L180" rel="#L180">180</span> +<span id="L181" rel="#L181">181</span> +<span id="L182" rel="#L182">182</span> +<span id="L183" rel="#L183">183</span> +<span id="L184" rel="#L184">184</span> +<span id="L185" rel="#L185">185</span> +<span id="L186" rel="#L186">186</span> +<span id="L187" rel="#L187">187</span> +<span id="L188" rel="#L188">188</span> +<span id="L189" rel="#L189">189</span> +<span id="L190" rel="#L190">190</span> +<span id="L191" rel="#L191">191</span> +<span id="L192" rel="#L192">192</span> +<span id="L193" rel="#L193">193</span> +<span id="L194" rel="#L194">194</span> +<span id="L195" rel="#L195">195</span> +<span id="L196" rel="#L196">196</span> +<span id="L197" rel="#L197">197</span> +<span id="L198" rel="#L198">198</span> +<span id="L199" rel="#L199">199</span> +<span id="L200" rel="#L200">200</span> +<span id="L201" rel="#L201">201</span> +<span id="L202" rel="#L202">202</span> +<span id="L203" rel="#L203">203</span> +<span id="L204" rel="#L204">204</span> +<span id="L205" rel="#L205">205</span> +<span id="L206" rel="#L206">206</span> +<span id="L207" rel="#L207">207</span> +<span id="L208" rel="#L208">208</span> +<span id="L209" rel="#L209">209</span> +<span id="L210" rel="#L210">210</span> +<span id="L211" rel="#L211">211</span> +<span id="L212" rel="#L212">212</span> +<span id="L213" rel="#L213">213</span> +<span id="L214" rel="#L214">214</span> +<span id="L215" rel="#L215">215</span> +<span id="L216" rel="#L216">216</span> +<span id="L217" rel="#L217">217</span> +<span id="L218" rel="#L218">218</span> +<span id="L219" rel="#L219">219</span> +<span id="L220" rel="#L220">220</span> +<span id="L221" rel="#L221">221</span> +<span id="L222" rel="#L222">222</span> +<span id="L223" rel="#L223">223</span> +<span id="L224" rel="#L224">224</span> +<span id="L225" rel="#L225">225</span> +<span id="L226" rel="#L226">226</span> +<span id="L227" rel="#L227">227</span> +<span id="L228" rel="#L228">228</span> +<span id="L229" rel="#L229">229</span> +<span id="L230" rel="#L230">230</span> +<span id="L231" rel="#L231">231</span> +<span id="L232" rel="#L232">232</span> +<span id="L233" rel="#L233">233</span> +<span id="L234" rel="#L234">234</span> +<span id="L235" rel="#L235">235</span> +<span id="L236" rel="#L236">236</span> +<span id="L237" rel="#L237">237</span> +<span id="L238" rel="#L238">238</span> +<span id="L239" rel="#L239">239</span> +<span id="L240" rel="#L240">240</span> +<span id="L241" rel="#L241">241</span> +<span id="L242" rel="#L242">242</span> +<span id="L243" rel="#L243">243</span> +<span id="L244" rel="#L244">244</span> +<span id="L245" rel="#L245">245</span> +<span id="L246" rel="#L246">246</span> +<span id="L247" rel="#L247">247</span> +<span id="L248" rel="#L248">248</span> +<span id="L249" rel="#L249">249</span> +<span id="L250" rel="#L250">250</span> +<span id="L251" rel="#L251">251</span> +<span id="L252" rel="#L252">252</span> +<span id="L253" rel="#L253">253</span> +<span id="L254" rel="#L254">254</span> +<span id="L255" rel="#L255">255</span> +<span id="L256" rel="#L256">256</span> +<span id="L257" rel="#L257">257</span> +<span id="L258" rel="#L258">258</span> +<span id="L259" rel="#L259">259</span> +<span id="L260" rel="#L260">260</span> +<span id="L261" rel="#L261">261</span> +<span id="L262" rel="#L262">262</span> +<span id="L263" rel="#L263">263</span> +<span id="L264" rel="#L264">264</span> +<span id="L265" rel="#L265">265</span> +<span id="L266" rel="#L266">266</span> +<span id="L267" rel="#L267">267</span> +<span id="L268" rel="#L268">268</span> +<span id="L269" rel="#L269">269</span> +<span id="L270" rel="#L270">270</span> +<span id="L271" rel="#L271">271</span> +<span id="L272" rel="#L272">272</span> +<span id="L273" rel="#L273">273</span> +<span id="L274" rel="#L274">274</span> +<span id="L275" rel="#L275">275</span> +<span id="L276" rel="#L276">276</span> +<span id="L277" rel="#L277">277</span> +<span id="L278" rel="#L278">278</span> +<span id="L279" rel="#L279">279</span> +<span id="L280" rel="#L280">280</span> +<span id="L281" rel="#L281">281</span> +<span id="L282" rel="#L282">282</span> +<span id="L283" rel="#L283">283</span> +<span id="L284" rel="#L284">284</span> +<span id="L285" rel="#L285">285</span> +<span id="L286" rel="#L286">286</span> +<span id="L287" rel="#L287">287</span> +<span id="L288" rel="#L288">288</span> +<span id="L289" rel="#L289">289</span> +<span id="L290" rel="#L290">290</span> +<span id="L291" rel="#L291">291</span> +<span id="L292" rel="#L292">292</span> +<span id="L293" rel="#L293">293</span> +<span id="L294" rel="#L294">294</span> +<span id="L295" rel="#L295">295</span> +<span id="L296" rel="#L296">296</span> +<span id="L297" rel="#L297">297</span> +<span id="L298" rel="#L298">298</span> +<span id="L299" rel="#L299">299</span> +<span id="L300" rel="#L300">300</span> +<span id="L301" rel="#L301">301</span> +<span id="L302" rel="#L302">302</span> +<span id="L303" rel="#L303">303</span> +<span id="L304" rel="#L304">304</span> +<span id="L305" rel="#L305">305</span> +<span id="L306" rel="#L306">306</span> +<span id="L307" rel="#L307">307</span> +<span id="L308" rel="#L308">308</span> +<span id="L309" rel="#L309">309</span> +<span id="L310" rel="#L310">310</span> +<span id="L311" rel="#L311">311</span> +<span id="L312" rel="#L312">312</span> +<span id="L313" rel="#L313">313</span> +<span id="L314" rel="#L314">314</span> +<span id="L315" rel="#L315">315</span> +<span id="L316" rel="#L316">316</span> +<span id="L317" rel="#L317">317</span> +<span id="L318" rel="#L318">318</span> +<span id="L319" rel="#L319">319</span> +<span id="L320" rel="#L320">320</span> +<span id="L321" rel="#L321">321</span> +<span id="L322" rel="#L322">322</span> +<span id="L323" rel="#L323">323</span> +<span id="L324" rel="#L324">324</span> +<span id="L325" rel="#L325">325</span> +<span id="L326" rel="#L326">326</span> +<span id="L327" rel="#L327">327</span> +<span id="L328" rel="#L328">328</span> +<span id="L329" rel="#L329">329</span> +<span id="L330" rel="#L330">330</span> +<span id="L331" rel="#L331">331</span> +<span id="L332" rel="#L332">332</span> +<span id="L333" rel="#L333">333</span> +<span id="L334" rel="#L334">334</span> +<span id="L335" rel="#L335">335</span> +<span id="L336" rel="#L336">336</span> +<span id="L337" rel="#L337">337</span> +<span id="L338" rel="#L338">338</span> +<span id="L339" rel="#L339">339</span> +<span id="L340" rel="#L340">340</span> +<span id="L341" rel="#L341">341</span> +<span id="L342" rel="#L342">342</span> +<span id="L343" rel="#L343">343</span> +<span id="L344" rel="#L344">344</span> +<span id="L345" rel="#L345">345</span> +<span id="L346" rel="#L346">346</span> +<span id="L347" rel="#L347">347</span> +<span id="L348" rel="#L348">348</span> +<span id="L349" rel="#L349">349</span> +<span id="L350" rel="#L350">350</span> +<span id="L351" rel="#L351">351</span> +<span id="L352" rel="#L352">352</span> +<span id="L353" rel="#L353">353</span> +<span id="L354" rel="#L354">354</span> +<span id="L355" rel="#L355">355</span> +<span id="L356" rel="#L356">356</span> +<span id="L357" rel="#L357">357</span> +<span id="L358" rel="#L358">358</span> +<span id="L359" rel="#L359">359</span> +<span id="L360" rel="#L360">360</span> +<span id="L361" rel="#L361">361</span> +<span id="L362" rel="#L362">362</span> +<span id="L363" rel="#L363">363</span> +<span id="L364" rel="#L364">364</span> +<span id="L365" rel="#L365">365</span> +<span id="L366" rel="#L366">366</span> +<span id="L367" rel="#L367">367</span> +<span id="L368" rel="#L368">368</span> +<span id="L369" rel="#L369">369</span> +<span id="L370" rel="#L370">370</span> +<span id="L371" rel="#L371">371</span> +<span id="L372" rel="#L372">372</span> +<span id="L373" rel="#L373">373</span> +<span id="L374" rel="#L374">374</span> +<span id="L375" rel="#L375">375</span> +<span id="L376" rel="#L376">376</span> +<span id="L377" rel="#L377">377</span> +<span id="L378" rel="#L378">378</span> +<span id="L379" rel="#L379">379</span> +<span id="L380" rel="#L380">380</span> +<span id="L381" rel="#L381">381</span> +<span id="L382" rel="#L382">382</span> +<span id="L383" rel="#L383">383</span> +<span id="L384" rel="#L384">384</span> +<span id="L385" rel="#L385">385</span> +<span id="L386" rel="#L386">386</span> +<span id="L387" rel="#L387">387</span> +<span id="L388" rel="#L388">388</span> +<span id="L389" rel="#L389">389</span> +<span id="L390" rel="#L390">390</span> +<span id="L391" rel="#L391">391</span> +<span id="L392" rel="#L392">392</span> +<span id="L393" rel="#L393">393</span> +<span id="L394" rel="#L394">394</span> +<span id="L395" rel="#L395">395</span> +<span id="L396" rel="#L396">396</span> +<span id="L397" rel="#L397">397</span> +<span id="L398" rel="#L398">398</span> +<span id="L399" rel="#L399">399</span> +<span id="L400" rel="#L400">400</span> +<span id="L401" rel="#L401">401</span> +<span id="L402" rel="#L402">402</span> +<span id="L403" rel="#L403">403</span> +<span id="L404" rel="#L404">404</span> +<span id="L405" rel="#L405">405</span> +<span id="L406" rel="#L406">406</span> +<span id="L407" rel="#L407">407</span> +<span id="L408" rel="#L408">408</span> +<span id="L409" rel="#L409">409</span> +<span id="L410" rel="#L410">410</span> +<span id="L411" rel="#L411">411</span> +<span id="L412" rel="#L412">412</span> +<span id="L413" rel="#L413">413</span> +<span id="L414" rel="#L414">414</span> +<span id="L415" rel="#L415">415</span> +<span id="L416" rel="#L416">416</span> +<span id="L417" rel="#L417">417</span> +<span id="L418" rel="#L418">418</span> +<span id="L419" rel="#L419">419</span> +<span id="L420" rel="#L420">420</span> +<span id="L421" rel="#L421">421</span> +<span id="L422" rel="#L422">422</span> +<span id="L423" rel="#L423">423</span> +<span id="L424" rel="#L424">424</span> +<span id="L425" rel="#L425">425</span> +<span id="L426" rel="#L426">426</span> +<span id="L427" rel="#L427">427</span> +<span id="L428" rel="#L428">428</span> +<span id="L429" rel="#L429">429</span> +<span id="L430" rel="#L430">430</span> +<span id="L431" rel="#L431">431</span> +<span id="L432" rel="#L432">432</span> +<span id="L433" rel="#L433">433</span> +<span id="L434" rel="#L434">434</span> +<span id="L435" rel="#L435">435</span> +<span id="L436" rel="#L436">436</span> +<span id="L437" rel="#L437">437</span> +<span id="L438" rel="#L438">438</span> +<span id="L439" rel="#L439">439</span> +<span id="L440" rel="#L440">440</span> +<span id="L441" rel="#L441">441</span> +<span id="L442" rel="#L442">442</span> +<span id="L443" rel="#L443">443</span> +<span id="L444" rel="#L444">444</span> +<span id="L445" rel="#L445">445</span> +<span id="L446" rel="#L446">446</span> +<span id="L447" rel="#L447">447</span> +<span id="L448" rel="#L448">448</span> +<span id="L449" rel="#L449">449</span> +<span id="L450" rel="#L450">450</span> +<span id="L451" rel="#L451">451</span> +<span id="L452" rel="#L452">452</span> +<span id="L453" rel="#L453">453</span> +<span id="L454" rel="#L454">454</span> +<span id="L455" rel="#L455">455</span> +<span id="L456" rel="#L456">456</span> +<span id="L457" rel="#L457">457</span> +<span id="L458" rel="#L458">458</span> +<span id="L459" rel="#L459">459</span> +<span id="L460" rel="#L460">460</span> +<span id="L461" rel="#L461">461</span> +<span id="L462" rel="#L462">462</span> +<span id="L463" rel="#L463">463</span> +<span id="L464" rel="#L464">464</span> +<span id="L465" rel="#L465">465</span> +<span id="L466" rel="#L466">466</span> +<span id="L467" rel="#L467">467</span> +<span id="L468" rel="#L468">468</span> +<span id="L469" rel="#L469">469</span> +<span id="L470" rel="#L470">470</span> +<span id="L471" rel="#L471">471</span> +<span id="L472" rel="#L472">472</span> +<span id="L473" rel="#L473">473</span> +<span id="L474" rel="#L474">474</span> +<span id="L475" rel="#L475">475</span> +<span id="L476" rel="#L476">476</span> +<span id="L477" rel="#L477">477</span> +<span id="L478" rel="#L478">478</span> +<span id="L479" rel="#L479">479</span> +<span id="L480" rel="#L480">480</span> +<span id="L481" rel="#L481">481</span> +<span id="L482" rel="#L482">482</span> +<span id="L483" rel="#L483">483</span> +<span id="L484" rel="#L484">484</span> +<span id="L485" rel="#L485">485</span> +<span id="L486" rel="#L486">486</span> +<span id="L487" rel="#L487">487</span> +<span id="L488" rel="#L488">488</span> +<span id="L489" rel="#L489">489</span> +<span id="L490" rel="#L490">490</span> +<span id="L491" rel="#L491">491</span> +<span id="L492" rel="#L492">492</span> +<span id="L493" rel="#L493">493</span> +<span id="L494" rel="#L494">494</span> +<span id="L495" rel="#L495">495</span> +<span id="L496" rel="#L496">496</span> +<span id="L497" rel="#L497">497</span> +<span id="L498" rel="#L498">498</span> +<span id="L499" rel="#L499">499</span> +<span id="L500" rel="#L500">500</span> +<span id="L501" rel="#L501">501</span> +<span id="L502" rel="#L502">502</span> +<span id="L503" rel="#L503">503</span> +<span id="L504" rel="#L504">504</span> +<span id="L505" rel="#L505">505</span> +<span id="L506" rel="#L506">506</span> +<span id="L507" rel="#L507">507</span> +<span id="L508" rel="#L508">508</span> +<span id="L509" rel="#L509">509</span> +<span id="L510" rel="#L510">510</span> +<span id="L511" rel="#L511">511</span> +<span id="L512" rel="#L512">512</span> +<span id="L513" rel="#L513">513</span> +<span id="L514" rel="#L514">514</span> +<span id="L515" rel="#L515">515</span> +<span id="L516" rel="#L516">516</span> +<span id="L517" rel="#L517">517</span> +<span id="L518" rel="#L518">518</span> +<span id="L519" rel="#L519">519</span> +<span id="L520" rel="#L520">520</span> +<span id="L521" rel="#L521">521</span> +<span id="L522" rel="#L522">522</span> +<span id="L523" rel="#L523">523</span> +<span id="L524" rel="#L524">524</span> +<span id="L525" rel="#L525">525</span> +<span id="L526" rel="#L526">526</span> +<span id="L527" rel="#L527">527</span> +<span id="L528" rel="#L528">528</span> +<span id="L529" rel="#L529">529</span> +<span id="L530" rel="#L530">530</span> +<span id="L531" rel="#L531">531</span> +<span id="L532" rel="#L532">532</span> +<span id="L533" rel="#L533">533</span> +<span id="L534" rel="#L534">534</span> +<span id="L535" rel="#L535">535</span> +<span id="L536" rel="#L536">536</span> +<span id="L537" rel="#L537">537</span> +<span id="L538" rel="#L538">538</span> +<span id="L539" rel="#L539">539</span> +<span id="L540" rel="#L540">540</span> +<span id="L541" rel="#L541">541</span> +<span id="L542" rel="#L542">542</span> +<span id="L543" rel="#L543">543</span> +<span id="L544" rel="#L544">544</span> +<span id="L545" rel="#L545">545</span> +<span id="L546" rel="#L546">546</span> +<span id="L547" rel="#L547">547</span> +<span id="L548" rel="#L548">548</span> +<span id="L549" rel="#L549">549</span> +<span id="L550" rel="#L550">550</span> +<span id="L551" rel="#L551">551</span> +<span id="L552" rel="#L552">552</span> +<span id="L553" rel="#L553">553</span> +<span id="L554" rel="#L554">554</span> +<span id="L555" rel="#L555">555</span> +<span id="L556" rel="#L556">556</span> +<span id="L557" rel="#L557">557</span> +<span id="L558" rel="#L558">558</span> +<span id="L559" rel="#L559">559</span> +<span id="L560" rel="#L560">560</span> +<span id="L561" rel="#L561">561</span> +<span id="L562" rel="#L562">562</span> +<span id="L563" rel="#L563">563</span> +<span id="L564" rel="#L564">564</span> +<span id="L565" rel="#L565">565</span> +<span id="L566" rel="#L566">566</span> +<span id="L567" rel="#L567">567</span> +<span id="L568" rel="#L568">568</span> +<span id="L569" rel="#L569">569</span> +<span id="L570" rel="#L570">570</span> +<span id="L571" rel="#L571">571</span> +<span id="L572" rel="#L572">572</span> +<span id="L573" rel="#L573">573</span> +<span id="L574" rel="#L574">574</span> +<span id="L575" rel="#L575">575</span> +<span id="L576" rel="#L576">576</span> +<span id="L577" rel="#L577">577</span> +<span id="L578" rel="#L578">578</span> +<span id="L579" rel="#L579">579</span> +<span id="L580" rel="#L580">580</span> +<span id="L581" rel="#L581">581</span> +<span id="L582" rel="#L582">582</span> +<span id="L583" rel="#L583">583</span> +<span id="L584" rel="#L584">584</span> +<span id="L585" rel="#L585">585</span> +<span id="L586" rel="#L586">586</span> +<span id="L587" rel="#L587">587</span> +<span id="L588" rel="#L588">588</span> +<span id="L589" rel="#L589">589</span> +<span id="L590" rel="#L590">590</span> +<span id="L591" rel="#L591">591</span> +<span id="L592" rel="#L592">592</span> +<span id="L593" rel="#L593">593</span> +<span id="L594" rel="#L594">594</span> +<span id="L595" rel="#L595">595</span> +<span id="L596" rel="#L596">596</span> +<span id="L597" rel="#L597">597</span> +<span id="L598" rel="#L598">598</span> +<span id="L599" rel="#L599">599</span> +<span id="L600" rel="#L600">600</span> +<span id="L601" rel="#L601">601</span> +<span id="L602" rel="#L602">602</span> +<span id="L603" rel="#L603">603</span> +<span id="L604" rel="#L604">604</span> +<span id="L605" rel="#L605">605</span> +<span id="L606" rel="#L606">606</span> +<span id="L607" rel="#L607">607</span> +<span id="L608" rel="#L608">608</span> +<span id="L609" rel="#L609">609</span> +<span id="L610" rel="#L610">610</span> +<span id="L611" rel="#L611">611</span> +<span id="L612" rel="#L612">612</span> +<span id="L613" rel="#L613">613</span> +<span id="L614" rel="#L614">614</span> +<span id="L615" rel="#L615">615</span> +<span id="L616" rel="#L616">616</span> +<span id="L617" rel="#L617">617</span> +<span id="L618" rel="#L618">618</span> +<span id="L619" rel="#L619">619</span> +<span id="L620" rel="#L620">620</span> +<span id="L621" rel="#L621">621</span> +<span id="L622" rel="#L622">622</span> +<span id="L623" rel="#L623">623</span> +<span id="L624" rel="#L624">624</span> +<span id="L625" rel="#L625">625</span> +<span id="L626" rel="#L626">626</span> +<span id="L627" rel="#L627">627</span> +<span id="L628" rel="#L628">628</span> +<span id="L629" rel="#L629">629</span> +<span id="L630" rel="#L630">630</span> +<span id="L631" rel="#L631">631</span> +<span id="L632" rel="#L632">632</span> +<span id="L633" rel="#L633">633</span> +<span id="L634" rel="#L634">634</span> +<span id="L635" rel="#L635">635</span> +<span id="L636" rel="#L636">636</span> +<span id="L637" rel="#L637">637</span> +<span id="L638" rel="#L638">638</span> +<span id="L639" rel="#L639">639</span> +<span id="L640" rel="#L640">640</span> +<span id="L641" rel="#L641">641</span> +<span id="L642" rel="#L642">642</span> +<span id="L643" rel="#L643">643</span> +<span id="L644" rel="#L644">644</span> +<span id="L645" rel="#L645">645</span> +<span id="L646" rel="#L646">646</span> +<span id="L647" rel="#L647">647</span> +<span id="L648" rel="#L648">648</span> +<span id="L649" rel="#L649">649</span> +<span id="L650" rel="#L650">650</span> +<span id="L651" rel="#L651">651</span> +<span id="L652" rel="#L652">652</span> +<span id="L653" rel="#L653">653</span> +<span id="L654" rel="#L654">654</span> +<span id="L655" rel="#L655">655</span> +<span id="L656" rel="#L656">656</span> +<span id="L657" rel="#L657">657</span> +<span id="L658" rel="#L658">658</span> +<span id="L659" rel="#L659">659</span> +<span id="L660" rel="#L660">660</span> +<span id="L661" rel="#L661">661</span> +<span id="L662" rel="#L662">662</span> +<span id="L663" rel="#L663">663</span> +<span id="L664" rel="#L664">664</span> +<span id="L665" rel="#L665">665</span> +<span id="L666" rel="#L666">666</span> +<span id="L667" rel="#L667">667</span> +<span id="L668" rel="#L668">668</span> +<span id="L669" rel="#L669">669</span> +<span id="L670" rel="#L670">670</span> +<span id="L671" rel="#L671">671</span> +<span id="L672" rel="#L672">672</span> +<span id="L673" rel="#L673">673</span> +<span id="L674" rel="#L674">674</span> +<span id="L675" rel="#L675">675</span> +<span id="L676" rel="#L676">676</span> +<span id="L677" rel="#L677">677</span> +<span id="L678" rel="#L678">678</span> +<span id="L679" rel="#L679">679</span> +<span id="L680" rel="#L680">680</span> +<span id="L681" rel="#L681">681</span> +<span id="L682" rel="#L682">682</span> +<span id="L683" rel="#L683">683</span> +<span id="L684" rel="#L684">684</span> +<span id="L685" rel="#L685">685</span> +<span id="L686" rel="#L686">686</span> +<span id="L687" rel="#L687">687</span> +<span id="L688" rel="#L688">688</span> +<span id="L689" rel="#L689">689</span> +<span id="L690" rel="#L690">690</span> +<span id="L691" rel="#L691">691</span> +<span id="L692" rel="#L692">692</span> +<span id="L693" rel="#L693">693</span> +<span id="L694" rel="#L694">694</span> +<span id="L695" rel="#L695">695</span> +<span id="L696" rel="#L696">696</span> +<span id="L697" rel="#L697">697</span> +<span id="L698" rel="#L698">698</span> +<span id="L699" rel="#L699">699</span> +<span id="L700" rel="#L700">700</span> +<span id="L701" rel="#L701">701</span> +<span id="L702" rel="#L702">702</span> +<span id="L703" rel="#L703">703</span> +<span id="L704" rel="#L704">704</span> +<span id="L705" rel="#L705">705</span> +<span id="L706" rel="#L706">706</span> +<span id="L707" rel="#L707">707</span> +<span id="L708" rel="#L708">708</span> +<span id="L709" rel="#L709">709</span> +<span id="L710" rel="#L710">710</span> +<span id="L711" rel="#L711">711</span> +<span id="L712" rel="#L712">712</span> +<span id="L713" rel="#L713">713</span> +<span id="L714" rel="#L714">714</span> +<span id="L715" rel="#L715">715</span> +<span id="L716" rel="#L716">716</span> +<span id="L717" rel="#L717">717</span> +<span id="L718" rel="#L718">718</span> +<span id="L719" rel="#L719">719</span> +<span id="L720" rel="#L720">720</span> +<span id="L721" rel="#L721">721</span> +<span id="L722" rel="#L722">722</span> +<span id="L723" rel="#L723">723</span> +<span id="L724" rel="#L724">724</span> +<span id="L725" rel="#L725">725</span> +<span id="L726" rel="#L726">726</span> +<span id="L727" rel="#L727">727</span> +<span id="L728" rel="#L728">728</span> +<span id="L729" rel="#L729">729</span> +<span id="L730" rel="#L730">730</span> +<span id="L731" rel="#L731">731</span> +<span id="L732" rel="#L732">732</span> +<span id="L733" rel="#L733">733</span> +<span id="L734" rel="#L734">734</span> +<span id="L735" rel="#L735">735</span> +<span id="L736" rel="#L736">736</span> +<span id="L737" rel="#L737">737</span> +<span id="L738" rel="#L738">738</span> +<span id="L739" rel="#L739">739</span> +<span id="L740" rel="#L740">740</span> +<span id="L741" rel="#L741">741</span> +<span id="L742" rel="#L742">742</span> +<span id="L743" rel="#L743">743</span> +<span id="L744" rel="#L744">744</span> +<span id="L745" rel="#L745">745</span> +<span id="L746" rel="#L746">746</span> +<span id="L747" rel="#L747">747</span> +<span id="L748" rel="#L748">748</span> +<span id="L749" rel="#L749">749</span> +<span id="L750" rel="#L750">750</span> +<span id="L751" rel="#L751">751</span> +<span id="L752" rel="#L752">752</span> +<span id="L753" rel="#L753">753</span> +<span id="L754" rel="#L754">754</span> +<span id="L755" rel="#L755">755</span> +<span id="L756" rel="#L756">756</span> +<span id="L757" rel="#L757">757</span> +<span id="L758" rel="#L758">758</span> +<span id="L759" rel="#L759">759</span> +<span id="L760" rel="#L760">760</span> +<span id="L761" rel="#L761">761</span> +<span id="L762" rel="#L762">762</span> +<span id="L763" rel="#L763">763</span> +<span id="L764" rel="#L764">764</span> +<span id="L765" rel="#L765">765</span> +<span id="L766" rel="#L766">766</span> +<span id="L767" rel="#L767">767</span> +<span id="L768" rel="#L768">768</span> +<span id="L769" rel="#L769">769</span> +<span id="L770" rel="#L770">770</span> +<span id="L771" rel="#L771">771</span> +<span id="L772" rel="#L772">772</span> +<span id="L773" rel="#L773">773</span> +<span id="L774" rel="#L774">774</span> +<span id="L775" rel="#L775">775</span> +<span id="L776" rel="#L776">776</span> +<span id="L777" rel="#L777">777</span> +<span id="L778" rel="#L778">778</span> +<span id="L779" rel="#L779">779</span> +<span id="L780" rel="#L780">780</span> +<span id="L781" rel="#L781">781</span> +<span id="L782" rel="#L782">782</span> +<span id="L783" rel="#L783">783</span> +<span id="L784" rel="#L784">784</span> +<span id="L785" rel="#L785">785</span> +<span id="L786" rel="#L786">786</span> +<span id="L787" rel="#L787">787</span> +<span id="L788" rel="#L788">788</span> +<span id="L789" rel="#L789">789</span> +<span id="L790" rel="#L790">790</span> +<span id="L791" rel="#L791">791</span> +<span id="L792" rel="#L792">792</span> +<span id="L793" rel="#L793">793</span> +<span id="L794" rel="#L794">794</span> +<span id="L795" rel="#L795">795</span> +<span id="L796" rel="#L796">796</span> +<span id="L797" rel="#L797">797</span> +<span id="L798" rel="#L798">798</span> +<span id="L799" rel="#L799">799</span> +<span id="L800" rel="#L800">800</span> +<span id="L801" rel="#L801">801</span> +<span id="L802" rel="#L802">802</span> +<span id="L803" rel="#L803">803</span> +<span id="L804" rel="#L804">804</span> +<span id="L805" rel="#L805">805</span> +<span id="L806" rel="#L806">806</span> +<span id="L807" rel="#L807">807</span> +<span id="L808" rel="#L808">808</span> +<span id="L809" rel="#L809">809</span> +<span id="L810" rel="#L810">810</span> +<span id="L811" rel="#L811">811</span> +<span id="L812" rel="#L812">812</span> +<span id="L813" rel="#L813">813</span> +<span id="L814" rel="#L814">814</span> +<span id="L815" rel="#L815">815</span> +<span id="L816" rel="#L816">816</span> +<span id="L817" rel="#L817">817</span> +<span id="L818" rel="#L818">818</span> +<span id="L819" rel="#L819">819</span> +<span id="L820" rel="#L820">820</span> +<span id="L821" rel="#L821">821</span> +<span id="L822" rel="#L822">822</span> +<span id="L823" rel="#L823">823</span> +<span id="L824" rel="#L824">824</span> +<span id="L825" rel="#L825">825</span> +<span id="L826" rel="#L826">826</span> +<span id="L827" rel="#L827">827</span> +<span id="L828" rel="#L828">828</span> +<span id="L829" rel="#L829">829</span> +<span id="L830" rel="#L830">830</span> +<span id="L831" rel="#L831">831</span> +<span id="L832" rel="#L832">832</span> +<span id="L833" rel="#L833">833</span> +<span id="L834" rel="#L834">834</span> +<span id="L835" rel="#L835">835</span> +<span id="L836" rel="#L836">836</span> +<span id="L837" rel="#L837">837</span> +<span id="L838" rel="#L838">838</span> +<span id="L839" rel="#L839">839</span> +<span id="L840" rel="#L840">840</span> +<span id="L841" rel="#L841">841</span> +<span id="L842" rel="#L842">842</span> +<span id="L843" rel="#L843">843</span> +<span id="L844" rel="#L844">844</span> +<span id="L845" rel="#L845">845</span> +<span id="L846" rel="#L846">846</span> +<span id="L847" rel="#L847">847</span> +<span id="L848" rel="#L848">848</span> +<span id="L849" rel="#L849">849</span> +<span id="L850" rel="#L850">850</span> +<span id="L851" rel="#L851">851</span> +<span id="L852" rel="#L852">852</span> +<span id="L853" rel="#L853">853</span> +<span id="L854" rel="#L854">854</span> +<span id="L855" rel="#L855">855</span> +<span id="L856" rel="#L856">856</span> +<span id="L857" rel="#L857">857</span> +<span id="L858" rel="#L858">858</span> +<span id="L859" rel="#L859">859</span> +<span id="L860" rel="#L860">860</span> +<span id="L861" rel="#L861">861</span> +<span id="L862" rel="#L862">862</span> +<span id="L863" rel="#L863">863</span> +<span id="L864" rel="#L864">864</span> +<span id="L865" rel="#L865">865</span> +<span id="L866" rel="#L866">866</span> +<span id="L867" rel="#L867">867</span> +<span id="L868" rel="#L868">868</span> +<span id="L869" rel="#L869">869</span> +<span id="L870" rel="#L870">870</span> +<span id="L871" rel="#L871">871</span> +<span id="L872" rel="#L872">872</span> +<span id="L873" rel="#L873">873</span> +<span id="L874" rel="#L874">874</span> +<span id="L875" rel="#L875">875</span> +<span id="L876" rel="#L876">876</span> +<span id="L877" rel="#L877">877</span> +<span id="L878" rel="#L878">878</span> +<span id="L879" rel="#L879">879</span> +<span id="L880" rel="#L880">880</span> +<span id="L881" rel="#L881">881</span> +<span id="L882" rel="#L882">882</span> +<span id="L883" rel="#L883">883</span> +<span id="L884" rel="#L884">884</span> +<span id="L885" rel="#L885">885</span> +<span id="L886" rel="#L886">886</span> +<span id="L887" rel="#L887">887</span> +<span id="L888" rel="#L888">888</span> +</pre> + </td> + <td width="100%"> + <div class="highlight"><pre><div class='line' id='LC1'><span class="cm">/*!</span></div><div class='line' id='LC2'><span class="cm"> * g.Raphael 0.5 - Charting library, based on RaphaΓ«l</span></div><div class='line' id='LC3'><span class="cm"> *</span></div><div class='line' id='LC4'><span class="cm"> * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)</span></div><div class='line' id='LC5'><span class="cm"> * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.</span></div><div class='line' id='LC6'><span class="cm"> */</span></div><div class='line' id='LC7'><br/></div><div class='line' id='LC8'><span class="cm">/*</span></div><div class='line' id='LC9'><span class="cm"> * Tooltips on Element prototype</span></div><div class='line' id='LC10'><span class="cm"> */</span></div><div class='line' id='LC11'><span class="cm">/*\</span></div><div class='line' id='LC12'><span class="cm"> * Element.popup</span></div><div class='line' id='LC13'><span class="cm"> [ method ]</span></div><div class='line' id='LC14'><span class="cm"> **</span></div><div class='line' id='LC15'><span class="cm"> * Puts the context Element in a 'popup' tooltip. Can also be used on sets.</span></div><div class='line' id='LC16'><span class="cm"> **</span></div><div class='line' id='LC17'><span class="cm"> > Parameters</span></div><div class='line' id='LC18'><span class="cm"> **</span></div><div class='line' id='LC19'><span class="cm"> - dir (string) location of Element relative to the tail: `'down'`, `'left'`, `'up'` [default], or `'right'`.</span></div><div class='line' id='LC20'><span class="cm"> - size (number) amount of bevel/padding around the Element, as well as half the width and height of the tail [default: `5`]</span></div><div class='line' id='LC21'><span class="cm"> - x (number) x coordinate of the popup's tail [default: Element's `x` or `cx`]</span></div><div class='line' id='LC22'><span class="cm"> - y (number) y coordinate of the popup's tail [default: Element's `y` or `cy`]</span></div><div class='line' id='LC23'><span class="cm"> **</span></div><div class='line' id='LC24'><span class="cm"> = (object) path element of the popup</span></div><div class='line' id='LC25'><span class="cm"> > Usage</span></div><div class='line' id='LC26'><span class="cm"> | paper.circle(50, 50, 5).attr({</span></div><div class='line' id='LC27'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC28'><span class="cm"> | fill: "0-#c9de96-#8ab66b:44-#398235"</span></div><div class='line' id='LC29'><span class="cm"> | }).popup();</span></div><div class='line' id='LC30'><span class="cm"> \*/</span></div><div class='line' id='LC31'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">popup</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">dir</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC32'> <span class="kd">var</span> <span class="nx">paper</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">paper</span> <span class="o">||</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">paper</span><span class="p">,</span></div><div class='line' id='LC33'> <span class="nx">bb</span><span class="p">,</span> <span class="nx">xy</span><span class="p">,</span> <span class="nx">center</span><span class="p">,</span> <span class="nx">cw</span><span class="p">,</span> <span class="nx">ch</span><span class="p">;</span></div><div class='line' id='LC34'><br/></div><div class='line' id='LC35'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">paper</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC36'><br/></div><div class='line' id='LC37'> <span class="k">switch</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC38'> <span class="k">case</span> <span class="s1">'text'</span><span class="o">:</span></div><div class='line' id='LC39'> <span class="k">case</span> <span class="s1">'circle'</span><span class="o">:</span></div><div class='line' id='LC40'> <span class="k">case</span> <span class="s1">'ellipse'</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span></div><div class='line' id='LC41'> <span class="k">default</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC42'> <span class="p">}</span></div><div class='line' id='LC43'><br/></div><div class='line' id='LC44'> <span class="nx">dir</span> <span class="o">=</span> <span class="nx">dir</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="s1">'up'</span> <span class="o">:</span> <span class="nx">dir</span><span class="p">;</span></div><div class='line' id='LC45'> <span class="nx">size</span> <span class="o">=</span> <span class="nx">size</span> <span class="o">||</span> <span class="mi">5</span><span class="p">;</span></div><div class='line' id='LC46'> <span class="nx">bb</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getBBox</span><span class="p">();</span></div><div class='line' id='LC47'><br/></div><div class='line' id='LC48'> <span class="nx">x</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">x</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">x</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span></div><div class='line' id='LC49'> <span class="nx">y</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">y</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">y</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC50'> <span class="nx">cw</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">max</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span></div><div class='line' id='LC51'> <span class="nx">ch</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">max</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span></div><div class='line' id='LC52'><br/></div><div class='line' id='LC53'> <span class="k">this</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="mi">0</span><span class="p">),</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="mi">0</span><span class="p">));</span></div><div class='line' id='LC54'> <span class="nx">bb</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getBBox</span><span class="p">();</span></div><div class='line' id='LC55'><br/></div><div class='line' id='LC56'> <span class="kd">var</span> <span class="nx">paths</span> <span class="o">=</span> <span class="p">{</span></div><div class='line' id='LC57'> <span class="nx">up</span><span class="o">:</span> <span class="p">[</span></div><div class='line' id='LC58'> <span class="s1">'M'</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span></div><div class='line' id='LC59'> <span class="s1">'l'</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">cw</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC60'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC61'> <span class="s1">'l'</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">,</span></div><div class='line' id='LC62'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC63'> <span class="s1">'l'</span><span class="p">,</span> <span class="nx">size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">cw</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC64'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC65'> <span class="s1">'l'</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">,</span></div><div class='line' id='LC66'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC67'> <span class="s1">'l'</span><span class="p">,</span> <span class="o">-</span><span class="nx">cw</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC68'> <span class="s1">'z'</span></div><div class='line' id='LC69'> <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s1">','</span><span class="p">),</span></div><div class='line' id='LC70'> <span class="nx">down</span><span class="o">:</span> <span class="p">[</span></div><div class='line' id='LC71'> <span class="s1">'M'</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span></div><div class='line' id='LC72'> <span class="s1">'l'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">cw</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC73'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC74'> <span class="s1">'l'</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">,</span></div><div class='line' id='LC75'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC76'> <span class="s1">'l'</span><span class="p">,</span> <span class="o">-</span><span class="p">(</span><span class="nx">size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">cw</span> <span class="o">*</span> <span class="mi">2</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC77'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC78'> <span class="s1">'l'</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">,</span></div><div class='line' id='LC79'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC80'> <span class="s1">'l'</span><span class="p">,</span> <span class="nx">cw</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC81'> <span class="s1">'z'</span></div><div class='line' id='LC82'> <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s1">','</span><span class="p">),</span></div><div class='line' id='LC83'> <span class="nx">left</span><span class="o">:</span> <span class="p">[</span></div><div class='line' id='LC84'> <span class="s1">'M'</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span></div><div class='line' id='LC85'> <span class="s1">'l'</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">ch</span><span class="p">,</span></div><div class='line' id='LC86'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC87'> <span class="s1">'l'</span><span class="p">,</span> <span class="o">-</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC88'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC89'> <span class="s1">'l'</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="p">(</span><span class="nx">size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">ch</span> <span class="o">*</span> <span class="mi">2</span><span class="p">),</span></div><div class='line' id='LC90'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC91'> <span class="s1">'l'</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC92'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC93'> <span class="s1">'l'</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">ch</span><span class="p">,</span></div><div class='line' id='LC94'> <span class="s1">'z'</span></div><div class='line' id='LC95'> <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s1">','</span><span class="p">),</span></div><div class='line' id='LC96'> <span class="nx">right</span><span class="o">:</span> <span class="p">[</span></div><div class='line' id='LC97'> <span class="s1">'M'</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span></div><div class='line' id='LC98'> <span class="s1">'l'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">ch</span><span class="p">,</span></div><div class='line' id='LC99'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC100'> <span class="s1">'l'</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC101'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC102'> <span class="s1">'l'</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">ch</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC103'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC104'> <span class="s1">'l'</span><span class="p">,</span> <span class="o">-</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC105'> <span class="s1">'a'</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span> <span class="o">-</span><span class="nx">size</span><span class="p">,</span></div><div class='line' id='LC106'> <span class="s1">'l'</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">ch</span><span class="p">,</span></div><div class='line' id='LC107'> <span class="s1">'z'</span></div><div class='line' id='LC108'> <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s1">','</span><span class="p">)</span></div><div class='line' id='LC109'> <span class="p">};</span></div><div class='line' id='LC110'><br/></div><div class='line' id='LC111'> <span class="nx">xy</span> <span class="o">=</span> <span class="p">{</span></div><div class='line' id='LC112'> <span class="nx">up</span><span class="o">:</span> <span class="p">{</span> <span class="nx">x</span><span class="o">:</span> <span class="o">-!</span><span class="nx">center</span> <span class="o">*</span> <span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">),</span> <span class="nx">y</span><span class="o">:</span> <span class="o">-</span><span class="nx">size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">-</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="p">},</span></div><div class='line' id='LC113'> <span class="nx">down</span><span class="o">:</span> <span class="p">{</span> <span class="nx">x</span><span class="o">:</span> <span class="o">-!</span><span class="nx">center</span> <span class="o">*</span> <span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">),</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="p">},</span></div><div class='line' id='LC114'> <span class="nx">left</span><span class="o">:</span> <span class="p">{</span> <span class="nx">x</span><span class="o">:</span> <span class="o">-</span><span class="nx">size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">-</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">),</span> <span class="nx">y</span><span class="o">:</span> <span class="o">-!</span><span class="nx">center</span> <span class="o">*</span> <span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="p">},</span></div><div class='line' id='LC115'> <span class="nx">right</span><span class="o">:</span> <span class="p">{</span> <span class="nx">x</span><span class="o">:</span> <span class="nx">size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">),</span> <span class="nx">y</span><span class="o">:</span> <span class="o">-!</span><span class="nx">center</span> <span class="o">*</span> <span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="p">}</span></div><div class='line' id='LC116'> <span class="p">}[</span><span class="nx">dir</span><span class="p">];</span></div><div class='line' id='LC117'><br/></div><div class='line' id='LC118'> <span class="k">this</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="nx">xy</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">xy</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC119'> <span class="k">return</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">path</span><span class="p">(</span><span class="nx">paths</span><span class="p">[</span><span class="nx">dir</span><span class="p">]).</span><span class="nx">attr</span><span class="p">({</span> <span class="nx">fill</span><span class="o">:</span> <span class="s2">"#000"</span><span class="p">,</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s2">"none"</span> <span class="p">}).</span><span class="nx">insertBefore</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">node</span> <span class="o">?</span> <span class="k">this</span> <span class="o">:</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span></div><div class='line' id='LC120'><span class="p">};</span></div><div class='line' id='LC121'><br/></div><div class='line' id='LC122'><span class="cm">/*\</span></div><div class='line' id='LC123'><span class="cm"> * Element.tag</span></div><div class='line' id='LC124'><span class="cm"> [ method ]</span></div><div class='line' id='LC125'><span class="cm"> **</span></div><div class='line' id='LC126'><span class="cm"> * Puts the context Element in a 'tag' tooltip. Can also be used on sets.</span></div><div class='line' id='LC127'><span class="cm"> **</span></div><div class='line' id='LC128'><span class="cm"> > Parameters</span></div><div class='line' id='LC129'><span class="cm"> **</span></div><div class='line' id='LC130'><span class="cm"> - angle (number) angle of orientation in degrees [default: `0`]</span></div><div class='line' id='LC131'><span class="cm"> - r (number) radius of the loop [default: `5`]</span></div><div class='line' id='LC132'><span class="cm"> - x (number) x coordinate of the center of the tag loop [default: Element's `x` or `cx`]</span></div><div class='line' id='LC133'><span class="cm"> - y (number) y coordinate of the center of the tag loop [default: Element's `x` or `cx`]</span></div><div class='line' id='LC134'><span class="cm"> **</span></div><div class='line' id='LC135'><span class="cm"> = (object) path element of the tag</span></div><div class='line' id='LC136'><span class="cm"> > Usage</span></div><div class='line' id='LC137'><span class="cm"> | paper.circle(50, 50, 15).attr({</span></div><div class='line' id='LC138'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC139'><span class="cm"> | fill: "0-#c9de96-#8ab66b:44-#398235"</span></div><div class='line' id='LC140'><span class="cm"> | }).tag(60);</span></div><div class='line' id='LC141'><span class="cm"> \*/</span></div><div class='line' id='LC142'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">tag</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC143'> <span class="kd">var</span> <span class="nx">d</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span></div><div class='line' id='LC144'> <span class="nx">paper</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">paper</span> <span class="o">||</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">paper</span><span class="p">;</span></div><div class='line' id='LC145'><br/></div><div class='line' id='LC146'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">paper</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC147'><br/></div><div class='line' id='LC148'> <span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">path</span><span class="p">().</span><span class="nx">attr</span><span class="p">({</span> <span class="nx">fill</span><span class="o">:</span> <span class="s1">'#000'</span><span class="p">,</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s1">'#000'</span> <span class="p">}),</span></div><div class='line' id='LC149'> <span class="nx">bb</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getBBox</span><span class="p">(),</span></div><div class='line' id='LC150'> <span class="nx">dx</span><span class="p">,</span> <span class="nx">R</span><span class="p">,</span> <span class="nx">center</span><span class="p">,</span> <span class="nx">tmp</span><span class="p">;</span></div><div class='line' id='LC151'><br/></div><div class='line' id='LC152'> <span class="k">switch</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC153'> <span class="k">case</span> <span class="s1">'text'</span><span class="o">:</span></div><div class='line' id='LC154'> <span class="k">case</span> <span class="s1">'circle'</span><span class="o">:</span></div><div class='line' id='LC155'> <span class="k">case</span> <span class="s1">'ellipse'</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span></div><div class='line' id='LC156'> <span class="k">default</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC157'> <span class="p">}</span></div><div class='line' id='LC158'><br/></div><div class='line' id='LC159'> <span class="nx">angle</span> <span class="o">=</span> <span class="nx">angle</span> <span class="o">||</span> <span class="mi">0</span><span class="p">;</span></div><div class='line' id='LC160'> <span class="nx">x</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">x</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">x</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span></div><div class='line' id='LC161'> <span class="nx">y</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">y</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">y</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC162'> <span class="nx">r</span> <span class="o">=</span> <span class="nx">r</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="mi">5</span> <span class="o">:</span> <span class="nx">r</span><span class="p">;</span></div><div class='line' id='LC163'> <span class="nx">R</span> <span class="o">=</span> <span class="p">.</span><span class="mi">5522</span> <span class="o">*</span> <span class="nx">r</span><span class="p">;</span></div><div class='line' id='LC164'><br/></div><div class='line' id='LC165'> <span class="k">if</span> <span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">>=</span> <span class="nx">r</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC166'> <span class="nx">p</span><span class="p">.</span><span class="nx">attr</span><span class="p">({</span></div><div class='line' id='LC167'> <span class="nx">path</span><span class="o">:</span> <span class="p">[</span></div><div class='line' id='LC168'> <span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">r</span><span class="p">,</span></div><div class='line' id='LC169'> <span class="s2">"a"</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">r</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">r</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC170'> <span class="s2">"m"</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">r</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">-</span><span class="nx">d</span><span class="p">,</span></div><div class='line' id='LC171'> <span class="s2">"a"</span><span class="p">,</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC172'> <span class="s2">"L"</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span></div><div class='line' id='LC173'> <span class="s2">"l"</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span> <span class="o">-</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC174'> <span class="s2">"L"</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">r</span> <span class="o">-</span> <span class="nx">d</span></div><div class='line' id='LC175'> <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s2">","</span><span class="p">)</span></div><div class='line' id='LC176'> <span class="p">});</span></div><div class='line' id='LC177'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC178'> <span class="nx">dx</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sqrt</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span></div><div class='line' id='LC179'> <span class="nx">p</span><span class="p">.</span><span class="nx">attr</span><span class="p">({</span></div><div class='line' id='LC180'> <span class="nx">path</span><span class="o">:</span> <span class="p">[</span></div><div class='line' id='LC181'> <span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">r</span><span class="p">,</span></div><div class='line' id='LC182'> <span class="s2">"c"</span><span class="p">,</span> <span class="o">-</span><span class="nx">R</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">r</span><span class="p">,</span> <span class="nx">R</span> <span class="o">-</span> <span class="nx">r</span><span class="p">,</span> <span class="o">-</span><span class="nx">r</span><span class="p">,</span> <span class="o">-</span><span class="nx">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">R</span><span class="p">,</span> <span class="nx">r</span> <span class="o">-</span> <span class="nx">R</span><span class="p">,</span> <span class="o">-</span><span class="nx">r</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="o">-</span><span class="nx">r</span><span class="p">,</span> <span class="nx">R</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="nx">r</span> <span class="o">-</span> <span class="nx">R</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">R</span><span class="p">,</span> <span class="nx">R</span> <span class="o">-</span> <span class="nx">r</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span> <span class="o">-</span><span class="nx">r</span><span class="p">,</span> <span class="nx">r</span><span class="p">,</span></div><div class='line' id='LC183'> <span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">dx</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="nx">d</span><span class="p">,</span></div><div class='line' id='LC184'> <span class="s2">"a"</span><span class="p">,</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span></div><div class='line' id='LC185'> <span class="s2">"l"</span><span class="p">,</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span> <span class="o">-</span> <span class="nx">dx</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span></div><div class='line' id='LC186'> <span class="s2">"L"</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">dx</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="nx">d</span></div><div class='line' id='LC187'> <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s2">","</span><span class="p">)</span></div><div class='line' id='LC188'> <span class="p">});</span></div><div class='line' id='LC189'> <span class="p">}</span></div><div class='line' id='LC190'><br/></div><div class='line' id='LC191'> <span class="nx">angle</span> <span class="o">=</span> <span class="mi">360</span> <span class="o">-</span> <span class="nx">angle</span><span class="p">;</span></div><div class='line' id='LC192'> <span class="nx">p</span><span class="p">.</span><span class="nx">rotate</span><span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC193'><br/></div><div class='line' id='LC194'> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC195'> <span class="c1">//elements</span></div><div class='line' id='LC196'> <span class="k">this</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">x</span> <span class="o">?</span> <span class="s1">'x'</span> <span class="o">:</span> <span class="s1">'cx'</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span> <span class="o">+</span> <span class="p">(</span><span class="o">!</span><span class="nx">center</span> <span class="o">?</span> <span class="k">this</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">'text'</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">:</span> <span class="mi">0</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)).</span><span class="nx">attr</span><span class="p">(</span><span class="s1">'y'</span><span class="p">,</span> <span class="nx">center</span> <span class="o">?</span> <span class="nx">y</span> <span class="o">:</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC197'> <span class="k">this</span><span class="p">.</span><span class="nx">rotate</span><span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC198'> <span class="nx">angle</span> <span class="o">></span> <span class="mi">90</span> <span class="o">&&</span> <span class="nx">angle</span> <span class="o"><</span> <span class="mi">270</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">x</span> <span class="o">?</span> <span class="s1">'x'</span> <span class="o">:</span> <span class="s1">'cx'</span><span class="p">,</span> <span class="nx">x</span> <span class="o">-</span> <span class="nx">r</span> <span class="o">-</span> <span class="nx">d</span> <span class="o">-</span> <span class="p">(</span><span class="o">!</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)).</span><span class="nx">rotate</span><span class="p">(</span><span class="mi">180</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC199'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC200'> <span class="c1">//sets</span></div><div class='line' id='LC201'> <span class="k">if</span> <span class="p">(</span><span class="nx">angle</span> <span class="o">></span> <span class="mi">90</span> <span class="o">&&</span> <span class="nx">angle</span> <span class="o"><</span> <span class="mi">270</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC202'> <span class="k">this</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">-</span> <span class="nx">r</span> <span class="o">-</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC203'> <span class="k">this</span><span class="p">.</span><span class="nx">rotate</span><span class="p">(</span><span class="nx">angle</span> <span class="o">-</span> <span class="mi">180</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC204'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC205'> <span class="k">this</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">r</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC206'> <span class="k">this</span><span class="p">.</span><span class="nx">rotate</span><span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">r</span> <span class="o">-</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span> </div><div class='line' id='LC207'> <span class="p">}</span></div><div class='line' id='LC208'> <span class="p">}</span></div><div class='line' id='LC209'><br/></div><div class='line' id='LC210'> <span class="k">return</span> <span class="nx">p</span><span class="p">.</span><span class="nx">insertBefore</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">node</span> <span class="o">?</span> <span class="k">this</span> <span class="o">:</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span></div><div class='line' id='LC211'><span class="p">};</span></div><div class='line' id='LC212'><br/></div><div class='line' id='LC213'><span class="cm">/*\</span></div><div class='line' id='LC214'><span class="cm"> * Element.drop</span></div><div class='line' id='LC215'><span class="cm"> [ method ]</span></div><div class='line' id='LC216'><span class="cm"> **</span></div><div class='line' id='LC217'><span class="cm"> * Puts the context Element in a 'drop' tooltip. Can also be used on sets.</span></div><div class='line' id='LC218'><span class="cm"> **</span></div><div class='line' id='LC219'><span class="cm"> > Parameters</span></div><div class='line' id='LC220'><span class="cm"> **</span></div><div class='line' id='LC221'><span class="cm"> - angle (number) angle of orientation in degrees [default: `0`]</span></div><div class='line' id='LC222'><span class="cm"> - x (number) x coordinate of the drop's point [default: Element's `x` or `cx`]</span></div><div class='line' id='LC223'><span class="cm"> - y (number) y coordinate of the drop's point [default: Element's `x` or `cx`]</span></div><div class='line' id='LC224'><span class="cm"> **</span></div><div class='line' id='LC225'><span class="cm"> = (object) path element of the drop</span></div><div class='line' id='LC226'><span class="cm"> > Usage</span></div><div class='line' id='LC227'><span class="cm"> | paper.circle(50, 50, 8).attr({</span></div><div class='line' id='LC228'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC229'><span class="cm"> | fill: "0-#c9de96-#8ab66b:44-#398235"</span></div><div class='line' id='LC230'><span class="cm"> | }).drop(60);</span></div><div class='line' id='LC231'><span class="cm"> \*/</span></div><div class='line' id='LC232'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">drop</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC233'> <span class="kd">var</span> <span class="nx">bb</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getBBox</span><span class="p">(),</span></div><div class='line' id='LC234'> <span class="nx">paper</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">paper</span> <span class="o">||</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">paper</span><span class="p">,</span></div><div class='line' id='LC235'> <span class="nx">center</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">p</span><span class="p">,</span> <span class="nx">dx</span><span class="p">,</span> <span class="nx">dy</span><span class="p">;</span></div><div class='line' id='LC236'><br/></div><div class='line' id='LC237'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">paper</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC238'><br/></div><div class='line' id='LC239'> <span class="k">switch</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC240'> <span class="k">case</span> <span class="s1">'text'</span><span class="o">:</span></div><div class='line' id='LC241'> <span class="k">case</span> <span class="s1">'circle'</span><span class="o">:</span></div><div class='line' id='LC242'> <span class="k">case</span> <span class="s1">'ellipse'</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span></div><div class='line' id='LC243'> <span class="k">default</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC244'> <span class="p">}</span></div><div class='line' id='LC245'><br/></div><div class='line' id='LC246'> <span class="nx">angle</span> <span class="o">=</span> <span class="nx">angle</span> <span class="o">||</span> <span class="mi">0</span><span class="p">;</span></div><div class='line' id='LC247'><br/></div><div class='line' id='LC248'> <span class="nx">x</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">x</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">x</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span></div><div class='line' id='LC249'> <span class="nx">y</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">y</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">y</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC250'> <span class="nx">size</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">max</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">);</span></div><div class='line' id='LC251'> <span class="nx">p</span> <span class="o">=</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">path</span><span class="p">([</span></div><div class='line' id='LC252'> <span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span></div><div class='line' id='LC253'> <span class="s2">"l"</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC254'> <span class="s2">"A"</span><span class="p">,</span> <span class="nx">size</span> <span class="o">*</span> <span class="p">.</span><span class="mi">4</span><span class="p">,</span> <span class="nx">size</span> <span class="o">*</span> <span class="p">.</span><span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">size</span> <span class="o">*</span> <span class="p">.</span><span class="mi">7</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">size</span> <span class="o">*</span> <span class="p">.</span><span class="mi">7</span><span class="p">,</span></div><div class='line' id='LC255'> <span class="s2">"z"</span></div><div class='line' id='LC256'> <span class="p">]).</span><span class="nx">attr</span><span class="p">({</span><span class="nx">fill</span><span class="o">:</span> <span class="s2">"#000"</span><span class="p">,</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s2">"none"</span><span class="p">}).</span><span class="nx">rotate</span><span class="p">(</span><span class="mf">22.5</span> <span class="o">-</span> <span class="nx">angle</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC257'><br/></div><div class='line' id='LC258'> <span class="nx">angle</span> <span class="o">=</span> <span class="p">(</span><span class="nx">angle</span> <span class="o">+</span> <span class="mi">90</span><span class="p">)</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">180</span><span class="p">;</span></div><div class='line' id='LC259'> <span class="nx">dx</span> <span class="o">=</span> <span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">size</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sin</span><span class="p">(</span><span class="nx">angle</span><span class="p">))</span> <span class="o">-</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC260'> <span class="nx">dy</span> <span class="o">=</span> <span class="p">(</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">size</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">cos</span><span class="p">(</span><span class="nx">angle</span><span class="p">))</span> <span class="o">-</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC261'><br/></div><div class='line' id='LC262'> <span class="k">this</span><span class="p">.</span><span class="nx">attrs</span> <span class="o">?</span></div><div class='line' id='LC263'> <span class="k">this</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">x</span> <span class="o">?</span> <span class="s1">'x'</span> <span class="o">:</span> <span class="s1">'cx'</span><span class="p">,</span> <span class="nx">dx</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">y</span> <span class="o">?</span> <span class="s1">'y'</span> <span class="o">:</span> <span class="s1">'cy'</span><span class="p">,</span> <span class="nx">dy</span><span class="p">)</span> <span class="o">:</span></div><div class='line' id='LC264'> <span class="k">this</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="nx">dx</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">dy</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC265'><br/></div><div class='line' id='LC266'> <span class="k">return</span> <span class="nx">p</span><span class="p">.</span><span class="nx">insertBefore</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">node</span> <span class="o">?</span> <span class="k">this</span> <span class="o">:</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span></div><div class='line' id='LC267'><span class="p">};</span></div><div class='line' id='LC268'><br/></div><div class='line' id='LC269'><span class="cm">/*\</span></div><div class='line' id='LC270'><span class="cm"> * Element.flag</span></div><div class='line' id='LC271'><span class="cm"> [ method ]</span></div><div class='line' id='LC272'><span class="cm"> **</span></div><div class='line' id='LC273'><span class="cm"> * Puts the context Element in a 'flag' tooltip. Can also be used on sets.</span></div><div class='line' id='LC274'><span class="cm"> **</span></div><div class='line' id='LC275'><span class="cm"> > Parameters</span></div><div class='line' id='LC276'><span class="cm"> **</span></div><div class='line' id='LC277'><span class="cm"> - angle (number) angle of orientation in degrees [default: `0`]</span></div><div class='line' id='LC278'><span class="cm"> - x (number) x coordinate of the flag's point [default: Element's `x` or `cx`]</span></div><div class='line' id='LC279'><span class="cm"> - y (number) y coordinate of the flag's point [default: Element's `x` or `cx`]</span></div><div class='line' id='LC280'><span class="cm"> **</span></div><div class='line' id='LC281'><span class="cm"> = (object) path element of the flag</span></div><div class='line' id='LC282'><span class="cm"> > Usage</span></div><div class='line' id='LC283'><span class="cm"> | paper.circle(50, 50, 10).attr({</span></div><div class='line' id='LC284'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC285'><span class="cm"> | fill: "0-#c9de96-#8ab66b:44-#398235"</span></div><div class='line' id='LC286'><span class="cm"> | }).flag(60);</span></div><div class='line' id='LC287'><span class="cm"> \*/</span></div><div class='line' id='LC288'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">flag</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC289'> <span class="kd">var</span> <span class="nx">d</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span></div><div class='line' id='LC290'> <span class="nx">paper</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">paper</span> <span class="o">||</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">paper</span><span class="p">;</span></div><div class='line' id='LC291'><br/></div><div class='line' id='LC292'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">paper</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC293'><br/></div><div class='line' id='LC294'> <span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">path</span><span class="p">().</span><span class="nx">attr</span><span class="p">({</span> <span class="nx">fill</span><span class="o">:</span> <span class="s1">'#000'</span><span class="p">,</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s1">'#000'</span> <span class="p">}),</span></div><div class='line' id='LC295'> <span class="nx">bb</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getBBox</span><span class="p">(),</span></div><div class='line' id='LC296'> <span class="nx">h</span> <span class="o">=</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC297'> <span class="nx">center</span><span class="p">;</span></div><div class='line' id='LC298'><br/></div><div class='line' id='LC299'> <span class="k">switch</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC300'> <span class="k">case</span> <span class="s1">'text'</span><span class="o">:</span></div><div class='line' id='LC301'> <span class="k">case</span> <span class="s1">'circle'</span><span class="o">:</span></div><div class='line' id='LC302'> <span class="k">case</span> <span class="s1">'ellipse'</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span></div><div class='line' id='LC303'> <span class="k">default</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC304'> <span class="p">}</span></div><div class='line' id='LC305'><br/></div><div class='line' id='LC306'> <span class="nx">angle</span> <span class="o">=</span> <span class="nx">angle</span> <span class="o">||</span> <span class="mi">0</span><span class="p">;</span></div><div class='line' id='LC307'> <span class="nx">x</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">x</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">x</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span></div><div class='line' id='LC308'> <span class="nx">y</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">y</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">y</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC309'><br/></div><div class='line' id='LC310'> <span class="nx">p</span><span class="p">.</span><span class="nx">attr</span><span class="p">({</span></div><div class='line' id='LC311'> <span class="nx">path</span><span class="o">:</span> <span class="p">[</span></div><div class='line' id='LC312'> <span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span></div><div class='line' id='LC313'> <span class="s2">"l"</span><span class="p">,</span> <span class="nx">h</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="o">-</span><span class="nx">h</span> <span class="o">-</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span> <span class="o">-</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC314'> <span class="s2">"z"</span></div><div class='line' id='LC315'> <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s2">","</span><span class="p">)</span></div><div class='line' id='LC316'> <span class="p">});</span></div><div class='line' id='LC317'><br/></div><div class='line' id='LC318'> <span class="nx">angle</span> <span class="o">=</span> <span class="mi">360</span> <span class="o">-</span> <span class="nx">angle</span><span class="p">;</span></div><div class='line' id='LC319'> <span class="nx">p</span><span class="p">.</span><span class="nx">rotate</span><span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC320'><br/></div><div class='line' id='LC321'> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC322'> <span class="c1">//elements</span></div><div class='line' id='LC323'> <span class="k">this</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">x</span> <span class="o">?</span> <span class="s1">'x'</span> <span class="o">:</span> <span class="s1">'cx'</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">h</span> <span class="o">+</span> <span class="nx">d</span> <span class="o">+</span> <span class="p">(</span><span class="o">!</span><span class="nx">center</span> <span class="o">?</span> <span class="k">this</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">'text'</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">:</span> <span class="mi">0</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)).</span><span class="nx">attr</span><span class="p">(</span><span class="s1">'y'</span><span class="p">,</span> <span class="nx">center</span> <span class="o">?</span> <span class="nx">y</span> <span class="o">:</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC324'> <span class="k">this</span><span class="p">.</span><span class="nx">rotate</span><span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC325'> <span class="nx">angle</span> <span class="o">></span> <span class="mi">90</span> <span class="o">&&</span> <span class="nx">angle</span> <span class="o"><</span> <span class="mi">270</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">x</span> <span class="o">?</span> <span class="s1">'x'</span> <span class="o">:</span> <span class="s1">'cx'</span><span class="p">,</span> <span class="nx">x</span> <span class="o">-</span> <span class="nx">h</span> <span class="o">-</span> <span class="nx">d</span> <span class="o">-</span> <span class="p">(</span><span class="o">!</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)).</span><span class="nx">rotate</span><span class="p">(</span><span class="mi">180</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC326'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC327'> <span class="c1">//sets</span></div><div class='line' id='LC328'> <span class="k">if</span> <span class="p">(</span><span class="nx">angle</span> <span class="o">></span> <span class="mi">90</span> <span class="o">&&</span> <span class="nx">angle</span> <span class="o"><</span> <span class="mi">270</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC329'> <span class="k">this</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">-</span> <span class="nx">h</span> <span class="o">-</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC330'> <span class="k">this</span><span class="p">.</span><span class="nx">rotate</span><span class="p">(</span><span class="nx">angle</span> <span class="o">-</span> <span class="mi">180</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="nx">h</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC331'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC332'> <span class="k">this</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">h</span> <span class="o">+</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC333'> <span class="k">this</span><span class="p">.</span><span class="nx">rotate</span><span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">h</span> <span class="o">-</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC334'> <span class="p">}</span></div><div class='line' id='LC335'> <span class="p">}</span></div><div class='line' id='LC336'><br/></div><div class='line' id='LC337'> <span class="k">return</span> <span class="nx">p</span><span class="p">.</span><span class="nx">insertBefore</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">node</span> <span class="o">?</span> <span class="k">this</span> <span class="o">:</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span></div><div class='line' id='LC338'><span class="p">};</span></div><div class='line' id='LC339'><br/></div><div class='line' id='LC340'><span class="cm">/*\</span></div><div class='line' id='LC341'><span class="cm"> * Element.label</span></div><div class='line' id='LC342'><span class="cm"> [ method ]</span></div><div class='line' id='LC343'><span class="cm"> **</span></div><div class='line' id='LC344'><span class="cm"> * Puts the context Element in a 'label' tooltip. Can also be used on sets.</span></div><div class='line' id='LC345'><span class="cm"> **</span></div><div class='line' id='LC346'><span class="cm"> = (object) path element of the label.</span></div><div class='line' id='LC347'><span class="cm"> > Usage</span></div><div class='line' id='LC348'><span class="cm"> | paper.circle(50, 50, 10).attr({</span></div><div class='line' id='LC349'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC350'><span class="cm"> | fill: "0-#c9de96-#8ab66b:44-#398235"</span></div><div class='line' id='LC351'><span class="cm"> | }).label();</span></div><div class='line' id='LC352'><span class="cm"> \*/</span></div><div class='line' id='LC353'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">label</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC354'> <span class="kd">var</span> <span class="nx">bb</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getBBox</span><span class="p">(),</span></div><div class='line' id='LC355'> <span class="nx">paper</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">paper</span> <span class="o">||</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">paper</span><span class="p">,</span></div><div class='line' id='LC356'> <span class="nx">r</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">+</span> <span class="mi">10</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span></div><div class='line' id='LC357'><br/></div><div class='line' id='LC358'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">paper</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC359'><br/></div><div class='line' id='LC360'> <span class="k">return</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">rect</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">r</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">r</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="nx">r</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">+</span> <span class="nx">r</span><span class="p">,</span> <span class="nx">r</span><span class="p">).</span><span class="nx">attr</span><span class="p">({</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s1">'none'</span><span class="p">,</span> <span class="nx">fill</span><span class="o">:</span> <span class="s1">'#000'</span> <span class="p">}).</span><span class="nx">insertBefore</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">node</span> <span class="o">?</span> <span class="k">this</span> <span class="o">:</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span></div><div class='line' id='LC361'><span class="p">};</span></div><div class='line' id='LC362'><br/></div><div class='line' id='LC363'><span class="cm">/*\</span></div><div class='line' id='LC364'><span class="cm"> * Element.blob</span></div><div class='line' id='LC365'><span class="cm"> [ method ]</span></div><div class='line' id='LC366'><span class="cm"> **</span></div><div class='line' id='LC367'><span class="cm"> * Puts the context Element in a 'blob' tooltip. Can also be used on sets.</span></div><div class='line' id='LC368'><span class="cm"> **</span></div><div class='line' id='LC369'><span class="cm"> > Parameters</span></div><div class='line' id='LC370'><span class="cm"> **</span></div><div class='line' id='LC371'><span class="cm"> - angle (number) angle of orientation in degrees [default: `0`]</span></div><div class='line' id='LC372'><span class="cm"> - x (number) x coordinate of the blob's tail [default: Element's `x` or `cx`]</span></div><div class='line' id='LC373'><span class="cm"> - y (number) y coordinate of the blob's tail [default: Element's `x` or `cx`]</span></div><div class='line' id='LC374'><span class="cm"> **</span></div><div class='line' id='LC375'><span class="cm"> = (object) path element of the blob</span></div><div class='line' id='LC376'><span class="cm"> > Usage</span></div><div class='line' id='LC377'><span class="cm"> | paper.circle(50, 50, 8).attr({</span></div><div class='line' id='LC378'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC379'><span class="cm"> | fill: "0-#c9de96-#8ab66b:44-#398235"</span></div><div class='line' id='LC380'><span class="cm"> | }).blob(60);</span></div><div class='line' id='LC381'><span class="cm"> \*/</span></div><div class='line' id='LC382'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">blob</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC383'> <span class="kd">var</span> <span class="nx">bb</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getBBox</span><span class="p">(),</span></div><div class='line' id='LC384'> <span class="nx">rad</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">180</span><span class="p">,</span></div><div class='line' id='LC385'> <span class="nx">paper</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">paper</span> <span class="o">||</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">paper</span><span class="p">,</span></div><div class='line' id='LC386'> <span class="nx">p</span><span class="p">,</span> <span class="nx">center</span><span class="p">,</span> <span class="nx">size</span><span class="p">;</span></div><div class='line' id='LC387'><br/></div><div class='line' id='LC388'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">paper</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC389'><br/></div><div class='line' id='LC390'> <span class="k">switch</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC391'> <span class="k">case</span> <span class="s1">'text'</span><span class="o">:</span></div><div class='line' id='LC392'> <span class="k">case</span> <span class="s1">'circle'</span><span class="o">:</span></div><div class='line' id='LC393'> <span class="k">case</span> <span class="s1">'ellipse'</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span></div><div class='line' id='LC394'> <span class="k">default</span><span class="o">:</span> <span class="nx">center</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC395'> <span class="p">}</span></div><div class='line' id='LC396'><br/></div><div class='line' id='LC397'> <span class="nx">p</span> <span class="o">=</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">path</span><span class="p">().</span><span class="nx">attr</span><span class="p">({</span> <span class="nx">fill</span><span class="o">:</span> <span class="s2">"#000"</span><span class="p">,</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s2">"none"</span> <span class="p">});</span></div><div class='line' id='LC398'> <span class="nx">angle</span> <span class="o">=</span> <span class="p">(</span><span class="o">+</span><span class="nx">angle</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">?</span> <span class="nx">angle</span> <span class="o">:</span> <span class="mi">45</span><span class="p">)</span> <span class="o">+</span> <span class="mi">90</span><span class="p">;</span></div><div class='line' id='LC399'> <span class="nx">size</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span><span class="p">,</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">);</span></div><div class='line' id='LC400'> <span class="nx">x</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">x</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">x</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span></div><div class='line' id='LC401'> <span class="nx">y</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">y</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="o">?</span> <span class="nx">y</span> <span class="o">:</span> <span class="p">(</span><span class="nx">center</span> <span class="o">?</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span></div><div class='line' id='LC402'><br/></div><div class='line' id='LC403'> <span class="kd">var</span> <span class="nx">w</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">max</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span> <span class="o">*</span> <span class="mi">25</span> <span class="o">/</span> <span class="mi">12</span><span class="p">),</span></div><div class='line' id='LC404'> <span class="nx">h</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">max</span><span class="p">(</span><span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">+</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">size</span> <span class="o">*</span> <span class="mi">25</span> <span class="o">/</span> <span class="mi">12</span><span class="p">),</span></div><div class='line' id='LC405'> <span class="nx">x2</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">size</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sin</span><span class="p">((</span><span class="nx">angle</span> <span class="o">-</span> <span class="mf">22.5</span><span class="p">)</span> <span class="o">*</span> <span class="nx">rad</span><span class="p">),</span></div><div class='line' id='LC406'> <span class="nx">y2</span> <span class="o">=</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">size</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">cos</span><span class="p">((</span><span class="nx">angle</span> <span class="o">-</span> <span class="mf">22.5</span><span class="p">)</span> <span class="o">*</span> <span class="nx">rad</span><span class="p">),</span></div><div class='line' id='LC407'> <span class="nx">x1</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">size</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sin</span><span class="p">((</span><span class="nx">angle</span> <span class="o">+</span> <span class="mf">22.5</span><span class="p">)</span> <span class="o">*</span> <span class="nx">rad</span><span class="p">),</span></div><div class='line' id='LC408'> <span class="nx">y1</span> <span class="o">=</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">size</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">cos</span><span class="p">((</span><span class="nx">angle</span> <span class="o">+</span> <span class="mf">22.5</span><span class="p">)</span> <span class="o">*</span> <span class="nx">rad</span><span class="p">),</span></div><div class='line' id='LC409'> <span class="nx">dx</span> <span class="o">=</span> <span class="p">(</span><span class="nx">x1</span> <span class="o">-</span> <span class="nx">x2</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC410'> <span class="nx">dy</span> <span class="o">=</span> <span class="p">(</span><span class="nx">y1</span> <span class="o">-</span> <span class="nx">y2</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC411'> <span class="nx">rx</span> <span class="o">=</span> <span class="nx">w</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC412'> <span class="nx">ry</span> <span class="o">=</span> <span class="nx">h</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC413'> <span class="nx">k</span> <span class="o">=</span> <span class="o">-</span><span class="nb">Math</span><span class="p">.</span><span class="nx">sqrt</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="nx">rx</span> <span class="o">*</span> <span class="nx">rx</span> <span class="o">*</span> <span class="nx">ry</span> <span class="o">*</span> <span class="nx">ry</span> <span class="o">-</span> <span class="nx">rx</span> <span class="o">*</span> <span class="nx">rx</span> <span class="o">*</span> <span class="nx">dy</span> <span class="o">*</span> <span class="nx">dy</span> <span class="o">-</span> <span class="nx">ry</span> <span class="o">*</span> <span class="nx">ry</span> <span class="o">*</span> <span class="nx">dx</span> <span class="o">*</span> <span class="nx">dx</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="nx">rx</span> <span class="o">*</span> <span class="nx">rx</span> <span class="o">*</span> <span class="nx">dy</span> <span class="o">*</span> <span class="nx">dy</span> <span class="o">+</span> <span class="nx">ry</span> <span class="o">*</span> <span class="nx">ry</span> <span class="o">*</span> <span class="nx">dx</span> <span class="o">*</span> <span class="nx">dx</span><span class="p">)),</span></div><div class='line' id='LC414'> <span class="nx">cx</span> <span class="o">=</span> <span class="nx">k</span> <span class="o">*</span> <span class="nx">rx</span> <span class="o">*</span> <span class="nx">dy</span> <span class="o">/</span> <span class="nx">ry</span> <span class="o">+</span> <span class="p">(</span><span class="nx">x1</span> <span class="o">+</span> <span class="nx">x2</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span></div><div class='line' id='LC415'> <span class="nx">cy</span> <span class="o">=</span> <span class="nx">k</span> <span class="o">*</span> <span class="o">-</span><span class="nx">ry</span> <span class="o">*</span> <span class="nx">dx</span> <span class="o">/</span> <span class="nx">rx</span> <span class="o">+</span> <span class="p">(</span><span class="nx">y1</span> <span class="o">+</span> <span class="nx">y2</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span></div><div class='line' id='LC416'><br/></div><div class='line' id='LC417'> <span class="nx">p</span><span class="p">.</span><span class="nx">attr</span><span class="p">({</span></div><div class='line' id='LC418'> <span class="nx">x</span><span class="o">:</span> <span class="nx">cx</span><span class="p">,</span></div><div class='line' id='LC419'> <span class="nx">y</span><span class="o">:</span> <span class="nx">cy</span><span class="p">,</span></div><div class='line' id='LC420'> <span class="nx">path</span><span class="o">:</span> <span class="p">[</span></div><div class='line' id='LC421'> <span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span></div><div class='line' id='LC422'> <span class="s2">"L"</span><span class="p">,</span> <span class="nx">x1</span><span class="p">,</span> <span class="nx">y1</span><span class="p">,</span></div><div class='line' id='LC423'> <span class="s2">"A"</span><span class="p">,</span> <span class="nx">rx</span><span class="p">,</span> <span class="nx">ry</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">x2</span><span class="p">,</span> <span class="nx">y2</span><span class="p">,</span></div><div class='line' id='LC424'> <span class="s2">"z"</span></div><div class='line' id='LC425'> <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s2">","</span><span class="p">)</span></div><div class='line' id='LC426'> <span class="p">});</span></div><div class='line' id='LC427'><br/></div><div class='line' id='LC428'> <span class="k">this</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="nx">cx</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">cy</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span></div><div class='line' id='LC429'><br/></div><div class='line' id='LC430'> <span class="k">return</span> <span class="nx">p</span><span class="p">.</span><span class="nx">insertBefore</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">node</span> <span class="o">?</span> <span class="k">this</span> <span class="o">:</span> <span class="k">this</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span></div><div class='line' id='LC431'><span class="p">};</span></div><div class='line' id='LC432'><br/></div><div class='line' id='LC433'><span class="cm">/*</span></div><div class='line' id='LC434'><span class="cm"> * Tooltips on Paper prototype</span></div><div class='line' id='LC435'><span class="cm"> */</span></div><div class='line' id='LC436'><span class="cm">/*\</span></div><div class='line' id='LC437'><span class="cm"> * Paper.label</span></div><div class='line' id='LC438'><span class="cm"> [ method ]</span></div><div class='line' id='LC439'><span class="cm"> **</span></div><div class='line' id='LC440'><span class="cm"> * Puts the given `text` into a 'label' tooltip. The text is given a default style according to @g.txtattr. See @Element.label</span></div><div class='line' id='LC441'><span class="cm"> **</span></div><div class='line' id='LC442'><span class="cm"> > Parameters</span></div><div class='line' id='LC443'><span class="cm"> **</span></div><div class='line' id='LC444'><span class="cm"> - x (number) x coordinate of the center of the label</span></div><div class='line' id='LC445'><span class="cm"> - y (number) y coordinate of the center of the label</span></div><div class='line' id='LC446'><span class="cm"> - text (string) text to place inside the label</span></div><div class='line' id='LC447'><span class="cm"> **</span></div><div class='line' id='LC448'><span class="cm"> = (object) set containing the label path and the text element</span></div><div class='line' id='LC449'><span class="cm"> > Usage</span></div><div class='line' id='LC450'><span class="cm"> | paper.label(50, 50, "$9.99");</span></div><div class='line' id='LC451'><span class="cm"> \*/</span></div><div class='line' id='LC452'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">label</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC453'> <span class="kd">var</span> <span class="nx">set</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">();</span></div><div class='line' id='LC454'><br/></div><div class='line' id='LC455'> <span class="nx">text</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span><span class="nx">txtattr</span><span class="p">);</span></div><div class='line' id='LC456'> <span class="k">return</span> <span class="nx">set</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">label</span><span class="p">(),</span> <span class="nx">text</span><span class="p">);</span></div><div class='line' id='LC457'><span class="p">};</span></div><div class='line' id='LC458'><br/></div><div class='line' id='LC459'><span class="cm">/*\</span></div><div class='line' id='LC460'><span class="cm"> * Paper.popup</span></div><div class='line' id='LC461'><span class="cm"> [ method ]</span></div><div class='line' id='LC462'><span class="cm"> **</span></div><div class='line' id='LC463'><span class="cm"> * Puts the given `text` into a 'popup' tooltip. The text is given a default style according to @g.txtattr. See @Element.popup</span></div><div class='line' id='LC464'><span class="cm"> *</span></div><div class='line' id='LC465'><span class="cm"> * Note: The `dir` parameter has changed from g.Raphael 0.4.1 to 0.5. The options `0`, `1`, `2`, and `3` has been changed to `'down'`, `'left'`, `'up'`, and `'right'` respectively.</span></div><div class='line' id='LC466'><span class="cm"> **</span></div><div class='line' id='LC467'><span class="cm"> > Parameters</span></div><div class='line' id='LC468'><span class="cm"> **</span></div><div class='line' id='LC469'><span class="cm"> - x (number) x coordinate of the popup's tail</span></div><div class='line' id='LC470'><span class="cm"> - y (number) y coordinate of the popup's tail</span></div><div class='line' id='LC471'><span class="cm"> - text (string) text to place inside the popup</span></div><div class='line' id='LC472'><span class="cm"> - dir (string) location of the text relative to the tail: `'down'`, `'left'`, `'up'` [default], or `'right'`.</span></div><div class='line' id='LC473'><span class="cm"> - size (number) amount of padding around the Element [default: `5`]</span></div><div class='line' id='LC474'><span class="cm"> **</span></div><div class='line' id='LC475'><span class="cm"> = (object) set containing the popup path and the text element</span></div><div class='line' id='LC476'><span class="cm"> > Usage</span></div><div class='line' id='LC477'><span class="cm"> | paper.popup(50, 50, "$9.99", 'down');</span></div><div class='line' id='LC478'><span class="cm"> \*/</span></div><div class='line' id='LC479'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">popup</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">,</span> <span class="nx">dir</span><span class="p">,</span> <span class="nx">size</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC480'> <span class="kd">var</span> <span class="nx">set</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">();</span></div><div class='line' id='LC481'><br/></div><div class='line' id='LC482'> <span class="nx">text</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span><span class="nx">txtattr</span><span class="p">);</span></div><div class='line' id='LC483'> <span class="k">return</span> <span class="nx">set</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">popup</span><span class="p">(</span><span class="nx">dir</span><span class="p">,</span> <span class="nx">size</span><span class="p">),</span> <span class="nx">text</span><span class="p">);</span></div><div class='line' id='LC484'><span class="p">};</span></div><div class='line' id='LC485'><br/></div><div class='line' id='LC486'><span class="cm">/*\</span></div><div class='line' id='LC487'><span class="cm"> * Paper.tag</span></div><div class='line' id='LC488'><span class="cm"> [ method ]</span></div><div class='line' id='LC489'><span class="cm"> **</span></div><div class='line' id='LC490'><span class="cm"> * Puts the given text into a 'tag' tooltip. The text is given a default style according to @g.txtattr. See @Element.tag</span></div><div class='line' id='LC491'><span class="cm"> **</span></div><div class='line' id='LC492'><span class="cm"> > Parameters</span></div><div class='line' id='LC493'><span class="cm"> **</span></div><div class='line' id='LC494'><span class="cm"> - x (number) x coordinate of the center of the tag loop</span></div><div class='line' id='LC495'><span class="cm"> - y (number) y coordinate of the center of the tag loop</span></div><div class='line' id='LC496'><span class="cm"> - text (string) text to place inside the tag</span></div><div class='line' id='LC497'><span class="cm"> - angle (number) angle of orientation in degrees [default: `0`]</span></div><div class='line' id='LC498'><span class="cm"> - r (number) radius of the loop [default: `5`]</span></div><div class='line' id='LC499'><span class="cm"> **</span></div><div class='line' id='LC500'><span class="cm"> = (object) set containing the tag path and the text element</span></div><div class='line' id='LC501'><span class="cm"> > Usage</span></div><div class='line' id='LC502'><span class="cm"> | paper.tag(50, 50, "$9.99", 60);</span></div><div class='line' id='LC503'><span class="cm"> \*/</span></div><div class='line' id='LC504'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">tag</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">,</span> <span class="nx">angle</span><span class="p">,</span> <span class="nx">r</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC505'> <span class="kd">var</span> <span class="nx">set</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">();</span></div><div class='line' id='LC506'><br/></div><div class='line' id='LC507'> <span class="nx">text</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span><span class="nx">txtattr</span><span class="p">);</span></div><div class='line' id='LC508'> <span class="k">return</span> <span class="nx">set</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">tag</span><span class="p">(</span><span class="nx">angle</span><span class="p">,</span> <span class="nx">r</span><span class="p">),</span> <span class="nx">text</span><span class="p">);</span></div><div class='line' id='LC509'><span class="p">};</span></div><div class='line' id='LC510'><br/></div><div class='line' id='LC511'><span class="cm">/*\</span></div><div class='line' id='LC512'><span class="cm"> * Paper.flag</span></div><div class='line' id='LC513'><span class="cm"> [ method ]</span></div><div class='line' id='LC514'><span class="cm"> **</span></div><div class='line' id='LC515'><span class="cm"> * Puts the given `text` into a 'flag' tooltip. The text is given a default style according to @g.txtattr. See @Element.flag</span></div><div class='line' id='LC516'><span class="cm"> **</span></div><div class='line' id='LC517'><span class="cm"> > Parameters</span></div><div class='line' id='LC518'><span class="cm"> **</span></div><div class='line' id='LC519'><span class="cm"> - x (number) x coordinate of the flag's point</span></div><div class='line' id='LC520'><span class="cm"> - y (number) y coordinate of the flag's point</span></div><div class='line' id='LC521'><span class="cm"> - text (string) text to place inside the flag</span></div><div class='line' id='LC522'><span class="cm"> - angle (number) angle of orientation in degrees [default: `0`]</span></div><div class='line' id='LC523'><span class="cm"> **</span></div><div class='line' id='LC524'><span class="cm"> = (object) set containing the flag path and the text element</span></div><div class='line' id='LC525'><span class="cm"> > Usage</span></div><div class='line' id='LC526'><span class="cm"> | paper.flag(50, 50, "$9.99", 60);</span></div><div class='line' id='LC527'><span class="cm"> \*/</span></div><div class='line' id='LC528'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">flag</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">,</span> <span class="nx">angle</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC529'> <span class="kd">var</span> <span class="nx">set</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">();</span></div><div class='line' id='LC530'><br/></div><div class='line' id='LC531'> <span class="nx">text</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span><span class="nx">txtattr</span><span class="p">);</span></div><div class='line' id='LC532'> <span class="k">return</span> <span class="nx">set</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">flag</span><span class="p">(</span><span class="nx">angle</span><span class="p">),</span> <span class="nx">text</span><span class="p">);</span></div><div class='line' id='LC533'><span class="p">};</span></div><div class='line' id='LC534'><br/></div><div class='line' id='LC535'><span class="cm">/*\</span></div><div class='line' id='LC536'><span class="cm"> * Paper.drop</span></div><div class='line' id='LC537'><span class="cm"> [ method ]</span></div><div class='line' id='LC538'><span class="cm"> **</span></div><div class='line' id='LC539'><span class="cm"> * Puts the given text into a 'drop' tooltip. The text is given a default style according to @g.txtattr. See @Element.drop</span></div><div class='line' id='LC540'><span class="cm"> **</span></div><div class='line' id='LC541'><span class="cm"> > Parameters</span></div><div class='line' id='LC542'><span class="cm"> **</span></div><div class='line' id='LC543'><span class="cm"> - x (number) x coordinate of the drop's point</span></div><div class='line' id='LC544'><span class="cm"> - y (number) y coordinate of the drop's point</span></div><div class='line' id='LC545'><span class="cm"> - text (string) text to place inside the drop</span></div><div class='line' id='LC546'><span class="cm"> - angle (number) angle of orientation in degrees [default: `0`]</span></div><div class='line' id='LC547'><span class="cm"> **</span></div><div class='line' id='LC548'><span class="cm"> = (object) set containing the drop path and the text element</span></div><div class='line' id='LC549'><span class="cm"> > Usage</span></div><div class='line' id='LC550'><span class="cm"> | paper.drop(50, 50, "$9.99", 60);</span></div><div class='line' id='LC551'><span class="cm"> \*/</span></div><div class='line' id='LC552'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">drop</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">,</span> <span class="nx">angle</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC553'> <span class="kd">var</span> <span class="nx">set</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">();</span></div><div class='line' id='LC554'><br/></div><div class='line' id='LC555'> <span class="nx">text</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span><span class="nx">txtattr</span><span class="p">);</span></div><div class='line' id='LC556'> <span class="k">return</span> <span class="nx">set</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">drop</span><span class="p">(</span><span class="nx">angle</span><span class="p">),</span> <span class="nx">text</span><span class="p">);</span></div><div class='line' id='LC557'><span class="p">};</span></div><div class='line' id='LC558'><br/></div><div class='line' id='LC559'><span class="cm">/*\</span></div><div class='line' id='LC560'><span class="cm"> * Paper.blob</span></div><div class='line' id='LC561'><span class="cm"> [ method ]</span></div><div class='line' id='LC562'><span class="cm"> **</span></div><div class='line' id='LC563'><span class="cm"> * Puts the given text into a 'blob' tooltip. The text is given a default style according to @g.txtattr. See @Element.blob</span></div><div class='line' id='LC564'><span class="cm"> **</span></div><div class='line' id='LC565'><span class="cm"> > Parameters</span></div><div class='line' id='LC566'><span class="cm"> **</span></div><div class='line' id='LC567'><span class="cm"> - x (number) x coordinate of the blob's tail</span></div><div class='line' id='LC568'><span class="cm"> - y (number) y coordinate of the blob's tail</span></div><div class='line' id='LC569'><span class="cm"> - text (string) text to place inside the blob</span></div><div class='line' id='LC570'><span class="cm"> - angle (number) angle of orientation in degrees [default: `0`]</span></div><div class='line' id='LC571'><span class="cm"> **</span></div><div class='line' id='LC572'><span class="cm"> = (object) set containing the blob path and the text element</span></div><div class='line' id='LC573'><span class="cm"> > Usage</span></div><div class='line' id='LC574'><span class="cm"> | paper.blob(50, 50, "$9.99", 60);</span></div><div class='line' id='LC575'><span class="cm"> \*/</span></div><div class='line' id='LC576'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">blob</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">,</span> <span class="nx">angle</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC577'> <span class="kd">var</span> <span class="nx">set</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">();</span></div><div class='line' id='LC578'><br/></div><div class='line' id='LC579'> <span class="nx">text</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">text</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span><span class="nx">txtattr</span><span class="p">);</span></div><div class='line' id='LC580'> <span class="k">return</span> <span class="nx">set</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">blob</span><span class="p">(</span><span class="nx">angle</span><span class="p">),</span> <span class="nx">text</span><span class="p">);</span></div><div class='line' id='LC581'><span class="p">};</span></div><div class='line' id='LC582'><br/></div><div class='line' id='LC583'><span class="cm">/**</span></div><div class='line' id='LC584'><span class="cm"> * Brightness functions on the Element prototype</span></div><div class='line' id='LC585'><span class="cm"> */</span></div><div class='line' id='LC586'><span class="cm">/*\</span></div><div class='line' id='LC587'><span class="cm"> * Element.lighter</span></div><div class='line' id='LC588'><span class="cm"> [ method ]</span></div><div class='line' id='LC589'><span class="cm"> **</span></div><div class='line' id='LC590'><span class="cm"> * Makes the context element lighter by increasing the brightness and reducing the saturation by a given factor. Can be called on Sets.</span></div><div class='line' id='LC591'><span class="cm"> **</span></div><div class='line' id='LC592'><span class="cm"> > Parameters</span></div><div class='line' id='LC593'><span class="cm"> **</span></div><div class='line' id='LC594'><span class="cm"> - times (number) adjustment factor [default: `2`]</span></div><div class='line' id='LC595'><span class="cm"> **</span></div><div class='line' id='LC596'><span class="cm"> = (object) Element</span></div><div class='line' id='LC597'><span class="cm"> > Usage</span></div><div class='line' id='LC598'><span class="cm"> | paper.circle(50, 50, 20).attr({</span></div><div class='line' id='LC599'><span class="cm"> | fill: "#ff0000",</span></div><div class='line' id='LC600'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC601'><span class="cm"> | "stroke-width": 2</span></div><div class='line' id='LC602'><span class="cm"> | }).lighter(6);</span></div><div class='line' id='LC603'><span class="cm"> \*/</span></div><div class='line' id='LC604'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">lighter</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">times</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC605'> <span class="nx">times</span> <span class="o">=</span> <span class="nx">times</span> <span class="o">||</span> <span class="mi">2</span><span class="p">;</span></div><div class='line' id='LC606'><br/></div><div class='line' id='LC607'> <span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">fill</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">stroke</span><span class="p">];</span></div><div class='line' id='LC608'><br/></div><div class='line' id='LC609'> <span class="k">this</span><span class="p">.</span><span class="nx">fs</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">fs</span> <span class="o">||</span> <span class="p">[</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">]];</span></div><div class='line' id='LC610'><br/></div><div class='line' id='LC611'> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Raphael</span><span class="p">.</span><span class="nx">rgb2hsb</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">getRGB</span><span class="p">(</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">]).</span><span class="nx">hex</span><span class="p">);</span></div><div class='line' id='LC612'> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Raphael</span><span class="p">.</span><span class="nx">rgb2hsb</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">getRGB</span><span class="p">(</span><span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">]).</span><span class="nx">hex</span><span class="p">);</span></div><div class='line' id='LC613'> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">b</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">b</span> <span class="o">*</span> <span class="nx">times</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span></div><div class='line' id='LC614'> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">s</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">s</span> <span class="o">/</span> <span class="nx">times</span><span class="p">;</span></div><div class='line' id='LC615'> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">b</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">b</span> <span class="o">*</span> <span class="nx">times</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span></div><div class='line' id='LC616'> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">s</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">s</span> <span class="o">/</span> <span class="nx">times</span><span class="p">;</span></div><div class='line' id='LC617'><br/></div><div class='line' id='LC618'> <span class="k">this</span><span class="p">.</span><span class="nx">attr</span><span class="p">({</span><span class="nx">fill</span><span class="o">:</span> <span class="s2">"hsb("</span> <span class="o">+</span> <span class="p">[</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">h</span><span class="p">,</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">s</span><span class="p">,</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">b</span><span class="p">]</span> <span class="o">+</span> <span class="s2">")"</span><span class="p">,</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s2">"hsb("</span> <span class="o">+</span> <span class="p">[</span><span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">h</span><span class="p">,</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">s</span><span class="p">,</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">b</span><span class="p">]</span> <span class="o">+</span> <span class="s2">")"</span><span class="p">});</span></div><div class='line' id='LC619'> <span class="k">return</span> <span class="k">this</span><span class="p">;</span></div><div class='line' id='LC620'><span class="p">};</span></div><div class='line' id='LC621'><br/></div><div class='line' id='LC622'><span class="cm">/*\</span></div><div class='line' id='LC623'><span class="cm"> * Element.darker</span></div><div class='line' id='LC624'><span class="cm"> [ method ]</span></div><div class='line' id='LC625'><span class="cm"> **</span></div><div class='line' id='LC626'><span class="cm"> * Makes the context element darker by decreasing the brightness and increasing the saturation by a given factor. Can be called on Sets.</span></div><div class='line' id='LC627'><span class="cm"> **</span></div><div class='line' id='LC628'><span class="cm"> > Parameters</span></div><div class='line' id='LC629'><span class="cm"> **</span></div><div class='line' id='LC630'><span class="cm"> - times (number) adjustment factor [default: `2`]</span></div><div class='line' id='LC631'><span class="cm"> **</span></div><div class='line' id='LC632'><span class="cm"> = (object) Element</span></div><div class='line' id='LC633'><span class="cm"> > Usage</span></div><div class='line' id='LC634'><span class="cm"> | paper.circle(50, 50, 20).attr({</span></div><div class='line' id='LC635'><span class="cm"> | fill: "#ff0000",</span></div><div class='line' id='LC636'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC637'><span class="cm"> | "stroke-width": 2</span></div><div class='line' id='LC638'><span class="cm"> | }).darker(6);</span></div><div class='line' id='LC639'><span class="cm"> \*/</span></div><div class='line' id='LC640'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">darker</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">times</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC641'> <span class="nx">times</span> <span class="o">=</span> <span class="nx">times</span> <span class="o">||</span> <span class="mi">2</span><span class="p">;</span></div><div class='line' id='LC642'><br/></div><div class='line' id='LC643'> <span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">fill</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">stroke</span><span class="p">];</span></div><div class='line' id='LC644'><br/></div><div class='line' id='LC645'> <span class="k">this</span><span class="p">.</span><span class="nx">fs</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">fs</span> <span class="o">||</span> <span class="p">[</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">]];</span></div><div class='line' id='LC646'><br/></div><div class='line' id='LC647'> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Raphael</span><span class="p">.</span><span class="nx">rgb2hsb</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">getRGB</span><span class="p">(</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">]).</span><span class="nx">hex</span><span class="p">);</span></div><div class='line' id='LC648'> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Raphael</span><span class="p">.</span><span class="nx">rgb2hsb</span><span class="p">(</span><span class="nx">Raphael</span><span class="p">.</span><span class="nx">getRGB</span><span class="p">(</span><span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">]).</span><span class="nx">hex</span><span class="p">);</span></div><div class='line' id='LC649'> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">s</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">s</span> <span class="o">*</span> <span class="nx">times</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span></div><div class='line' id='LC650'> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">b</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">b</span> <span class="o">/</span> <span class="nx">times</span><span class="p">;</span></div><div class='line' id='LC651'> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">s</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">s</span> <span class="o">*</span> <span class="nx">times</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span></div><div class='line' id='LC652'> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">b</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">b</span> <span class="o">/</span> <span class="nx">times</span><span class="p">;</span></div><div class='line' id='LC653'><br/></div><div class='line' id='LC654'> <span class="k">this</span><span class="p">.</span><span class="nx">attr</span><span class="p">({</span><span class="nx">fill</span><span class="o">:</span> <span class="s2">"hsb("</span> <span class="o">+</span> <span class="p">[</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">h</span><span class="p">,</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">s</span><span class="p">,</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">b</span><span class="p">]</span> <span class="o">+</span> <span class="s2">")"</span><span class="p">,</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s2">"hsb("</span> <span class="o">+</span> <span class="p">[</span><span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">h</span><span class="p">,</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">s</span><span class="p">,</span> <span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">b</span><span class="p">]</span> <span class="o">+</span> <span class="s2">")"</span><span class="p">});</span></div><div class='line' id='LC655'> <span class="k">return</span> <span class="k">this</span><span class="p">;</span></div><div class='line' id='LC656'><span class="p">};</span></div><div class='line' id='LC657'><br/></div><div class='line' id='LC658'><span class="cm">/*\</span></div><div class='line' id='LC659'><span class="cm"> * Element.resetBrightness</span></div><div class='line' id='LC660'><span class="cm"> [ method ]</span></div><div class='line' id='LC661'><span class="cm"> **</span></div><div class='line' id='LC662'><span class="cm"> * Resets brightness and saturation levels to their original values. See @Element.lighter and @Element.darker. Can be called on Sets.</span></div><div class='line' id='LC663'><span class="cm"> **</span></div><div class='line' id='LC664'><span class="cm"> = (object) Element</span></div><div class='line' id='LC665'><span class="cm"> > Usage</span></div><div class='line' id='LC666'><span class="cm"> | paper.circle(50, 50, 20).attr({</span></div><div class='line' id='LC667'><span class="cm"> | fill: "#ff0000",</span></div><div class='line' id='LC668'><span class="cm"> | stroke: "#fff",</span></div><div class='line' id='LC669'><span class="cm"> | "stroke-width": 2</span></div><div class='line' id='LC670'><span class="cm"> | }).lighter(6).resetBrightness();</span></div><div class='line' id='LC671'><span class="cm"> \*/</span></div><div class='line' id='LC672'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">.</span><span class="nx">resetBrightness</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC673'> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">fs</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC674'> <span class="k">this</span><span class="p">.</span><span class="nx">attr</span><span class="p">({</span> <span class="nx">fill</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">fs</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nx">stroke</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">fs</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">});</span></div><div class='line' id='LC675'> <span class="k">delete</span> <span class="k">this</span><span class="p">.</span><span class="nx">fs</span><span class="p">;</span></div><div class='line' id='LC676'> <span class="p">}</span></div><div class='line' id='LC677'> <span class="k">return</span> <span class="k">this</span><span class="p">;</span></div><div class='line' id='LC678'><span class="p">};</span></div><div class='line' id='LC679'><br/></div><div class='line' id='LC680'><span class="c1">//alias to set prototype</span></div><div class='line' id='LC681'><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC682'> <span class="kd">var</span> <span class="nx">brightness</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'lighter'</span><span class="p">,</span> <span class="s1">'darker'</span><span class="p">,</span> <span class="s1">'resetBrightness'</span><span class="p">],</span></div><div class='line' id='LC683'> <span class="nx">tooltips</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'popup'</span><span class="p">,</span> <span class="s1">'tag'</span><span class="p">,</span> <span class="s1">'flag'</span><span class="p">,</span> <span class="s1">'label'</span><span class="p">,</span> <span class="s1">'drop'</span><span class="p">,</span> <span class="s1">'blob'</span><span class="p">];</span></div><div class='line' id='LC684'><br/></div><div class='line' id='LC685'> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">f</span> <span class="k">in</span> <span class="nx">tooltips</span><span class="p">)</span> <span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC686'> <span class="nx">Raphael</span><span class="p">.</span><span class="nx">st</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC687'> <span class="k">return</span> <span class="nx">Raphael</span><span class="p">.</span><span class="nx">el</span><span class="p">[</span><span class="nx">name</span><span class="p">].</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span></div><div class='line' id='LC688'> <span class="p">};</span></div><div class='line' id='LC689'> <span class="p">})(</span><span class="nx">tooltips</span><span class="p">[</span><span class="nx">f</span><span class="p">]);</span></div><div class='line' id='LC690'><br/></div><div class='line' id='LC691'> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">f</span> <span class="k">in</span> <span class="nx">brightness</span><span class="p">)</span> <span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC692'> <span class="nx">Raphael</span><span class="p">.</span><span class="nx">st</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC693'> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="k">this</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC694'> <span class="k">this</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">name</span><span class="p">].</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span> <span class="nx">arguments</span><span class="p">);</span></div><div class='line' id='LC695'> <span class="p">}</span></div><div class='line' id='LC696'><br/></div><div class='line' id='LC697'> <span class="k">return</span> <span class="k">this</span><span class="p">;</span></div><div class='line' id='LC698'> <span class="p">};</span></div><div class='line' id='LC699'> <span class="p">})(</span><span class="nx">brightness</span><span class="p">[</span><span class="nx">f</span><span class="p">]);</span></div><div class='line' id='LC700'><span class="p">})();</span></div><div class='line' id='LC701'><br/></div><div class='line' id='LC702'><span class="c1">//chart prototype for storing common functions</span></div><div class='line' id='LC703'><span class="nx">Raphael</span><span class="p">.</span><span class="nx">g</span> <span class="o">=</span> <span class="p">{</span></div><div class='line' id='LC704'> <span class="cm">/*\</span></div><div class='line' id='LC705'><span class="cm"> * g.shim</span></div><div class='line' id='LC706'><span class="cm"> [ object ]</span></div><div class='line' id='LC707'><span class="cm"> **</span></div><div class='line' id='LC708'><span class="cm"> * An attribute object that charts will set on all generated shims (shims being the invisible objects that mouse events are bound to)</span></div><div class='line' id='LC709'><span class="cm"> **</span></div><div class='line' id='LC710'><span class="cm"> > Default value</span></div><div class='line' id='LC711'><span class="cm"> | { stroke: 'none', fill: '#000', 'fill-opacity': 0 }</span></div><div class='line' id='LC712'><span class="cm"> \*/</span></div><div class='line' id='LC713'> <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span> <span class="nx">stroke</span><span class="o">:</span> <span class="s1">'none'</span><span class="p">,</span> <span class="nx">fill</span><span class="o">:</span> <span class="s1">'#000'</span><span class="p">,</span> <span class="s1">'fill-opacity'</span><span class="o">:</span> <span class="mi">0</span> <span class="p">},</span></div><div class='line' id='LC714'><br/></div><div class='line' id='LC715'> <span class="cm">/*\</span></div><div class='line' id='LC716'><span class="cm"> * g.txtattr</span></div><div class='line' id='LC717'><span class="cm"> [ object ]</span></div><div class='line' id='LC718'><span class="cm"> **</span></div><div class='line' id='LC719'><span class="cm"> * An attribute object that charts and tooltips will set on any generated text</span></div><div class='line' id='LC720'><span class="cm"> **</span></div><div class='line' id='LC721'><span class="cm"> > Default value</span></div><div class='line' id='LC722'><span class="cm"> | { font: '12px Arial, sans-serif', fill: '#fff' }</span></div><div class='line' id='LC723'><span class="cm"> \*/</span> </div><div class='line' id='LC724'> <span class="nx">txtattr</span><span class="o">:</span> <span class="p">{</span> <span class="nx">font</span><span class="o">:</span> <span class="s1">'12px Arial, sans-serif'</span><span class="p">,</span> <span class="nx">fill</span><span class="o">:</span> <span class="s1">'#fff'</span> <span class="p">},</span></div><div class='line' id='LC725'><br/></div><div class='line' id='LC726'> <span class="cm">/*\</span></div><div class='line' id='LC727'><span class="cm"> * g.colors</span></div><div class='line' id='LC728'><span class="cm"> [ array ]</span></div><div class='line' id='LC729'><span class="cm"> **</span></div><div class='line' id='LC730'><span class="cm"> * An array of color values that charts will iterate through when drawing chart data values.</span></div><div class='line' id='LC731'><span class="cm"> **</span></div><div class='line' id='LC732'><span class="cm"> \*/</span></div><div class='line' id='LC733'> <span class="nx">colors</span><span class="o">:</span> <span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC734'> <span class="kd">var</span> <span class="nx">hues</span> <span class="o">=</span> <span class="p">[.</span><span class="mi">6</span><span class="p">,</span> <span class="p">.</span><span class="mi">2</span><span class="p">,</span> <span class="p">.</span><span class="mi">05</span><span class="p">,</span> <span class="p">.</span><span class="mi">1333</span><span class="p">,</span> <span class="p">.</span><span class="mi">75</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span></div><div class='line' id='LC735'> <span class="nx">colors</span> <span class="o">=</span> <span class="p">[];</span></div><div class='line' id='LC736'><br/></div><div class='line' id='LC737'> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC738'> <span class="k">if</span> <span class="p">(</span><span class="nx">i</span> <span class="o"><</span> <span class="nx">hues</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC739'> <span class="nx">colors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">'hsb('</span> <span class="o">+</span> <span class="nx">hues</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">+</span> <span class="s1">',.75, .75)'</span><span class="p">);</span></div><div class='line' id='LC740'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC741'> <span class="nx">colors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">'hsb('</span> <span class="o">+</span> <span class="nx">hues</span><span class="p">[</span><span class="nx">i</span> <span class="o">-</span> <span class="nx">hues</span><span class="p">.</span><span class="nx">length</span><span class="p">]</span> <span class="o">+</span> <span class="s1">', 1, .5)'</span><span class="p">);</span></div><div class='line' id='LC742'> <span class="p">}</span></div><div class='line' id='LC743'> <span class="p">}</span></div><div class='line' id='LC744'><br/></div><div class='line' id='LC745'> <span class="k">return</span> <span class="nx">colors</span><span class="p">;</span></div><div class='line' id='LC746'> <span class="p">})(),</span></div><div class='line' id='LC747'> </div><div class='line' id='LC748'> <span class="nx">snapEnds</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">from</span><span class="p">,</span> <span class="nx">to</span><span class="p">,</span> <span class="nx">steps</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC749'> <span class="kd">var</span> <span class="nx">f</span> <span class="o">=</span> <span class="nx">from</span><span class="p">,</span></div><div class='line' id='LC750'> <span class="nx">t</span> <span class="o">=</span> <span class="nx">to</span><span class="p">;</span></div><div class='line' id='LC751'><br/></div><div class='line' id='LC752'> <span class="k">if</span> <span class="p">(</span><span class="nx">f</span> <span class="o">==</span> <span class="nx">t</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC753'> <span class="k">return</span> <span class="p">{</span><span class="nx">from</span><span class="o">:</span> <span class="nx">f</span><span class="p">,</span> <span class="nx">to</span><span class="o">:</span> <span class="nx">t</span><span class="p">,</span> <span class="nx">power</span><span class="o">:</span> <span class="mi">0</span><span class="p">};</span></div><div class='line' id='LC754'> <span class="p">}</span></div><div class='line' id='LC755'><br/></div><div class='line' id='LC756'> <span class="kd">function</span> <span class="nx">round</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC757'> <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="nx">a</span> <span class="o">-</span> <span class="p">.</span><span class="mi">5</span><span class="p">)</span> <span class="o"><</span> <span class="p">.</span><span class="mi">25</span> <span class="o">?</span> <span class="o">~~</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span> <span class="o">:</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">a</span><span class="p">);</span></div><div class='line' id='LC758'> <span class="p">}</span></div><div class='line' id='LC759'><br/></div><div class='line' id='LC760'> <span class="kd">var</span> <span class="nx">d</span> <span class="o">=</span> <span class="p">(</span><span class="nx">t</span> <span class="o">-</span> <span class="nx">f</span><span class="p">)</span> <span class="o">/</span> <span class="nx">steps</span><span class="p">,</span></div><div class='line' id='LC761'> <span class="nx">r</span> <span class="o">=</span> <span class="o">~~</span><span class="p">(</span><span class="nx">d</span><span class="p">),</span></div><div class='line' id='LC762'> <span class="nx">R</span> <span class="o">=</span> <span class="nx">r</span><span class="p">,</span></div><div class='line' id='LC763'> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span></div><div class='line' id='LC764'><br/></div><div class='line' id='LC765'> <span class="k">if</span> <span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC766'> <span class="k">while</span> <span class="p">(</span><span class="nx">R</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC767'> <span class="nx">i</span><span class="o">--</span><span class="p">;</span></div><div class='line' id='LC768'> <span class="nx">R</span> <span class="o">=</span> <span class="o">~~</span><span class="p">(</span><span class="nx">d</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">))</span> <span class="o">/</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span></div><div class='line' id='LC769'> <span class="p">}</span></div><div class='line' id='LC770'><br/></div><div class='line' id='LC771'> <span class="nx">i</span> <span class="o">++</span><span class="p">;</span></div><div class='line' id='LC772'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC773'> <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="nx">r</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC774'> <span class="nx">i</span> <span class="o">=</span> <span class="nx">i</span> <span class="o">||</span> <span class="mi">1</span><span class="p">;</span></div><div class='line' id='LC775'> <span class="nx">r</span> <span class="o">=</span> <span class="o">~~</span><span class="p">(</span><span class="nx">d</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">))</span> <span class="o">/</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span></div><div class='line' id='LC776'> <span class="nx">i</span><span class="o">++</span><span class="p">;</span></div><div class='line' id='LC777'> <span class="p">}</span></div><div class='line' id='LC778'><br/></div><div class='line' id='LC779'> <span class="nx">i</span> <span class="o">&&</span> <span class="nx">i</span><span class="o">--</span><span class="p">;</span></div><div class='line' id='LC780'> <span class="p">}</span></div><div class='line' id='LC781'><br/></div><div class='line' id='LC782'> <span class="nx">t</span> <span class="o">=</span> <span class="nx">round</span><span class="p">(</span><span class="nx">to</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">))</span> <span class="o">/</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span></div><div class='line' id='LC783'><br/></div><div class='line' id='LC784'> <span class="k">if</span> <span class="p">(</span><span class="nx">t</span> <span class="o"><</span> <span class="nx">to</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC785'> <span class="nx">t</span> <span class="o">=</span> <span class="nx">round</span><span class="p">((</span><span class="nx">to</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">))</span> <span class="o">/</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span></div><div class='line' id='LC786'> <span class="p">}</span></div><div class='line' id='LC787'><br/></div><div class='line' id='LC788'> <span class="nx">f</span> <span class="o">=</span> <span class="nx">round</span><span class="p">((</span><span class="nx">from</span> <span class="o">-</span> <span class="p">(</span><span class="nx">i</span> <span class="o">></span> <span class="mi">0</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="p">.</span><span class="mi">5</span><span class="p">))</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">))</span> <span class="o">/</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span></div><div class='line' id='LC789'> <span class="k">return</span> <span class="p">{</span> <span class="nx">from</span><span class="o">:</span> <span class="nx">f</span><span class="p">,</span> <span class="nx">to</span><span class="o">:</span> <span class="nx">t</span><span class="p">,</span> <span class="nx">power</span><span class="o">:</span> <span class="nx">i</span> <span class="p">};</span></div><div class='line' id='LC790'> <span class="p">},</span></div><div class='line' id='LC791'><br/></div><div class='line' id='LC792'> <span class="nx">axis</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">length</span><span class="p">,</span> <span class="nx">from</span><span class="p">,</span> <span class="nx">to</span><span class="p">,</span> <span class="nx">steps</span><span class="p">,</span> <span class="nx">orientation</span><span class="p">,</span> <span class="nx">labels</span><span class="p">,</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">dashsize</span><span class="p">,</span> <span class="nx">paper</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC793'> <span class="nx">dashsize</span> <span class="o">=</span> <span class="nx">dashsize</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="mi">2</span> <span class="o">:</span> <span class="nx">dashsize</span><span class="p">;</span></div><div class='line' id='LC794'> <span class="nx">type</span> <span class="o">=</span> <span class="nx">type</span> <span class="o">||</span> <span class="s2">"t"</span><span class="p">;</span></div><div class='line' id='LC795'> <span class="nx">steps</span> <span class="o">=</span> <span class="nx">steps</span> <span class="o">||</span> <span class="mi">10</span><span class="p">;</span></div><div class='line' id='LC796'> <span class="nx">paper</span> <span class="o">=</span> <span class="nx">arguments</span><span class="p">[</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1">//paper is always last argument</span></div><div class='line' id='LC797'><br/></div><div class='line' id='LC798'> <span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">type</span> <span class="o">==</span> <span class="s2">"|"</span> <span class="o">||</span> <span class="nx">type</span> <span class="o">==</span> <span class="s2">" "</span> <span class="o">?</span> <span class="p">[</span><span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="s2">"l"</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">.</span><span class="mi">001</span><span class="p">]</span> <span class="o">:</span> <span class="nx">orientation</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">||</span> <span class="nx">orientation</span> <span class="o">==</span> <span class="mi">3</span> <span class="o">?</span> <span class="p">[</span><span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="s2">"l"</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">length</span><span class="p">]</span> <span class="o">:</span> <span class="p">[</span><span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span><span class="p">,</span> <span class="s2">"l"</span><span class="p">,</span> <span class="nx">length</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span></div><div class='line' id='LC799'> <span class="nx">ends</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">snapEnds</span><span class="p">(</span><span class="nx">from</span><span class="p">,</span> <span class="nx">to</span><span class="p">,</span> <span class="nx">steps</span><span class="p">),</span></div><div class='line' id='LC800'> <span class="nx">f</span> <span class="o">=</span> <span class="nx">ends</span><span class="p">.</span><span class="nx">from</span><span class="p">,</span></div><div class='line' id='LC801'> <span class="nx">t</span> <span class="o">=</span> <span class="nx">ends</span><span class="p">.</span><span class="nx">to</span><span class="p">,</span></div><div class='line' id='LC802'> <span class="nx">i</span> <span class="o">=</span> <span class="nx">ends</span><span class="p">.</span><span class="nx">power</span><span class="p">,</span></div><div class='line' id='LC803'> <span class="nx">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC804'> <span class="nx">txtattr</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">font</span><span class="o">:</span> <span class="s2">"11px 'Fontin Sans', Fontin-Sans, sans-serif"</span> <span class="p">},</span></div><div class='line' id='LC805'> <span class="nx">text</span> <span class="o">=</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">set</span><span class="p">(),</span></div><div class='line' id='LC806'> <span class="nx">d</span><span class="p">;</span></div><div class='line' id='LC807'><br/></div><div class='line' id='LC808'> <span class="nx">d</span> <span class="o">=</span> <span class="p">(</span><span class="nx">t</span> <span class="o">-</span> <span class="nx">f</span><span class="p">)</span> <span class="o">/</span> <span class="nx">steps</span><span class="p">;</span></div><div class='line' id='LC809'><br/></div><div class='line' id='LC810'> <span class="kd">var</span> <span class="nx">label</span> <span class="o">=</span> <span class="nx">f</span><span class="p">,</span></div><div class='line' id='LC811'> <span class="nx">rnd</span> <span class="o">=</span> <span class="nx">i</span> <span class="o">></span> <span class="mi">0</span> <span class="o">?</span> <span class="nx">i</span> <span class="o">:</span> <span class="mi">0</span><span class="p">;</span></div><div class='line' id='LC812'> <span class="nx">dx</span> <span class="o">=</span> <span class="nx">length</span> <span class="o">/</span> <span class="nx">steps</span><span class="p">;</span></div><div class='line' id='LC813'><br/></div><div class='line' id='LC814'> <span class="k">if</span> <span class="p">(</span><span class="o">+</span><span class="nx">orientation</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">||</span> <span class="o">+</span><span class="nx">orientation</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC815'> <span class="kd">var</span> <span class="nx">Y</span> <span class="o">=</span> <span class="nx">y</span><span class="p">,</span></div><div class='line' id='LC816'> <span class="nx">addon</span> <span class="o">=</span> <span class="p">(</span><span class="nx">orientation</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nx">dashsize</span> <span class="o">+</span> <span class="mi">3</span> <span class="o">+</span> <span class="o">!!</span><span class="p">(</span><span class="nx">orientation</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span></div><div class='line' id='LC817'><br/></div><div class='line' id='LC818'> <span class="k">while</span> <span class="p">(</span><span class="nx">Y</span> <span class="o">>=</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">length</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC819'> <span class="nx">type</span> <span class="o">!=</span> <span class="s2">"-"</span> <span class="o">&&</span> <span class="nx">type</span> <span class="o">!=</span> <span class="s2">" "</span> <span class="o">&&</span> <span class="p">(</span><span class="nx">path</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">concat</span><span class="p">([</span><span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span> <span class="o">-</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s2">"+"</span> <span class="o">||</span> <span class="nx">type</span> <span class="o">==</span> <span class="s2">"|"</span> <span class="o">?</span> <span class="nx">dashsize</span> <span class="o">:</span> <span class="o">!</span><span class="p">(</span><span class="nx">orientation</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="nx">dashsize</span> <span class="o">*</span> <span class="mi">2</span><span class="p">),</span> <span class="nx">Y</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span><span class="p">,</span> <span class="s2">"l"</span><span class="p">,</span> <span class="nx">dashsize</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]));</span></div><div class='line' id='LC820'> <span class="nx">text</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">paper</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">addon</span><span class="p">,</span> <span class="nx">Y</span><span class="p">,</span> <span class="p">(</span><span class="nx">labels</span> <span class="o">&&</span> <span class="nx">labels</span><span class="p">[</span><span class="nx">j</span><span class="o">++</span><span class="p">])</span> <span class="o">||</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">label</span><span class="p">)</span> <span class="o">==</span> <span class="nx">label</span> <span class="o">?</span> <span class="nx">label</span> <span class="o">:</span> <span class="o">+</span><span class="nx">label</span><span class="p">.</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">rnd</span><span class="p">))).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">txtattr</span><span class="p">).</span><span class="nx">attr</span><span class="p">({</span> <span class="s2">"text-anchor"</span><span class="o">:</span> <span class="nx">orientation</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">?</span> <span class="s2">"start"</span> <span class="o">:</span> <span class="s2">"end"</span> <span class="p">}));</span></div><div class='line' id='LC821'> <span class="nx">label</span> <span class="o">+=</span> <span class="nx">d</span><span class="p">;</span></div><div class='line' id='LC822'> <span class="nx">Y</span> <span class="o">-=</span> <span class="nx">dx</span><span class="p">;</span></div><div class='line' id='LC823'> <span class="p">}</span></div><div class='line' id='LC824'><br/></div><div class='line' id='LC825'> <span class="k">if</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">Y</span> <span class="o">+</span> <span class="nx">dx</span> <span class="o">-</span> <span class="p">(</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">length</span><span class="p">)))</span> <span class="p">{</span></div><div class='line' id='LC826'> <span class="nx">type</span> <span class="o">!=</span> <span class="s2">"-"</span> <span class="o">&&</span> <span class="nx">type</span> <span class="o">!=</span> <span class="s2">" "</span> <span class="o">&&</span> <span class="p">(</span><span class="nx">path</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">concat</span><span class="p">([</span><span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span> <span class="o">-</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s2">"+"</span> <span class="o">||</span> <span class="nx">type</span> <span class="o">==</span> <span class="s2">"|"</span> <span class="o">?</span> <span class="nx">dashsize</span> <span class="o">:</span> <span class="o">!</span><span class="p">(</span><span class="nx">orientation</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="nx">dashsize</span> <span class="o">*</span> <span class="mi">2</span><span class="p">),</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">length</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span><span class="p">,</span> <span class="s2">"l"</span><span class="p">,</span> <span class="nx">dashsize</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]));</span></div><div class='line' id='LC827'> <span class="nx">text</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">paper</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">addon</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">length</span><span class="p">,</span> <span class="p">(</span><span class="nx">labels</span> <span class="o">&&</span> <span class="nx">labels</span><span class="p">[</span><span class="nx">j</span><span class="p">])</span> <span class="o">||</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">label</span><span class="p">)</span> <span class="o">==</span> <span class="nx">label</span> <span class="o">?</span> <span class="nx">label</span> <span class="o">:</span> <span class="o">+</span><span class="nx">label</span><span class="p">.</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">rnd</span><span class="p">))).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">txtattr</span><span class="p">).</span><span class="nx">attr</span><span class="p">({</span> <span class="s2">"text-anchor"</span><span class="o">:</span> <span class="nx">orientation</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">?</span> <span class="s2">"start"</span> <span class="o">:</span> <span class="s2">"end"</span> <span class="p">}));</span></div><div class='line' id='LC828'> <span class="p">}</span></div><div class='line' id='LC829'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC830'> <span class="nx">label</span> <span class="o">=</span> <span class="nx">f</span><span class="p">;</span></div><div class='line' id='LC831'> <span class="nx">rnd</span> <span class="o">=</span> <span class="p">(</span><span class="nx">i</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="o">*</span> <span class="nx">i</span><span class="p">;</span></div><div class='line' id='LC832'> <span class="nx">addon</span> <span class="o">=</span> <span class="p">(</span><span class="nx">orientation</span> <span class="o">?</span> <span class="o">-</span><span class="mi">1</span> <span class="o">:</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nx">dashsize</span> <span class="o">+</span> <span class="mi">9</span> <span class="o">+</span> <span class="o">!</span><span class="nx">orientation</span><span class="p">);</span></div><div class='line' id='LC833'><br/></div><div class='line' id='LC834'> <span class="kd">var</span> <span class="nx">X</span> <span class="o">=</span> <span class="nx">x</span><span class="p">,</span></div><div class='line' id='LC835'> <span class="nx">dx</span> <span class="o">=</span> <span class="nx">length</span> <span class="o">/</span> <span class="nx">steps</span><span class="p">,</span></div><div class='line' id='LC836'> <span class="nx">txt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span></div><div class='line' id='LC837'> <span class="nx">prev</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span></div><div class='line' id='LC838'><br/></div><div class='line' id='LC839'> <span class="k">while</span> <span class="p">(</span><span class="nx">X</span> <span class="o"><=</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">length</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC840'> <span class="nx">type</span> <span class="o">!=</span> <span class="s2">"-"</span> <span class="o">&&</span> <span class="nx">type</span> <span class="o">!=</span> <span class="s2">" "</span> <span class="o">&&</span> <span class="p">(</span><span class="nx">path</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">concat</span><span class="p">([</span><span class="s2">"M"</span><span class="p">,</span> <span class="nx">X</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s2">"+"</span> <span class="o">?</span> <span class="nx">dashsize</span> <span class="o">:</span> <span class="o">!!</span><span class="nx">orientation</span> <span class="o">*</span> <span class="nx">dashsize</span> <span class="o">*</span> <span class="mi">2</span><span class="p">),</span> <span class="s2">"l"</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">dashsize</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]));</span></div><div class='line' id='LC841'> <span class="nx">text</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">txt</span> <span class="o">=</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">X</span><span class="p">,</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">addon</span><span class="p">,</span> <span class="p">(</span><span class="nx">labels</span> <span class="o">&&</span> <span class="nx">labels</span><span class="p">[</span><span class="nx">j</span><span class="o">++</span><span class="p">])</span> <span class="o">||</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">label</span><span class="p">)</span> <span class="o">==</span> <span class="nx">label</span> <span class="o">?</span> <span class="nx">label</span> <span class="o">:</span> <span class="o">+</span><span class="nx">label</span><span class="p">.</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">rnd</span><span class="p">))).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">txtattr</span><span class="p">));</span></div><div class='line' id='LC842'><br/></div><div class='line' id='LC843'> <span class="kd">var</span> <span class="nx">bb</span> <span class="o">=</span> <span class="nx">txt</span><span class="p">.</span><span class="nx">getBBox</span><span class="p">();</span></div><div class='line' id='LC844'><br/></div><div class='line' id='LC845'> <span class="k">if</span> <span class="p">(</span><span class="nx">prev</span> <span class="o">>=</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC846'> <span class="nx">text</span><span class="p">.</span><span class="nx">pop</span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">).</span><span class="nx">remove</span><span class="p">();</span></div><div class='line' id='LC847'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC848'> <span class="nx">prev</span> <span class="o">=</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">bb</span><span class="p">.</span><span class="nx">width</span><span class="p">;</span></div><div class='line' id='LC849'> <span class="p">}</span></div><div class='line' id='LC850'><br/></div><div class='line' id='LC851'> <span class="nx">label</span> <span class="o">+=</span> <span class="nx">d</span><span class="p">;</span></div><div class='line' id='LC852'> <span class="nx">X</span> <span class="o">+=</span> <span class="nx">dx</span><span class="p">;</span></div><div class='line' id='LC853'> <span class="p">}</span></div><div class='line' id='LC854'><br/></div><div class='line' id='LC855'> <span class="k">if</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">X</span> <span class="o">-</span> <span class="nx">dx</span> <span class="o">-</span> <span class="nx">x</span> <span class="o">-</span> <span class="nx">length</span><span class="p">))</span> <span class="p">{</span></div><div class='line' id='LC856'> <span class="nx">type</span> <span class="o">!=</span> <span class="s2">"-"</span> <span class="o">&&</span> <span class="nx">type</span> <span class="o">!=</span> <span class="s2">" "</span> <span class="o">&&</span> <span class="p">(</span><span class="nx">path</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">concat</span><span class="p">([</span><span class="s2">"M"</span><span class="p">,</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">length</span> <span class="o">+</span> <span class="p">.</span><span class="mi">5</span><span class="p">,</span> <span class="nx">y</span> <span class="o">-</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s2">"+"</span> <span class="o">?</span> <span class="nx">dashsize</span> <span class="o">:</span> <span class="o">!!</span><span class="nx">orientation</span> <span class="o">*</span> <span class="nx">dashsize</span> <span class="o">*</span> <span class="mi">2</span><span class="p">),</span> <span class="s2">"l"</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">dashsize</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]));</span></div><div class='line' id='LC857'> <span class="nx">text</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">paper</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">length</span><span class="p">,</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">addon</span><span class="p">,</span> <span class="p">(</span><span class="nx">labels</span> <span class="o">&&</span> <span class="nx">labels</span><span class="p">[</span><span class="nx">j</span><span class="p">])</span> <span class="o">||</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">label</span><span class="p">)</span> <span class="o">==</span> <span class="nx">label</span> <span class="o">?</span> <span class="nx">label</span> <span class="o">:</span> <span class="o">+</span><span class="nx">label</span><span class="p">.</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">rnd</span><span class="p">))).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">txtattr</span><span class="p">));</span></div><div class='line' id='LC858'> <span class="p">}</span></div><div class='line' id='LC859'> <span class="p">}</span></div><div class='line' id='LC860'><br/></div><div class='line' id='LC861'> <span class="kd">var</span> <span class="nx">res</span> <span class="o">=</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">path</span><span class="p">(</span><span class="nx">path</span><span class="p">);</span></div><div class='line' id='LC862'><br/></div><div class='line' id='LC863'> <span class="nx">res</span><span class="p">.</span><span class="nx">text</span> <span class="o">=</span> <span class="nx">text</span><span class="p">;</span></div><div class='line' id='LC864'> <span class="nx">res</span><span class="p">.</span><span class="nx">all</span> <span class="o">=</span> <span class="nx">paper</span><span class="p">.</span><span class="nx">set</span><span class="p">([</span><span class="nx">res</span><span class="p">,</span> <span class="nx">text</span><span class="p">]);</span></div><div class='line' id='LC865'> <span class="nx">res</span><span class="p">.</span><span class="nx">remove</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC866'> <span class="k">this</span><span class="p">.</span><span class="nx">text</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span></div><div class='line' id='LC867'> <span class="k">this</span><span class="p">.</span><span class="nx">constructor</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">remove</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">);</span></div><div class='line' id='LC868'> <span class="p">};</span></div><div class='line' id='LC869'><br/></div><div class='line' id='LC870'> <span class="k">return</span> <span class="nx">res</span><span class="p">;</span></div><div class='line' id='LC871'> <span class="p">},</span></div><div class='line' id='LC872'> </div><div class='line' id='LC873'> <span class="nx">labelise</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">label</span><span class="p">,</span> <span class="nx">val</span><span class="p">,</span> <span class="nx">total</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC874'> <span class="k">if</span> <span class="p">(</span><span class="nx">label</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC875'> <span class="k">return</span> <span class="p">(</span><span class="nx">label</span> <span class="o">+</span> <span class="s2">""</span><span class="p">).</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/(##+(?:\.#+)?)|(%%+(?:\.%+)?)/g</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">percent</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC876'> <span class="k">if</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC877'> <span class="k">return</span> <span class="p">(</span><span class="o">+</span><span class="nx">val</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/^#+\.?/g</span><span class="p">,</span> <span class="s2">""</span><span class="p">).</span><span class="nx">length</span><span class="p">);</span></div><div class='line' id='LC878'> <span class="p">}</span></div><div class='line' id='LC879'> <span class="k">if</span> <span class="p">(</span><span class="nx">percent</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC880'> <span class="k">return</span> <span class="p">(</span><span class="nx">val</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">/</span> <span class="nx">total</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">percent</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/^%+\.?/g</span><span class="p">,</span> <span class="s2">""</span><span class="p">).</span><span class="nx">length</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"%"</span><span class="p">;</span></div><div class='line' id='LC881'> <span class="p">}</span></div><div class='line' id='LC882'> <span class="p">});</span></div><div class='line' id='LC883'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC884'> <span class="k">return</span> <span class="p">(</span><span class="o">+</span><span class="nx">val</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span></div><div class='line' id='LC885'> <span class="p">}</span></div><div class='line' id='LC886'> <span class="p">}</span></div><div class='line' id='LC887'><span class="p">}</span></div><div class='line' id='LC888'><br/></div></pre></div> + </td> + </tr> + </table> + </div> + + </div> + </div> + </div> + </div> + + </div> + +<div class="frame frame-loading" style="display:none;" data-tree-list-url="/DmitryBaranovskiy/g.raphael/tree-list/1828dc56656c452e8795a4218842d6f5585adced" data-blob-url-prefix="/DmitryBaranovskiy/g.raphael/blob/1828dc56656c452e8795a4218842d6f5585adced"> + <img src="https://a248.e.akamai.net/assets.github.com/images/modules/ajax/big_spinner_336699.gif?1310104853" height="32" width="32"> +</div> + + </div> + </div> + + + <!-- footer --> + <div id="footer" > + + <div class="upper_footer"> + <div class="container" class="clearfix"> + + <!--[if IE]><h4 id="blacktocat_ie">GitHub Links</h4><![endif]--> + <![if !IE]><h4 id="blacktocat">GitHub Links</h4><![endif]> + + <ul class="footer_nav"> + <h4>GitHub</h4> + <li><a href="https://github.com/about">About</a></li> + <li><a href="https://github.com/blog">Blog</a></li> + <li><a href="https://github.com/features">Features</a></li> + <li><a href="https://github.com/contact">Contact & Support</a></li> + <li><a href="https://github.com/training">Training</a></li> + <li><a href="http://enterprise.github.com/">GitHub Enterprise</a></li> + <li><a href="http://status.github.com/">Site Status</a></li> + </ul> + + <ul class="footer_nav"> + <h4>Tools</h4> + <li><a href="http://get.gaug.es/">Gauges: Analyze web traffic</a></li> + <li><a href="http://speakerdeck.com">Speakerdeck: Presentations</a></li> + <li><a href="https://gist.github.com">Gist: Code snippets</a></li> + <li><a href="http://mac.github.com/">GitHub for Mac</a></li> + <li><a href="http://mobile.github.com/">Issues for iPhone</a></li> + <li><a href="http://jobs.github.com/">Job Board</a></li> + </ul> + + <ul class="footer_nav"> + <h4>Extras</h4> + <li><a href="http://shop.github.com/">GitHub Shop</a></li> + <li><a href="http://octodex.github.com/">The Octodex</a></li> + </ul> + + <ul class="footer_nav"> + <h4>Documentation</h4> + <li><a href="http://help.github.com/">GitHub Help</a></li> + <li><a href="http://developer.github.com/">Developer API</a></li> + <li><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown</a></li> + <li><a href="http://pages.github.com/">GitHub Pages</a></li> + </ul> + + </div><!-- /.site --> + </div><!-- /.upper_footer --> + +<div class="lower_footer"> + <div class="container" class="clearfix"> + <!--[if IE]><div id="legal_ie"><![endif]--> + <![if !IE]><div id="legal"><![endif]> + <ul> + <li><a href="https://github.com/site/terms">Terms of Service</a></li> + <li><a href="https://github.com/site/privacy">Privacy</a></li> + <li><a href="https://github.com/security">Security</a></li> + </ul> + + <p>© 2012 <span id="_rrt" title="0.06369s from fe8.rs.github.com">GitHub</span> Inc. All rights reserved.</p> + </div><!-- /#legal or /#legal_ie--> + + <div class="sponsor"> + <a href="http://www.rackspace.com" class="logo"> + <img alt="Dedicated Server" height="36" src="https://a248.e.akamai.net/assets.github.com/images/modules/footer/rackspace_logo.png?v2" width="38" /> + </a> + Powered by the <a href="http://www.rackspace.com ">Dedicated + Servers</a> and<br/> <a href="http://www.rackspacecloud.com">Cloud + Computing</a> of Rackspace Hosting<span>®</span> + </div> + </div><!-- /.site --> +</div><!-- /.lower_footer --> + + </div><!-- /#footer --> + + + +<div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none"> + <h2>Keyboard Shortcuts <small><a href="#" class="js-see-all-keyboard-shortcuts">(see all)</a></small></h2> + + <div class="columns threecols"> + <div class="column first"> + <h3>Site wide shortcuts</h3> + <dl class="keyboard-mappings"> + <dt>s</dt> + <dd>Focus site search</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>?</dt> + <dd>Bring up this help dialog</dd> + </dl> + </div><!-- /.column.first --> + + <div class="column middle" style='display:none'> + <h3>Commit list</h3> + <dl class="keyboard-mappings"> + <dt>j</dt> + <dd>Move selection down</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>k</dt> + <dd>Move selection up</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>c <em>or</em> o <em>or</em> enter</dt> + <dd>Open commit</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>y</dt> + <dd>Expand URL to its canonical form</dd> + </dl> + </div><!-- /.column.first --> + + <div class="column last" style='display:none'> + <h3>Pull request list</h3> + <dl class="keyboard-mappings"> + <dt>j</dt> + <dd>Move selection down</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>k</dt> + <dd>Move selection up</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>o <em>or</em> enter</dt> + <dd>Open issue</dd> + </dl> + </div><!-- /.columns.last --> + + </div><!-- /.columns.equacols --> + + <div style='display:none'> + <div class="rule"></div> + + <h3>Issues</h3> + + <div class="columns threecols"> + <div class="column first"> + <dl class="keyboard-mappings"> + <dt>j</dt> + <dd>Move selection down</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>k</dt> + <dd>Move selection up</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>x</dt> + <dd>Toggle selection</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>o <em>or</em> enter</dt> + <dd>Open issue</dd> + </dl> + </div><!-- /.column.first --> + <div class="column middle"> + <dl class="keyboard-mappings"> + <dt>I</dt> + <dd>Mark selection as read</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>U</dt> + <dd>Mark selection as unread</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>e</dt> + <dd>Close selection</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>y</dt> + <dd>Remove selection from view</dd> + </dl> + </div><!-- /.column.middle --> + <div class="column last"> + <dl class="keyboard-mappings"> + <dt>c</dt> + <dd>Create issue</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>l</dt> + <dd>Create label</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>i</dt> + <dd>Back to inbox</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>u</dt> + <dd>Back to issues</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>/</dt> + <dd>Focus issues search</dd> + </dl> + </div> + </div> + </div> + + <div style='display:none'> + <div class="rule"></div> + + <h3>Issues Dashboard</h3> + + <div class="columns threecols"> + <div class="column first"> + <dl class="keyboard-mappings"> + <dt>j</dt> + <dd>Move selection down</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>k</dt> + <dd>Move selection up</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>o <em>or</em> enter</dt> + <dd>Open issue</dd> + </dl> + </div><!-- /.column.first --> + </div> + </div> + + <div style='display:none'> + <div class="rule"></div> + + <h3>Network Graph</h3> + <div class="columns equacols"> + <div class="column first"> + <dl class="keyboard-mappings"> + <dt><span class="badmono">β</span> <em>or</em> h</dt> + <dd>Scroll left</dd> + </dl> + <dl class="keyboard-mappings"> + <dt><span class="badmono">β</span> <em>or</em> l</dt> + <dd>Scroll right</dd> + </dl> + <dl class="keyboard-mappings"> + <dt><span class="badmono">β</span> <em>or</em> k</dt> + <dd>Scroll up</dd> + </dl> + <dl class="keyboard-mappings"> + <dt><span class="badmono">β</span> <em>or</em> j</dt> + <dd>Scroll down</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>t</dt> + <dd>Toggle visibility of head labels</dd> + </dl> + </div><!-- /.column.first --> + <div class="column last"> + <dl class="keyboard-mappings"> + <dt>shift <span class="badmono">β</span> <em>or</em> shift h</dt> + <dd>Scroll all the way left</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>shift <span class="badmono">β</span> <em>or</em> shift l</dt> + <dd>Scroll all the way right</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>shift <span class="badmono">β</span> <em>or</em> shift k</dt> + <dd>Scroll all the way up</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>shift <span class="badmono">β</span> <em>or</em> shift j</dt> + <dd>Scroll all the way down</dd> + </dl> + </div><!-- /.column.last --> + </div> + </div> + + <div > + <div class="rule"></div> + <div class="columns threecols"> + <div class="column first" > + <h3>Source Code Browsing</h3> + <dl class="keyboard-mappings"> + <dt>t</dt> + <dd>Activates the file finder</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>l</dt> + <dd>Jump to line</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>w</dt> + <dd>Switch branch/tag</dd> + </dl> + <dl class="keyboard-mappings"> + <dt>y</dt> + <dd>Expand URL to its canonical form</dd> + </dl> + </div> + </div> + </div> +</div> + + <div id="markdown-help" class="instapaper_ignore readability-extra"> + <h2>Markdown Cheat Sheet</h2> + + <div class="cheatsheet-content"> + + <div class="mod"> + <div class="col"> + <h3>Format Text</h3> + <p>Headers</p> + <pre> +# This is an <h1> tag +## This is an <h2> tag +###### This is an <h6> tag</pre> + <p>Text styles</p> + <pre> +*This text will be italic* +_This will also be italic_ +**This text will be bold** +__This will also be bold__ + +*You **can** combine them* +</pre> + </div> + <div class="col"> + <h3>Lists</h3> + <p>Unordered</p> + <pre> +* Item 1 +* Item 2 + * Item 2a + * Item 2b</pre> + <p>Ordered</p> + <pre> +1. Item 1 +2. Item 2 +3. Item 3 + * Item 3a + * Item 3b</pre> + </div> + <div class="col"> + <h3>Miscellaneous</h3> + <p>Images</p> + <pre> + +Format:  +</pre> + <p>Links</p> + <pre> +http://github.com - automatic! +[GitHub](http://github.com)</pre> +<p>Blockquotes</p> + <pre> +As Kanye West said: + +> We're living the future so +> the present is our past. +</pre> + </div> + </div> + <div class="rule"></div> + + <h3>Code Examples in Markdown</h3> + <div class="col"> + <p>Syntax highlighting with <a href="http://github.github.com/github-flavored-markdown/" title="GitHub Flavored Markdown" target="_blank">GFM</a></p> + <pre> +```javascript +function fancyAlert(arg) { + if(arg) { + $.facebox({div:'#foo'}) + } +} +```</pre> + </div> + <div class="col"> + <p>Or, indent your code 4 spaces</p> + <pre> +Here is a Python code example +without syntax highlighting: + + def foo: + if not bar: + return true</pre> + </div> + <div class="col"> + <p>Inline code for comments</p> + <pre> +I think you should use an +`<addr>` element here instead.</pre> + </div> + </div> + + </div> +</div> + + + <div class="context-overlay"></div> + + <div class="ajax-error-message"> + <p><span class="icon"></span> Something went wrong with that request. Please try again. <a href="javascript:;" class="ajax-error-dismiss">Dismiss</a></p> + </div> + + + + + </body> +</html> + diff --git a/raphael.js b/raphael.js new file mode 100644 index 0000000..bf6e741 --- /dev/null +++ b/raphael.js @@ -0,0 +1,5462 @@ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ +// β RaphaΓ«l 2.0.1 - JavaScript Vector Library β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ \\ +// β Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) β \\ +// β Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) β \\ +// β Licensed under the MIT (http://raphaeljs.com/license.html) license. β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ + +// ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ +// β Eve 0.4.0 - JavaScript Events Library β \\ +// ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ \\ +// β Copyright (c) 2008-2011 Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) β \\ +// β Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. β \\ +// ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ + +(function (glob) { + var version = "0.4.0", + has = "hasOwnProperty", + separator = /[\.\/]/, + wildcard = "*", + fun = function () {}, + numsort = function (a, b) { + return a - b; + }, + current_event, + stop, + events = {n: {}}, + + eve = function (name, scope) { + var e = events, + oldstop = stop, + args = Array.prototype.slice.call(arguments, 2), + listeners = eve.listeners(name), + z = 0, + f = false, + l, + indexed = [], + queue = {}, + out = [], + errors = []; + current_event = name; + stop = 0; + for (var i = 0, ii = listeners.length; i < ii; i++) if ("zIndex" in listeners[i]) { + indexed.push(listeners[i].zIndex); + if (listeners[i].zIndex < 0) { + queue[listeners[i].zIndex] = listeners[i]; + } + } + indexed.sort(numsort); + while (indexed[z] < 0) { + l = queue[indexed[z++]]; + out.push(l.apply(scope, args)); + if (stop) { + stop = oldstop; + return out; + } + } + for (i = 0; i < ii; i++) { + l = listeners[i]; + if ("zIndex" in l) { + if (l.zIndex == indexed[z]) { + out.push(l.apply(scope, args)); + if (stop) { + stop = oldstop; + return out; + } + do { + z++; + l = queue[indexed[z]]; + l && out.push(l.apply(scope, args)); + if (stop) { + stop = oldstop; + return out; + } + } while (l) + } else { + queue[l.zIndex] = l; + } + } else { + out.push(l.apply(scope, args)); + if (stop) { + stop = oldstop; + return out; + } + } + } + stop = oldstop; + return out.length ? out : null; + }; + + eve.listeners = function (name) { + var names = name.split(separator), + e = events, + item, + items, + k, + i, + ii, + j, + jj, + nes, + es = [e], + out = []; + for (i = 0, ii = names.length; i < ii; i++) { + nes = []; + for (j = 0, jj = es.length; j < jj; j++) { + e = es[j].n; + items = [e[names[i]], e[wildcard]]; + k = 2; + while (k--) { + item = items[k]; + if (item) { + nes.push(item); + out = out.concat(item.f || []); + } + } + } + es = nes; + } + return out; + }; + + + eve.on = function (name, f) { + var names = name.split(separator), + e = events; + for (var i = 0, ii = names.length; i < ii; i++) { + e = e.n; + !e[names[i]] && (e[names[i]] = {n: {}}); + e = e[names[i]]; + } + e.f = e.f || []; + for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) { + return fun; + } + e.f.push(f); + return function (zIndex) { + if (+zIndex == +zIndex) { + f.zIndex = +zIndex; + } + }; + }; + + eve.stop = function () { + stop = 1; + }; + + eve.nt = function (subname) { + if (subname) { + return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event); + } + return current_event; + }; + + eve.unbind = function (name, f) { + var names = name.split(separator), + e, + key, + splice, + i, ii, j, jj, + cur = [events]; + for (i = 0, ii = names.length; i < ii; i++) { + for (j = 0; j < cur.length; j += splice.length - 2) { + splice = [j, 1]; + e = cur[j].n; + if (names[i] != wildcard) { + if (e[names[i]]) { + splice.push(e[names[i]]); + } + } else { + for (key in e) if (e[has](key)) { + splice.push(e[key]); + } + } + cur.splice.apply(cur, splice); + } + } + for (i = 0, ii = cur.length; i < ii; i++) { + e = cur[i]; + while (e.n) { + if (f) { + if (e.f) { + for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) { + e.f.splice(j, 1); + break; + } + !e.f.length && delete e.f; + } + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + var funcs = e.n[key].f; + for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) { + funcs.splice(j, 1); + break; + } + !funcs.length && delete e.n[key].f; + } + } else { + delete e.f; + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + delete e.n[key].f; + } + } + e = e.n; + } + } + }; + + eve.once = function (name, f) { + var f2 = function () { + f.apply(this, arguments); + eve.unbind(name, f2); + }; + return eve.on(name, f2); + }; + + eve.version = version; + eve.toString = function () { + return "You are running Eve " + version; + }; + (typeof module != "undefined" && module.exports) ? (module.exports = eve) : (glob.eve = eve); +})(this); + +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ +// β "RaphaΓ«l 2.0.1" - JavaScript Vector Library β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ \\ +// β Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) β \\ +// β Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) β \\ +// β Licensed under the MIT (http://raphaeljs.com/license.html) license. β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ +(function () { + + function R(first) { + if (R.is(first, "function")) { + return loaded ? first() : eve.on("DOMload", first); + } else if (R.is(first, array)) { + return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first); + } else { + var args = Array.prototype.slice.call(arguments, 0); + if (R.is(args[args.length - 1], "function")) { + var f = args.pop(); + return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on("DOMload", function () { + f.call(R._engine.create[apply](R, args)); + }); + } else { + return R._engine.create[apply](R, arguments); + } + } + } + R.version = "2.0.1"; + R.eve = eve; + var loaded, + separator = /[, ]+/, + elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1}, + formatrg = /\{(\d+)\}/g, + proto = "prototype", + has = "hasOwnProperty", + g = { + doc: document, + win: window + }, + oldRaphael = { + was: Object.prototype[has].call(g.win, "Raphael"), + is: g.win.Raphael + }, + Paper = function () { + + + this.ca = this.customAttributes = {}; + }, + paperproto, + appendChild = "appendChild", + apply = "apply", + concat = "concat", + supportsTouch = "createTouch" in g.doc, + E = "", + S = " ", + Str = String, + split = "split", + events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[split](S), + touchMap = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + lowerCase = Str.prototype.toLowerCase, + math = Math, + mmax = math.max, + mmin = math.min, + abs = math.abs, + pow = math.pow, + PI = math.PI, + nu = "number", + string = "string", + array = "array", + toString = "toString", + fillString = "fill", + objectToString = Object.prototype.toString, + paper = {}, + push = "push", + ISURL = R._ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i, + colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i, + isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1}, + bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + round = math.round, + setAttribute = "setAttribute", + toFloat = parseFloat, + toInt = parseInt, + upperCase = Str.prototype.toUpperCase, + availableAttrs = R._availableAttrs = { + "arrow-end": "none", + "arrow-start": "none", + blur: 0, + "clip-rect": "0 0 1e9 1e9", + cursor: "default", + cx: 0, + cy: 0, + fill: "#fff", + "fill-opacity": 1, + font: '10px "Arial"', + "font-family": '"Arial"', + "font-size": "10", + "font-style": "normal", + "font-weight": 400, + gradient: 0, + height: 0, + href: "http://raphaeljs.com/", + "letter-spacing": 0, + opacity: 1, + path: "M0,0", + r: 0, + rx: 0, + ry: 0, + src: "", + stroke: "#000", + "stroke-dasharray": "", + "stroke-linecap": "butt", + "stroke-linejoin": "butt", + "stroke-miterlimit": 0, + "stroke-opacity": 1, + "stroke-width": 1, + target: "_blank", + "text-anchor": "middle", + title: "Raphael", + transform: "", + width: 0, + x: 0, + y: 0 + }, + availableAnimAttrs = R._availableAnimAttrs = { + blur: nu, + "clip-rect": "csv", + cx: nu, + cy: nu, + fill: "colour", + "fill-opacity": nu, + "font-size": nu, + height: nu, + opacity: nu, + path: "path", + r: nu, + rx: nu, + ry: nu, + stroke: "colour", + "stroke-opacity": nu, + "stroke-width": nu, + transform: "transform", + width: nu, + x: nu, + y: nu + }, + commaSpaces = /\s*,\s*/, + hsrg = {hs: 1, rg: 1}, + p2s = /,?([achlmqrstvxz]),?/gi, + pathCommand = /([achlmrqstvz])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?\s*,?\s*)+)/ig, + tCommand = /([rstm])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?\s*,?\s*)+)/ig, + pathValues = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)\s*,?\s*/ig, + radial_gradient = R._radial_gradient = /^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, + eldata = {}, + sortByKey = function (a, b) { + return a.key - b.key; + }, + sortByNumber = function (a, b) { + return toFloat(a) - toFloat(b); + }, + fun = function () {}, + pipe = function (x) { + return x; + }, + rectPath = R._rectPath = function (x, y, w, h, r) { + if (r) { + return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]]; + } + return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]]; + }, + ellipsePath = function (x, y, rx, ry) { + if (ry == null) { + ry = rx; + } + return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]]; + }, + getPath = R._getPath = { + path: function (el) { + return el.attr("path"); + }, + circle: function (el) { + var a = el.attrs; + return ellipsePath(a.cx, a.cy, a.r); + }, + ellipse: function (el) { + var a = el.attrs; + return ellipsePath(a.cx, a.cy, a.rx, a.ry); + }, + rect: function (el) { + var a = el.attrs; + return rectPath(a.x, a.y, a.width, a.height, a.r); + }, + image: function (el) { + var a = el.attrs; + return rectPath(a.x, a.y, a.width, a.height); + }, + text: function (el) { + var bbox = el._getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + } + }, + mapPath = R.mapPath = function (path, matrix) { + if (!matrix) { + return path; + } + var x, y, i, j, ii, jj, pathi; + path = path2curve(path); + for (i = 0, ii = path.length; i < ii; i++) { + pathi = path[i]; + for (j = 1, jj = pathi.length; j < jj; j += 2) { + x = matrix.x(pathi[j], pathi[j + 1]); + y = matrix.y(pathi[j], pathi[j + 1]); + pathi[j] = x; + pathi[j + 1] = y; + } + } + return path; + }; + + R._g = g; + + R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML"); + if (R.type == "VML") { + var d = g.doc.createElement("div"), + b; + d.innerHTML = '<v:shape adj="1"/>'; + b = d.firstChild; + b.style.behavior = "url(#default#VML)"; + if (!(b && typeof b.adj == "object")) { + return (R.type = E); + } + d = null; + } + + + R.svg = !(R.vml = R.type == "VML"); + R._Paper = Paper; + + R.fn = paperproto = Paper.prototype = R.prototype; + R._id = 0; + R._oid = 0; + + R.is = function (o, type) { + type = lowerCase.call(type); + if (type == "finite") { + return !isnan[has](+o); + } + if (type == "array") { + return o instanceof Array; + } + return (type == "null" && o === null) || + (type == typeof o && o !== null) || + (type == "object" && o === Object(o)) || + (type == "array" && Array.isArray && Array.isArray(o)) || + objectToString.call(o).slice(8, -1).toLowerCase() == type; + }; + + R.angle = function (x1, y1, x2, y2, x3, y3) { + if (x3 == null) { + var x = x1 - x2, + y = y1 - y2; + if (!x && !y) { + return 0; + } + return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360; + } else { + return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3); + } + }; + + R.rad = function (deg) { + return deg % 360 * PI / 180; + }; + + R.deg = function (rad) { + return rad * 180 / PI % 360; + }; + + R.snapTo = function (values, value, tolerance) { + tolerance = R.is(tolerance, "finite") ? tolerance : 10; + if (R.is(values, array)) { + var i = values.length; + while (i--) if (abs(values[i] - value) <= tolerance) { + return values[i]; + } + } else { + values = +values; + var rem = value % values; + if (rem < tolerance) { + return value - rem; + } + if (rem > values - tolerance) { + return value - rem + values; + } + } + return value; + }; + + + var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) { + return function () { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(uuidRegEx, uuidReplacer).toUpperCase(); + }; + })(/[xy]/g, function (c) { + var r = math.random() * 16 | 0, + v = c == "x" ? r : (r & 3 | 8); + return v.toString(16); + }); + + + R.setWindow = function (newwin) { + eve("setWindow", R, g.win, newwin); + g.win = newwin; + g.doc = g.win.document; + if (R._engine.initWin) { + R._engine.initWin(g.win); + } + }; + var toHex = function (color) { + if (R.vml) { + // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/ + var trim = /^\s+|\s+$/g; + var bod; + try { + var docum = new ActiveXObject("htmlfile"); + docum.write("<body>"); + docum.close(); + bod = docum.body; + } catch(e) { + bod = createPopup().document.body; + } + var range = bod.createTextRange(); + toHex = cacher(function (color) { + try { + bod.style.color = Str(color).replace(trim, E); + var value = range.queryCommandValue("ForeColor"); + value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16); + return "#" + ("000000" + value.toString(16)).slice(-6); + } catch(e) { + return "none"; + } + }); + } else { + var i = g.doc.createElement("i"); + i.title = "Rapha\xebl Colour Picker"; + i.style.display = "none"; + g.doc.body.appendChild(i); + toHex = cacher(function (color) { + i.style.color = color; + return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color"); + }); + } + return toHex(color); + }, + hsbtoString = function () { + return "hsb(" + [this.h, this.s, this.b] + ")"; + }, + hsltoString = function () { + return "hsl(" + [this.h, this.s, this.l] + ")"; + }, + rgbtoString = function () { + return this.hex; + }, + prepareRGB = function (r, g, b) { + if (g == null && R.is(r, "object") && "r" in r && "g" in r && "b" in r) { + b = r.b; + g = r.g; + r = r.r; + } + if (g == null && R.is(r, string)) { + var clr = R.getRGB(r); + r = clr.r; + g = clr.g; + b = clr.b; + } + if (r > 1 || g > 1 || b > 1) { + r /= 255; + g /= 255; + b /= 255; + } + + return [r, g, b]; + }, + packageRGB = function (r, g, b, o) { + r *= 255; + g *= 255; + b *= 255; + var rgb = { + r: r, + g: g, + b: b, + hex: R.rgb(r, g, b), + toString: rgbtoString + }; + R.is(o, "finite") && (rgb.opacity = o); + return rgb; + }; + + + R.color = function (clr) { + var rgb; + if (R.is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) { + rgb = R.hsb2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.hex = rgb.hex; + } else if (R.is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) { + rgb = R.hsl2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.hex = rgb.hex; + } else { + if (R.is(clr, "string")) { + clr = R.getRGB(clr); + } + if (R.is(clr, "object") && "r" in clr && "g" in clr && "b" in clr) { + rgb = R.rgb2hsl(clr); + clr.h = rgb.h; + clr.s = rgb.s; + clr.l = rgb.l; + rgb = R.rgb2hsb(clr); + clr.v = rgb.b; + } else { + clr = {hex: "none"}; + clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1; + } + } + clr.toString = rgbtoString; + return clr; + }; + + R.hsb2rgb = function (h, s, v, o) { + if (this.is(h, "object") && "h" in h && "s" in h && "b" in h) { + v = h.b; + s = h.s; + h = h.h; + o = h.o; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = v * s; + X = C * (1 - abs(h % 2 - 1)); + R = G = B = v - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); + }; + + R.hsl2rgb = function (h, s, l, o) { + if (this.is(h, "object") && "h" in h && "s" in h && "l" in h) { + l = h.l; + s = h.s; + h = h.h; + } + if (h > 1 || s > 1 || l > 1) { + h /= 360; + s /= 100; + l /= 100; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = 2 * s * (l < .5 ? l : 1 - l); + X = C * (1 - abs(h % 2 - 1)); + R = G = B = l - C / 2; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); + }; + + R.rgb2hsb = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, V, C; + V = mmax(r, g, b); + C = V - mmin(r, g, b); + H = (C == 0 ? null : + V == r ? (g - b) / C : + V == g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C == 0 ? 0 : C / V; + return {h: H, s: S, b: V, toString: hsbtoString}; + }; + + R.rgb2hsl = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, L, M, m, C; + M = mmax(r, g, b); + m = mmin(r, g, b); + C = M - m; + H = (C == 0 ? null : + M == r ? (g - b) / C : + M == g ? (b - r) / C + 2 : + (r - g) / C + 4); + H = ((H + 360) % 6) * 60 / 360; + L = (M + m) / 2; + S = (C == 0 ? 0 : + L < .5 ? C / (2 * L) : + C / (2 - 2 * L)); + return {h: H, s: S, l: L, toString: hsltoString}; + }; + R._path2string = function () { + return this.join(",").replace(p2s, "$1"); + }; + function repush(array, item) { + for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) { + return array.push(array.splice(i, 1)[0]); + } + } + function cacher(f, scope, postprocessor) { + function newf() { + var arg = Array.prototype.slice.call(arguments, 0), + args = arg.join("\u2400"), + cache = newf.cache = newf.cache || {}, + count = newf.count = newf.count || []; + if (cache[has](args)) { + repush(count, args); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + count.length >= 1e3 && delete cache[count.shift()]; + count.push(args); + cache[args] = f[apply](scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; + } + + var preload = R._preload = function (src, f) { + var img = g.doc.createElement("img"); + img.style.cssText = "position:absolute;left:-9999em;top:-9999em"; + img.onload = function () { + f.call(this); + this.onload = null; + g.doc.body.removeChild(this); + }; + img.onerror = function () { + g.doc.body.removeChild(this); + }; + g.doc.body.appendChild(img); + img.src = src; + }; + + function clrToString() { + return this.hex; + } + + + R.getRGB = cacher(function (colour) { + if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; + } + if (colour == "none") { + return {r: -1, g: -1, b: -1, hex: "none", toString: clrToString}; + } + !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour)); + var res, + red, + green, + blue, + opacity, + t, + values, + rgb = colour.match(colourRegExp); + if (rgb) { + if (rgb[2]) { + blue = toInt(rgb[2].substring(5), 16); + green = toInt(rgb[2].substring(3, 5), 16); + red = toInt(rgb[2].substring(1, 3), 16); + } + if (rgb[3]) { + blue = toInt((t = rgb[3].charAt(3)) + t, 16); + green = toInt((t = rgb[3].charAt(2)) + t, 16); + red = toInt((t = rgb[3].charAt(1)) + t, 16); + } + if (rgb[4]) { + values = rgb[4][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + } + if (rgb[5]) { + values = rgb[5][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsb2rgb(red, green, blue, opacity); + } + if (rgb[6]) { + values = rgb[6][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsl2rgb(red, green, blue, opacity); + } + rgb = {r: red, g: green, b: blue, toString: clrToString}; + rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1); + R.is(opacity, "finite") && (rgb.opacity = opacity); + return rgb; + } + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; + }, R); + + R.hsb = cacher(function (h, s, b) { + return R.hsb2rgb(h, s, b).hex; + }); + + R.hsl = cacher(function (h, s, l) { + return R.hsl2rgb(h, s, l).hex; + }); + + R.rgb = cacher(function (r, g, b) { + return "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1); + }); + + R.getColor = function (value) { + var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75}, + rgb = this.hsb2rgb(start.h, start.s, start.b); + start.h += .075; + if (start.h > 1) { + start.h = 0; + start.s -= .2; + start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b}); + } + return rgb.hex; + }; + + R.getColor.reset = function () { + delete this.start; + }; + + // http://schepers.cc/getting-to-the-point + function catmullRom2bezier(crp) { + var d = []; + for (var i = 0, iLen = crp.length; iLen - 2 > i; i += 2) { + var p = [{x: +crp[i], y: +crp[i + 1]}, + {x: +crp[i], y: +crp[i + 1]}, + {x: +crp[i + 2], y: +crp[i + 3]}, + {x: +crp[i + 4], y: +crp[i + 5]}]; + if (iLen - 4 == i) { + p[0] = {x: +crp[i - 2], y: +crp[i - 1]}; + p[3] = p[2]; + } else if (i) { + p[0] = {x: +crp[i - 2], y: +crp[i - 1]}; + } + d.push(["C", + (-p[0].x + 6 * p[1].x + p[2].x) / 6, + (-p[0].y + 6 * p[1].y + p[2].y) / 6, + (p[1].x + 6 * p[2].x - p[3].x) / 6, + (p[1].y + 6*p[2].y - p[3].y) / 6, + p[2].x, + p[2].y + ]); + } + + return d; + } + + R.parsePathString = cacher(function (pathString) { + if (!pathString) { + return null; + } + var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0}, + data = []; + if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption + data = pathClone(pathString); + } + if (!data.length) { + Str(pathString).replace(pathCommand, function (a, b, c) { + var params = [], + name = b.toLowerCase(); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + if (name == "m" && params.length > 2) { + data.push([b][concat](params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + if (name == "r") { + data.push([b][concat](params)); + } else while (params.length >= paramCounts[name]) { + data.push([b][concat](params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + }); + } + data.toString = R._path2string; + return data; + }); + + R.parseTransformString = cacher(function (TString) { + if (!TString) { + return null; + } + var paramCounts = {r: 3, s: 4, t: 2, m: 6}, + data = []; + if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption + data = pathClone(TString); + } + if (!data.length) { + Str(TString).replace(tCommand, function (a, b, c) { + var params = [], + name = lowerCase.call(b); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + data.push([b][concat](params)); + }); + } + data.toString = R._path2string; + return data; + }); + + R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t, + t13 = pow(t1, 3), + t12 = pow(t1, 2), + t2 = t * t, + t3 = t2 * t, + x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x, + y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y), + ax = t1 * p1x + t * c1x, + ay = t1 * p1y + t * c1y, + cx = t1 * c2x + t * p2x, + cy = t1 * c2y + t * p2y, + alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI); + (mx > nx || my < ny) && (alpha += 180); + return { + x: x, + y: y, + m: {x: mx, y: my}, + n: {x: nx, y: ny}, + start: {x: ax, y: ay}, + end: {x: cx, y: cy}, + alpha: alpha + }; + }; + R._removedFactory = function (methodname) { + return function () { + throw new Error("Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object"); + }; + }; + var pathDimensions = cacher(function (path) { + if (!path) { + return {x: 0, y: 0, width: 0, height: 0}; + } + path = path2curve(path); + var x = 0, + y = 0, + X = [], + Y = [], + p; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = p[1]; + y = p[2]; + X.push(x); + Y.push(y); + } else { + var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + X = X[concat](dim.min.x, dim.max.x); + Y = Y[concat](dim.min.y, dim.max.y); + x = p[5]; + y = p[6]; + } + } + var xmin = mmin[apply](0, X), + ymin = mmin[apply](0, Y); + return { + x: xmin, + y: ymin, + width: mmax[apply](0, X) - xmin, + height: mmax[apply](0, Y) - ymin + }; + }, null, function (o) { + return { + x: o.x, + y: o.y, + width: o.width, + height: o.height + }; + }), + pathClone = function (pathArray) { + var res = []; + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + for (var i = 0, ii = pathArray.length; i < ii; i++) { + res[i] = []; + for (var j = 0, jj = pathArray[i].length; j < jj; j++) { + res[i][j] = pathArray[i][j]; + } + } + res.toString = R._path2string; + return res; + }, + pathToRelative = R._pathToRelative = cacher(function (pathArray) { + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = pathArray[0][1]; + y = pathArray[0][2]; + mx = x; + my = y; + start++; + res.push(["M", x, y]); + } + for (var i = start, ii = pathArray.length; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != lowerCase.call(pa[0])) { + r[0] = lowerCase.call(pa[0]); + switch (r[0]) { + case "a": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] - x).toFixed(3); + r[7] = +(pa[7] - y).toFixed(3); + break; + case "v": + r[1] = +(pa[1] - y).toFixed(3); + break; + case "m": + mx = pa[1]; + my = pa[2]; + default: + for (var j = 1, jj = pa.length; j < jj; j++) { + r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3); + } + } + } else { + r = res[i] = []; + if (pa[0] == "m") { + mx = pa[1] + x; + my = pa[2] + y; + } + for (var k = 0, kk = pa.length; k < kk; k++) { + res[i][k] = pa[k]; + } + } + var len = res[i].length; + switch (res[i][0]) { + case "z": + x = mx; + y = my; + break; + case "h": + x += +res[i][len - 1]; + break; + case "v": + y += +res[i][len - 1]; + break; + default: + x += +res[i][len - 2]; + y += +res[i][len - 1]; + } + } + res.toString = R._path2string; + return res; + }, 0, pathClone), + pathToAbsolute = R._pathToAbsolute = cacher(function (pathArray) { + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + if (!pathArray || !pathArray.length) { + return [["M", 0, 0]]; + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = ["M", x, y]; + } + for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) { + res.push(r = []); + pa = pathArray[i]; + if (pa[0] != upperCase.call(pa[0])) { + r[0] = upperCase.call(pa[0]); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] + x); + r[7] = +(pa[7] + y); + break; + case "V": + r[1] = +pa[1] + y; + break; + case "H": + r[1] = +pa[1] + x; + break; + case "R": + var dots = [x, y][concat](pa.slice(1)); + for (var j = 2, jj = dots.length; j < jj; j++) { + dots[j] = +dots[j] + x; + dots[++j] = +dots[j] + y; + } + res.pop(); + res = res[concat](catmullRom2bezier(dots)); + break; + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + default: + for (j = 1, jj = pa.length; j < jj; j++) { + r[j] = +pa[j] + ((j % 2) ? x : y); + } + } + } else if (pa[0] == "R") { + dots = [x, y][concat](pa.slice(1)); + res.pop(); + res = res[concat](catmullRom2bezier(dots)); + r = ["R"][concat](pa.slice(-2)); + } else { + for (var k = 0, kk = pa.length; k < kk; k++) { + r[k] = pa[k]; + } + } + switch (r[0]) { + case "Z": + x = mx; + y = my; + break; + case "H": + x = r[1]; + break; + case "V": + y = r[1]; + break; + case "M": + mx = r[r.length - 2]; + my = r[r.length - 1]; + default: + x = r[r.length - 2]; + y = r[r.length - 1]; + } + } + res.toString = R._path2string; + return res; + }, null, pathClone), + l2c = function (x1, y1, x2, y2) { + return [x1, y1, x2, y2, x2, y2]; + }, + q2c = function (x1, y1, ax, ay, x2, y2) { + var _13 = 1 / 3, + _23 = 2 / 3; + return [ + _13 * x1 + _23 * ax, + _13 * y1 + _23 * ay, + _13 * x2 + _23 * ax, + _13 * y2 + _23 * ay, + x2, + y2 + ]; + }, + a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var _120 = PI * 120 / 180, + rad = PI / 180 * (+angle || 0), + res = [], + xy, + rotate = cacher(function (x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), + Y = x * math.sin(rad) + y * math.cos(rad); + return {x: X, y: Y}; + }); + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var cos = math.cos(PI / 180 * angle), + sin = math.sin(PI / 180 * angle), + x = (x1 - x2) / 2, + y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + var rx2 = rx * rx, + ry2 = ry * ry, + k = (large_arc_flag == sweep_flag ? -1 : 1) * + math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))), + cx = k * rx * y / ry + (x1 + x2) / 2, + cy = k * -ry * x / rx + (y1 + y2) / 2, + f1 = math.asin(((y1 - cy) / ry).toFixed(9)), + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + f1 < 0 && (f1 = PI * 2 + f1); + f2 < 0 && (f2 = PI * 2 + f2); + if (sweep_flag && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sweep_flag && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + var df = f2 - f1; + if (abs(df) > _120) { + var f2old = f2, + x2old = x2, + y2old = y2; + f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = math.cos(f1), + s1 = math.sin(f1), + c2 = math.cos(f2), + s2 = math.sin(f2), + t = math.tan(df / 4), + hx = 4 / 3 * rx * t, + hy = 4 / 3 * ry * t, + m1 = [x1, y1], + m2 = [x1 + hx * s1, y1 - hy * c1], + m3 = [x2 + hx * s2, y2 - hy * c2], + m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [m2, m3, m4][concat](res); + } else { + res = [m2, m3, m4][concat](res).join()[split](","); + var newres = []; + for (var i = 0, ii = res.length; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + }, + findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t; + return { + x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y + }; + }, + curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x), + b = 2 * (c1x - p1x) - 2 * (c2x - c1x), + c = p1x - c1x, + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a, + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a, + y = [p1y, p2y], + x = [p1x, p2x], + dot; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x.push(dot.x); + y.push(dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x.push(dot.x); + y.push(dot.y); + } + a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y); + b = 2 * (c1y - p1y) - 2 * (c2y - c1y); + c = p1y - c1y; + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a; + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x.push(dot.x); + y.push(dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x.push(dot.x); + y.push(dot.y); + } + return { + min: {x: mmin[apply](0, x), y: mmin[apply](0, y)}, + max: {x: mmax[apply](0, x), y: mmax[apply](0, y)} + }; + }), + path2curve = R._path2curve = cacher(function (path, path2) { + var p = pathToAbsolute(path), + p2 = path2 && pathToAbsolute(path2), + attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + processPath = function (path, d) { + var nx, ny; + if (!path) { + return ["C", d.x, d.y, d.x, d.y, d.x, d.y]; + } + !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null); + switch (path[0]) { + case "M": + d.X = path[1]; + d.Y = path[2]; + break; + case "A": + path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1)))); + break; + case "S": + nx = d.x + (d.x - (d.bx || d.x)); + ny = d.y + (d.y - (d.by || d.y)); + path = ["C", nx, ny][concat](path.slice(1)); + break; + case "T": + d.qx = d.x + (d.x - (d.qx || d.x)); + d.qy = d.y + (d.y - (d.qy || d.y)); + path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); + break; + case "Q": + d.qx = path[1]; + d.qy = path[2]; + path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4])); + break; + case "L": + path = ["C"][concat](l2c(d.x, d.y, path[1], path[2])); + break; + case "H": + path = ["C"][concat](l2c(d.x, d.y, path[1], d.y)); + break; + case "V": + path = ["C"][concat](l2c(d.x, d.y, d.x, path[1])); + break; + case "Z": + path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y)); + break; + } + return path; + }, + fixArc = function (pp, i) { + if (pp[i].length > 7) { + pp[i].shift(); + var pi = pp[i]; + while (pi.length) { + pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6))); + } + pp.splice(i, 1); + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + fixM = function (path1, path2, a1, a2, i) { + if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { + path2.splice(i, 0, ["M", a2.x, a2.y]); + a1.bx = 0; + a1.by = 0; + a1.x = path1[i][1]; + a1.y = path1[i][2]; + ii = mmax(p.length, p2 && p2.length || 0); + } + }; + for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) { + p[i] = processPath(p[i], attrs); + fixArc(p, i); + p2 && (p2[i] = processPath(p2[i], attrs2)); + p2 && fixArc(p2, i); + fixM(p, p2, attrs, attrs2, i); + fixM(p2, p, attrs2, attrs, i); + var seg = p[i], + seg2 = p2 && p2[i], + seglen = seg.length, + seg2len = p2 && seg2.length; + attrs.x = seg[seglen - 2]; + attrs.y = seg[seglen - 1]; + attrs.bx = toFloat(seg[seglen - 4]) || attrs.x; + attrs.by = toFloat(seg[seglen - 3]) || attrs.y; + attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x); + attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y); + attrs2.x = p2 && seg2[seg2len - 2]; + attrs2.y = p2 && seg2[seg2len - 1]; + } + return p2 ? [p, p2] : p; + }, null, pathClone), + parseDots = R._parseDots = cacher(function (gradient) { + var dots = []; + for (var i = 0, ii = gradient.length; i < ii; i++) { + var dot = {}, + par = gradient[i].match(/^([^:]*):?([\d\.]*)/); + dot.color = R.getRGB(par[1]); + if (dot.color.error) { + return null; + } + dot.color = dot.color.hex; + par[2] && (dot.offset = par[2] + "%"); + dots.push(dot); + } + for (i = 1, ii = dots.length - 1; i < ii; i++) { + if (!dots[i].offset) { + var start = toFloat(dots[i - 1].offset || 0), + end = 0; + for (var j = i + 1; j < ii; j++) { + if (dots[j].offset) { + end = dots[j].offset; + break; + } + } + if (!end) { + end = 100; + j = ii; + } + end = toFloat(end); + var d = (end - start) / (j - i + 1); + for (; i < j; i++) { + start += d; + dots[i].offset = start + "%"; + } + } + } + return dots; + }), + tear = R._tear = function (el, paper) { + el == paper.top && (paper.top = el.prev); + el == paper.bottom && (paper.bottom = el.next); + el.next && (el.next.prev = el.prev); + el.prev && (el.prev.next = el.next); + }, + tofront = R._tofront = function (el, paper) { + if (paper.top === el) { + return; + } + tear(el, paper); + el.next = null; + el.prev = paper.top; + paper.top.next = el; + paper.top = el; + }, + toback = R._toback = function (el, paper) { + if (paper.bottom === el) { + return; + } + tear(el, paper); + el.next = paper.bottom; + el.prev = null; + paper.bottom.prev = el; + paper.bottom = el; + }, + insertafter = R._insertafter = function (el, el2, paper) { + tear(el, paper); + el2 == paper.top && (paper.top = el); + el2.next && (el2.next.prev = el); + el.next = el2.next; + el.prev = el2; + el2.next = el; + }, + insertbefore = R._insertbefore = function (el, el2, paper) { + tear(el, paper); + el2 == paper.bottom && (paper.bottom = el); + el2.prev && (el2.prev.next = el); + el.prev = el2.prev; + el2.prev = el; + el.next = el2; + }, + extractTransform = R._extractTransform = function (el, tstr) { + if (tstr == null) { + return el._.transform; + } + tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || E); + var tdata = R.parseTransformString(tstr), + deg = 0, + dx = 0, + dy = 0, + sx = 1, + sy = 1, + _ = el._, + m = new Matrix; + _.transform = tdata || []; + if (tdata) { + for (var i = 0, ii = tdata.length; i < ii; i++) { + var t = tdata[i], + tlen = t.length, + command = Str(t[0]).toLowerCase(), + absolute = t[0] != command, + inver = absolute ? m.invert() : 0, + x1, + y1, + x2, + y2, + bb; + if (command == "t" && tlen == 3) { + if (absolute) { + x1 = inver.x(0, 0); + y1 = inver.y(0, 0); + x2 = inver.x(t[1], t[2]); + y2 = inver.y(t[1], t[2]); + m.translate(x2 - x1, y2 - y1); + } else { + m.translate(t[1], t[2]); + } + } else if (command == "r") { + if (tlen == 2) { + bb = bb || el.getBBox(1); + m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2); + deg += t[1]; + } else if (tlen == 4) { + if (absolute) { + x2 = inver.x(t[2], t[3]); + y2 = inver.y(t[2], t[3]); + m.rotate(t[1], x2, y2); + } else { + m.rotate(t[1], t[2], t[3]); + } + deg += t[1]; + } + } else if (command == "s") { + if (tlen == 2 || tlen == 3) { + bb = bb || el.getBBox(1); + m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2); + sx *= t[1]; + sy *= t[tlen - 1]; + } else if (tlen == 5) { + if (absolute) { + x2 = inver.x(t[3], t[4]); + y2 = inver.y(t[3], t[4]); + m.scale(t[1], t[2], x2, y2); + } else { + m.scale(t[1], t[2], t[3], t[4]); + } + sx *= t[1]; + sy *= t[2]; + } + } else if (command == "m" && tlen == 7) { + m.add(t[1], t[2], t[3], t[4], t[5], t[6]); + } + _.dirtyT = 1; + el.matrix = m; + } + } + + el.matrix = m; + + _.sx = sx; + _.sy = sy; + _.deg = deg; + _.dx = dx = m.e; + _.dy = dy = m.f; + + if (sx == 1 && sy == 1 && !deg && _.bbox) { + _.bbox.x += +dx; + _.bbox.y += +dy; + } else { + _.dirtyT = 1; + } + }, + getEmpty = function (item) { + var l = item[0]; + switch (l.toLowerCase()) { + case "t": return [l, 0, 0]; + case "m": return [l, 1, 0, 0, 1, 0, 0]; + case "r": if (item.length == 4) { + return [l, 0, item[2], item[3]]; + } else { + return [l, 0]; + } + case "s": if (item.length == 5) { + return [l, 1, 1, item[3], item[4]]; + } else if (item.length == 3) { + return [l, 1, 1]; + } else { + return [l, 1]; + } + } + }, + equaliseTransform = R._equaliseTransform = function (t1, t2) { + t2 = Str(t2).replace(/\.{3}|\u2026/g, t1); + t1 = R.parseTransformString(t1) || []; + t2 = R.parseTransformString(t2) || []; + var maxlength = mmax(t1.length, t2.length), + from = [], + to = [], + i = 0, j, jj, + tt1, tt2; + for (; i < maxlength; i++) { + tt1 = t1[i] || getEmpty(t2[i]); + tt2 = t2[i] || getEmpty(tt1); + if ((tt1[0] != tt2[0]) || + (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) || + (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])) + ) { + return; + } + from[i] = []; + to[i] = []; + for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) { + j in tt1 && (from[i][j] = tt1[j]); + j in tt2 && (to[i][j] = tt2[j]); + } + } + return { + from: from, + to: to + }; + }; + R._getContainer = function (x, y, w, h) { + var container; + container = h == null && !R.is(x, "object") ? g.doc.getElementById(x) : x; + if (container == null) { + return; + } + if (container.tagName) { + if (y == null) { + return { + container: container, + width: container.style.pixelWidth || container.offsetWidth, + height: container.style.pixelHeight || container.offsetHeight + }; + } else { + return { + container: container, + width: y, + height: w + }; + } + } + return { + container: 1, + x: x, + y: y, + width: w, + height: h + }; + }; + + R.pathToRelative = pathToRelative; + R._engine = {}; + + R.path2curve = path2curve; + + R.matrix = function (a, b, c, d, e, f) { + return new Matrix(a, b, c, d, e, f); + }; + function Matrix(a, b, c, d, e, f) { + if (a != null) { + this.a = +a; + this.b = +b; + this.c = +c; + this.d = +d; + this.e = +e; + this.f = +f; + } else { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.e = 0; + this.f = 0; + } + } + (function (matrixproto) { + + matrixproto.add = function (a, b, c, d, e, f) { + var out = [[], [], []], + m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], + matrix = [[a, c, e], [b, d, f], [0, 0, 1]], + x, y, z, res; + + if (a && a instanceof Matrix) { + matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]]; + } + + for (x = 0; x < 3; x++) { + for (y = 0; y < 3; y++) { + res = 0; + for (z = 0; z < 3; z++) { + res += m[x][z] * matrix[z][y]; + } + out[x][y] = res; + } + } + this.a = out[0][0]; + this.b = out[1][0]; + this.c = out[0][1]; + this.d = out[1][1]; + this.e = out[0][2]; + this.f = out[1][2]; + }; + + matrixproto.invert = function () { + var me = this, + x = me.a * me.d - me.b * me.c; + return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x); + }; + + matrixproto.clone = function () { + return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); + }; + + matrixproto.translate = function (x, y) { + this.add(1, 0, 0, 1, x, y); + }; + + matrixproto.scale = function (x, y, cx, cy) { + y == null && (y = x); + (cx || cy) && this.add(1, 0, 0, 1, cx, cy); + this.add(x, 0, 0, y, 0, 0); + (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy); + }; + + matrixproto.rotate = function (a, x, y) { + a = R.rad(a); + x = x || 0; + y = y || 0; + var cos = +math.cos(a).toFixed(9), + sin = +math.sin(a).toFixed(9); + this.add(cos, sin, -sin, cos, x, y); + this.add(1, 0, 0, 1, -x, -y); + }; + + matrixproto.x = function (x, y) { + return x * this.a + y * this.c + this.e; + }; + + matrixproto.y = function (x, y) { + return x * this.b + y * this.d + this.f; + }; + matrixproto.get = function (i) { + return +this[Str.fromCharCode(97 + i)].toFixed(4); + }; + matrixproto.toString = function () { + return R.svg ? + "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")" : + [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join(); + }; + matrixproto.toFilter = function () { + return "progid:DXImageTransform.Microsoft.Matrix(M11=" + this.get(0) + + ", M12=" + this.get(2) + ", M21=" + this.get(1) + ", M22=" + this.get(3) + + ", Dx=" + this.get(4) + ", Dy=" + this.get(5) + ", sizingmethod='auto expand')"; + }; + matrixproto.offset = function () { + return [this.e.toFixed(4), this.f.toFixed(4)]; + }; + function norm(a) { + return a[0] * a[0] + a[1] * a[1]; + } + function normalize(a) { + var mag = math.sqrt(norm(a)); + a[0] && (a[0] /= mag); + a[1] && (a[1] /= mag); + } + + matrixproto.split = function () { + var out = {}; + // translation + out.dx = this.e; + out.dy = this.f; + + // scale and shear + var row = [[this.a, this.c], [this.b, this.d]]; + out.scalex = math.sqrt(norm(row[0])); + normalize(row[0]); + + out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1]; + row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear]; + + out.scaley = math.sqrt(norm(row[1])); + normalize(row[1]); + out.shear /= out.scaley; + + // rotation + var sin = -row[0][1], + cos = row[1][1]; + if (cos < 0) { + out.rotate = R.deg(math.acos(cos)); + if (sin < 0) { + out.rotate = 360 - out.rotate; + } + } else { + out.rotate = R.deg(math.asin(sin)); + } + + out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate); + out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate; + out.noRotation = !+out.shear.toFixed(9) && !out.rotate; + return out; + }; + + matrixproto.toTransformString = function (shorter) { + var s = shorter || this[split](); + if (s.isSimple) { + s.scalex = +s.scalex.toFixed(4); + s.scaley = +s.scaley.toFixed(4); + s.rotate = +s.rotate.toFixed(4); + return (s.dx && s.dy ? "t" + [s.dx, s.dy] : E) + + (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) + + (s.rotate ? "r" + [s.rotate, 0, 0] : E); + } else { + return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)]; + } + }; + })(Matrix.prototype); + + // WebKit rendering bug workaround method + var version = navigator.userAgent.match(/Version\/(.*?)\s/) || navigator.userAgent.match(/Chrome\/(\d+)/); + if ((navigator.vendor == "Apple Computer, Inc.") && (version && version[1] < 4 || navigator.platform.slice(0, 2) == "iP") || + (navigator.vendor == "Google Inc." && version && version[1] < 8)) { + + paperproto.safari = function () { + var rect = this.rect(-99, -99, this.width + 99, this.height + 99).attr({stroke: "none"}); + setTimeout(function () {rect.remove();}); + }; + } else { + paperproto.safari = fun; + } + + var preventDefault = function () { + this.returnValue = false; + }, + preventTouch = function () { + return this.originalEvent.preventDefault(); + }, + stopPropagation = function () { + this.cancelBubble = true; + }, + stopTouch = function () { + return this.originalEvent.stopPropagation(); + }, + addEvent = (function () { + if (g.doc.addEventListener) { + return function (obj, type, fn, element) { + var realName = supportsTouch && touchMap[type] ? touchMap[type] : type, + f = function (e) { + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + x = e.clientX + scrollX, + y = e.clientY + scrollY; + if (supportsTouch && touchMap[has](type)) { + for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) { + if (e.targetTouches[i].target == obj) { + var olde = e; + e = e.targetTouches[i]; + e.originalEvent = olde; + e.preventDefault = preventTouch; + e.stopPropagation = stopTouch; + break; + } + } + } + return fn.call(element, e, x, y); + }; + obj.addEventListener(realName, f, false); + return function () { + obj.removeEventListener(realName, f, false); + return true; + }; + }; + } else if (g.doc.attachEvent) { + return function (obj, type, fn, element) { + var f = function (e) { + e = e || g.win.event; + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + x = e.clientX + scrollX, + y = e.clientY + scrollY; + e.preventDefault = e.preventDefault || preventDefault; + e.stopPropagation = e.stopPropagation || stopPropagation; + return fn.call(element, e, x, y); + }; + obj.attachEvent("on" + type, f); + var detacher = function () { + obj.detachEvent("on" + type, f); + return true; + }; + return detacher; + }; + } + })(), + drag = [], + dragMove = function (e) { + var x = e.clientX, + y = e.clientY, + scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + dragi, + j = drag.length; + while (j--) { + dragi = drag[j]; + if (supportsTouch) { + var i = e.touches.length, + touch; + while (i--) { + touch = e.touches[i]; + if (touch.identifier == dragi.el._drag.id) { + x = touch.clientX; + y = touch.clientY; + (e.originalEvent ? e.originalEvent : e).preventDefault(); + break; + } + } + } else { + e.preventDefault(); + } + var node = dragi.el.node, + o, + next = node.nextSibling, + parent = node.parentNode, + display = node.style.display; + g.win.opera && parent.removeChild(node); + node.style.display = "none"; + o = dragi.el.paper.getElementByPoint(x, y); + node.style.display = display; + g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node)); + o && eve("drag.over." + dragi.el.id, dragi.el, o); + x += scrollX; + y += scrollY; + eve("drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e); + } + }, + dragUp = function (e) { + R.unmousemove(dragMove).unmouseup(dragUp); + var i = drag.length, + dragi; + while (i--) { + dragi = drag[i]; + dragi.el._drag = {}; + eve("drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e); + } + drag = []; + }, + + elproto = R.el = {}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + for (var i = events.length; i--;) { + (function (eventName) { + R[eventName] = elproto[eventName] = function (fn, scope) { + if (R.is(fn, "function")) { + this.events = this.events || []; + this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)}); + } + return this; + }; + R["un" + eventName] = elproto["un" + eventName] = function (fn) { + var events = this.events, + l = events.length; + while (l--) if (events[l].name == eventName && events[l].f == fn) { + events[l].unbind(); + events.splice(l, 1); + !events.length && delete this.events; + return this; + } + return this; + }; + })(events[i]); + } + + + elproto.data = function (key, value) { + var data = eldata[this.id] = eldata[this.id] || {}; + if (arguments.length == 1) { + if (R.is(key, "object")) { + for (var i in key) if (key[has](i)) { + this.data(i, key[i]); + } + return this; + } + eve("data.get." + this.id, this, data[key], key); + return data[key]; + } + data[key] = value; + eve("data.set." + this.id, this, value, key); + return this; + }; + + elproto.removeData = function (key) { + if (key == null) { + eldata[this.id] = {}; + } else { + eldata[this.id] && delete eldata[this.id][key]; + } + return this; + }; + + elproto.hover = function (f_in, f_out, scope_in, scope_out) { + return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); + }; + + elproto.unhover = function (f_in, f_out) { + return this.unmouseover(f_in).unmouseout(f_out); + }; + var draggable = []; + + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { + function start(e) { + (e.originalEvent || e).preventDefault(); + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft; + this._drag.x = e.clientX + scrollX; + this._drag.y = e.clientY + scrollY; + this._drag.id = e.identifier; + !drag.length && R.mousemove(dragMove).mouseup(dragUp); + drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope}); + onstart && eve.on("drag.start." + this.id, onstart); + onmove && eve.on("drag.move." + this.id, onmove); + onend && eve.on("drag.end." + this.id, onend); + eve("drag.start." + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e); + } + this._drag = {}; + draggable.push({el: this, start: start}); + this.mousedown(start); + return this; + }; + + elproto.onDragOver = function (f) { + f ? eve.on("drag.over." + this.id, f) : eve.unbind("drag.over." + this.id); + }; + + elproto.undrag = function () { + var i = draggable.length; + while (i--) if (draggable[i].el == this) { + this.unmousedown(draggable[i].start); + draggable.splice(i, 1); + eve.unbind("drag.*." + this.id); + } + !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp); + }; + + paperproto.circle = function (x, y, r) { + var out = R._engine.circle(this, x || 0, y || 0, r || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + + paperproto.rect = function (x, y, w, h, r) { + var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + + paperproto.ellipse = function (x, y, rx, ry) { + var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + + paperproto.path = function (pathString) { + pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E); + var out = R._engine.path(R.format[apply](R, arguments), this); + this.__set__ && this.__set__.push(out); + return out; + }; + + paperproto.image = function (src, x, y, w, h) { + var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + + paperproto.text = function (x, y, text) { + var out = R._engine.text(this, x || 0, y || 0, Str(text)); + this.__set__ && this.__set__.push(out); + return out; + }; + + paperproto.set = function (itemsArray) { + !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length)); + var out = new Set(itemsArray); + this.__set__ && this.__set__.push(out); + return out; + }; + + paperproto.setStart = function (set) { + this.__set__ = set || this.set(); + }; + + paperproto.setFinish = function (set) { + var out = this.__set__; + delete this.__set__; + return out; + }; + + paperproto.setSize = function (width, height) { + return R._engine.setSize.call(this, width, height); + }; + + paperproto.setViewBox = function (x, y, w, h, fit) { + return R._engine.setViewBox.call(this, x, y, w, h, fit); + }; + + + paperproto.top = paperproto.bottom = null; + + paperproto.raphael = R; + var getOffset = function (elem) { + var box = elem.getBoundingClientRect(), + doc = elem.ownerDocument, + body = doc.body, + docElem = doc.documentElement, + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, + top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop, + left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft; + return { + y: top, + x: left + }; + }; + + paperproto.getElementByPoint = function (x, y) { + var paper = this, + svg = paper.canvas, + target = g.doc.elementFromPoint(x, y); + if (g.win.opera && target.tagName == "svg") { + var so = getOffset(svg), + sr = svg.createSVGRect(); + sr.x = x - so.x; + sr.y = y - so.y; + sr.width = sr.height = 1; + var hits = svg.getIntersectionList(sr, null); + if (hits.length) { + target = hits[hits.length - 1]; + } + } + if (!target) { + return null; + } + while (target.parentNode && target != svg.parentNode && !target.raphael) { + target = target.parentNode; + } + target == paper.canvas.parentNode && (target = svg); + target = target && target.raphael ? paper.getById(target.raphaelid) : null; + return target; + }; + + paperproto.getById = function (id) { + var bot = this.bottom; + while (bot) { + if (bot.id == id) { + return bot; + } + bot = bot.next; + } + return null; + }; + + paperproto.forEach = function (callback, thisArg) { + var bot = this.bottom; + while (bot) { + if (callback.call(thisArg, bot) === false) { + return this; + } + bot = bot.next; + } + return this; + }; + function x_y() { + return this.x + S + this.y; + } + function x_y_w_h() { + return this.x + S + this.y + S + this.width + " \xd7 " + this.height; + } + + elproto.getBBox = function (isWithoutTransform) { + if (this.removed) { + return {}; + } + var _ = this._; + if (isWithoutTransform) { + if (_.dirty || !_.bboxwt) { + this.realPath = getPath[this.type](this); + _.bboxwt = pathDimensions(this.realPath); + _.bboxwt.toString = x_y_w_h; + _.dirty = 0; + } + return _.bboxwt; + } + if (_.dirty || _.dirtyT || !_.bbox) { + if (_.dirty || !this.realPath) { + _.bboxwt = 0; + this.realPath = getPath[this.type](this); + } + _.bbox = pathDimensions(mapPath(this.realPath, this.matrix)); + _.bbox.toString = x_y_w_h; + _.dirty = _.dirtyT = 0; + } + return _.bbox; + }; + + elproto.clone = function () { + if (this.removed) { + return null; + } + var out = this.paper[this.type]().attr(this.attr()); + this.__set__ && this.__set__.push(out); + return out; + }; + + elproto.glow = function (glow) { + if (this.type == "text") { + return null; + } + glow = glow || {}; + var s = { + width: (glow.width || 10) + (+this.attr("stroke-width") || 1), + fill: glow.fill || false, + opacity: glow.opacity || .5, + offsetx: glow.offsetx || 0, + offsety: glow.offsety || 0, + color: glow.color || "#000" + }, + c = s.width / 2, + r = this.paper, + out = r.set(), + path = this.realPath || getPath[this.type](this); + path = this.matrix ? mapPath(path, this.matrix) : path; + for (var i = 1; i < c + 1; i++) { + out.push(r.path(path).attr({ + stroke: s.color, + fill: s.fill ? s.color : "none", + "stroke-linejoin": "round", + "stroke-linecap": "round", + "stroke-width": +(s.width / c * i).toFixed(3), + opacity: +(s.opacity / c).toFixed(3) + })); + } + return out.insertBefore(this).translate(s.offsetx, s.offsety); + }; + var curveslengths = {}, + getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + var len = 0, + precision = 100, + name = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(), + cache = curveslengths[name], + old, dot; + !cache && (curveslengths[name] = cache = {data: []}); + cache.timer && clearTimeout(cache.timer); + cache.timer = setTimeout(function () {delete curveslengths[name];}, 2e3); + if (length != null && !cache.precision) { + var total = getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + cache.precision = ~~total * 10; + cache.data = []; + } + precision = cache.precision || precision; + for (var i = 0; i < precision + 1; i++) { + if (cache.data[i * precision]) { + dot = cache.data[i * precision]; + } else { + dot = R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i / precision); + cache.data[i * precision] = dot; + } + i && (len += pow(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2), .5)); + if (length != null && len >= length) { + return dot; + } + old = dot; + } + if (length == null) { + return len; + } + }, + getLengthFactory = function (istotal, subpath) { + return function (path, length, onlystart) { + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += ["C" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = ["M" + point.x, point.y + "C" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join(); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return {x: point.x, y: point.y, alpha: point.alpha}; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p.shift() + p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1); + point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha}); + return point; + }; + }; + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + + R.getTotalLength = getTotalLength; + + R.getPointAtLength = getPointAtLength; + + R.getSubpath = function (path, from, to) { + if (this.getTotalLength(path) - to < 1e-6) { + return getSubpathsAtLength(path, from).end; + } + var a = getSubpathsAtLength(path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + + elproto.getTotalLength = function () { + if (this.type != "path") {return;} + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + return getTotalLength(this.attrs.path); + }; + + elproto.getPointAtLength = function (length) { + if (this.type != "path") {return;} + return getPointAtLength(this.attrs.path, length); + }; + + elproto.getSubpath = function (from, to) { + if (this.type != "path") {return;} + return R.getSubpath(this.attrs.path, from, to); + }; + + var ef = R.easing_formulas = { + linear: function (n) { + return n; + }, + "<": function (n) { + return pow(n, 1.7); + }, + ">": function (n) { + return pow(n, .48); + }, + "<>": function (n) { + var q = .48 - n / 1.04, + Q = math.sqrt(.1734 + q * q), + x = Q - q, + X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1), + y = -Q - q, + Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1), + t = X + Y + .5; + return (1 - t) * 3 * t * t + t * t * t; + }, + backIn: function (n) { + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }, + backOut: function (n) { + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }, + elastic: function (n) { + if (n == !!n) { + return n; + } + return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1; + }, + bounce: function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + } + }; + ef.easeIn = ef["ease-in"] = ef["<"]; + ef.easeOut = ef["ease-out"] = ef[">"]; + ef.easeInOut = ef["ease-in-out"] = ef["<>"]; + ef["back-in"] = ef.backIn; + ef["back-out"] = ef.backOut; + + var animationElements = [], + requestAnimFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + setTimeout(callback, 16); + }, + animation = function () { + var Now = +new Date, + l = 0; + for (; l < animationElements.length; l++) { + var e = animationElements[l]; + if (e.el.removed || e.paused) { + continue; + } + var time = Now - e.start, + ms = e.ms, + easing = e.easing, + from = e.from, + diff = e.diff, + to = e.to, + t = e.t, + that = e.el, + set = {}, + now, + init = {}, + key; + if (e.initstatus) { + time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms; + e.status = e.initstatus; + delete e.initstatus; + e.stop && animationElements.splice(l--, 1); + } else { + e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top; + } + if (time < 0) { + continue; + } + if (time < ms) { + var pos = easing(time / ms); + for (var attr in from) if (from[has](attr)) { + switch (availableAnimAttrs[attr]) { + case nu: + now = +from[attr] + pos * ms * diff[attr]; + break; + case "colour": + now = "rgb(" + [ + upto255(round(from[attr].r + pos * ms * diff[attr].r)), + upto255(round(from[attr].g + pos * ms * diff[attr].g)), + upto255(round(from[attr].b + pos * ms * diff[attr].b)) + ].join(",") + ")"; + break; + case "path": + now = []; + for (var i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + now[i] = now[i].join(S); + } + now = now.join(S); + break; + case "transform": + if (diff[attr].real) { + now = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + } + } else { + var get = function (i) { + return +from[attr][i] + pos * ms * diff[attr][i]; + }; + // now = [["r", get(2), 0, 0], ["t", get(3), get(4)], ["s", get(0), get(1), 0, 0]]; + now = [["m", get(0), get(1), get(2), get(3), get(4), get(5)]]; + } + break; + case "csv": + if (attr == "clip-rect") { + now = []; + i = 4; + while (i--) { + now[i] = +from[attr][i] + pos * ms * diff[attr][i]; + } + } + break; + default: + var from2 = [][concat](from[attr]); + now = []; + i = that.paper.customAttributes[attr].length; + while (i--) { + now[i] = +from2[i] + pos * ms * diff[attr][i]; + } + break; + } + set[attr] = now; + } + that.attr(set); + (function (id, that, anim) { + setTimeout(function () { + eve("anim.frame." + id, that, anim); + }); + })(that.id, that, e.anim); + } else { + (function(f, el, a) { + setTimeout(function() { + eve("anim.frame." + el.id, el, a); + eve("anim.finish." + el.id, el, a); + R.is(f, "function") && f.call(el); + }); + })(e.callback, that, e.anim); + that.attr(to); + animationElements.splice(l--, 1); + if (e.repeat > 1 && !e.next) { + for (key in to) if (to[has](key)) { + init[key] = e.totalOrigin[key]; + } + e.el.attr(init); + runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1); + } + if (e.next && !e.stop) { + runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat); + } + } + } + R.svg && that && that.paper && that.paper.safari(); + animationElements.length && requestAnimFrame(animation); + }, + upto255 = function (color) { + return color > 255 ? 255 : color < 0 ? 0 : color; + }; + + elproto.animateWith = function (element, anim, params, ms, easing, callback) { + var a = params ? R.animation(params, ms, easing, callback) : anim, + status = element.status(anim); + return this.animate(a).status(a, status * anim.ms / a.ms); + }; + function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) { + var cx = 3 * p1x, + bx = 3 * (p2x - p1x) - cx, + ax = 1 - cx - bx, + cy = 3 * p1y, + by = 3 * (p2y - p1y) - cy, + ay = 1 - cy - by; + function sampleCurveX(t) { + return ((ax * t + bx) * t + cx) * t; + } + function solve(x, epsilon) { + var t = solveCurveX(x, epsilon); + return ((ay * t + by) * t + cy) * t; + } + function solveCurveX(x, epsilon) { + var t0, t1, t2, x2, d2, i; + for(t2 = x, i = 0; i < 8; i++) { + x2 = sampleCurveX(t2) - x; + if (abs(x2) < epsilon) { + return t2; + } + d2 = (3 * ax * t2 + 2 * bx) * t2 + cx; + if (abs(d2) < 1e-6) { + break; + } + t2 = t2 - x2 / d2; + } + t0 = 0; + t1 = 1; + t2 = x; + if (t2 < t0) { + return t0; + } + if (t2 > t1) { + return t1; + } + while (t0 < t1) { + x2 = sampleCurveX(t2); + if (abs(x2 - x) < epsilon) { + return t2; + } + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + t2 = (t1 - t0) / 2 + t0; + } + return t2; + } + return solve(t, 1 / (200 * duration)); + } + elproto.onAnimation = function (f) { + f ? eve.on("anim.frame." + this.id, f) : eve.unbind("anim.frame." + this.id); + return this; + }; + function Animation(anim, ms) { + var percents = [], + newAnim = {}; + this.ms = ms; + this.times = 1; + if (anim) { + for (var attr in anim) if (anim[has](attr)) { + newAnim[toFloat(attr)] = anim[attr]; + percents.push(toFloat(attr)); + } + percents.sort(sortByNumber); + } + this.anim = newAnim; + this.top = percents[percents.length - 1]; + this.percents = percents; + } + + Animation.prototype.delay = function (delay) { + var a = new Animation(this.anim, this.ms); + a.times = this.times; + a.del = +delay || 0; + return a; + }; + + Animation.prototype.repeat = function (times) { + var a = new Animation(this.anim, this.ms); + a.del = this.del; + a.times = math.floor(mmax(times, 0)) || 1; + return a; + }; + function runAnimation(anim, element, percent, status, totalOrigin, times) { + percent = toFloat(percent); + var params, + isInAnim, + isInAnimSet, + percents = [], + next, + prev, + timestamp, + ms = anim.ms, + from = {}, + to = {}, + diff = {}; + if (status) { + for (i = 0, ii = animationElements.length; i < ii; i++) { + var e = animationElements[i]; + if (e.el.id == element.id && e.anim == anim) { + if (e.percent != percent) { + animationElements.splice(i, 1); + isInAnimSet = 1; + } else { + isInAnim = e; + } + element.attr(e.totalOrigin); + break; + } + } + } else { + status = +to; // NaN + } + for (var i = 0, ii = anim.percents.length; i < ii; i++) { + if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) { + percent = anim.percents[i]; + prev = anim.percents[i - 1] || 0; + ms = ms / anim.top * (percent - prev); + next = anim.percents[i + 1]; + params = anim.anim[percent]; + break; + } else if (status) { + element.attr(anim.anim[anim.percents[i]]); + } + } + if (!params) { + return; + } + if (!isInAnim) { + for (var attr in params) if (params[has](attr)) { + if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) { + from[attr] = element.attr(attr); + (from[attr] == null) && (from[attr] = availableAttrs[attr]); + to[attr] = params[attr]; + switch (availableAnimAttrs[attr]) { + case nu: + diff[attr] = (to[attr] - from[attr]) / ms; + break; + case "colour": + from[attr] = R.getRGB(from[attr]); + var toColour = R.getRGB(to[attr]); + diff[attr] = { + r: (toColour.r - from[attr].r) / ms, + g: (toColour.g - from[attr].g) / ms, + b: (toColour.b - from[attr].b) / ms + }; + break; + case "path": + var pathes = path2curve(from[attr], to[attr]), + toPath = pathes[1]; + from[attr] = pathes[0]; + diff[attr] = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [0]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms; + } + } + break; + case "transform": + var _ = element._, + eq = equaliseTransform(_[attr], to[attr]); + if (eq) { + from[attr] = eq.from; + to[attr] = eq.to; + diff[attr] = []; + diff[attr].real = true; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms; + } + } + } else { + var m = (element.matrix || new Matrix), + to2 = { + _: {transform: _.transform}, + getBBox: function () { + return element.getBBox(1); + } + }; + from[attr] = [ + m.a, + m.b, + m.c, + m.d, + m.e, + m.f + ]; + extractTransform(to2, to[attr]); + to[attr] = to2._.transform; + diff[attr] = [ + (to2.matrix.a - m.a) / ms, + (to2.matrix.b - m.b) / ms, + (to2.matrix.c - m.c) / ms, + (to2.matrix.d - m.d) / ms, + (to2.matrix.e - m.e) / ms, + (to2.matrix.e - m.f) / ms + ]; + // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy]; + // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }}; + // extractTransform(to2, to[attr]); + // diff[attr] = [ + // (to2._.sx - _.sx) / ms, + // (to2._.sy - _.sy) / ms, + // (to2._.deg - _.deg) / ms, + // (to2._.dx - _.dx) / ms, + // (to2._.dy - _.dy) / ms + // ]; + } + break; + case "csv": + var values = Str(params[attr])[split](separator), + from2 = Str(from[attr])[split](separator); + if (attr == "clip-rect") { + from[attr] = from2; + diff[attr] = []; + i = from2.length; + while (i--) { + diff[attr][i] = (values[i] - from[attr][i]) / ms; + } + } + to[attr] = values; + break; + default: + values = [][concat](params[attr]); + from2 = [][concat](from[attr]); + diff[attr] = []; + i = element.paper.customAttributes[attr].length; + while (i--) { + diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms; + } + break; + } + } + } + var easing = params.easing, + easyeasy = R.easing_formulas[easing]; + if (!easyeasy) { + easyeasy = Str(easing).match(bezierrg); + if (easyeasy && easyeasy.length == 5) { + var curve = easyeasy; + easyeasy = function (t) { + return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms); + }; + } else { + easyeasy = pipe; + } + } + timestamp = params.start || anim.start || +new Date; + e = { + anim: anim, + percent: percent, + timestamp: timestamp, + start: timestamp + (anim.del || 0), + status: 0, + initstatus: status || 0, + stop: false, + ms: ms, + easing: easyeasy, + from: from, + diff: diff, + to: to, + el: element, + callback: params.callback, + prev: prev, + next: next, + repeat: times || anim.times, + origin: element.attr(), + totalOrigin: totalOrigin + }; + animationElements.push(e); + if (status && !isInAnim && !isInAnimSet) { + e.stop = true; + e.start = new Date - ms * status; + if (animationElements.length == 1) { + return animation(); + } + } + if (isInAnimSet) { + e.start = new Date - e.ms * status; + } + animationElements.length == 1 && requestAnimFrame(animation); + } else { + isInAnim.initstatus = status; + isInAnim.start = new Date - isInAnim.ms * status; + } + eve("anim.start." + element.id, element, anim); + } + + R.animation = function (params, ms, easing, callback) { + if (params instanceof Animation) { + return params; + } + if (R.is(easing, "function") || !easing) { + callback = callback || easing || null; + easing = null; + } + params = Object(params); + ms = +ms || 0; + var p = {}, + json, + attr; + for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + "%" != attr) { + json = true; + p[attr] = params[attr]; + } + if (!json) { + return new Animation(params, ms); + } else { + easing && (p.easing = easing); + callback && (p.callback = callback); + return new Animation({100: p}, ms); + } + }; + + elproto.animate = function (params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback); + runAnimation(anim, element, anim.percents[0], null, element.attr()); + return element; + }; + + elproto.setTime = function (anim, value) { + if (anim && value != null) { + this.status(anim, mmin(value, anim.ms) / anim.ms); + } + return this; + }; + + elproto.status = function (anim, value) { + var out = [], + i = 0, + len, + e; + if (value != null) { + runAnimation(anim, this, -1, mmin(value, 1)); + return this; + } else { + len = animationElements.length; + for (; i < len; i++) { + e = animationElements[i]; + if (e.el.id == this.id && (!anim || e.anim == anim)) { + if (anim) { + return e.status; + } + out.push({ + anim: e.anim, + status: e.status + }); + } + } + if (anim) { + return 0; + } + return out; + } + }; + + elproto.pause = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("anim.pause." + this.id, this, animationElements[i].anim) !== false) { + animationElements[i].paused = true; + } + } + return this; + }; + + elproto.resume = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + var e = animationElements[i]; + if (eve("anim.resume." + this.id, this, e.anim) !== false) { + delete e.paused; + this.status(e.anim, e.status); + } + } + return this; + }; + + elproto.stop = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("anim.stop." + this.id, this, animationElements[i].anim) !== false) { + animationElements.splice(i--, 1); + } + } + return this; + }; + elproto.toString = function () { + return "Rapha\xebl\u2019s object"; + }; + + // Set + var Set = function (items) { + this.items = []; + this.length = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items.length; i < ii; i++) { + if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) { + this[this.items.length] = this.items[this.items.length] = items[i]; + this.length++; + } + } + } + }, + setproto = Set.prototype; + + setproto.push = function () { + var item, + len; + for (var i = 0, ii = arguments.length; i < ii; i++) { + item = arguments[i]; + if (item && (item.constructor == elproto.constructor || item.constructor == Set)) { + len = this.items.length; + this[len] = this.items[len] = item; + this.length++; + } + } + return this; + }; + + setproto.pop = function () { + this.length && delete this[this.length--]; + return this.items.pop(); + }; + + setproto.forEach = function (callback, thisArg) { + for (var i = 0, ii = this.items.length; i < ii; i++) { + if (callback.call(thisArg, this.items[i], i) === false) { + return this; + } + } + return this; + }; + for (var method in elproto) if (elproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname][apply](el, arg); + }); + }; + })(method); + } + setproto.attr = function (name, value) { + if (name && R.is(name, array) && R.is(name[0], "object")) { + for (var j = 0, jj = name.length; j < jj; j++) { + this.items[j].attr(name[j]); + } + } else { + for (var i = 0, ii = this.items.length; i < ii; i++) { + this.items[i].attr(name, value); + } + } + return this; + }; + + setproto.clear = function () { + while (this.length) { + this.pop(); + } + }; + + setproto.splice = function (index, count, insertion) { + index = index < 0 ? mmax(this.length + index, 0) : index; + count = mmax(0, mmin(this.length - index, count)); + var tail = [], + todel = [], + args = [], + i; + for (i = 2; i < arguments.length; i++) { + args.push(arguments[i]); + } + for (i = 0; i < count; i++) { + todel.push(this[index + i]); + } + for (; i < this.length - index; i++) { + tail.push(this[index + i]); + } + var arglen = args.length; + for (i = 0; i < arglen + tail.length; i++) { + this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen]; + } + i = this.items.length = this.length -= count - arglen; + while (this[i]) { + delete this[i++]; + } + return new Set(todel); + }; + + setproto.exclude = function (el) { + for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) { + this.splice(i, 1); + return true; + } + }; + setproto.animate = function (params, ms, easing, callback) { + (R.is(easing, "function") || !easing) && (callback = easing || null); + var len = this.items.length, + i = len, + item, + set = this, + collector; + if (!len) { + return this; + } + callback && (collector = function () { + !--len && callback.call(set); + }); + easing = R.is(easing, string) ? easing : collector; + var anim = R.animation(params, ms, easing, collector); + item = this.items[--i].animate(anim); + while (i--) { + this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim); + } + return this; + }; + setproto.insertAfter = function (el) { + var i = this.items.length; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + setproto.getBBox = function () { + var x = [], + y = [], + w = [], + h = []; + for (var i = this.items.length; i--;) if (!this.items[i].removed) { + var box = this.items[i].getBBox(); + x.push(box.x); + y.push(box.y); + w.push(box.x + box.width); + h.push(box.y + box.height); + } + x = mmin[apply](0, x); + y = mmin[apply](0, y); + return { + x: x, + y: y, + width: mmax[apply](0, w) - x, + height: mmax[apply](0, h) - y + }; + }; + setproto.clone = function (s) { + s = new Set; + for (var i = 0, ii = this.items.length; i < ii; i++) { + s.push(this.items[i].clone()); + } + return s; + }; + setproto.toString = function () { + return "Rapha\xebl\u2018s set"; + }; + + + R.registerFont = function (font) { + if (!font.face) { + return font; + } + this.fonts = this.fonts || {}; + var fontcopy = { + w: font.w, + face: {}, + glyphs: {} + }, + family = font.face["font-family"]; + for (var prop in font.face) if (font.face[has](prop)) { + fontcopy.face[prop] = font.face[prop]; + } + if (this.fonts[family]) { + this.fonts[family].push(fontcopy); + } else { + this.fonts[family] = [fontcopy]; + } + if (!font.svg) { + fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10); + for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) { + var path = font.glyphs[glyph]; + fontcopy.glyphs[glyph] = { + w: path.w, + k: {}, + d: path.d && "M" + path.d.replace(/[mlcxtrv]/g, function (command) { + return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M"; + }) + "z" + }; + if (path.k) { + for (var k in path.k) if (path[has](k)) { + fontcopy.glyphs[glyph].k[k] = path.k[k]; + } + } + } + } + return font; + }; + + paperproto.getFont = function (family, weight, style, stretch) { + stretch = stretch || "normal"; + style = style || "normal"; + weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400; + if (!R.fonts) { + return; + } + var font = R.fonts[family]; + if (!font) { + var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i"); + for (var fontName in R.fonts) if (R.fonts[has](fontName)) { + if (name.test(fontName)) { + font = R.fonts[fontName]; + break; + } + } + } + var thefont; + if (font) { + for (var i = 0, ii = font.length; i < ii; i++) { + thefont = font[i]; + if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) { + break; + } + } + } + return thefont; + }; + + paperproto.print = function (x, y, string, font, size, origin, letter_spacing) { + origin = origin || "middle"; // baseline|middle + letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1); + var out = this.set(), + letters = Str(string)[split](E), + shift = 0, + path = E, + scale; + R.is(font, string) && (font = this.getFont(font)); + if (font) { + scale = (size || 16) / font.face["units-per-em"]; + var bb = font.face.bbox[split](separator), + top = +bb[0], + height = +bb[1] + (origin == "baseline" ? bb[3] - bb[1] + (+font.face.descent) : (bb[3] - bb[1]) / 2); + for (var i = 0, ii = letters.length; i < ii; i++) { + var prev = i && font.glyphs[letters[i - 1]] || {}, + curr = font.glyphs[letters[i]]; + shift += i ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0; + curr && curr.d && out.push(this.path(curr.d).attr({ + fill: "#000", + stroke: "none", + transform: [["t", shift * scale, 0]] + })); + } + out.transform(["...s", scale, scale, top, height, "t", (x - top) / scale, (y - height) / scale]); + } + return out; + }; + + + paperproto.add = function (json) { + if (R.is(json, "array")) { + var res = this.set(), + i = 0, + ii = json.length, + j; + for (; i < ii; i++) { + j = json[i] || {}; + elements[has](j.type) && res.push(this[j.type]().attr(j)); + } + } + return res; + }; + + + R.format = function (token, params) { + var args = R.is(params, array) ? [0][concat](params) : arguments; + token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) { + return args[++i] == null ? E : args[i]; + })); + return token || E; + }; + + R.fullfill = (function () { + var tokenRegex = /\{([^\}]+)\}/g, + objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties + replacer = function (all, key, obj) { + var res = obj; + key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) { + name = name || quotedName; + if (res) { + if (name in res) { + res = res[name]; + } + typeof res == "function" && isFunc && (res = res()); + } + }); + res = (res == null || res == obj ? all : res) + ""; + return res; + }; + return function (str, obj) { + return String(str).replace(tokenRegex, function (all, key) { + return replacer(all, key, obj); + }); + }; + })(); + + R.ninja = function () { + oldRaphael.was ? (g.win.Raphael = oldRaphael.is) : delete Raphael; + return R; + }; + + R.st = setproto; + // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html + (function (doc, loaded, f) { + if (doc.readyState == null && doc.addEventListener){ + doc.addEventListener(loaded, f = function () { + doc.removeEventListener(loaded, f, false); + doc.readyState = "complete"; + }, false); + doc.readyState = "loading"; + } + function isLoaded() { + (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve("DOMload"); + } + isLoaded(); + })(document, "DOMContentLoaded"); + + oldRaphael.was ? (g.win.Raphael = R) : (Raphael = R); + + eve.on("DOMload", function () { + loaded = true; + }); +})(); + + +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ +// β RaphaΓ«l - JavaScript Vector Library β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ \\ +// β SVG Module β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ \\ +// β Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) β \\ +// β Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) β \\ +// β Licensed under the MIT (http://raphaeljs.com/license.html) license. β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ +window.Raphael.svg && function (R) { + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + toInt = parseInt, + math = Math, + mmax = math.max, + abs = math.abs, + pow = math.pow, + separator = /[, ]+/, + eve = R.eve, + E = "", + S = " "; + var xlink = "http://www.w3.org/1999/xlink", + markers = { + block: "M5,0 0,2.5 5,5z", + classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z", + diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z", + open: "M6,1 1,3.5 6,6", + oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z" + }, + markerCounter = {}; + R.toString = function () { + return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version; + }; + var $ = function (el, attr) { + if (attr) { + if (typeof el == "string") { + el = $(el); + } + for (var key in attr) if (attr[has](key)) { + if (key.substring(0, 6) == "xlink:") { + el.setAttributeNS(xlink, key.substring(6), Str(attr[key])); + } else { + el.setAttribute(key, Str(attr[key])); + } + } + } else { + el = R._g.doc.createElementNS("http://www.w3.org/2000/svg", el); + el.style && (el.style.webkitTapHighlightColor = "rgba(0,0,0,0)"); + } + return el; + }, + addGradientFill = function (element, gradient) { + var type = "linear", + id = element.id + gradient, + fx = .5, fy = .5, + o = element.node, + SVG = element.paper, + s = o.style, + el = R._g.doc.getElementById(id); + if (!el) { + gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) { + type = "radial"; + if (_fx && _fy) { + fx = toFloat(_fx); + fy = toFloat(_fy); + var dir = ((fy > .5) * 2 - 1); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && + (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) && + fy != .5 && + (fy = fy.toFixed(5) - 1e-5 * dir); + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))], + max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1); + vector[2] *= max; + vector[3] *= max; + if (vector[2] < 0) { + vector[0] = -vector[2]; + vector[2] = 0; + } + if (vector[3] < 0) { + vector[1] = -vector[3]; + vector[3] = 0; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + id = id.replace(/[\(\)\s,\xb0#]/g, "_"); + + if (element.gradient && id != element.gradient.id) { + SVG.defs.removeChild(element.gradient); + delete element.gradient; + } + + if (!element.gradient) { + el = $(type + "Gradient", {id: id}); + element.gradient = el; + $(el, type == "radial" ? { + fx: fx, + fy: fy + } : { + x1: vector[0], + y1: vector[1], + x2: vector[2], + y2: vector[3], + gradientTransform: element.matrix.invert() + }); + SVG.defs.appendChild(el); + for (var i = 0, ii = dots.length; i < ii; i++) { + el.appendChild($("stop", { + offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%", + "stop-color": dots[i].color || "#fff" + })); + } + } + } + $(o, { + fill: "url(#" + id + ")", + opacity: 1, + "fill-opacity": 1 + }); + s.fill = E; + s.opacity = 1; + s.fillOpacity = 1; + return 1; + }, + updatePosition = function (o) { + var bbox = o.getBBox(1); + $(o.pattern, {patternTransform: o.matrix.invert() + " translate(" + bbox.x + "," + bbox.y + ")"}); + }, + addArrow = function (o, value, isEnd) { + if (o.type == "path") { + var values = Str(value).toLowerCase().split("-"), + p = o.paper, + se = isEnd ? "end" : "start", + node = o.node, + attrs = o.attrs, + stroke = attrs["stroke-width"], + i = values.length, + type = "classic", + from, + to, + dx, + refX, + attr, + w = 3, + h = 3, + t = 5; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": h = 5; break; + case "narrow": h = 2; break; + case "long": w = 5; break; + case "short": w = 2; break; + } + } + if (type == "open") { + w += 2; + h += 2; + t += 2; + dx = 1; + refX = isEnd ? 4 : 1; + attr = { + fill: "none", + stroke: attrs.stroke + }; + } else { + refX = dx = w / 2; + attr = { + fill: attrs.stroke, + stroke: "none" + }; + } + if (o._.arrows) { + if (isEnd) { + o._.arrows.endPath && markerCounter[o._.arrows.endPath]--; + o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--; + } else { + o._.arrows.startPath && markerCounter[o._.arrows.startPath]--; + o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--; + } + } else { + o._.arrows = {}; + } + if (type != "none") { + var pathId = "raphael-marker-" + type, + markerId = "raphael-marker-" + se + type + w + h; + if (!R._g.doc.getElementById(pathId)) { + p.defs.appendChild($($("path"), { + "stroke-linecap": "round", + d: markers[type], + id: pathId + })); + markerCounter[pathId] = 1; + } else { + markerCounter[pathId]++; + } + var marker = R._g.doc.getElementById(markerId), + use; + if (!marker) { + marker = $($("marker"), { + id: markerId, + markerHeight: h, + markerWidth: w, + orient: "auto", + refX: refX, + refY: h / 2 + }); + use = $($("use"), { + "xlink:href": "#" + pathId, + transform: (isEnd ? " rotate(180 " + w / 2 + " " + h / 2 + ") " : S) + "scale(" + w / t + "," + h / t + ")", + "stroke-width": 1 / ((w / t + h / t) / 2) + }); + marker.appendChild(use); + p.defs.appendChild(marker); + markerCounter[markerId] = 1; + } else { + markerCounter[markerId]++; + use = marker.getElementsByTagName("use")[0]; + } + $(use, attr); + var delta = dx * (type != "diamond" && type != "oval"); + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - delta * stroke; + } else { + from = delta * stroke; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + attr = {}; + attr["marker-" + se] = "url(#" + markerId + ")"; + if (to || from) { + attr.d = Raphael.getSubpath(attrs.path, from, to); + } + $(node, attr); + o._.arrows[se + "Path"] = pathId; + o._.arrows[se + "Marker"] = markerId; + o._.arrows[se + "dx"] = delta; + o._.arrows[se + "Type"] = type; + o._.arrows[se + "String"] = value; + } else { + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - from; + } else { + from = 0; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + o._.arrows[se + "Path"] && $(node, {d: Raphael.getSubpath(attrs.path, from, to)}); + delete o._.arrows[se + "Path"]; + delete o._.arrows[se + "Marker"]; + delete o._.arrows[se + "dx"]; + delete o._.arrows[se + "Type"]; + delete o._.arrows[se + "String"]; + } + for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) { + var item = R._g.doc.getElementById(attr); + item && item.parentNode.removeChild(item); + } + } + }, + dasharray = { + "": [0], + "none": [0], + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + addDashes = function (o, value, params) { + value = dasharray[Str(value).toLowerCase()]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = [], + i = value.length; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(o.node, {"stroke-dasharray": dashes.join(",")}); + } + }, + setFillAndStroke = function (o, params) { + var node = o.node, + attrs = o.attrs, + vis = node.style.visibility; + node.style.visibility = "hidden"; + for (var att in params) { + if (params[has](att)) { + if (!R._availableAttrs[has](att)) { + continue; + } + var value = params[att]; + attrs[att] = value; + switch (att) { + case "blur": + o.blur(value); + break; + case "href": + case "title": + case "target": + var pn = node.parentNode; + if (pn.tagName.toLowerCase() != "a") { + var hl = $("a"); + pn.insertBefore(hl, node); + hl.appendChild(node); + pn = hl; + } + if (att == "target" && value == "blank") { + pn.setAttributeNS(xlink, "show", "new"); + } else { + pn.setAttributeNS(xlink, att, value); + } + break; + case "cursor": + node.style.cursor = value; + break; + case "transform": + o.transform(value); + break; + case "arrow-start": + addArrow(o, value); + break; + case "arrow-end": + addArrow(o, value, 1); + break; + case "clip-rect": + var rect = Str(value).split(separator); + if (rect.length == 4) { + o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode); + var el = $("clipPath"), + rc = $("rect"); + el.id = R.createUUID(); + $(rc, { + x: rect[0], + y: rect[1], + width: rect[2], + height: rect[3] + }); + el.appendChild(rc); + o.paper.defs.appendChild(el); + $(node, {"clip-path": "url(#" + el.id + ")"}); + o.clip = rc; + } + if (!value) { + var path = node.getAttribute("clip-path"); + if (path) { + var clip = R._g.doc.getElementById(path.replace(/(^url\(#|\)$)/g, E)); + clip && clip.parentNode.removeChild(clip); + $(node, {"clip-path": E}); + delete o.clip; + } + } + break; + case "path": + if (o.type == "path") { + $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : "M0,0"}); + o._.dirty = 1; + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + } + break; + case "width": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fx) { + att = "x"; + value = attrs.x; + } else { + break; + } + case "x": + if (attrs.fx) { + value = -attrs.x - (attrs.width || 0); + } + case "rx": + if (att == "rx" && o.type == "rect") { + break; + } + case "cx": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "height": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fy) { + att = "y"; + value = attrs.y; + } else { + break; + } + case "y": + if (attrs.fy) { + value = -attrs.y - (attrs.height || 0); + } + case "ry": + if (att == "ry" && o.type == "rect") { + break; + } + case "cy": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "r": + if (o.type == "rect") { + $(node, {rx: value, ry: value}); + } else { + node.setAttribute(att, value); + } + o._.dirty = 1; + break; + case "src": + if (o.type == "image") { + node.setAttributeNS(xlink, "href", value); + } + break; + case "stroke-width": + if (o._.sx != 1 || o._.sy != 1) { + value /= mmax(abs(o._.sx), abs(o._.sy)) || 1; + } + if (o.paper._vbSize) { + value *= o.paper._vbSize; + } + node.setAttribute(att, value); + if (attrs["stroke-dasharray"]) { + addDashes(o, attrs["stroke-dasharray"], params); + } + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "stroke-dasharray": + addDashes(o, value, params); + break; + case "fill": + var isURL = Str(value).match(R._ISURL); + if (isURL) { + el = $("pattern"); + var ig = $("image"); + el.id = R.createUUID(); + $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1}); + $(ig, {x: 0, y: 0, "xlink:href": isURL[1]}); + el.appendChild(ig); + + (function (el) { + R._preload(isURL[1], function () { + var w = this.offsetWidth, + h = this.offsetHeight; + $(el, {width: w, height: h}); + $(ig, {width: w, height: h}); + o.paper.safari(); + }); + })(el); + o.paper.defs.appendChild(el); + node.style.fill = "url(#" + el.id + ")"; + $(node, {fill: "url(#" + el.id + ")"}); + o.pattern = el; + o.pattern && updatePosition(o); + break; + } + var clr = R.getRGB(value); + if (!clr.error) { + delete params.gradient; + delete attrs.gradient; + !R.is(attrs.opacity, "undefined") && + R.is(params.opacity, "undefined") && + $(node, {opacity: attrs.opacity}); + !R.is(attrs["fill-opacity"], "undefined") && + R.is(params["fill-opacity"], "undefined") && + $(node, {"fill-opacity": attrs["fill-opacity"]}); + } else if ((o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value)) { + if ("opacity" in attrs || "fill-opacity" in attrs) { + var gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + var stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": ("opacity" in attrs ? attrs.opacity : 1) * ("fill-opacity" in attrs ? attrs["fill-opacity"] : 1)}); + } + } + attrs.gradient = value; + attrs.fill = "none"; + break; + } + clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + case "stroke": + clr = R.getRGB(value); + node.setAttribute(att, clr.hex); + att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + if (att == "stroke" && o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "gradient": + (o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value); + break; + case "opacity": + if (attrs.gradient && !attrs[has]("stroke-opacity")) { + $(node, {"stroke-opacity": value > 1 ? value / 100 : value}); + } + // fall + case "fill-opacity": + if (attrs.gradient) { + gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": value}); + } + break; + } + default: + att == "font-size" && (value = toInt(value, 10) + "px"); + var cssrule = att.replace(/(\-.)/g, function (w) { + return w.substring(1).toUpperCase(); + }); + node.style[cssrule] = value; + o._.dirty = 1; + node.setAttribute(att, value); + break; + } + } + } + + tuneText(o, params); + node.style.visibility = vis; + }, + leading = 1.2, + tuneText = function (el, params) { + if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) { + return; + } + var a = el.attrs, + node = el.node, + fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10; + + if (params[has]("text")) { + a.text = params.text; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var texts = Str(params.text).split("\n"), + tspans = [], + tspan; + for (var i = 0, ii = texts.length; i < ii; i++) { + tspan = $("tspan"); + i && $(tspan, {dy: fontSize * leading, x: a.x}); + tspan.appendChild(R._g.doc.createTextNode(texts[i])); + node.appendChild(tspan); + tspans[i] = tspan; + } + } else { + tspans = node.getElementsByTagName("tspan"); + for (i = 0, ii = tspans.length; i < ii; i++) if (i) { + $(tspans[i], {dy: fontSize * leading, x: a.x}); + } else { + $(tspans[0], {dy: 0}); + } + } + $(node, {x: a.x, y: a.y}); + el._.dirty = 1; + var bb = el._getBBox(), + dif = a.y - (bb.y + bb.height / 2); + dif && R.is(dif, "finite") && $(tspans[0], {dy: dif}); + }, + Element = function (node, svg) { + var X = 0, + Y = 0; + + this[0] = this.node = node; + + node.raphael = true; + + this.id = R._oid++; + node.raphaelid = this.id; + this.matrix = R.matrix(); + this.realPath = null; + + this.paper = svg; + this.attrs = this.attrs || {}; + this._ = { + transform: [], + sx: 1, + sy: 1, + deg: 0, + dx: 0, + dy: 0, + dirty: 1 + }; + !svg.bottom && (svg.bottom = this); + + this.prev = svg.top; + svg.top && (svg.top.next = this); + svg.top = this; + + this.next = null; + }, + elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + + R._engine.path = function (pathString, SVG) { + var el = $("path"); + SVG.canvas && SVG.canvas.appendChild(el); + var p = new Element(el, SVG); + p.type = "path"; + setFillAndStroke(p, { + fill: "none", + stroke: "#000", + path: pathString + }); + return p; + }; + + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + return this; + }; + + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + + elproto.transform = function (tstr) { + var _ = this._; + if (tstr == null) { + return _.transform; + } + R._extractTransform(this, tstr); + + this.clip && $(this.clip, {transform: this.matrix.invert()}); + this.pattern && updatePosition(this); + this.node && $(this.node, {transform: this.matrix}); + + if (_.sx != 1 || _.sy != 1) { + var sw = this.attrs[has]("stroke-width") ? this.attrs["stroke-width"] : 1; + this.attr({"stroke-width": sw}); + } + + return this; + }; + + elproto.hide = function () { + !this.removed && this.paper.safari(this.node.style.display = "none"); + return this; + }; + + elproto.show = function () { + !this.removed && this.paper.safari(this.node.style.display = ""); + return this; + }; + + elproto.remove = function () { + if (this.removed) { + return; + } + var paper = this.paper; + paper.__set__ && paper.__set__.exclude(this); + eve.unbind("*.*." + this.id); + if (this.gradient) { + paper.defs.removeChild(this.gradient); + } + R._tear(this, paper); + this.node.parentNode.removeChild(this.node); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto._getBBox = function () { + if (this.node.style.display == "none") { + this.show(); + var hide = true; + } + var bbox = {}; + try { + bbox = this.node.getBBox(); + } catch(e) { + // Firefox 3.0.x plays badly here + } finally { + bbox = bbox || {}; + } + hide && this.hide(); + return bbox; + }; + + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + if (name == "transform") { + return this._.transform; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + if (value != null) { + var params = {}; + params[name] = value; + } else if (name != null && R.is(name, "object")) { + params = name; + } + for (var key in params) { + eve("attr." + key + "." + this.id, this, params[key]); + } + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + setFillAndStroke(this, params); + return this; + }; + + elproto.toFront = function () { + if (this.removed) { + return this; + } + if (this.node.parentNode.tagName.toLowerCase() == "a") { + this.node.parentNode.parentNode.appendChild(this.node.parentNode); + } else { + this.node.parentNode.appendChild(this.node); + } + var svg = this.paper; + svg.top != this && R._tofront(this, svg); + return this; + }; + + elproto.toBack = function () { + if (this.removed) { + return this; + } + var parent = this.node.parentNode; + if (parent.tagName.toLowerCase() == "a") { + parent.parentNode.insertBefore(this.node.parentNode, this.node.parentNode.parentNode.firstChild); + } else if (parent.firstChild != this.node) { + parent.insertBefore(this.node, this.node.parentNode.firstChild); + } + R._toback(this, this.paper); + var svg = this.paper; + return this; + }; + + elproto.insertAfter = function (element) { + if (this.removed) { + return this; + } + var node = element.node || element[element.length - 1].node; + if (node.nextSibling) { + node.parentNode.insertBefore(this.node, node.nextSibling); + } else { + node.parentNode.appendChild(this.node); + } + R._insertafter(this, element, this.paper); + return this; + }; + + elproto.insertBefore = function (element) { + if (this.removed) { + return this; + } + var node = element.node || element[0].node; + node.parentNode.insertBefore(this.node, node); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + // Experimental. No Safari support. Use it on your own risk. + var t = this; + if (+size !== 0) { + var fltr = $("filter"), + blur = $("feGaussianBlur"); + t.attrs.blur = size; + fltr.id = R.createUUID(); + $(blur, {stdDeviation: +size || 1.5}); + fltr.appendChild(blur); + t.paper.defs.appendChild(fltr); + t._blur = fltr; + $(t.node, {filter: "url(#" + fltr.id + ")"}); + } else { + if (t._blur) { + t._blur.parentNode.removeChild(t._blur); + delete t._blur; + delete t.attrs.blur; + } + t.node.removeAttribute("filter"); + } + }; + R._engine.circle = function (svg, x, y, r) { + var el = $("circle"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"}; + res.type = "circle"; + $(el, res.attrs); + return res; + }; + R._engine.rect = function (svg, x, y, w, h, r) { + var el = $("rect"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, r: r || 0, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"}; + res.type = "rect"; + $(el, res.attrs); + return res; + }; + R._engine.ellipse = function (svg, x, y, rx, ry) { + var el = $("ellipse"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"}; + res.type = "ellipse"; + $(el, res.attrs); + return res; + }; + R._engine.image = function (svg, src, x, y, w, h) { + var el = $("image"); + $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"}); + el.setAttributeNS(xlink, "href", src); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, src: src}; + res.type = "image"; + return res; + }; + R._engine.text = function (svg, x, y, text) { + var el = $("text"); + // $(el, {x: x, y: y, "text-anchor": "middle"}); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = { + x: x, + y: y, + "text-anchor": "middle", + text: text, + font: R._availableAttrs.font, + stroke: "none", + fill: "#000" + }; + res.type = "text"; + setFillAndStroke(res, res.attrs); + return res; + }; + R._engine.setSize = function (width, height) { + this.width = width || this.width; + this.height = height || this.height; + this.canvas.setAttribute("width", this.width); + this.canvas.setAttribute("height", this.height); + if (this._viewBox) { + this.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con && con.container, + x = con.x, + y = con.y, + width = con.width, + height = con.height; + if (!container) { + throw new Error("SVG container not found."); + } + var cnvs = $("svg"), + css = "overflow:hidden;", + isFloating; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + $(cnvs, { + height: height, + version: 1.1, + width: width, + xmlns: "http://www.w3.org/2000/svg" + }); + if (container == 1) { + cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px"; + R._g.doc.body.appendChild(cnvs); + isFloating = 1; + } else { + cnvs.style.cssText = css + "position:relative"; + if (container.firstChild) { + container.insertBefore(cnvs, container.firstChild); + } else { + container.appendChild(cnvs); + } + } + container = new R._Paper; + container.width = width; + container.height = height; + container.canvas = cnvs; + // plugins.call(container, container, R.fn); + container.clear(); + container._left = container._top = 0; + isFloating && (container.renderfix = function () {}); + container.renderfix(); + return container; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + eve("setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var size = mmax(w / this.width, h / this.height), + top = this.top, + aspectRatio = fit ? "meet" : "xMinYMin", + vb, + sw; + if (x == null) { + if (this._vbSize) { + size = 1; + } + delete this._vbSize; + vb = "0 0 " + this.width + S + this.height; + } else { + this._vbSize = size; + vb = x + S + y + S + w + S + h; + } + $(this.canvas, { + viewBox: vb, + preserveAspectRatio: aspectRatio + }); + while (size && top) { + sw = "stroke-width" in top.attrs ? top.attrs["stroke-width"] : 1; + top.attr({"stroke-width": sw}); + top._.dirty = 1; + top._.dirtyT = 1; + top = top.prev; + } + this._viewBox = [x, y, w, h, !!fit]; + return this; + }; + + R.prototype.renderfix = function () { + var cnvs = this.canvas, + s = cnvs.style, + pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix(), + left = -pos.e % 1, + top = -pos.f % 1; + if (left || top) { + if (left) { + this._left = (this._left + left) % 1; + s.left = this._left + "px"; + } + if (top) { + this._top = (this._top + top) % 1; + s.top = this._top + "px"; + } + } + }; + + R.prototype.clear = function () { + R.eve("clear", this); + var c = this.canvas; + while (c.firstChild) { + c.removeChild(c.firstChild); + } + this.bottom = this.top = null; + (this.desc = $("desc")).appendChild(R._g.doc.createTextNode("Created with Rapha\xebl " + R.version)); + c.appendChild(this.desc); + c.appendChild(this.defs = $("defs")); + }; + + R.prototype.remove = function () { + eve("remove", this); + this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + }; + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } +}(window.Raphael); + +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ +// β RaphaΓ«l - JavaScript Vector Library β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ \\ +// β VML Module β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ \\ +// β Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) β \\ +// β Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) β \\ +// β Licensed under the MIT (http://raphaeljs.com/license.html) license. β \\ +// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ \\ +window.Raphael.vml && function (R) { + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + math = Math, + round = math.round, + mmax = math.max, + mmin = math.min, + abs = math.abs, + fillString = "fill", + separator = /[, ]+/, + eve = R.eve, + ms = " progid:DXImageTransform.Microsoft", + S = " ", + E = "", + map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"}, + bites = /([clmz]),?([^clmz]*)/gi, + blurregexp = / progid:\S+Blur\([^\)]+\)/g, + val = /-?[^,\s-]+/g, + cssDot = "position:absolute;left:0;top:0;width:1px;height:1px", + zoom = 21600, + pathTypes = {path: 1, rect: 1, image: 1}, + ovalTypes = {circle: 1, ellipse: 1}, + path2vml = function (path) { + var total = /[ahqstv]/ig, + command = R._pathToAbsolute; + Str(path).match(total) && (command = R._path2curve); + total = /[clmz]/g; + if (command == R._pathToAbsolute && !Str(path).match(total)) { + var res = Str(path).replace(bites, function (all, command, args) { + var vals = [], + isMove = command.toLowerCase() == "m", + res = map[command]; + args.replace(val, function (value) { + if (isMove && vals.length == 2) { + res += vals + map[command == "m" ? "l" : "L"]; + vals = []; + } + vals.push(round(value * zoom)); + }); + return res + vals; + }); + return res; + } + var pa = command(path), p, r; + res = []; + for (var i = 0, ii = pa.length; i < ii; i++) { + p = pa[i]; + r = pa[i][0].toLowerCase(); + r == "z" && (r = "x"); + for (var j = 1, jj = p.length; j < jj; j++) { + r += round(p[j] * zoom) + (j != jj - 1 ? "," : E); + } + res.push(r); + } + return res.join(S); + }, + compensation = function (deg, dx, dy) { + var m = R.matrix(); + m.rotate(-deg, .5, .5); + return { + dx: m.x(dx, dy), + dy: m.y(dx, dy) + }; + }, + setCoords = function (p, sx, sy, dx, dy, deg) { + var _ = p._, + m = p.matrix, + fillpos = _.fillpos, + o = p.node, + s = o.style, + y = 1, + flip = "", + dxdy, + kx = zoom / sx, + ky = zoom / sy; + s.visibility = "hidden"; + if (!sx || !sy) { + return; + } + o.coordsize = abs(kx) + S + abs(ky); + s.rotation = deg * (sx * sy < 0 ? -1 : 1); + if (deg) { + var c = compensation(deg, dx, dy); + dx = c.dx; + dy = c.dy; + } + sx < 0 && (flip += "x"); + sy < 0 && (flip += " y") && (y = -1); + s.flip = flip; + o.coordorigin = (dx * -kx) + S + (dy * -ky); + if (fillpos || _.fillsize) { + var fill = o.getElementsByTagName(fillString); + fill = fill && fill[0]; + o.removeChild(fill); + if (fillpos) { + c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1])); + fill.position = c.dx * y + S + c.dy * y; + } + if (_.fillsize) { + fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy); + } + o.appendChild(fill); + } + s.visibility = "visible"; + }; + R.toString = function () { + return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version; + }; + var addArrow = function (o, value, isEnd) { + var values = Str(value).toLowerCase().split("-"), + se = isEnd ? "end" : "start", + i = values.length, + type = "classic", + w = "medium", + h = "medium"; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": + case "narrow": h = values[i]; break; + case "long": + case "short": w = values[i]; break; + } + } + var stroke = o.node.getElementsByTagName("stroke")[0]; + stroke[se + "arrow"] = type; + stroke[se + "arrowlength"] = w; + stroke[se + "arrowwidth"] = h; + }, + setFillAndStroke = function (o, params) { + // o.paper.canvas.style.display = "none"; + o.attrs = o.attrs || {}; + var node = o.node, + a = o.attrs, + s = node.style, + xy, + newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r), + isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry), + res = o; + + + for (var par in params) if (params[has](par)) { + a[par] = params[par]; + } + if (newpath) { + a.path = R._getPath[o.type](o); + o._.dirty = 1; + } + params.href && (node.href = params.href); + params.title && (node.title = params.title); + params.target && (node.target = params.target); + params.cursor && (s.cursor = params.cursor); + "blur" in params && o.blur(params.blur); + if (params.path && o.type == "path" || newpath) { + node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path); + if (o.type == "image") { + o._.fillpos = [a.x, a.y]; + o._.fillsize = [a.width, a.height]; + setCoords(o, 1, 1, 0, 0, 0); + } + } + "transform" in params && o.transform(params.transform); + if (isOval) { + var cx = +a.cx, + cy = +a.cy, + rx = +a.rx || +a.r || 0, + ry = +a.ry || +a.r || 0; + node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom)); + } + if ("clip-rect" in params) { + var rect = Str(params["clip-rect"]).split(separator); + if (rect.length == 4) { + rect[2] = +rect[2] + (+rect[0]); + rect[3] = +rect[3] + (+rect[1]); + var div = node.clipRect || R._g.doc.createElement("div"), + dstyle = div.style; + dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect); + if (!node.clipRect) { + dstyle.position = "absolute"; + dstyle.top = 0; + dstyle.left = 0; + dstyle.width = o.paper.width + "px"; + dstyle.height = o.paper.height + "px"; + node.parentNode.insertBefore(div, node); + div.appendChild(node); + node.clipRect = div; + } + } + if (!params["clip-rect"]) { + node.clipRect && (node.clipRect.style.clip = "auto"); + } + } + if (o.textpath) { + var textpathStyle = o.textpath.style; + params.font && (textpathStyle.font = params.font); + params["font-family"] && (textpathStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, E) + '"'); + params["font-size"] && (textpathStyle.fontSize = params["font-size"]); + params["font-weight"] && (textpathStyle.fontWeight = params["font-weight"]); + params["font-style"] && (textpathStyle.fontStyle = params["font-style"]); + } + if ("arrow-start" in params) { + addArrow(res, params["arrow-start"]); + } + if ("arrow-end" in params) { + addArrow(res, params["arrow-end"], 1); + } + if (params.opacity != null || + params["stroke-width"] != null || + params.fill != null || + params.src != null || + params.stroke != null || + params["stroke-width"] != null || + params["stroke-opacity"] != null || + params["fill-opacity"] != null || + params["stroke-dasharray"] != null || + params["stroke-miterlimit"] != null || + params["stroke-linejoin"] != null || + params["stroke-linecap"] != null) { + var fill = node.getElementsByTagName(fillString), + newfill = false; + fill = fill && fill[0]; + !fill && (newfill = fill = createNode(fillString)); + if (o.type == "image" && params.src) { + fill.src = params.src; + } + params.fill && (fill.on = true); + if (fill.on == null || params.fill == "none" || params.fill === null) { + fill.on = false; + } + if (fill.on && params.fill) { + var isURL = Str(params.fill).match(R._ISURL); + if (isURL) { + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = isURL[1]; + fill.type = "tile"; + var bbox = o.getBBox(1); + fill.position = bbox.x + S + bbox.y; + o._.fillpos = [bbox.x, bbox.y]; + + R._preload(isURL[1], function () { + o._.fillsize = [this.offsetWidth, this.offsetHeight]; + }); + } else { + fill.color = R.getRGB(params.fill).hex; + fill.src = E; + fill.type = "solid"; + if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill, fill)) { + a.fill = "none"; + a.gradient = params.fill; + fill.rotate = false; + } + } + } + if ("fill-opacity" in params || "opacity" in params) { + var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1); + opacity = mmin(mmax(opacity, 0), 1); + fill.opacity = opacity; + if (fill.src) { + fill.color = "none"; + } + } + node.appendChild(fill); + var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]), + newstroke = false; + !stroke && (newstroke = stroke = createNode("stroke")); + if ((params.stroke && params.stroke != "none") || + params["stroke-width"] || + params["stroke-opacity"] != null || + params["stroke-dasharray"] || + params["stroke-miterlimit"] || + params["stroke-linejoin"] || + params["stroke-linecap"]) { + stroke.on = true; + } + (params.stroke == "none" || params.stroke === null || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false); + var strokeColor = R.getRGB(params.stroke); + stroke.on && params.stroke && (stroke.color = strokeColor.hex); + opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1); + var width = (toFloat(params["stroke-width"]) || 1) * .75; + opacity = mmin(mmax(opacity, 0), 1); + params["stroke-width"] == null && (width = a["stroke-width"]); + params["stroke-width"] && (stroke.weight = width); + width && width < 1 && (opacity *= width) && (stroke.weight = 1); + stroke.opacity = opacity; + + params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter"); + stroke.miterlimit = params["stroke-miterlimit"] || 8; + params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round"); + if (params["stroke-dasharray"]) { + var dasharray = { + "-": "shortdash", + ".": "shortdot", + "-.": "shortdashdot", + "-..": "shortdashdotdot", + ". ": "dot", + "- ": "dash", + "--": "longdash", + "- .": "dashdot", + "--.": "longdashdot", + "--..": "longdashdotdot" + }; + stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E; + } + newstroke && node.appendChild(stroke); + } + if (res.type == "text") { + res.paper.canvas.style.display = E; + var span = res.paper.span, + m = 100, + fontSize = a.font && a.font.match(/\d+(?:\.\d*)?(?=px)/); + s = span.style; + a.font && (s.font = a.font); + a["font-family"] && (s.fontFamily = a["font-family"]); + a["font-weight"] && (s.fontWeight = a["font-weight"]); + a["font-style"] && (s.fontStyle = a["font-style"]); + fontSize = toFloat(a["font-size"] || fontSize && fontSize[0]) || 10; + s.fontSize = fontSize * m + "px"; + res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>")); + var brect = span.getBoundingClientRect(); + res.W = a.w = (brect.right - brect.left) / m; + res.H = a.h = (brect.bottom - brect.top) / m; + // res.paper.canvas.style.display = "none"; + res.X = a.x; + res.Y = a.y + res.H / 2; + + ("x" in params || "y" in params) && (res.path.v = R.format("m{0},{1}l{2},{1}", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1)); + var dirtyattrs = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"]; + for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) { + res._.dirty = 1; + break; + } + + // text-anchor emulation + switch (a["text-anchor"]) { + case "start": + res.textpath.style["v-text-align"] = "left"; + res.bbx = res.W / 2; + break; + case "end": + res.textpath.style["v-text-align"] = "right"; + res.bbx = -res.W / 2; + break; + default: + res.textpath.style["v-text-align"] = "center"; + res.bbx = 0; + break; + } + res.textpath.style["v-text-kern"] = true; + } + // res.paper.canvas.style.display = E; + }, + addGradientFill = function (o, gradient, fill) { + o.attrs = o.attrs || {}; + var attrs = o.attrs, + pow = Math.pow, + opacity, + oindex, + type = "linear", + fxfy = ".5 .5"; + o.attrs.gradient = gradient; + gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) { + type = "radial"; + if (fx && fy) { + fx = toFloat(fx); + fy = toFloat(fy); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5); + fxfy = fx + S + fy; + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + o = o.shape || o.node; + if (dots.length) { + o.removeChild(fill); + fill.on = true; + fill.method = "none"; + fill.color = dots[0].color; + fill.color2 = dots[dots.length - 1].color; + var clrs = []; + for (var i = 0, ii = dots.length; i < ii; i++) { + dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color); + } + fill.colors = clrs.length ? clrs.join() : "0% " + fill.color; + if (type == "radial") { + fill.type = "gradientTitle"; + fill.focus = "100%"; + fill.focussize = "0 0"; + fill.focusposition = fxfy; + fill.angle = 0; + } else { + // fill.rotate= true; + fill.type = "gradient"; + fill.angle = (270 - angle) % 360; + } + o.appendChild(fill); + } + return 1; + }, + Element = function (node, vml) { + this[0] = this.node = node; + node.raphael = true; + this.id = R._oid++; + node.raphaelid = this.id; + this.X = 0; + this.Y = 0; + this.attrs = {}; + this.paper = vml; + this.matrix = R.matrix(); + this._ = { + transform: [], + sx: 1, + sy: 1, + dx: 0, + dy: 0, + deg: 0, + dirty: 1, + dirtyT: 1 + }; + !vml.bottom && (vml.bottom = this); + this.prev = vml.top; + vml.top && (vml.top.next = this); + vml.top = this; + this.next = null; + }; + var elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + elproto.transform = function (tstr) { + if (tstr == null) { + return this._.transform; + } + var vbs = this.paper._viewBoxShift, + vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E, + oldt; + if (vbs) { + oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E); + } + R._extractTransform(this, vbt + tstr); + var matrix = this.matrix.clone(), + skew = this.skew, + o = this.node, + split, + isGrad = ~Str(this.attrs.fill).indexOf("-"), + isPatt = !Str(this.attrs.fill).indexOf("url("); + matrix.translate(-.5, -.5); + if (isPatt || isGrad || this.type == "image") { + skew.matrix = "1 0 0 1"; + skew.offset = "0 0"; + split = matrix.split(); + if ((isGrad && split.noRotation) || !split.isSimple) { + o.style.filter = matrix.toFilter(); + var bb = this.getBBox(), + bbt = this.getBBox(1), + dx = bb.x - bbt.x, + dy = bb.y - bbt.y; + o.coordorigin = (dx * -zoom) + S + (dy * -zoom); + setCoords(this, 1, 1, dx, dy, 0); + } else { + o.style.filter = E; + setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate); + } + } else { + o.style.filter = E; + skew.matrix = Str(matrix); + skew.offset = matrix.offset(); + } + oldt && (this._.transform = oldt); + return this; + }; + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + return; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this._.dirtyT = 1; + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + if (this._.bbox) { + this._.bbox.x += dx; + this._.bbox.y += dy; + } + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + isNaN(cx) && (cx = null); + isNaN(cy) && (cy = null); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + this._.dirtyT = 1; + return this; + }; + elproto.hide = function () { + !this.removed && (this.node.style.display = "none"); + return this; + }; + elproto.show = function () { + !this.removed && (this.node.style.display = E); + return this; + }; + elproto._getBBox = function () { + if (this.removed) { + return {}; + } + return { + x: this.X + (this.bbx || 0) - this.W / 2, + y: this.Y - this.H, + width: this.W, + height: this.H + }; + }; + elproto.remove = function () { + if (this.removed) { + return; + } + this.paper.__set__ && this.paper.__set__.exclude(this); + R.eve.unbind("*.*." + this.id); + R._tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + this.shape && this.shape.parentNode.removeChild(this.shape); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (this.attrs && value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + var params; + if (value != null) { + params = {}; + params[name] = value; + } + value == null && R.is(name, "object") && (params = name); + for (var key in params) { + eve("attr." + key + "." + this.id, this, params[key]); + } + if (params) { + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + // this.paper.canvas.style.display = "none"; + if (params.text && this.type == "text") { + this.textpath.string = params.text; + } + setFillAndStroke(this, params); + // this.paper.canvas.style.display = E; + } + return this; + }; + elproto.toFront = function () { + !this.removed && this.node.parentNode.appendChild(this.node); + this.paper && this.paper.top != this && R._tofront(this, this.paper); + return this; + }; + elproto.toBack = function () { + if (this.removed) { + return this; + } + if (this.node.parentNode.firstChild != this.node) { + this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild); + R._toback(this, this.paper); + } + return this; + }; + elproto.insertAfter = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[element.length - 1]; + } + if (element.node.nextSibling) { + element.node.parentNode.insertBefore(this.node, element.node.nextSibling); + } else { + element.node.parentNode.appendChild(this.node); + } + R._insertafter(this, element, this.paper); + return this; + }; + elproto.insertBefore = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[0]; + } + element.node.parentNode.insertBefore(this.node, element.node); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + var s = this.node.runtimeStyle, + f = s.filter; + f = f.replace(blurregexp, E); + if (+size !== 0) { + this.attrs.blur = size; + s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")"; + s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5)); + } else { + s.filter = f; + s.margin = 0; + delete this.attrs.blur; + } + }; + + R._engine.path = function (pathString, vml) { + var el = createNode("shape"); + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = vml.coordorigin; + var p = new Element(el, vml), + attr = {fill: "none", stroke: "#000"}; + pathString && (attr.path = pathString); + p.type = "path"; + p.path = []; + p.Path = E; + setFillAndStroke(p, attr); + vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.rect = function (vml, x, y, w, h, r) { + var path = R._rectPath(x, y, w, h, r), + res = vml.path(path), + a = res.attrs; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.r = r; + a.path = path; + res.type = "rect"; + return res; + }; + R._engine.ellipse = function (vml, x, y, rx, ry) { + var res = vml.path(), + a = res.attrs; + res.X = x - rx; + res.Y = y - ry; + res.W = rx * 2; + res.H = ry * 2; + res.type = "ellipse"; + setFillAndStroke(res, { + cx: x, + cy: y, + rx: rx, + ry: ry + }); + return res; + }; + R._engine.circle = function (vml, x, y, r) { + var res = vml.path(), + a = res.attrs; + res.X = x - r; + res.Y = y - r; + res.W = res.H = r * 2; + res.type = "circle"; + setFillAndStroke(res, { + cx: x, + cy: y, + r: r + }); + return res; + }; + R._engine.image = function (vml, src, x, y, w, h) { + var path = R._rectPath(x, y, w, h), + res = vml.path(path).attr({stroke: "none"}), + a = res.attrs, + node = res.node, + fill = node.getElementsByTagName(fillString)[0]; + a.src = src; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.path = path; + res.type = "image"; + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = src; + fill.type = "tile"; + res._.fillpos = [x, y]; + res._.fillsize = [w, h]; + node.appendChild(fill); + setCoords(res, 1, 1, 0, 0, 0); + return res; + }; + R._engine.text = function (vml, x, y, text) { + var el = createNode("shape"), + path = createNode("path"), + o = createNode("textpath"); + x = x || 0; + y = y || 0; + text = text || ""; + path.v = R.format("m{0},{1}l{2},{1}", round(x * zoom), round(y * zoom), round(x * zoom) + 1); + path.textpathok = true; + o.string = Str(text); + o.on = true; + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = "0 0"; + var p = new Element(el, vml), + attr = { + fill: "#000", + stroke: "none", + font: R._availableAttrs.font, + text: text + }; + p.shape = el; + p.path = path; + p.textpath = o; + p.type = "text"; + p.attrs.text = Str(text); + p.attrs.x = x; + p.attrs.y = y; + p.attrs.w = 1; + p.attrs.h = 1; + setFillAndStroke(p, attr); + el.appendChild(o); + el.appendChild(path); + vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.setSize = function (width, height) { + var cs = this.canvas.style; + this.width = width; + this.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + if (this._viewBox) { + R._engine.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + R.eve("setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var width = this.width, + height = this.height, + size = 1 / mmax(w / width, h / height), + H, W; + if (fit) { + H = height / h; + W = width / w; + if (w * H < width) { + x -= (width - w * H) / 2 / H; + } + if (h * W < height) { + y -= (height - h * W) / 2 / W; + } + } + this._viewBox = [x, y, w, h, !!fit]; + this._viewBoxShift = { + dx: -x, + dy: -y, + scale: size + }; + this.forEach(function (el) { + el.transform("..."); + }); + return this; + }; + var createNode; + R._engine.initWin = function (win) { + var doc = win.document; + doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); + try { + !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); + createNode = function (tagName) { + return doc.createElement('<rvml:' + tagName + ' class="rvml">'); + }; + } catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + }; + R._engine.initWin(R._g.win); + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con.container, + height = con.height, + s, + width = con.width, + x = con.x, + y = con.y; + if (!container) { + throw new Error("VML container not found."); + } + var res = new R._Paper, + c = res.canvas = R._g.doc.createElement("div"), + cs = c.style; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + res.width = width; + res.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + res.coordsize = zoom * 1e3 + S + zoom * 1e3; + res.coordorigin = "0 0"; + res.span = R._g.doc.createElement("span"); + res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;"; + c.appendChild(res.span); + cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height); + if (container == 1) { + R._g.doc.body.appendChild(c); + cs.left = x + "px"; + cs.top = y + "px"; + cs.position = "absolute"; + } else { + if (container.firstChild) { + container.insertBefore(c, container.firstChild); + } else { + container.appendChild(c); + } + } + // plugins.call(res, res, R.fn); + res.renderfix = function () {}; + return res; + }; + R.prototype.clear = function () { + R.eve("clear", this); + this.canvas.innerHTML = E; + this.span = R._g.doc.createElement("span"); + this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + this.canvas.appendChild(this.span); + this.bottom = this.top = null; + }; + R.prototype.remove = function () { + R.eve("remove", this); + this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + return true; + }; + + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } +}(window.Raphael);
\ No newline at end of file diff --git a/test/g.raphael-min.js b/test/g.raphael-min.js Binary files differnew file mode 100644 index 0000000..5d12a81 --- /dev/null +++ b/test/g.raphael-min.js diff --git a/test/raphael-min.js b/test/raphael-min.js Binary files differnew file mode 100644 index 0000000..5a40d6e --- /dev/null +++ b/test/raphael-min.js diff --git a/thoughts.schoolties.txt b/thoughts.schoolties.txt new file mode 100644 index 0000000..bd0f914 --- /dev/null +++ b/thoughts.schoolties.txt @@ -0,0 +1,71 @@ +I've been waiting really to get some guidance on what the dataset should be, has the client been given any idea of what questions we will ask the members? It strikes me that the more personal the data is the more interesting a picture can be drawn of it? But its a decision what that data should be. + +Moving ahead, I've been looking at the demographic classifications from http://www.statcentral.ie/ +It could also be interesting to compare some of the results with stats from that source - for example averages. + +I propose that we work with the following datasets: + +Year of joining the school +Year of leaving the school +Education level +Ethnic or cultural background* +Religion* (still a practicing catholic?) +Household income* (within bands) +Marital status* +Number of children - ages & sexes* +Children who have attended Oatlands college +Current place of residence +Number of previous places of residence +Years at present residence +Professional sector (based on heirarchical classification system in http://www.cso.ie/en/media/csoie/census/census2006results/volume8/volume_8_occupations_entire_volume.pdf p39-43) +Access to the internet +Access to broadband +Lifestyle - hobbies, participation in sports + +The ones I've marked with a * would be ones that we should think about. +We could decide it by ourselves, ask the client or do a little user survey of what data we think we should be looking at? +There are other areas that we could conceivably look at but I'd imagine that we won't- such as + +Health - incidence of serious diseases, psychiatric treatment, incidence of smoking etc +Access to private health insurance +Longevity - age of parents, are parents alive +Children with disabilities + +I think the main ways we will look at this data is in the form of maps and timelines that graph the other datasets. +Maybe a good approach is to utilise the visualisation as the input method also? This might reduce the amount of boring data the user will have to input to participate in the database, making the process more interactive: first the user inputs a data item graphically, and then is hown how the input results compared with everyone elses. Diego, I guess that would break your assumption that the data access model is one-way only. + +------------------------------------------------------------------------------------------------------------- + +question: on a page which is illustrated around the subject +transition to answer +colours: candy + +start: ask a question, be shown your answer fitting in +skip to the graphics +default ways of graphing the data: by place, by time +ways of browsing the data: + -selecting data/ axes from lists + -jumping to the next preset graph w/transitions + +requirements of the library: + -read JSON + -draw scale sprites, vectors + -support for graphs, menus, buttons + +processing.js: ++++ I know it +--- No native charting +--- Scaleable? + +highcharts.com +--- jquery ++++ pretty by default +--- difficult to customize? ie to transition between graphs? as it just seems to draw a single graph + + +design of the program + +-------------> +a list of questions + +is ie compatibility a strong need?
\ No newline at end of file |
