<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=149.172.225.28</id>
	<title>Wikizone - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=149.172.225.28"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/149.172.225.28"/>
	<updated>2026-05-06T13:57:35Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22920</id>
		<title>JavaScript - Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22920"/>
		<updated>2018-03-30T12:54:30Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Lightbox, Gallery &amp;amp; co */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Libraries Skripte und Plugins für JavaScript, sortiert nach Kategorien&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.jqueryscript.net/&lt;br /&gt;
&lt;br /&gt;
== Images Loaded ==&lt;br /&gt;
Testen ob alle Bilder geladen sind, um dann weitere Funktionen auzuführen.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Images Loaded]]&lt;br /&gt;
== Events ==&lt;br /&gt;
=== Gesture Recognition ===&lt;br /&gt;
[[JavaScript - hammer.js Webapp Touch Gestures]]&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
=== CreateJS ===&lt;br /&gt;
Tools für Animation und Interaktion&lt;br /&gt;
&lt;br /&gt;
http://createjs.com&lt;br /&gt;
&lt;br /&gt;
=== jQuery Appear ===&lt;br /&gt;
[[jQuery Appear - Plugin]] - Events wenn Elemente im Viewport auftauchen / verschwinden&lt;br /&gt;
&lt;br /&gt;
=== jQuery Easing ===&lt;br /&gt;
Easing Kurven für Animationen [[jQuery Easing - Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Simple Text Rotator ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Simple Text Rotator&lt;br /&gt;
!function(e){var t={animation:&amp;quot;dissolve&amp;quot;,separator:&amp;quot;,&amp;quot;,speed:2e3};e.fn.textrotator=function(n){var r=e.extend({},t,n);return this.each(function(){var t=e(this);var n=[];e.each(t.text().split(r.separator),function(e,t){n.push(t)});t.text(n[0]);var i=function(){switch(r.animation){case&amp;quot;dissolve&amp;quot;:t.animate({textShadowBlur:20,opacity:0},500,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).animate({textShadowBlur:0,opacity:1},500)});break;case&amp;quot;flip&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,transform:&amp;quot; rotateY(-180deg)&amp;quot;});break;case&amp;quot;flipUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,transform:&amp;quot; rotateX(-180deg)&amp;quot;});break;case&amp;quot;flipCube&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,transform:&amp;quot; rotateY(180deg)&amp;quot;});break;case&amp;quot;flipCubeUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,transform:&amp;quot; rotateX(180deg)&amp;quot;});break;case&amp;quot;spin&amp;quot;:if(t.find(&amp;quot;.rotating&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.rotating&amp;quot;).html())}s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating spin&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().text(n[s+1]).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotate(0) scale(1)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,transform:&amp;quot;rotate(0) scale(1)&amp;quot;});break;case&amp;quot;fade&amp;quot;:t.fadeOut(r.speed,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).fadeIn(r.speed)});break}};setInterval(i,r.speed)})}}(window.jQuery)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wow Reveal Animations ===&lt;br /&gt;
Kostenpflichtig für kommerzielle Seiten. Developer Lizenz ca 99$. Enthalten z.B. bei angelajochum.de. Kann kostenlos geladen werden zum testen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthieua/WOW&lt;br /&gt;
&lt;br /&gt;
http://mynameismatthieu.com/WOW/index.html&lt;br /&gt;
&lt;br /&gt;
=== Flippy Text Effekt ===&lt;br /&gt;
https://github.com/yemM/flippy&lt;br /&gt;
&lt;br /&gt;
Verwendet in Hera Template&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
=== Pushy ===&lt;br /&gt;
Gutes Mobiles Off-Canvas Menu&lt;br /&gt;
&lt;br /&gt;
[[Pushy Menu]]&lt;br /&gt;
=== Meanmenu ===&lt;br /&gt;
Verwandelt ein Normales verschachteltes Menu in ein gut zu bediendendes Mobiles Menu.&lt;br /&gt;
&lt;br /&gt;
[[Meanmenu.js - jQuery Plugin]] (1.x,2.x)&lt;br /&gt;
&lt;br /&gt;
=== jQuery Mobile Menu ===&lt;br /&gt;
Mobiles Dropdownmenü aus ul Liste&lt;br /&gt;
&lt;br /&gt;
[[jQuery Mobile Menu - Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Parallax ==&lt;br /&gt;
=== Parallax selbst gemacht ===&lt;br /&gt;
[[Parallax Effekt selbst gemacht]]&lt;br /&gt;
&lt;br /&gt;
=== jquery-parallax (jQuery) ===&lt;br /&gt;
Einfach und effektiv.&lt;br /&gt;
&lt;br /&gt;
[[jquery-parallax]]&lt;br /&gt;
&lt;br /&gt;
=== Stellar.js ===&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/&lt;br /&gt;
&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/docs/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*! Stellar.js v0.6.2 | Copyright 2014, Mark Dalgleish | http://markdalgleish.com/projects/stellar.js | http://markdalgleish.mit-license.org */&lt;br /&gt;
!function(a,b,c,d){function e(b,c){this.element=b,this.options=a.extend({},g,c),this._defaults=g,this._name=f,this.init()}var f=&amp;quot;stellar&amp;quot;,g={scrollProperty:&amp;quot;scroll&amp;quot;,positionProperty:&amp;quot;position&amp;quot;,horizontalScrolling:!0,verticalScrolling:!0,horizontalOffset:0,verticalOffset:0,responsive:!1,parallaxBackgrounds:!0,parallaxElements:!0,hideDistantElements:!0,hideElement:function(a){a.hide()},showElement:function(a){a.show()}},h={scroll:{getLeft:function(a){return a.scrollLeft()},setLeft:function(a,b){a.scrollLeft(b)},getTop:function(a){return a.scrollTop()},setTop:function(a,b){a.scrollTop(b)}},position:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;top&amp;quot;),10)}},margin:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;margin-left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;margin-top&amp;quot;),10)}},transform:{getLeft:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[4],10):0},getTop:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[5],10):0}}},i={position:{setLeft:function(a,b){a.css(&amp;quot;left&amp;quot;,b)},setTop:function(a,b){a.css(&amp;quot;top&amp;quot;,b)}},transform:{setPosition:function(a,b,c,d,e){a[0].style[k]=&amp;quot;translate3d(&amp;quot;+(b-c)+&amp;quot;px, &amp;quot;+(d-e)+&amp;quot;px, 0)&amp;quot;}}},j=function(){var b,c=/^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/,d=a(&amp;quot;script&amp;quot;)[0].style,e=&amp;quot;&amp;quot;;for(b in d)if(c.test(b)){e=b.match(c)[0];break}return&amp;quot;WebkitOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Webkit&amp;quot;),&amp;quot;KhtmlOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Khtml&amp;quot;),function(a){return e+(e.length&amp;gt;0?a.charAt(0).toUpperCase()+a.slice(1):a)}}(),k=j(&amp;quot;transform&amp;quot;),l=a(&amp;quot;&amp;lt;div /&amp;gt;&amp;quot;,{style:&amp;quot;background:#fff&amp;quot;}).css(&amp;quot;background-position-x&amp;quot;)!==d,m=l?function(a,b,c){a.css({&amp;quot;background-position-x&amp;quot;:b,&amp;quot;background-position-y&amp;quot;:c})}:function(a,b,c){a.css(&amp;quot;background-position&amp;quot;,b+&amp;quot; &amp;quot;+c)},n=l?function(a){return[a.css(&amp;quot;background-position-x&amp;quot;),a.css(&amp;quot;background-position-y&amp;quot;)]}:function(a){return a.css(&amp;quot;background-position&amp;quot;).split(&amp;quot; &amp;quot;)},o=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a){setTimeout(a,1e3/60)};e.prototype={init:function(){this.options.name=f+&amp;quot;_&amp;quot;+Math.floor(1e9*Math.random()),this._defineElements(),this._defineGetters(),this._defineSetters(),this._handleWindowLoadAndResize(),this._detectViewport(),this.refresh({firstLoad:!0}),&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this._handleScrollEvent():this._startAnimationLoop()},_defineElements:function(){this.element===c.body&amp;amp;&amp;amp;(this.element=b),this.$scrollElement=a(this.element),this.$element=this.element===b?a(&amp;quot;body&amp;quot;):this.$scrollElement,this.$viewportElement=this.options.viewportElement!==d?a(this.options.viewportElement):this.$scrollElement[0]===b||&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this.$scrollElement:this.$scrollElement.parent()},_defineGetters:function(){var a=this,b=h[a.options.scrollProperty];this._getScrollLeft=function(){return b.getLeft(a.$scrollElement)},this._getScrollTop=function(){return b.getTop(a.$scrollElement)}},_defineSetters:function(){var b=this,c=h[b.options.scrollProperty],d=i[b.options.positionProperty],e=c.setLeft,f=c.setTop;this._setScrollLeft=&amp;quot;function&amp;quot;==typeof e?function(a){e(b.$scrollElement,a)}:a.noop,this._setScrollTop=&amp;quot;function&amp;quot;==typeof f?function(a){f(b.$scrollElement,a)}:a.noop,this._setPosition=d.setPosition||function(a,c,e,f,g){b.options.horizontalScrolling&amp;amp;&amp;amp;d.setLeft(a,c,e),b.options.verticalScrolling&amp;amp;&amp;amp;d.setTop(a,f,g)}},_handleWindowLoadAndResize:function(){var c=this,d=a(b);c.options.responsive&amp;amp;&amp;amp;d.bind(&amp;quot;load.&amp;quot;+this.name,function(){c.refresh()}),d.bind(&amp;quot;resize.&amp;quot;+this.name,function(){c._detectViewport(),c.options.responsive&amp;amp;&amp;amp;c.refresh()})},refresh:function(c){var d=this,e=d._getScrollLeft(),f=d._getScrollTop();c&amp;amp;&amp;amp;c.firstLoad||this._reset(),this._setScrollLeft(0),this._setScrollTop(0),this._setOffsets(),this._findParticles(),this._findBackgrounds(),c&amp;amp;&amp;amp;c.firstLoad&amp;amp;&amp;amp;/WebKit/.test(navigator.userAgent)&amp;amp;&amp;amp;a(b).load(function(){var a=d._getScrollLeft(),b=d._getScrollTop();d._setScrollLeft(a+1),d._setScrollTop(b+1),d._setScrollLeft(a),d._setScrollTop(b)}),this._setScrollLeft(e),this._setScrollTop(f)},_detectViewport:function(){var a=this.$viewportElement.offset(),b=null!==a&amp;amp;&amp;amp;a!==d;this.viewportWidth=this.$viewportElement.width(),this.viewportHeight=this.$viewportElement.height(),this.viewportOffsetTop=b?a.top:0,this.viewportOffsetLeft=b?a.left:0},_findParticles:function(){{var b=this;this._getScrollLeft(),this._getScrollTop()}if(this.particles!==d)for(var c=this.particles.length-1;c&amp;gt;=0;c--)this.particles[c].$element.data(&amp;quot;stellar-elementIsActive&amp;quot;,d);this.particles=[],this.options.parallaxElements&amp;amp;&amp;amp;this.$element.find(&amp;quot;[data-stellar-ratio]&amp;quot;).each(function(){var c,e,f,g,h,i,j,k,l,m=a(this),n=0,o=0,p=0,q=0;if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)){if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)!==this)return}else m.data(&amp;quot;stellar-elementIsActive&amp;quot;,this);b.options.showElement(m),m.data(&amp;quot;stellar-startingLeft&amp;quot;)?(m.css(&amp;quot;left&amp;quot;,m.data(&amp;quot;stellar-startingLeft&amp;quot;)),m.css(&amp;quot;top&amp;quot;,m.data(&amp;quot;stellar-startingTop&amp;quot;))):(m.data(&amp;quot;stellar-startingLeft&amp;quot;,m.css(&amp;quot;left&amp;quot;)),m.data(&amp;quot;stellar-startingTop&amp;quot;,m.css(&amp;quot;top&amp;quot;))),f=m.position().left,g=m.position().top,h=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-top&amp;quot;),10),k=m.offset().left-h,l=m.offset().top-i,m.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(n=p,o=q,j=b,!1):(p+=b.position().left,void(q+=b.position().top))}),c=m.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-horizontal-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-horizontal-offset&amp;quot;):b.horizontalOffset,e=m.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-vertical-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-vertical-offset&amp;quot;):b.verticalOffset,b.particles.push({$element:m,$offsetParent:j,isFixed:&amp;quot;fixed&amp;quot;===m.css(&amp;quot;position&amp;quot;),horizontalOffset:c,verticalOffset:e,startingPositionLeft:f,startingPositionTop:g,startingOffsetLeft:k,startingOffsetTop:l,parentOffsetLeft:n,parentOffsetTop:o,stellarRatio:m.data(&amp;quot;stellar-ratio&amp;quot;)!==d?m.data(&amp;quot;stellar-ratio&amp;quot;):1,width:m.outerWidth(!0),height:m.outerHeight(!0),isHidden:!1})})},_findBackgrounds:function(){var b,c=this,e=this._getScrollLeft(),f=this._getScrollTop();this.backgrounds=[],this.options.parallaxBackgrounds&amp;amp;&amp;amp;(b=this.$element.find(&amp;quot;[data-stellar-background-ratio]&amp;quot;),this.$element.data(&amp;quot;stellar-background-ratio&amp;quot;)&amp;amp;&amp;amp;(b=b.add(this.$element)),b.each(function(){var b,g,h,i,j,k,l,o=a(this),p=n(o),q=0,r=0,s=0,t=0;if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)){if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)!==this)return}else o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;,this);o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;)?m(o,o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;)):(o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,p[0]),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,p[1])),h=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-top&amp;quot;),10),j=o.offset().left-h-e,k=o.offset().top-i-f,o.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(q=s,r=t,l=b,!1):(s+=b.position().left,void(t+=b.position().top))}),b=o.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-horizontal-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-horizontal-offset&amp;quot;):c.horizontalOffset,g=o.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-vertical-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-vertical-offset&amp;quot;):c.verticalOffset,c.backgrounds.push({$element:o,$offsetParent:l,isFixed:&amp;quot;fixed&amp;quot;===o.css(&amp;quot;background-attachment&amp;quot;),horizontalOffset:b,verticalOffset:g,startingValueLeft:p[0],startingValueTop:p[1],startingBackgroundPositionLeft:isNaN(parseInt(p[0],10))?0:parseInt(p[0],10),startingBackgroundPositionTop:isNaN(parseInt(p[1],10))?0:parseInt(p[1],10),startingPositionLeft:o.position().left,startingPositionTop:o.position().top,startingOffsetLeft:j,startingOffsetTop:k,parentOffsetLeft:q,parentOffsetTop:r,stellarRatio:o.data(&amp;quot;stellar-background-ratio&amp;quot;)===d?1:o.data(&amp;quot;stellar-background-ratio&amp;quot;)})}))},_reset:function(){var a,b,c,d,e;for(e=this.particles.length-1;e&amp;gt;=0;e--)a=this.particles[e],b=a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;),c=a.$element.data(&amp;quot;stellar-startingTop&amp;quot;),this._setPosition(a.$element,b,b,c,c),this.options.showElement(a.$element),a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;,null).data(&amp;quot;stellar-elementIsActive&amp;quot;,null).data(&amp;quot;stellar-backgroundIsActive&amp;quot;,null);for(e=this.backgrounds.length-1;e&amp;gt;=0;e--)d=this.backgrounds[e],d.$element.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,null).data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,null),m(d.$element,d.startingValueLeft,d.startingValueTop)},destroy:function(){this._reset(),this.$scrollElement.unbind(&amp;quot;resize.&amp;quot;+this.name).unbind(&amp;quot;scroll.&amp;quot;+this.name),this._animationLoop=a.noop,a(b).unbind(&amp;quot;load.&amp;quot;+this.name).unbind(&amp;quot;resize.&amp;quot;+this.name)},_setOffsets:function(){var c=this,d=a(b);d.unbind(&amp;quot;resize.horizontal-&amp;quot;+this.name).unbind(&amp;quot;resize.vertical-&amp;quot;+this.name),&amp;quot;function&amp;quot;==typeof this.options.horizontalOffset?(this.horizontalOffset=this.options.horizontalOffset(),d.bind(&amp;quot;resize.horizontal-&amp;quot;+this.name,function(){c.horizontalOffset=c.options.horizontalOffset()})):this.horizontalOffset=this.options.horizontalOffset,&amp;quot;function&amp;quot;==typeof this.options.verticalOffset?(this.verticalOffset=this.options.verticalOffset(),d.bind(&amp;quot;resize.vertical-&amp;quot;+this.name,function(){c.verticalOffset=c.options.verticalOffset()})):this.verticalOffset=this.options.verticalOffset},_repositionElements:function(){var a,b,c,d,e,f,g,h,i,j,k=this._getScrollLeft(),l=this._getScrollTop(),n=!0,o=!0;if(this.currentScrollLeft!==k||this.currentScrollTop!==l||this.currentWidth!==this.viewportWidth||this.currentHeight!==this.viewportHeight){for(this.currentScrollLeft=k,this.currentScrollTop=l,this.currentWidth=this.viewportWidth,this.currentHeight=this.viewportHeight,j=this.particles.length-1;j&amp;gt;=0;j--)a=this.particles[j],b=a.isFixed?1:0,this.options.horizontalScrolling?(f=(k+a.horizontalOffset+this.viewportOffsetLeft+a.startingPositionLeft-a.startingOffsetLeft+a.parentOffsetLeft)*-(a.stellarRatio+b-1)+a.startingPositionLeft,h=f-a.startingPositionLeft+a.startingOffsetLeft):(f=a.startingPositionLeft,h=a.startingOffsetLeft),this.options.verticalScrolling?(g=(l+a.verticalOffset+this.viewportOffsetTop+a.startingPositionTop-a.startingOffsetTop+a.parentOffsetTop)*-(a.stellarRatio+b-1)+a.startingPositionTop,i=g-a.startingPositionTop+a.startingOffsetTop):(g=a.startingPositionTop,i=a.startingOffsetTop),this.options.hideDistantElements&amp;amp;&amp;amp;(o=!this.options.horizontalScrolling||h+a.width&amp;gt;(a.isFixed?0:k)&amp;amp;&amp;amp;h&amp;lt;(a.isFixed?0:k)+this.viewportWidth+this.viewportOffsetLeft,n=!this.options.verticalScrolling||i+a.height&amp;gt;(a.isFixed?0:l)&amp;amp;&amp;amp;i&amp;lt;(a.isFixed?0:l)+this.viewportHeight+this.viewportOffsetTop),o&amp;amp;&amp;amp;n?(a.isHidden&amp;amp;&amp;amp;(this.options.showElement(a.$element),a.isHidden=!1),this._setPosition(a.$element,f,a.startingPositionLeft,g,a.startingPositionTop)):a.isHidden||(this.options.hideElement(a.$element),a.isHidden=!0);for(j=this.backgrounds.length-1;j&amp;gt;=0;j--)c=this.backgrounds[j],b=c.isFixed?0:1,d=this.options.horizontalScrolling?(k+c.horizontalOffset-this.viewportOffsetLeft-c.startingOffsetLeft+c.parentOffsetLeft-c.startingBackgroundPositionLeft)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueLeft,e=this.options.verticalScrolling?(l+c.verticalOffset-this.viewportOffsetTop-c.startingOffsetTop+c.parentOffsetTop-c.startingBackgroundPositionTop)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueTop,m(c.$element,d,e)}},_handleScrollEvent:function(){var a=this,b=!1,c=function(){a._repositionElements(),b=!1},d=function(){b||(o(c),b=!0)};this.$scrollElement.bind(&amp;quot;scroll.&amp;quot;+this.name,d),d()},_startAnimationLoop:function(){var a=this;this._animationLoop=function(){o(a._animationLoop),a._repositionElements()},this._animationLoop()}},a.fn[f]=function(b){var c=arguments;return b===d||&amp;quot;object&amp;quot;==typeof b?this.each(function(){a.data(this,&amp;quot;plugin_&amp;quot;+f)||a.data(this,&amp;quot;plugin_&amp;quot;+f,new e(this,b))}):&amp;quot;string&amp;quot;==typeof b&amp;amp;&amp;amp;&amp;quot;_&amp;quot;!==b[0]&amp;amp;&amp;amp;&amp;quot;init&amp;quot;!==b?this.each(function(){var d=a.data(this,&amp;quot;plugin_&amp;quot;+f);d instanceof e&amp;amp;&amp;amp;&amp;quot;function&amp;quot;==typeof d[b]&amp;amp;&amp;amp;d[b].apply(d,Array.prototype.slice.call(c,1)),&amp;quot;destroy&amp;quot;===b&amp;amp;&amp;amp;a.data(this,&amp;quot;plugin_&amp;quot;+f,null)}):void 0},a[f]=function(){var c=a(b);return c.stellar.apply(c,Array.prototype.slice.call(arguments,0))},a[f].scrollProperty=h,a[f].positionProperty=i,b.Stellar=e}(jQuery,this,document);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scrolly ===&lt;br /&gt;
[[JQuery.Scrolly]]&lt;br /&gt;
&lt;br /&gt;
== Lightbox, Gallery &amp;amp; co ==&lt;br /&gt;
=== Photoswipe ===&lt;br /&gt;
Mit Swipe und Zoom Gesten-Unterstützung&lt;br /&gt;
&lt;br /&gt;
=== Chocolat ===&lt;br /&gt;
Nette responsive Lightbox für Anfänger und Profis&lt;br /&gt;
&lt;br /&gt;
http://chocolat.insipi.de&lt;br /&gt;
&lt;br /&gt;
[[Chocolat Lightbox]]&lt;br /&gt;
&lt;br /&gt;
=== Lightbox ===&lt;br /&gt;
Der Klassiker: [[Lightbox jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Magnific Popup ===&lt;br /&gt;
Galt lange als DER Nachfolger der Lightbox [[Magnific Popup jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Fancybox ===&lt;br /&gt;
Relativ schlanke Lightbox Alternative mit Übergangseffekten - in der neuen Version 3 kostenpflichtig und nicht mehr ganz so schlank.&lt;br /&gt;
&lt;br /&gt;
== Isotope / Masonry ==&lt;br /&gt;
[[JavaScript - Masonry / Isotope]]&lt;br /&gt;
&lt;br /&gt;
== Charts / Counter ==&lt;br /&gt;
=== jQuery CountTo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// jQuery CountTo&lt;br /&gt;
!function(t){&amp;quot;use strict&amp;quot;;function e(t,e){return t.toFixed(e.decimals)}t.fn.countTo=function(e){return e=e||{},t(this).each(function(){function a(){s+=l,c++,n(s),&amp;quot;function&amp;quot;==typeof o.onUpdate&amp;amp;&amp;amp;o.onUpdate.call(i,s),c&amp;gt;=r&amp;amp;&amp;amp;(f.removeData(&amp;quot;countTo&amp;quot;),clearInterval(d.interval),s=o.to,&amp;quot;function&amp;quot;==typeof o.onComplete&amp;amp;&amp;amp;o.onComplete.call(i,s))}function n(t){var e=o.formatter.call(i,t,o);f.text(e)}var o=t.extend({},t.fn.countTo.defaults,{from:t(this).data(&amp;quot;from&amp;quot;),to:t(this).data(&amp;quot;to&amp;quot;),speed:t(this).data(&amp;quot;speed&amp;quot;),refreshInterval:t(this).data(&amp;quot;refresh-interval&amp;quot;),decimals:t(this).data(&amp;quot;decimals&amp;quot;)},e),r=Math.ceil(o.speed/o.refreshInterval),l=(o.to-o.from)/r,i=this,f=t(this),c=0,s=o.from,d=f.data(&amp;quot;countTo&amp;quot;)||{};f.data(&amp;quot;countTo&amp;quot;,d),d.interval&amp;amp;&amp;amp;clearInterval(d.interval),d.interval=setInterval(a,o.refreshInterval),n(s)})},t.fn.countTo.defaults={from:0,to:0,speed:1e3,refreshInterval:100,decimals:0,formatter:e,onUpdate:null,onComplete:null}}(jQuery);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Easy Pie Chart ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**!&lt;br /&gt;
 * easyPieChart&lt;br /&gt;
 * Lightweight plugin to render simple, animated and retina optimized pie charts&lt;br /&gt;
 *&lt;br /&gt;
 * @license &lt;br /&gt;
 * @author Robert Fleischmann &amp;lt;rendro87@gmail.com&amp;gt; (http://robert-fleischmann.de)&lt;br /&gt;
 * @version 2.1.6&lt;br /&gt;
 **/&lt;br /&gt;
!function(a,b){&amp;quot;object&amp;quot;==typeof exports?module.exports=b(require(&amp;quot;jquery&amp;quot;)):&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement(&amp;quot;canvas&amp;quot;);a.appendChild(d),&amp;quot;undefined&amp;quot;!=typeof G_vmlCanvasManager&amp;amp;&amp;amp;G_vmlCanvasManager.initElement(d);var e=d.getContext(&amp;quot;2d&amp;quot;);d.width=d.height=b.size;var f=1;window.devicePixelRatio&amp;gt;1&amp;amp;&amp;amp;(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,&amp;quot;px&amp;quot;].join(&amp;quot;&amp;quot;),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&amp;amp;&amp;amp;b.scaleLength&amp;amp;&amp;amp;(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0&amp;gt;=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d&amp;gt;0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&amp;amp;&amp;amp;i(),b.trackColor&amp;amp;&amp;amp;h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&amp;amp;&amp;amp;e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d=&amp;quot;function&amp;quot;==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f&amp;gt;=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:&amp;quot;#ef1e25&amp;quot;,trackColor:&amp;quot;#f9f9f9&amp;quot;,scaleColor:&amp;quot;#dfe0e0&amp;quot;,scaleLength:5,lineCap:&amp;quot;round&amp;quot;,lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1&amp;gt;b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if(&amp;quot;undefined&amp;quot;!=typeof b)d.renderer=b;else{if(&amp;quot;undefined&amp;quot;==typeof SVGRenderer)throw new Error(&amp;quot;Please load either the SVG- or the CanvasRenderer&amp;quot;);d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&amp;amp;&amp;amp;(e[b]=c&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof c[b]?c[b]:d[b],&amp;quot;function&amp;quot;==typeof e[b]&amp;amp;&amp;amp;(e[b]=e[b].bind(this)));e.easing=&amp;quot;string&amp;quot;==typeof e.easing&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof jQuery&amp;amp;&amp;amp;jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,&amp;quot;number&amp;quot;==typeof e.animate&amp;amp;&amp;amp;(e.animate={duration:e.animate,enabled:!0}),&amp;quot;boolean&amp;quot;!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&amp;amp;&amp;amp;a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&amp;amp;&amp;amp;a.getAttribute(&amp;quot;data-percent&amp;quot;)&amp;amp;&amp;amp;this.update(parseFloat(a.getAttribute(&amp;quot;data-percent&amp;quot;)))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,&amp;quot;easyPieChart&amp;quot;)||(d=a.extend({},b,a(this).data()),a.data(this,&amp;quot;easyPieChart&amp;quot;,new c(this,d)))})}});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Audio / Video / MediaPlayer ==&lt;br /&gt;
Siehe auch: [[JavaScript - HTML5 Audio]]&lt;br /&gt;
https://ourcodeworld.com/articles/read/148/top-7-best-html5-media-player-javascript-plugins&lt;br /&gt;
&lt;br /&gt;
* Plyr (HTML5, YouTube, Vimeo, accessible, lightweight, customisable, responsive, no dependencies) https://github.com/sampotts/plyr&lt;br /&gt;
* Video.js (Video, build new from ground in 2010, popular)&lt;br /&gt;
* Popcorn.js (HTML5 Event Framework for Filmmakers, Audio Video, Vimeo, YouTube, Soundcloud...)&lt;br /&gt;
* Afterglow ( HTML5 Elements, little Effort)&lt;br /&gt;
* MediaElement.js (Mimics HTML5, Flash Fallback, Accessible)&lt;br /&gt;
* jPlayer (Audio, Video, Skinnable, API&lt;br /&gt;
* Projekktor (OpenSource Video/Audio, Flashfallback different output devices)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FitVids ===&lt;br /&gt;
Embedding Videos from YouTube, Vimeo,...&lt;br /&gt;
&lt;br /&gt;
[[FitVids jQuery Plugin]] https://github.com/davatron5000/FitVids.js&lt;br /&gt;
&lt;br /&gt;
=== Vide - Video Backgrounds ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Vide - v0.5.1&lt;br /&gt;
 *  Easy as hell jQuery plugin for video backgrounds.&lt;br /&gt;
 *  http://vodkabears.github.io/vide/&lt;br /&gt;
 *&lt;br /&gt;
 *  Made by Ilya Makarov&lt;br /&gt;
 *  Under MIT License&lt;br /&gt;
 */&lt;br /&gt;
!function(a,b){&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(&amp;quot;object&amp;quot;==typeof exports?require(&amp;quot;jquery&amp;quot;):a.jQuery)}(this,function(a){&amp;quot;use strict&amp;quot;;function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,&amp;quot;:&amp;quot;).replace(/\s*,\s*/g,&amp;quot;,&amp;quot;).split(&amp;quot;,&amp;quot;),h=0,g=f.length;h&amp;lt;g&amp;amp;&amp;amp;(c=f[h],c.search(/^(http|https|ftp):\/\//)===-1&amp;amp;&amp;amp;c.search(&amp;quot;:&amp;quot;)!==-1);h++)b=c.indexOf(&amp;quot;:&amp;quot;),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=&amp;quot;true&amp;quot;===e||&amp;quot;false&amp;quot;!==e&amp;amp;&amp;amp;e),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=isNaN(e)?e:+e),i[d]=e;return null==d&amp;amp;&amp;amp;null==e?a:i}function c(a){a=&amp;quot;&amp;quot;+a;var b,c,d,e=a.split(/\s+/),f=&amp;quot;50%&amp;quot;,g=&amp;quot;50%&amp;quot;;for(d=0,b=e.length;d&amp;lt;b;d++)c=e[d],&amp;quot;left&amp;quot;===c?f=&amp;quot;0%&amp;quot;:&amp;quot;right&amp;quot;===c?f=&amp;quot;100%&amp;quot;:&amp;quot;top&amp;quot;===c?g=&amp;quot;0%&amp;quot;:&amp;quot;bottom&amp;quot;===c?g=&amp;quot;100%&amp;quot;:&amp;quot;center&amp;quot;===c?0===d?f=&amp;quot;50%&amp;quot;:g=&amp;quot;50%&amp;quot;:0===d?f=c:g=c;return{x:f,y:g}}function d(b,c){var d=function(){c(this.src)};a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.gif&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpeg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.png&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d)}function e(c,d,e){if(this.$element=a(c),&amp;quot;string&amp;quot;==typeof d&amp;amp;&amp;amp;(d=b(d)),e?&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=b(e)):e={},&amp;quot;string&amp;quot;==typeof d)d=d.replace(/\.\w*$/,&amp;quot;&amp;quot;);else if(&amp;quot;object&amp;quot;==typeof d)for(var f in d)d.hasOwnProperty(f)&amp;amp;&amp;amp;(d[f]=d[f].replace(/\.\w*$/,&amp;quot;&amp;quot;));this.settings=a.extend({},g,e),this.path=d;try{this.init()}catch(i){if(i.message!==h)throw i}}var f=&amp;quot;vide&amp;quot;,g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:&amp;quot;50% 50%&amp;quot;,posterType:&amp;quot;detect&amp;quot;,resizing:!0,bgColor:&amp;quot;transparent&amp;quot;,className:&amp;quot;&amp;quot;},h=&amp;quot;Not implemented&amp;quot;;e.prototype.init=function(){var b,e,f=this,g=f.path,i=g,j=&amp;quot;&amp;quot;,k=f.$element,l=f.settings,m=c(l.position),n=l.posterType;e=f.$wrapper=a(&amp;quot;&amp;lt;div&amp;gt;&amp;quot;).addClass(l.className).css({position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:0,left:0,bottom:0,right:0,overflow:&amp;quot;hidden&amp;quot;,&amp;quot;-webkit-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-moz-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-o-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-color&amp;quot;:l.bgColor,&amp;quot;background-repeat&amp;quot;:&amp;quot;no-repeat&amp;quot;,&amp;quot;background-position&amp;quot;:m.x+&amp;quot; &amp;quot;+m.y}),&amp;quot;object&amp;quot;==typeof g&amp;amp;&amp;amp;(g.poster?i=g.poster:g.mp4?i=g.mp4:g.webm?i=g.webm:g.ogv&amp;amp;&amp;amp;(i=g.ogv)),&amp;quot;detect&amp;quot;===n?d(i,function(a){e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+a+&amp;quot;)&amp;quot;)}):&amp;quot;none&amp;quot;!==n&amp;amp;&amp;amp;e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+i+&amp;quot;.&amp;quot;+n+&amp;quot;)&amp;quot;),&amp;quot;static&amp;quot;===k.css(&amp;quot;position&amp;quot;)&amp;amp;&amp;amp;k.css(&amp;quot;position&amp;quot;,&amp;quot;relative&amp;quot;),k.prepend(e),&amp;quot;object&amp;quot;==typeof g?(g.mp4&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.mp4+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;#039;),g.webm&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.webm+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;#039;),g.ogv&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.ogv+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;#039;),b=f.$video=a(&amp;quot;&amp;lt;video&amp;gt;&amp;quot;+j+&amp;quot;&amp;lt;/video&amp;gt;&amp;quot;)):b=f.$video=a(&amp;#039;&amp;lt;video&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;lt;/video&amp;gt;&amp;#039;);try{b.prop({autoplay:l.autoplay,loop:l.loop,volume:l.volume,muted:l.muted,defaultMuted:l.muted,playbackRate:l.playbackRate,defaultPlaybackRate:l.playbackRate})}catch(o){throw new Error(h)}b.css({margin:&amp;quot;auto&amp;quot;,position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:m.y,left:m.x,&amp;quot;-webkit-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-ms-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,transform:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,visibility:&amp;quot;hidden&amp;quot;,opacity:0}).one(&amp;quot;canplaythrough.vide&amp;quot;,function(){f.resize()}).one(&amp;quot;playing.vide&amp;quot;,function(){b.css({visibility:&amp;quot;visible&amp;quot;,opacity:1}),e.css(&amp;quot;background-image&amp;quot;,&amp;quot;none&amp;quot;)}),k.on(&amp;quot;resize.vide&amp;quot;,function(){l.resizing&amp;amp;&amp;amp;f.resize()}),e.append(b)},e.prototype.getVideoObject=function(){return this.$video[0]},e.prototype.resize=function(){if(this.$video){var a=this.$wrapper,b=this.$video,c=b[0],d=c.videoHeight,e=c.videoWidth,f=a.height(),g=a.width();g/e&amp;gt;f/d?b.css({width:g+2,height:&amp;quot;auto&amp;quot;}):b.css({width:&amp;quot;auto&amp;quot;,height:f+2})}},e.prototype.destroy=function(){delete a[f].lookup[this.index],this.$video&amp;amp;&amp;amp;this.$video.off(f),this.$element.off(f).removeData(f),this.$wrapper.remove()},a[f]={lookup:[]},a.fn[f]=function(b,c){var d;return this.each(function(){d=a.data(this,f),d&amp;amp;&amp;amp;d.destroy(),d=new e(this,b,c),d.index=a[f].lookup.push(d)-1,a.data(this,f,d)}),this},a(document).ready(function(){var b=a(window);b.on(&amp;quot;resize.vide&amp;quot;,function(){for(var b,c=a[f].lookup.length,d=0;d&amp;lt;c;d++)b=a[f].lookup[d],b&amp;amp;&amp;amp;b.settings.resizing&amp;amp;&amp;amp;b.resize()}),b.on(&amp;quot;unload.vide&amp;quot;,function(){return!1}),a(document).find(&amp;quot;[data-vide-bg]&amp;quot;).each(function(b,c){var d=a(c),e=d.data(&amp;quot;vide-options&amp;quot;),g=d.data(&amp;quot;vide-bg&amp;quot;);d[f](g,e)})})});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Siehe Extra Seite&lt;br /&gt;
&lt;br /&gt;
== Slider &amp;amp; Carousel ==&lt;br /&gt;
=== Slick Carousel &amp;amp; Slider ===&lt;br /&gt;
Der kann fast alles Slider. Gehört mit Owl Slider zu den vielseitigen.&lt;br /&gt;
&lt;br /&gt;
http://kenwheeler.github.io/slick/&lt;br /&gt;
&lt;br /&gt;
=== Owl Carousel===&lt;br /&gt;
[[Owl Carousel - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Revolution Slider ===&lt;br /&gt;
https://revolution.themepunch.com/examples-jquery/&lt;br /&gt;
&lt;br /&gt;
=== FlexSlider ===&lt;br /&gt;
[[FlexSlider - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Schlichter aber vielseitiger Slider mit schönem KenBurns Effekt und div. Übergängen. Erfordert etwas JS Kenntnisse wenn mehr angepasst werden soll.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Vegas Slider]]&lt;br /&gt;
&lt;br /&gt;
=== MultiScroll.js ===&lt;br /&gt;
http://alvarotrigo.com/multiScroll&lt;br /&gt;
&lt;br /&gt;
Gegenläufiger Scroller&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;jquery.multiscroll.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- This following line is needed in case of using the default easing option or when using another&lt;br /&gt;
 one rather than &amp;quot;linear&amp;quot; or &amp;quot;swing&amp;quot;. You can also add the full jQuery UI instead of this file if you prefer --&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;vendors/jquery.easings.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery.multiscroll.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;multiscroll&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-left&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-right&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Elemente manipulieren ==&lt;br /&gt;
=== Match Heights ===&lt;br /&gt;
Spalten in der Länge anpassen. Siehe auch Flex Grid in CSS3&lt;br /&gt;
&lt;br /&gt;
[[Equal Heights]]&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Match Height]]&lt;br /&gt;
&lt;br /&gt;
=== Fit Viewport ===&lt;br /&gt;
==== Viewport Height ====&lt;br /&gt;
Element an die Höhe des Viewports anpassen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  $(document).ready(function(){&lt;br /&gt;
      $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
          $(window).resize(function(){&lt;br /&gt;
              $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
      });&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scrolling ==&lt;br /&gt;
Hinweis die meisten Scroll To and ScrollTops lassen sich auch mit einfachen jquery Snippets realisieren. &lt;br /&gt;
=== Einfaches jQuery Scroll To Top ===&lt;br /&gt;
Mehr brauchts nicht :-) [[Scroll ToTop (jQuery)]]&lt;br /&gt;
&lt;br /&gt;
=== Perfect Scrollbar ===&lt;br /&gt;
[[Perfect Scrollbar]]&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler ScrollTo ===&lt;br /&gt;
https://github.com/flesler/jquery.scrollTo&lt;br /&gt;
&lt;br /&gt;
Lightweight, cross-browser and highly customizable animated scrolling with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler LocalScroll ===&lt;br /&gt;
https://github.com/flesler/jquery.localScroll&lt;br /&gt;
&lt;br /&gt;
Animated anchor navigation made easy with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Smooth Scroll ===&lt;br /&gt;
Oil for Scrolling - damit ruckelt es nicht so beim Scrollen mit dem Mausrad&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// SmoothScroll for websites v1.4.0 (Balazs Galambosi)&lt;br /&gt;
// http://www.smoothscroll.net/&lt;br /&gt;
//&lt;br /&gt;
// Licensed under the terms of the MIT license.&lt;br /&gt;
//&lt;br /&gt;
// You may use it in your theme if you credit me. &lt;br /&gt;
// It is also free to use on any individual website.&lt;br /&gt;
//&lt;br /&gt;
// Exception:&lt;br /&gt;
// The only restriction is to not publish any  &lt;br /&gt;
// extension for browsers or native application&lt;br /&gt;
// without getting a written permission first.&lt;br /&gt;
//&lt;br /&gt;
!function(){function e(){z.keyboardSupport&amp;amp;&amp;amp;m(&amp;quot;keydown&amp;quot;,a)}function t(){if(!A&amp;amp;&amp;amp;document.body){A=!0;var t=document.body,o=document.documentElement,n=window.innerHeight,r=t.scrollHeight;if(B=document.compatMode.indexOf(&amp;quot;CSS&amp;quot;)&amp;gt;=0?o:t,D=t,e(),top!=self)X=!0;else if(r&amp;gt;n&amp;amp;&amp;amp;(t.offsetHeight&amp;lt;=n||o.offsetHeight&amp;lt;=n)){var a=document.createElement(&amp;quot;div&amp;quot;);a.style.cssText=&amp;quot;position:absolute; z-index:-10000; top:0; left:0; right:0; height:&amp;quot;+B.scrollHeight+&amp;quot;px&amp;quot;,document.body.appendChild(a);var i;T=function(){i||(i=setTimeout(function(){L||(a.style.height=&amp;quot;0&amp;quot;,a.style.height=B.scrollHeight+&amp;quot;px&amp;quot;,i=null)},500))},setTimeout(T,10),m(&amp;quot;resize&amp;quot;,T);var l={attributes:!0,childList:!0,characterData:!1};if(M=new V(T),M.observe(t,l),B.offsetHeight&amp;lt;=n){var c=document.createElement(&amp;quot;div&amp;quot;);c.style.clear=&amp;quot;both&amp;quot;,t.appendChild(c)}}z.fixedBackground||L||(t.style.backgroundAttachment=&amp;quot;scroll&amp;quot;,o.style.backgroundAttachment=&amp;quot;scroll&amp;quot;)}}function o(){M&amp;amp;&amp;amp;M.disconnect(),h(I,r),h(&amp;quot;mousedown&amp;quot;,i),h(&amp;quot;keydown&amp;quot;,a),h(&amp;quot;resize&amp;quot;,T),h(&amp;quot;load&amp;quot;,t)}function n(e,t,o){if(p(t,o),1!=z.accelerationMax){var n=Date.now(),r=n-R;if(r&amp;lt;z.accelerationDelta){var a=(1+50/r)/2;a&amp;gt;1&amp;amp;&amp;amp;(a=Math.min(a,z.accelerationMax),t*=a,o*=a)}R=Date.now()}if(q.push({x:t,y:o,lastX:0&amp;gt;t?.99:-.99,lastY:0&amp;gt;o?.99:-.99,start:Date.now()}),!P){var i=e===document.body,l=function(n){for(var r=Date.now(),a=0,c=0,u=0;u&amp;lt;q.length;u++){var d=q[u],s=r-d.start,f=s&amp;gt;=z.animationTime,m=f?1:s/z.animationTime;z.pulseAlgorithm&amp;amp;&amp;amp;(m=x(m));var h=d.x*m-d.lastX&amp;gt;&amp;gt;0,w=d.y*m-d.lastY&amp;gt;&amp;gt;0;a+=h,c+=w,d.lastX+=h,d.lastY+=w,f&amp;amp;&amp;amp;(q.splice(u,1),u--)}i?window.scrollBy(a,c):(a&amp;amp;&amp;amp;(e.scrollLeft+=a),c&amp;amp;&amp;amp;(e.scrollTop+=c)),t||o||(q=[]),q.length?_(l,e,1e3/z.frameRate+1):P=!1};_(l,e,0),P=!0}}function r(e){A||t();var o=e.target,r=u(o);if(!r||e.defaultPrevented||e.ctrlKey)return!0;if(w(D,&amp;quot;embed&amp;quot;)||w(o,&amp;quot;embed&amp;quot;)&amp;amp;&amp;amp;/\.pdf/i.test(o.src)||w(D,&amp;quot;object&amp;quot;))return!0;var a=-e.wheelDeltaX||e.deltaX||0,i=-e.wheelDeltaY||e.deltaY||0;return K&amp;amp;&amp;amp;(e.wheelDeltaX&amp;amp;&amp;amp;b(e.wheelDeltaX,120)&amp;amp;&amp;amp;(a=-120*(e.wheelDeltaX/Math.abs(e.wheelDeltaX))),e.wheelDeltaY&amp;amp;&amp;amp;b(e.wheelDeltaY,120)&amp;amp;&amp;amp;(i=-120*(e.wheelDeltaY/Math.abs(e.wheelDeltaY)))),a||i||(i=-e.wheelDelta||0),1===e.deltaMode&amp;amp;&amp;amp;(a*=40,i*=40),!z.touchpadSupport&amp;amp;&amp;amp;v(i)?!0:(Math.abs(a)&amp;gt;1.2&amp;amp;&amp;amp;(a*=z.stepSize/120),Math.abs(i)&amp;gt;1.2&amp;amp;&amp;amp;(i*=z.stepSize/120),n(r,a,i),e.preventDefault(),void l())}function a(e){var t=e.target,o=e.ctrlKey||e.altKey||e.metaKey||e.shiftKey&amp;amp;&amp;amp;e.keyCode!==N.spacebar;document.contains(D)||(D=document.activeElement);var r=/^(textarea|select|embed|object)$/i,a=/^(button|submit|radio|checkbox|file|color|image)$/i;if(r.test(t.nodeName)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;!a.test(t.type)||w(D,&amp;quot;video&amp;quot;)||y(e)||t.isContentEditable||e.defaultPrevented||o)return!0;if((w(t,&amp;quot;button&amp;quot;)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;a.test(t.type))&amp;amp;&amp;amp;e.keyCode===N.spacebar)return!0;var i,c=0,d=0,s=u(D),f=s.clientHeight;switch(s==document.body&amp;amp;&amp;amp;(f=window.innerHeight),e.keyCode){case N.up:d=-z.arrowScroll;break;case N.down:d=z.arrowScroll;break;case N.spacebar:i=e.shiftKey?1:-1,d=-i*f*.9;break;case N.pageup:d=.9*-f;break;case N.pagedown:d=.9*f;break;case N.home:d=-s.scrollTop;break;case N.end:var m=s.scrollHeight-s.scrollTop-f;d=m&amp;gt;0?m+10:0;break;case N.left:c=-z.arrowScroll;break;case N.right:c=z.arrowScroll;break;default:return!0}n(s,c,d),e.preventDefault(),l()}function i(e){D=e.target}function l(){clearTimeout(E),E=setInterval(function(){F={}},1e3)}function c(e,t){for(var o=e.length;o--;)F[j(e[o])]=t;return t}function u(e){var t=[],o=document.body,n=B.scrollHeight;do{var r=F[j(e)];if(r)return c(t,r);if(t.push(e),n===e.scrollHeight){var a=s(B)&amp;amp;&amp;amp;s(o),i=a||f(B);if(X&amp;amp;&amp;amp;d(B)||!X&amp;amp;&amp;amp;i)return c(t,$())}else if(d(e)&amp;amp;&amp;amp;f(e))return c(t,e)}while(e=e.parentElement)}function d(e){return e.clientHeight+10&amp;lt;e.scrollHeight}function s(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;hidden&amp;quot;!==t}function f(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;scroll&amp;quot;===t||&amp;quot;auto&amp;quot;===t}function m(e,t){window.addEventListener(e,t,!1)}function h(e,t){window.removeEventListener(e,t,!1)}function w(e,t){return(e.nodeName||&amp;quot;&amp;quot;).toLowerCase()===t.toLowerCase()}function p(e,t){e=e&amp;gt;0?1:-1,t=t&amp;gt;0?1:-1,(Y.x!==e||Y.y!==t)&amp;amp;&amp;amp;(Y.x=e,Y.y=t,q=[],R=0)}function v(e){return e?(O.length||(O=[e,e,e]),e=Math.abs(e),O.push(e),O.shift(),clearTimeout(H),H=setTimeout(function(){window.localStorage&amp;amp;&amp;amp;(localStorage.SS_deltaBuffer=O.join(&amp;quot;,&amp;quot;))},1e3),!g(120)&amp;amp;&amp;amp;!g(100)):void 0}function b(e,t){return Math.floor(e/t)==e/t}function g(e){return b(O[0],e)&amp;amp;&amp;amp;b(O[1],e)&amp;amp;&amp;amp;b(O[2],e)}function y(e){var t=e.target,o=!1;if(-1!=document.URL.indexOf(&amp;quot;www.youtube.com/watch&amp;quot;))do if(o=t.classList&amp;amp;&amp;amp;t.classList.contains(&amp;quot;html5-video-controls&amp;quot;))break;while(t=t.parentNode);return o}function S(e){var t,o,n;return e*=z.pulseScale,1&amp;gt;e?t=e-(1-Math.exp(-e)):(o=Math.exp(-1),e-=1,n=1-Math.exp(-e),t=o+n*(1-o)),t*z.pulseNormalize}function x(e){return e&amp;gt;=1?1:0&amp;gt;=e?0:(1==z.pulseNormalize&amp;amp;&amp;amp;(z.pulseNormalize/=S(1)),S(e))}function k(e){for(var t in e)C.hasOwnProperty(t)&amp;amp;&amp;amp;(z[t]=e[t])}var D,M,T,E,H,C={frameRate:150,animationTime:400,stepSize:100,pulseAlgorithm:!0,pulseScale:4,pulseNormalize:1,accelerationDelta:50,accelerationMax:3,keyboardSupport:!0,arrowScroll:50,touchpadSupport:!1,fixedBackground:!0,excluded:&amp;quot;&amp;quot;},z=C,L=!1,X=!1,Y={x:0,y:0},A=!1,B=document.documentElement,O=[],K=/^Mac/.test(navigator.platform),N={left:37,up:38,right:39,down:40,spacebar:32,pageup:33,pagedown:34,end:35,home:36},q=[],P=!1,R=Date.now(),j=function(){var e=0;return function(t){return t.uniqueID||(t.uniqueID=e++)}}(),F={};window.localStorage&amp;amp;&amp;amp;localStorage.SS_deltaBuffer&amp;amp;&amp;amp;(O=localStorage.SS_deltaBuffer.split(&amp;quot;,&amp;quot;));var I,_=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e,t,o){window.setTimeout(e,o||1e3/60)}}(),V=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,$=function(){var e;return function(){if(!e){var t=document.createElement(&amp;quot;div&amp;quot;);t.style.cssText=&amp;quot;height:10000px;width:1px;&amp;quot;,document.body.appendChild(t);var o=document.body.scrollTop;document.documentElement.scrollTop;window.scrollBy(0,1),e=document.body.scrollTop!=o?document.body:document.documentElement,window.scrollBy(0,-1),document.body.removeChild(t)}return e}}(),U=window.navigator.userAgent,W=/Edge/.test(U),G=/chrome/i.test(U)&amp;amp;&amp;amp;!W,J=/safari/i.test(U)&amp;amp;&amp;amp;!W,Q=/mobile/i.test(U),Z=(G||J)&amp;amp;&amp;amp;!Q;&amp;quot;onwheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)?I=&amp;quot;wheel&amp;quot;:&amp;quot;onmousewheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)&amp;amp;&amp;amp;(I=&amp;quot;mousewheel&amp;quot;),I&amp;amp;&amp;amp;Z&amp;amp;&amp;amp;(m(I,r),m(&amp;quot;mousedown&amp;quot;,i),m(&amp;quot;load&amp;quot;,t)),k.destroy=o,window.SmoothScrollOptions&amp;amp;&amp;amp;k(window.SmoothScrollOptions),&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define(function(){return k}):&amp;quot;object&amp;quot;==typeof exports?module.exports=k:window.SmoothScroll=k}();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Typography, Fonts, etc==&lt;br /&gt;
=== Letter.js ===&lt;br /&gt;
Zerpflückt Texte und wrappt Buchstaben / Wörter / Zeilen in durchnummerierte Klassen. Diese kann man dann cool Stylen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/davatron5000/Lettering.js&lt;br /&gt;
&lt;br /&gt;
=== Fittext ===&lt;br /&gt;
Responsive Textgrößen in Typographie-Spielereien für Überschriften etc.&lt;br /&gt;
&lt;br /&gt;
http://fittextjs.com/&lt;br /&gt;
&lt;br /&gt;
=== Prism.js ===&lt;br /&gt;
Syntaxhighlighter&lt;br /&gt;
&lt;br /&gt;
== Google Maps mit gmaps.js ==&lt;br /&gt;
https://hpneo.github.io/gmaps/&lt;br /&gt;
Einfache Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
new GMaps({&lt;br /&gt;
  div: &amp;#039;#map&amp;#039;,&lt;br /&gt;
  lat: -12.043333,&lt;br /&gt;
  lng: -77.028333&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Grey Style Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Google map	&lt;br /&gt;
/*global $:false */&lt;br /&gt;
    var map;&lt;br /&gt;
    $(document).ready(function(){&amp;quot;use strict&amp;quot;;&lt;br /&gt;
      map = new GMaps({&lt;br /&gt;
    disableDefaultUI: true,&lt;br /&gt;
    scrollwheel: false,&lt;br /&gt;
        el: &amp;#039;#map&amp;#039;,&lt;br /&gt;
        lat: 48.4912812,&lt;br /&gt;
        lng: 9.2175255&lt;br /&gt;
      });&lt;br /&gt;
      map.drawOverlay({&lt;br /&gt;
        lat: map.getCenter().lat(),&lt;br /&gt;
        lng: map.getCenter().lng(),&lt;br /&gt;
        layer: &amp;#039;overlayLayer&amp;#039;,&lt;br /&gt;
        content: &amp;#039;&amp;lt;div class=&amp;quot;overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
        verticalAlign: &amp;#039;center&amp;#039;,&lt;br /&gt;
        horizontalAlign: &amp;#039;center&amp;#039;&lt;br /&gt;
      });&lt;br /&gt;
        var styles = [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;visibility&amp;quot;: &amp;quot;on&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.9 },&lt;br /&gt;
      { &amp;quot;lightness&amp;quot;: 37 },&lt;br /&gt;
      { &amp;quot;gamma&amp;quot;: 0.62 },&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -93 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -1 },&lt;br /&gt;
      { &amp;quot;color&amp;quot;: &amp;quot;#ffffff&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.2 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;road&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -98 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;landscape&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -89 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;water&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#cfa144&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.4 },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -38 }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
];&lt;br /&gt;
        &lt;br /&gt;
        map.addStyle({&lt;br /&gt;
            styledMapName:&amp;quot;Styled Map&amp;quot;,&lt;br /&gt;
            styles: styles,&lt;br /&gt;
            mapTypeId: &amp;quot;map_style&amp;quot;  &lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        map.setStyle(&amp;quot;map_style&amp;quot;);	&lt;br /&gt;
		&lt;br /&gt;
    });			&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
(function(root, factory) {&lt;br /&gt;
  if(typeof exports === &amp;#039;object&amp;#039;) {&lt;br /&gt;
    module.exports = factory();&lt;br /&gt;
  }&lt;br /&gt;
  else if(typeof define === &amp;#039;function&amp;#039; &amp;amp;&amp;amp; define.amd) {&lt;br /&gt;
    define([&amp;#039;jquery&amp;#039;, &amp;#039;googlemaps!&amp;#039;], factory);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    root.GMaps = factory();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}(this, function() {&lt;br /&gt;
&lt;br /&gt;
/*!&lt;br /&gt;
 * GMaps.js v0.4.25&lt;br /&gt;
 * http://hpneo.github.com/gmaps/&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2017, Gustavo Leon&lt;br /&gt;
 * Released under the MIT License.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var extend_object = function(obj, new_obj) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === new_obj) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in new_obj) {&lt;br /&gt;
    if (new_obj[name] !== undefined) {&lt;br /&gt;
      obj[name] = new_obj[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var replace_object = function(obj, replace) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === replace) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in replace) {&lt;br /&gt;
    if (obj[name] != undefined) {&lt;br /&gt;
      obj[name] = replace[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_map = function(array, callback) {&lt;br /&gt;
  var original_callback_params = Array.prototype.slice.call(arguments, 2),&lt;br /&gt;
      array_return = [],&lt;br /&gt;
      array_length = array.length,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  if (Array.prototype.map &amp;amp;&amp;amp; array.map === Array.prototype.map) {&lt;br /&gt;
    array_return = Array.prototype.map.call(array, function(item) {&lt;br /&gt;
      var callback_params = original_callback_params.slice(0);&lt;br /&gt;
      callback_params.splice(0, 0, item);&lt;br /&gt;
&lt;br /&gt;
      return callback.apply(this, callback_params);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (i = 0; i &amp;lt; array_length; i++) {&lt;br /&gt;
      callback_params = original_callback_params;&lt;br /&gt;
      callback_params.splice(0, 0, array[i]);&lt;br /&gt;
      array_return.push(callback.apply(this, callback_params));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return array_return;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_flat = function(array) {&lt;br /&gt;
  var new_array = [],&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
    new_array = new_array.concat(array[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new_array;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var coordsToLatLngs = function(coords, useGeoJSON) {&lt;br /&gt;
  var first_coord = coords[0],&lt;br /&gt;
      second_coord = coords[1];&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON) {&lt;br /&gt;
    first_coord = coords[1];&lt;br /&gt;
    second_coord = coords[0];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new google.maps.LatLng(first_coord, second_coord);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var arrayToLatLng = function(coords, useGeoJSON) {&lt;br /&gt;
  var i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; coords.length; i++) {&lt;br /&gt;
    if (!(coords[i] instanceof google.maps.LatLng)) {&lt;br /&gt;
      if (coords[i].length &amp;gt; 0 &amp;amp;&amp;amp; typeof(coords[i][0]) === &amp;quot;object&amp;quot;) {&lt;br /&gt;
        coords[i] = arrayToLatLng(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        coords[i] = coordsToLatLngs(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return coords;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementsByClassName = function (class_name, context) {&lt;br /&gt;
    var element,&lt;br /&gt;
        _class = class_name.replace(&amp;#039;.&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    if (&amp;#039;jQuery&amp;#039; in this &amp;amp;&amp;amp; context) {&lt;br /&gt;
        element = $(&amp;quot;.&amp;quot; + _class, context)[0];&lt;br /&gt;
    } else {&lt;br /&gt;
        element = document.getElementsByClassName(_class)[0];&lt;br /&gt;
    }&lt;br /&gt;
    return element;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementById = function(id, context) {&lt;br /&gt;
  var element,&lt;br /&gt;
  id = id.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  if (&amp;#039;jQuery&amp;#039; in window &amp;amp;&amp;amp; context) {&lt;br /&gt;
    element = $(&amp;#039;#&amp;#039; + id, context)[0];&lt;br /&gt;
  } else {&lt;br /&gt;
    element = document.getElementById(id);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return element;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var findAbsolutePosition = function(obj)  {&lt;br /&gt;
  var curleft = 0,&lt;br /&gt;
      curtop = 0;&lt;br /&gt;
&lt;br /&gt;
  if (obj.getBoundingClientRect) {&lt;br /&gt;
      var rect = obj.getBoundingClientRect();&lt;br /&gt;
      var sx = -(window.scrollX ? window.scrollX : window.pageXOffset);&lt;br /&gt;
      var sy = -(window.scrollY ? window.scrollY : window.pageYOffset);&lt;br /&gt;
&lt;br /&gt;
      return [(rect.left - sx), (rect.top - sy)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (obj.offsetParent) {&lt;br /&gt;
    do {&lt;br /&gt;
      curleft += obj.offsetLeft;&lt;br /&gt;
      curtop += obj.offsetTop;&lt;br /&gt;
    } while (obj = obj.offsetParent);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return [curleft, curtop];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var GMaps = (function(global) {&lt;br /&gt;
  &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  var doc = document;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new GMaps instance, including a Google Maps map.&lt;br /&gt;
   * @class GMaps&lt;br /&gt;
   * @constructs&lt;br /&gt;
   * @param {object} options - `options` accepts all the [MapOptions](https://developers.google.com/maps/documentation/javascript/reference#MapOptions) and [events](https://developers.google.com/maps/documentation/javascript/reference#Map) listed in the Google Maps API. Also accepts:&lt;br /&gt;
   * * `lat` (number): Latitude of the map&amp;#039;s center&lt;br /&gt;
   * * `lng` (number): Longitude of the map&amp;#039;s center&lt;br /&gt;
   * * `el` (string or HTMLElement): container where the map will be rendered&lt;br /&gt;
   * * `markerClusterer` (function): A function to create a marker cluster. You can use MarkerClusterer or MarkerClustererPlus.&lt;br /&gt;
   */&lt;br /&gt;
  var GMaps = function(options) {&lt;br /&gt;
&lt;br /&gt;
    if (!(typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps)) {&lt;br /&gt;
      if (typeof window.console === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.console.error) {&lt;br /&gt;
        console.error(&amp;#039;Google Maps API is required. Please register the following JavaScript library https://maps.googleapis.com/maps/api/js.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return function() {};&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!this) return new GMaps(options);&lt;br /&gt;
&lt;br /&gt;
    options.zoom = options.zoom || 15;&lt;br /&gt;
    options.mapType = options.mapType || &amp;#039;roadmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var valueOrDefault = function(value, defaultValue) {&lt;br /&gt;
      return value === undefined ? defaultValue : value;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var self = this,&lt;br /&gt;
        i,&lt;br /&gt;
        events_that_hide_context_menu = [&lt;br /&gt;
          &amp;#039;bounds_changed&amp;#039;, &amp;#039;center_changed&amp;#039;, &amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;,&lt;br /&gt;
          &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;idle&amp;#039;, &amp;#039;maptypeid_changed&amp;#039;, &amp;#039;projection_changed&amp;#039;,&lt;br /&gt;
          &amp;#039;resize&amp;#039;, &amp;#039;tilesloaded&amp;#039;, &amp;#039;zoom_changed&amp;#039;&lt;br /&gt;
        ],&lt;br /&gt;
        events_that_doesnt_hide_context_menu = [&amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;],&lt;br /&gt;
        options_to_be_deleted = [&amp;#039;el&amp;#039;, &amp;#039;lat&amp;#039;, &amp;#039;lng&amp;#039;, &amp;#039;mapType&amp;#039;, &amp;#039;width&amp;#039;, &amp;#039;height&amp;#039;, &amp;#039;markerClusterer&amp;#039;, &amp;#039;enableNewStyle&amp;#039;],&lt;br /&gt;
        identifier = options.el || options.div,&lt;br /&gt;
        markerClustererFunction = options.markerClusterer,&lt;br /&gt;
        mapType = google.maps.MapTypeId[options.mapType.toUpperCase()],&lt;br /&gt;
        map_center = new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        zoomControl = valueOrDefault(options.zoomControl, true),&lt;br /&gt;
        zoomControlOpt = options.zoomControlOpt || {&lt;br /&gt;
          style: &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
          position: &amp;#039;TOP_LEFT&amp;#039;&lt;br /&gt;
        },&lt;br /&gt;
        zoomControlStyle = zoomControlOpt.style || &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
        zoomControlPosition = zoomControlOpt.position || &amp;#039;TOP_LEFT&amp;#039;,&lt;br /&gt;
        panControl = valueOrDefault(options.panControl, true),&lt;br /&gt;
        mapTypeControl = valueOrDefault(options.mapTypeControl, true),&lt;br /&gt;
        scaleControl = valueOrDefault(options.scaleControl, true),&lt;br /&gt;
        streetViewControl = valueOrDefault(options.streetViewControl, true),&lt;br /&gt;
        overviewMapControl = valueOrDefault(overviewMapControl, true),&lt;br /&gt;
        map_options = {},&lt;br /&gt;
        map_base_options = {&lt;br /&gt;
          zoom: this.zoom,&lt;br /&gt;
          center: map_center,&lt;br /&gt;
          mapTypeId: mapType&lt;br /&gt;
        },&lt;br /&gt;
        map_controls_options = {&lt;br /&gt;
          panControl: panControl,&lt;br /&gt;
          zoomControl: zoomControl,&lt;br /&gt;
          zoomControlOptions: {&lt;br /&gt;
            style: google.maps.ZoomControlStyle[zoomControlStyle],&lt;br /&gt;
            position: google.maps.ControlPosition[zoomControlPosition]&lt;br /&gt;
          },&lt;br /&gt;
          mapTypeControl: mapTypeControl,&lt;br /&gt;
          scaleControl: scaleControl,&lt;br /&gt;
          streetViewControl: streetViewControl,&lt;br /&gt;
          overviewMapControl: overviewMapControl&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
      if (typeof(options.el) === &amp;#039;string&amp;#039; || typeof(options.div) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
        if (identifier.indexOf(&amp;quot;#&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Container element&lt;br /&gt;
             *&lt;br /&gt;
             * @type {HTMLElement}&lt;br /&gt;
             */&lt;br /&gt;
            this.el = getElementById(identifier, options.context);&lt;br /&gt;
        } else {&lt;br /&gt;
            this.el = getElementsByClassName.apply(this, [identifier, options.context]);&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
          this.el = identifier;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if (typeof(this.el) === &amp;#039;undefined&amp;#039; || this.el === null) {&lt;br /&gt;
      throw &amp;#039;No element defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.context_menu = window.context_menu || {};&lt;br /&gt;
    window.context_menu[self.el.id] = {};&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of custom controls in the map UI&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.controls = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s overlays&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.overlays = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of KML/GeoRSS and FusionTable layers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.layers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of data layers (See {@link GMaps#addLayer})&lt;br /&gt;
     *&lt;br /&gt;
     * @type {object}&lt;br /&gt;
     */&lt;br /&gt;
    this.singleLayers = {};&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s markers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.markers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s lines&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polylines = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s routes requested by {@link GMaps#getRoutes}, {@link GMaps#renderRoute}, {@link GMaps#drawRoute}, {@link GMaps#travelRoute} or {@link GMaps#drawSteppedRoute}&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.routes = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s polygons&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polygons = [];&lt;br /&gt;
    this.infoWindow = null;&lt;br /&gt;
    this.overlay_el = null;&lt;br /&gt;
    /**&lt;br /&gt;
     * Current map&amp;#039;s zoom&lt;br /&gt;
     *&lt;br /&gt;
     * @type {number}&lt;br /&gt;
     */&lt;br /&gt;
    this.zoom = options.zoom;&lt;br /&gt;
    this.registered_events = {};&lt;br /&gt;
&lt;br /&gt;
    this.el.style.width = options.width || this.el.scrollWidth || this.el.offsetWidth;&lt;br /&gt;
    this.el.style.height = options.height || this.el.scrollHeight || this.el.offsetHeight;&lt;br /&gt;
&lt;br /&gt;
    google.maps.visualRefresh = options.enableNewStyle;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; options_to_be_deleted.length; i++) {&lt;br /&gt;
      delete options[options_to_be_deleted[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(options.disableDefaultUI != true) {&lt;br /&gt;
      map_base_options = extend_object(map_base_options, map_controls_options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    map_options = extend_object(map_base_options, options);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_doesnt_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_doesnt_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Google Maps map instance&lt;br /&gt;
     *&lt;br /&gt;
     * @type {google.maps.Map}&lt;br /&gt;
     */&lt;br /&gt;
    this.map = new google.maps.Map(this.el, map_options);&lt;br /&gt;
&lt;br /&gt;
    if (markerClustererFunction) {&lt;br /&gt;
      /**&lt;br /&gt;
       * Marker Clusterer instance&lt;br /&gt;
       *&lt;br /&gt;
       * @type {object}&lt;br /&gt;
       */&lt;br /&gt;
      this.markerClusterer = markerClustererFunction.apply(this, [this.map]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var buildContextMenuHTML = function(control, e) {&lt;br /&gt;
      var html = &amp;#039;&amp;#039;,&lt;br /&gt;
          options = window.context_menu[self.el.id][control];&lt;br /&gt;
&lt;br /&gt;
      for (var i in options){&lt;br /&gt;
        if (options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options[i];&lt;br /&gt;
&lt;br /&gt;
          html += &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a id=&amp;quot;&amp;#039; + control + &amp;#039;_&amp;#039; + i + &amp;#039;&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;&amp;#039; + option.title + &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) return;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.innerHTML = html;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_items = context_menu_element.getElementsByTagName(&amp;#039;a&amp;#039;),&lt;br /&gt;
          context_menu_items_count = context_menu_items.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; context_menu_items_count; i++) {&lt;br /&gt;
        var context_menu_item = context_menu_items[i];&lt;br /&gt;
&lt;br /&gt;
        var assign_menu_item_action = function(ev){&lt;br /&gt;
          ev.preventDefault();&lt;br /&gt;
&lt;br /&gt;
          options[this.id.replace(control + &amp;#039;_&amp;#039;, &amp;#039;&amp;#039;)].action.apply(self, [e]);&lt;br /&gt;
          self.hideContextMenu();&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        google.maps.event.clearListeners(context_menu_item, &amp;#039;click&amp;#039;);&lt;br /&gt;
        google.maps.event.addDomListenerOnce(context_menu_item, &amp;#039;click&amp;#039;, assign_menu_item_action, false);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var position = findAbsolutePosition.apply(this, [self.el]),&lt;br /&gt;
          left = position[0] + e.pixel.x - 15,&lt;br /&gt;
          top = position[1] + e.pixel.y- 15;&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.style.left = left + &amp;quot;px&amp;quot;;&lt;br /&gt;
      context_menu_element.style.top = top + &amp;quot;px&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      // context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this.buildContextMenu = function(control, e) {&lt;br /&gt;
      if (control === &amp;#039;marker&amp;#039;) {&lt;br /&gt;
        e.pixel = {};&lt;br /&gt;
&lt;br /&gt;
        var overlay = new google.maps.OverlayView();&lt;br /&gt;
        overlay.setMap(self.map);&lt;br /&gt;
&lt;br /&gt;
        overlay.draw = function() {&lt;br /&gt;
          var projection = overlay.getProjection(),&lt;br /&gt;
              position = e.marker.getPosition();&lt;br /&gt;
&lt;br /&gt;
          e.pixel = projection.fromLatLngToContainerPixel(position);&lt;br /&gt;
&lt;br /&gt;
          buildContextMenuHTML(control, e);&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        buildContextMenuHTML(control, e);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      setTimeout(function() {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
      }, 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Add a context menu for a map or a marker.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {object} options - The `options` object should contain:&lt;br /&gt;
     * * `control` (string): Kind of control the context menu will be attached. Can be &amp;quot;map&amp;quot; or &amp;quot;marker&amp;quot;.&lt;br /&gt;
     * * `options` (array): A collection of context menu items:&lt;br /&gt;
     *   * `title` (string): Item&amp;#039;s title shown in the context menu.&lt;br /&gt;
     *   * `name` (string): Item&amp;#039;s identifier.&lt;br /&gt;
     *   * `action` (function): Function triggered after selecting the context menu item.&lt;br /&gt;
     */&lt;br /&gt;
    this.setContextMenu = function(options) {&lt;br /&gt;
      window.context_menu[self.el.id][options.control] = {};&lt;br /&gt;
&lt;br /&gt;
      var i,&lt;br /&gt;
          ul = doc.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      for (i in options.options) {&lt;br /&gt;
        if (options.options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options.options[i];&lt;br /&gt;
&lt;br /&gt;
          window.context_menu[self.el.id][options.control][option.name] = {&lt;br /&gt;
            title: option.title,&lt;br /&gt;
            action: option.action&lt;br /&gt;
          };&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ul.id = &amp;#039;gmaps_context_menu&amp;#039;;&lt;br /&gt;
      ul.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.position = &amp;#039;absolute&amp;#039;;&lt;br /&gt;
      ul.style.minWidth = &amp;#039;100px&amp;#039;;&lt;br /&gt;
      ul.style.background = &amp;#039;white&amp;#039;;&lt;br /&gt;
      ul.style.listStyle = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.padding = &amp;#039;8px&amp;#039;;&lt;br /&gt;
      ul.style.boxShadow = &amp;#039;2px 2px 6px #ccc&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) {&lt;br /&gt;
        doc.body.appendChild(ul);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      google.maps.event.addDomListener(context_menu_element, &amp;#039;mouseout&amp;#039;, function(ev) {&lt;br /&gt;
        if (!ev.relatedTarget || !this.contains(ev.relatedTarget)) {&lt;br /&gt;
          window.setTimeout(function(){&lt;br /&gt;
            context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
          }, 400);&lt;br /&gt;
        }&lt;br /&gt;
      }, false);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Hide the current context menu&lt;br /&gt;
     */&lt;br /&gt;
    this.hideContextMenu = function() {&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (context_menu_element) {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var setupListener = function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
        if (e == undefined) {&lt;br /&gt;
          e = this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        options[name].apply(this, [e]);&lt;br /&gt;
&lt;br /&gt;
        self.hideContextMenu();&lt;br /&gt;
      });&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    //google.maps.event.addListener(this.map, &amp;#039;idle&amp;#039;, this.hideContextMenu);&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;zoom_changed&amp;#039;, this.hideContextMenu);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_doesnt_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_doesnt_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
      if (options.rightclick) {&lt;br /&gt;
        options.rightclick.apply(this, [e]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(window.context_menu[self.el.id][&amp;#039;map&amp;#039;] != undefined) {&lt;br /&gt;
        self.buildContextMenu(&amp;#039;map&amp;#039;, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Trigger a `resize` event, useful if you need to repaint the current map (for changes in the viewport or display / hide actions).&lt;br /&gt;
     */&lt;br /&gt;
    this.refresh = function() {&lt;br /&gt;
      google.maps.event.trigger(this.map, &amp;#039;resize&amp;#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the markers added in the map.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitZoom = function() {&lt;br /&gt;
      var latLngs = [],&lt;br /&gt;
          markers_length = this.markers.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; markers_length; i++) {&lt;br /&gt;
        if(typeof(this.markers[i].visible) === &amp;#039;boolean&amp;#039; &amp;amp;&amp;amp; this.markers[i].visible) {&lt;br /&gt;
          latLngs.push(this.markers[i].getPosition());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.fitLatLngBounds(latLngs);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the coordinates in the `latLngs` array.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {array} latLngs - Collection of `google.maps.LatLng` objects.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitLatLngBounds = function(latLngs) {&lt;br /&gt;
      var total = latLngs.length,&lt;br /&gt;
          bounds = new google.maps.LatLngBounds(),&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for(i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
        bounds.extend(latLngs[i]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.map.fitBounds(bounds);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Center the map using the `lat` and `lng` coordinates.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} lat - Latitude of the coordinate.&lt;br /&gt;
     * @param {number} lng - Longitude of the coordinate.&lt;br /&gt;
     * @param {function} [callback] - Callback that will be executed after the map is centered.&lt;br /&gt;
     */&lt;br /&gt;
    this.setCenter = function(lat, lng, callback) {&lt;br /&gt;
      this.map.panTo(new google.maps.LatLng(lat, lng));&lt;br /&gt;
&lt;br /&gt;
      if (callback) {&lt;br /&gt;
        callback();&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Return the HTML element container of the map.&lt;br /&gt;
     *&lt;br /&gt;
     * @returns {HTMLElement} the element container.&lt;br /&gt;
     */&lt;br /&gt;
    this.getElement = function() {&lt;br /&gt;
      return this.el;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Increase the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed in.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomIn = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() + value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Decrease the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed out.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomOut = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() - value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var native_methods = [],&lt;br /&gt;
        method;&lt;br /&gt;
&lt;br /&gt;
    for (method in this.map) {&lt;br /&gt;
      if (typeof(this.map[method]) == &amp;#039;function&amp;#039; &amp;amp;&amp;amp; !this[method]) {&lt;br /&gt;
        native_methods.push(method);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; native_methods.length; i++) {&lt;br /&gt;
      (function(gmaps, scope, method_name) {&lt;br /&gt;
        gmaps[method_name] = function(){&lt;br /&gt;
          return scope[method_name].apply(scope, arguments);&lt;br /&gt;
        };&lt;br /&gt;
      })(this, this.map, native_methods[i]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return GMaps;&lt;br /&gt;
})(this);&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createControl = function(options) {&lt;br /&gt;
  var control = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  control.style.cursor = &amp;#039;pointer&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.disableDefaultStyles !== true) {&lt;br /&gt;
    control.style.fontFamily = &amp;#039;Roboto, Arial, sans-serif&amp;#039;;&lt;br /&gt;
    control.style.fontSize = &amp;#039;11px&amp;#039;;&lt;br /&gt;
    control.style.boxShadow = &amp;#039;rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var option in options.style) {&lt;br /&gt;
    control.style[option] = options.style[option];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.id) {&lt;br /&gt;
    control.id = options.id;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.title) {&lt;br /&gt;
    control.title = options.title;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.classes) {&lt;br /&gt;
    control.className = options.classes;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.content) {&lt;br /&gt;
    if (typeof options.content === &amp;#039;string&amp;#039;) {&lt;br /&gt;
      control.innerHTML = options.content;&lt;br /&gt;
    }&lt;br /&gt;
    else if (options.content instanceof HTMLElement) {&lt;br /&gt;
      control.appendChild(options.content);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.position) {&lt;br /&gt;
    control.position = google.maps.ControlPosition[options.position.toUpperCase()];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev in options.events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addDomListener(object, name, function(){&lt;br /&gt;
        options.events[name].apply(this, [this]);&lt;br /&gt;
      });&lt;br /&gt;
    })(control, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  control.index = 1;&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Add a custom control to the map UI.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {object} options - The `options` object should contain:&lt;br /&gt;
 * * `style` (object): The keys and values of this object should be valid CSS properties and values.&lt;br /&gt;
 * * `id` (string): The HTML id for the custom control.&lt;br /&gt;
 * * `classes` (string): A string containing all the HTML classes for the custom control.&lt;br /&gt;
 * * `content` (string or HTML element): The content of the custom control.&lt;br /&gt;
 * * `position` (string): Any valid [`google.maps.ControlPosition`](https://developers.google.com/maps/documentation/javascript/controls#ControlPositioning) value, in lower or upper case.&lt;br /&gt;
 * * `events` (object): The keys of this object should be valid DOM events. The values should be functions.&lt;br /&gt;
 * * `disableDefaultStyles` (boolean): If false, removes the default styles for the controls like font (family and size), and box shadow.&lt;br /&gt;
 * @returns {HTMLElement}&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.addControl = function(options) {&lt;br /&gt;
  var control = this.createControl(options);&lt;br /&gt;
&lt;br /&gt;
  this.controls.push(control);&lt;br /&gt;
  this.map.controls[control.position].push(control);&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Remove a control from the map. `control` should be a control returned by `addControl()`.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {HTMLElement} control - One of the controls returned by `addControl()`.&lt;br /&gt;
 * @returns {HTMLElement} the removed control.&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.removeControl = function(control) {&lt;br /&gt;
  var position = null,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; this.controls.length; i++) {&lt;br /&gt;
    if (this.controls[i] == control) {&lt;br /&gt;
      position = this.controls[i].position;&lt;br /&gt;
      this.controls.splice(i, 1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (position) {&lt;br /&gt;
    for (i = 0; i &amp;lt; this.map.controls.length; i++) {&lt;br /&gt;
      var controlsForPosition = this.map.controls[control.position];&lt;br /&gt;
&lt;br /&gt;
      if (controlsForPosition.getAt(i) == control) {&lt;br /&gt;
        controlsForPosition.removeAt(i);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createMarker = function(options) {&lt;br /&gt;
  if (options.lat == undefined &amp;amp;&amp;amp; options.lng == undefined &amp;amp;&amp;amp; options.position == undefined) {&lt;br /&gt;
    throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      details = options.details,&lt;br /&gt;
      fences = options.fences,&lt;br /&gt;
      outside = options.outside,&lt;br /&gt;
      base_options = {&lt;br /&gt;
        position: new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        map: null&lt;br /&gt;
      },&lt;br /&gt;
      marker_options = extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  delete marker_options.lat;&lt;br /&gt;
  delete marker_options.lng;&lt;br /&gt;
  delete marker_options.fences;&lt;br /&gt;
  delete marker_options.outside;&lt;br /&gt;
&lt;br /&gt;
  var marker = new google.maps.Marker(marker_options);&lt;br /&gt;
&lt;br /&gt;
  marker.fences = fences;&lt;br /&gt;
&lt;br /&gt;
  if (options.infoWindow) {&lt;br /&gt;
    marker.infoWindow = new google.maps.InfoWindow(options.infoWindow);&lt;br /&gt;
&lt;br /&gt;
    var info_window_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;content_changed&amp;#039;, &amp;#039;domready&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; info_window_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        if (options.infoWindow[name]) {&lt;br /&gt;
          google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
            options.infoWindow[name].apply(this, [e]);&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      })(marker.infoWindow, info_window_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var marker_events = [&amp;#039;animation_changed&amp;#039;, &amp;#039;clickable_changed&amp;#039;, &amp;#039;cursor_changed&amp;#039;, &amp;#039;draggable_changed&amp;#039;, &amp;#039;flat_changed&amp;#039;, &amp;#039;icon_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;shadow_changed&amp;#039;, &amp;#039;shape_changed&amp;#039;, &amp;#039;title_changed&amp;#039;, &amp;#039;visible_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  var marker_events_with_mouse = [&amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;, &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this, [this]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(marker, marker_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events_with_mouse.length; ev++) {&lt;br /&gt;
    (function(map, object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(me){&lt;br /&gt;
          if(!me.pixel){&lt;br /&gt;
            me.pixel = map.getProjection().fromLatLngToPoint(me.latLng)&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          options[name].apply(this, [me]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(this.map, marker, marker_events_with_mouse[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
    this.details = details;&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      options.click.apply(this, [this]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      self.hideInfoWindows();&lt;br /&gt;
      marker.infoWindow.open(self.map, marker);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
    e.marker = this;&lt;br /&gt;
&lt;br /&gt;
    if (options.rightclick) {&lt;br /&gt;
      options.rightclick.apply(this, [e]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (window.context_menu[self.el.id][&amp;#039;marker&amp;#039;] != undefined) {&lt;br /&gt;
      self.buildContextMenu(&amp;#039;marker&amp;#039;, e);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    google.maps.event.addListener(marker, &amp;#039;dragend&amp;#039;, function() {&lt;br /&gt;
      self.checkMarkerGeofence(marker, function(m, f) {&lt;br /&gt;
        outside(m, f);&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarker = function(options) {&lt;br /&gt;
  var marker;&lt;br /&gt;
  if(options.hasOwnProperty(&amp;#039;gm_accessors_&amp;#039;)) {&lt;br /&gt;
    // Native google.maps.Marker object&lt;br /&gt;
    marker = options;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if ((options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) || options.position) {&lt;br /&gt;
      marker = this.createMarker(options);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  marker.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if(this.markerClusterer) {&lt;br /&gt;
    this.markerClusterer.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.markers.push(marker);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;marker_added&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarkers = function(array) {&lt;br /&gt;
  for (var i = 0, marker; marker=array[i]; i++) {&lt;br /&gt;
    this.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return this.markers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.hideInfoWindows = function() {&lt;br /&gt;
  for (var i = 0, marker; marker = this.markers[i]; i++){&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      marker.infoWindow.close();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarker = function(marker) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
    if (this.markers[i] === marker) {&lt;br /&gt;
      this.markers[i].setMap(null);&lt;br /&gt;
      this.markers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      if(this.markerClusterer) {&lt;br /&gt;
        this.markerClusterer.removeMarker(marker);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarkers = function (collection) {&lt;br /&gt;
  var new_markers = [];&lt;br /&gt;
&lt;br /&gt;
  if (typeof collection == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(this.markerClusterer &amp;amp;&amp;amp; this.markerClusterer.clearMarkers) {&lt;br /&gt;
      this.markerClusterer.clearMarkers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; collection.length; i++) {&lt;br /&gt;
      var index = this.markers.indexOf(collection[i]);&lt;br /&gt;
&lt;br /&gt;
      if (index &amp;gt; -1) {&lt;br /&gt;
        var marker = this.markers[index];&lt;br /&gt;
        marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
        if(this.markerClusterer) {&lt;br /&gt;
          this.markerClusterer.removeMarker(marker);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      if (marker.getMap() != null) {&lt;br /&gt;
        new_markers.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawOverlay = function(options) {&lt;br /&gt;
  var overlay = new google.maps.OverlayView(),&lt;br /&gt;
      auto_show = true;&lt;br /&gt;
&lt;br /&gt;
  overlay.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if (options.auto_show != null) {&lt;br /&gt;
    auto_show = options.auto_show;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  overlay.onAdd = function() {&lt;br /&gt;
    var el = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    el.style.borderStyle = &amp;quot;none&amp;quot;;&lt;br /&gt;
    el.style.borderWidth = &amp;quot;0px&amp;quot;;&lt;br /&gt;
    el.style.position = &amp;quot;absolute&amp;quot;;&lt;br /&gt;
    el.style.zIndex = 100;&lt;br /&gt;
    el.innerHTML = options.content;&lt;br /&gt;
&lt;br /&gt;
    overlay.el = el;&lt;br /&gt;
&lt;br /&gt;
    if (!options.layer) {&lt;br /&gt;
      options.layer = &amp;#039;overlayLayer&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var panes = this.getPanes(),&lt;br /&gt;
        overlayLayer = panes[options.layer],&lt;br /&gt;
        stop_overlay_events = [&amp;#039;contextmenu&amp;#039;, &amp;#039;DOMMouseScroll&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    overlayLayer.appendChild(el);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; stop_overlay_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        google.maps.event.addDomListener(object, name, function(e){&lt;br /&gt;
          if (navigator.userAgent.toLowerCase().indexOf(&amp;#039;msie&amp;#039;) != -1 &amp;amp;&amp;amp; document.all) {&lt;br /&gt;
            e.cancelBubble = true;&lt;br /&gt;
            e.returnValue = false;&lt;br /&gt;
          }&lt;br /&gt;
          else {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
      })(el, stop_overlay_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      panes.overlayMouseTarget.appendChild(overlay.el);&lt;br /&gt;
      google.maps.event.addDomListener(overlay.el, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
        options.click.apply(overlay, [overlay]);&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.trigger(this, &amp;#039;ready&amp;#039;);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.draw = function() {&lt;br /&gt;
    var projection = this.getProjection(),&lt;br /&gt;
        pixel = projection.fromLatLngToDivPixel(new google.maps.LatLng(options.lat, options.lng));&lt;br /&gt;
&lt;br /&gt;
    options.horizontalOffset = options.horizontalOffset || 0;&lt;br /&gt;
    options.verticalOffset = options.verticalOffset || 0;&lt;br /&gt;
&lt;br /&gt;
    var el = overlay.el,&lt;br /&gt;
        content = el.children[0],&lt;br /&gt;
        content_height = content.clientHeight,&lt;br /&gt;
        content_width = content.clientWidth;&lt;br /&gt;
&lt;br /&gt;
    switch (options.verticalAlign) {&lt;br /&gt;
      case &amp;#039;top&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - content_height + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;middle&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - (content_height / 2) + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;bottom&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (options.horizontalAlign) {&lt;br /&gt;
      case &amp;#039;left&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - content_width + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;center&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - (content_width / 2) + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;right&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    el.style.display = auto_show ? &amp;#039;block&amp;#039; : &amp;#039;none&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (!auto_show) {&lt;br /&gt;
      options.show.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.onRemove = function() {&lt;br /&gt;
    var el = overlay.el;&lt;br /&gt;
&lt;br /&gt;
    if (options.remove) {&lt;br /&gt;
      options.remove.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      overlay.el.parentNode.removeChild(overlay.el);&lt;br /&gt;
      overlay.el = null;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.overlays.push(overlay);&lt;br /&gt;
  return overlay;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlay = function(overlay) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.overlays.length; i++) {&lt;br /&gt;
    if (this.overlays[i] === overlay) {&lt;br /&gt;
      this.overlays[i].setMap(null);&lt;br /&gt;
      this.overlays.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlays = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.overlays[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.overlays = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolyline = function(options) {&lt;br /&gt;
  var path = [],&lt;br /&gt;
      points = options.path;&lt;br /&gt;
&lt;br /&gt;
  if (points.length) {&lt;br /&gt;
    if (points[0][0] === undefined) {&lt;br /&gt;
      path = points;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      for (var i = 0, latlng; latlng = points[i]; i++) {&lt;br /&gt;
        path.push(new google.maps.LatLng(latlng[0], latlng[1]));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    path: path,&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight,&lt;br /&gt;
    geodesic: options.geodesic,&lt;br /&gt;
    clickable: true,&lt;br /&gt;
    editable: false,&lt;br /&gt;
    visible: true&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;clickable&amp;quot;)) {&lt;br /&gt;
    polyline_options.clickable = options.clickable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;editable&amp;quot;)) {&lt;br /&gt;
    polyline_options.editable = options.editable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;zIndex&amp;quot;)) {&lt;br /&gt;
    polyline_options.zIndex = options.zIndex;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline = new google.maps.Polyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
  var polyline_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polyline_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polyline, polyline_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines.push(polyline);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polyline_added&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
  return polyline;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolyline = function(polyline) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polylines.length; i++) {&lt;br /&gt;
    if (this.polylines[i] === polyline) {&lt;br /&gt;
      this.polylines[i].setMap(null);&lt;br /&gt;
      this.polylines.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polyline_removed&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolylines = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polylines[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawCircle = function(options) {&lt;br /&gt;
  options =  extend_object({&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    center: new google.maps.LatLng(options.lat, options.lng)&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Circle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRectangle = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  var latLngBounds = new google.maps.LatLngBounds(&lt;br /&gt;
    new google.maps.LatLng(options.bounds[0][0], options.bounds[0][1]),&lt;br /&gt;
    new google.maps.LatLng(options.bounds[1][0], options.bounds[1][1])&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  options.bounds = latLngBounds;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Rectangle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolygon = function(options) {&lt;br /&gt;
  var useGeoJSON = false;&lt;br /&gt;
&lt;br /&gt;
  if(options.hasOwnProperty(&amp;quot;useGeoJSON&amp;quot;)) {&lt;br /&gt;
    useGeoJSON = options.useGeoJSON;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.useGeoJSON;&lt;br /&gt;
&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON == false) {&lt;br /&gt;
    options.paths = [options.paths.slice(0)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.paths.length &amp;gt; 0) {&lt;br /&gt;
    if (options.paths[0].length &amp;gt; 0) {&lt;br /&gt;
      options.paths = array_flat(array_map(options.paths, arrayToLatLng, useGeoJSON));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Polygon(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polygon_added&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygon = function(polygon) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polygons.length; i++) {&lt;br /&gt;
    if (this.polygons[i] === polygon) {&lt;br /&gt;
      this.polygons[i].setMap(null);&lt;br /&gt;
      this.polygons.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polygon_removed&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygons = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polygons[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromFusionTables = function(options) {&lt;br /&gt;
  var events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var fusion_tables_options = options,&lt;br /&gt;
      layer = new google.maps.FusionTablesLayer(fusion_tables_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromFusionTables = function(options) {&lt;br /&gt;
  var layer = this.getFromFusionTables(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromKML = function(options) {&lt;br /&gt;
  var url = options.url,&lt;br /&gt;
      events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.url;&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var kml_options = options,&lt;br /&gt;
      layer = new google.maps.KmlLayer(url, kml_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromKML = function(options) {&lt;br /&gt;
  var layer = this.getFromKML(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addLayer = function(layerName, options) {&lt;br /&gt;
  //var default_layers = [&amp;#039;weather&amp;#039;, &amp;#039;clouds&amp;#039;, &amp;#039;traffic&amp;#039;, &amp;#039;transit&amp;#039;, &amp;#039;bicycling&amp;#039;, &amp;#039;panoramio&amp;#039;, &amp;#039;places&amp;#039;];&lt;br /&gt;
  options = options || {};&lt;br /&gt;
  var layer;&lt;br /&gt;
&lt;br /&gt;
  switch(layerName) {&lt;br /&gt;
    case &amp;#039;weather&amp;#039;: this.singleLayers.weather = layer = new google.maps.weather.WeatherLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;clouds&amp;#039;: this.singleLayers.clouds = layer = new google.maps.weather.CloudLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;traffic&amp;#039;: this.singleLayers.traffic = layer = new google.maps.TrafficLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;: this.singleLayers.transit = layer = new google.maps.TransitLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;: this.singleLayers.bicycling = layer = new google.maps.BicyclingLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;panoramio&amp;#039;:&lt;br /&gt;
        this.singleLayers.panoramio = layer = new google.maps.panoramio.PanoramioLayer();&lt;br /&gt;
        layer.setTag(options.filter);&lt;br /&gt;
        delete options.filter;&lt;br /&gt;
&lt;br /&gt;
        //click event&lt;br /&gt;
        if (options.click) {&lt;br /&gt;
          google.maps.event.addListener(layer, &amp;#039;click&amp;#039;, function(event) {&lt;br /&gt;
            options.click(event);&lt;br /&gt;
            delete options.click;&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
      case &amp;#039;places&amp;#039;:&lt;br /&gt;
        this.singleLayers.places = layer = new google.maps.places.PlacesService(this.map);&lt;br /&gt;
&lt;br /&gt;
        //search, nearbySearch, radarSearch callback, Both are the same&lt;br /&gt;
        if (options.search || options.nearbySearch || options.radarSearch) {&lt;br /&gt;
          var placeSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            keyword : options.keyword || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            name : options.name || null,&lt;br /&gt;
            radius : options.radius || null,&lt;br /&gt;
            rankBy : options.rankBy || null,&lt;br /&gt;
            types : options.types || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          if (options.radarSearch) {&lt;br /&gt;
            layer.radarSearch(placeSearchRequest, options.radarSearch);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.search) {&lt;br /&gt;
            layer.search(placeSearchRequest, options.search);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.nearbySearch) {&lt;br /&gt;
            layer.nearbySearch(placeSearchRequest, options.nearbySearch);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //textSearch callback&lt;br /&gt;
        if (options.textSearch) {&lt;br /&gt;
          var textSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            query : options.query || null,&lt;br /&gt;
            radius : options.radius || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          layer.textSearch(textSearchRequest, options.textSearch);&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (layer !== undefined) {&lt;br /&gt;
    if (typeof layer.setOptions == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setOptions(options);&lt;br /&gt;
    }&lt;br /&gt;
    if (typeof layer.setMap == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setMap(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return layer;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeLayer = function(layer) {&lt;br /&gt;
  if (typeof(layer) == &amp;quot;string&amp;quot; &amp;amp;&amp;amp; this.singleLayers[layer] !== undefined) {&lt;br /&gt;
     this.singleLayers[layer].setMap(null);&lt;br /&gt;
&lt;br /&gt;
     delete this.singleLayers[layer];&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.layers.length; i++) {&lt;br /&gt;
      if (this.layers[i] === layer) {&lt;br /&gt;
        this.layers[i].setMap(null);&lt;br /&gt;
        this.layers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var travelMode, unitSystem;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getRoutes = function(options) {&lt;br /&gt;
  switch (options.travelMode) {&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.BICYCLING;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.TRANSIT;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;driving&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.DRIVING;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      travelMode = google.maps.TravelMode.WALKING;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.unitSystem === &amp;#039;imperial&amp;#039;) {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.IMPERIAL;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.METRIC;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var base_options = {&lt;br /&gt;
        avoidHighways: false,&lt;br /&gt;
        avoidTolls: false,&lt;br /&gt;
        optimizeWaypoints: false,&lt;br /&gt;
        waypoints: []&lt;br /&gt;
      },&lt;br /&gt;
      request_options =  extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]);&lt;br /&gt;
  request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]);&lt;br /&gt;
  request_options.travelMode = travelMode;&lt;br /&gt;
  request_options.unitSystem = unitSystem;&lt;br /&gt;
&lt;br /&gt;
  delete request_options.callback;&lt;br /&gt;
  delete request_options.error;&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      routes = [],&lt;br /&gt;
      service = new google.maps.DirectionsService();&lt;br /&gt;
&lt;br /&gt;
  service.route(request_options, function(result, status) {&lt;br /&gt;
    if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
      for (var r in result.routes) {&lt;br /&gt;
        if (result.routes.hasOwnProperty(r)) {&lt;br /&gt;
          routes.push(result.routes[r]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback(routes, result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      if (options.error) {&lt;br /&gt;
        options.error(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeRoutes = function() {&lt;br /&gt;
  this.routes.length = 0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getElevations = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    locations: [],&lt;br /&gt;
    path : false,&lt;br /&gt;
    samples : 256&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (options.locations.length &amp;gt; 0) {&lt;br /&gt;
    if (options.locations[0].length &amp;gt; 0) {&lt;br /&gt;
      options.locations = array_flat(array_map([options.locations], arrayToLatLng,  false));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
&lt;br /&gt;
  var service = new google.maps.ElevationService();&lt;br /&gt;
&lt;br /&gt;
  //location request&lt;br /&gt;
  if (!options.path) {&lt;br /&gt;
    delete options.path;&lt;br /&gt;
    delete options.samples;&lt;br /&gt;
&lt;br /&gt;
    service.getElevationForLocations(options, function(result, status) {&lt;br /&gt;
      if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  //path request&lt;br /&gt;
  } else {&lt;br /&gt;
    var pathRequest = {&lt;br /&gt;
      path : options.locations,&lt;br /&gt;
      samples : options.samples&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    service.getElevationAlongPath(pathRequest, function(result, status) {&lt;br /&gt;
     if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.renderRoute = function(options, renderOptions) {&lt;br /&gt;
  var self = this,&lt;br /&gt;
      panel = ((typeof renderOptions.panel === &amp;#039;string&amp;#039;) ? document.getElementById(renderOptions.panel.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;)) : renderOptions.panel),&lt;br /&gt;
      display;&lt;br /&gt;
&lt;br /&gt;
  renderOptions.panel = panel;&lt;br /&gt;
  renderOptions = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, renderOptions);&lt;br /&gt;
  display = new google.maps.DirectionsRenderer(renderOptions);&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes, response, status) {&lt;br /&gt;
      if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
        display.setDirections(response);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes) {&lt;br /&gt;
      if (routes.length &amp;gt; 0) {&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: routes[routes.length - 1].overview_path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
        if (options.callback) {&lt;br /&gt;
          options.callback(routes[routes.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.travelRoute = function(options) {&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      unitSystem: options.unitSystem,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawSteppedRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              var polyline_options = {&lt;br /&gt;
                path: step.path,&lt;br /&gt;
                strokeColor: options.strokeColor,&lt;br /&gt;
                strokeOpacity: options.strokeOpacity,&lt;br /&gt;
                strokeWeight: options.strokeWeight&lt;br /&gt;
              };&lt;br /&gt;
&lt;br /&gt;
              if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
                polyline_options.icons = options.icons;&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              self.drawPolyline(polyline_options);&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: step.path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route = function(options) {&lt;br /&gt;
  this.origin = options.origin;&lt;br /&gt;
  this.destination = options.destination;&lt;br /&gt;
  this.waypoints = options.waypoints;&lt;br /&gt;
&lt;br /&gt;
  this.map = options.map;&lt;br /&gt;
  this.route = options.route;&lt;br /&gt;
  this.step_count = 0;&lt;br /&gt;
  this.steps = this.route.legs[0].steps;&lt;br /&gt;
  this.steps_length = this.steps.length;&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    path: new google.maps.MVCArray(),&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polyline = this.map.drawPolyline(polyline_options).getPath();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.getRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.map.getRoutes({&lt;br /&gt;
    origin : this.origin,&lt;br /&gt;
    destination : this.destination,&lt;br /&gt;
    travelMode : options.travelMode,&lt;br /&gt;
    waypoints : this.waypoints || [],&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    callback : function() {&lt;br /&gt;
      self.route = e[0];&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback.call(self);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.back = function() {&lt;br /&gt;
  if (this.step_count &amp;gt; 0) {&lt;br /&gt;
    this.step_count--;&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.pop();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.forward = function() {&lt;br /&gt;
  if (this.step_count &amp;lt; this.steps_length) {&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.push(path[p]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    this.step_count++;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkGeofence = function(lat, lng, fence) {&lt;br /&gt;
  return fence.containsLatLng(new google.maps.LatLng(lat, lng));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkMarkerGeofence = function(marker, outside_callback) {&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    for (var i = 0, fence; fence = marker.fences[i]; i++) {&lt;br /&gt;
      var pos = marker.getPosition();&lt;br /&gt;
      if (!this.checkGeofence(pos.lat(), pos.lng(), fence)) {&lt;br /&gt;
        outside_callback(marker, fence);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.toImage = function(options) {&lt;br /&gt;
  var options = options || {},&lt;br /&gt;
      static_map_options = {};&lt;br /&gt;
&lt;br /&gt;
  static_map_options[&amp;#039;size&amp;#039;] = options[&amp;#039;size&amp;#039;] || [this.el.clientWidth, this.el.clientHeight];&lt;br /&gt;
  static_map_options[&amp;#039;lat&amp;#039;] = this.getCenter().lat();&lt;br /&gt;
  static_map_options[&amp;#039;lng&amp;#039;] = this.getCenter().lng();&lt;br /&gt;
&lt;br /&gt;
  if (this.markers.length &amp;gt; 0) {&lt;br /&gt;
    static_map_options[&amp;#039;markers&amp;#039;] = [];&lt;br /&gt;
    &lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      static_map_options[&amp;#039;markers&amp;#039;].push({&lt;br /&gt;
        lat: this.markers[i].getPosition().lat(),&lt;br /&gt;
        lng: this.markers[i].getPosition().lng()&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (this.polylines.length &amp;gt; 0) {&lt;br /&gt;
    var polyline = this.polylines[0];&lt;br /&gt;
    &lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;] = {};&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;path&amp;#039;] = google.maps.geometry.encoding.encodePath(polyline.getPath());&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeColor&amp;#039;] = polyline.strokeColor&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeOpacity&amp;#039;] = polyline.strokeOpacity&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeWeight&amp;#039;] = polyline.strokeWeight&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return GMaps.staticMapURL(static_map_options);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.staticMapURL = function(options){&lt;br /&gt;
  var parameters = [],&lt;br /&gt;
      data,&lt;br /&gt;
      static_root = (location.protocol === &amp;#039;file:&amp;#039; ? &amp;#039;http:&amp;#039; : location.protocol ) + &amp;#039;//maps.googleapis.com/maps/api/staticmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.url) {&lt;br /&gt;
    static_root = options.url;&lt;br /&gt;
    delete options.url;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  static_root += &amp;#039;?&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  var markers = options.markers;&lt;br /&gt;
  &lt;br /&gt;
  delete options.markers;&lt;br /&gt;
&lt;br /&gt;
  if (!markers &amp;amp;&amp;amp; options.marker) {&lt;br /&gt;
    markers = [options.marker];&lt;br /&gt;
    delete options.marker;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var styles = options.styles;&lt;br /&gt;
&lt;br /&gt;
  delete options.styles;&lt;br /&gt;
&lt;br /&gt;
  var polyline = options.polyline;&lt;br /&gt;
  delete options.polyline;&lt;br /&gt;
&lt;br /&gt;
  /** Map options **/&lt;br /&gt;
  if (options.center) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.center);&lt;br /&gt;
    delete options.center;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.address) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.address);&lt;br /&gt;
    delete options.address;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.lat) {&lt;br /&gt;
    parameters.push([&amp;#039;center=&amp;#039;, options.lat, &amp;#039;,&amp;#039;, options.lng].join(&amp;#039;&amp;#039;));&lt;br /&gt;
    delete options.lat;&lt;br /&gt;
    delete options.lng;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.visible) {&lt;br /&gt;
    var visible = encodeURI(options.visible.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
    parameters.push(&amp;#039;visible=&amp;#039; + visible);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var size = options.size;&lt;br /&gt;
  if (size) {&lt;br /&gt;
    if (size.join) {&lt;br /&gt;
      size = size.join(&amp;#039;x&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    delete options.size;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    size = &amp;#039;630x300&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  parameters.push(&amp;#039;size=&amp;#039; + size);&lt;br /&gt;
&lt;br /&gt;
  if (!options.zoom &amp;amp;&amp;amp; options.zoom !== false) {&lt;br /&gt;
    options.zoom = 15;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var sensor = options.hasOwnProperty(&amp;#039;sensor&amp;#039;) ? !!options.sensor : true;&lt;br /&gt;
  delete options.sensor;&lt;br /&gt;
  parameters.push(&amp;#039;sensor=&amp;#039; + sensor);&lt;br /&gt;
&lt;br /&gt;
  for (var param in options) {&lt;br /&gt;
    if (options.hasOwnProperty(param)) {&lt;br /&gt;
      parameters.push(param + &amp;#039;=&amp;#039; + options[param]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Markers **/&lt;br /&gt;
  if (markers) {&lt;br /&gt;
    var marker, loc;&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; data = markers[i]; i++) {&lt;br /&gt;
      marker = [];&lt;br /&gt;
&lt;br /&gt;
      if (data.size &amp;amp;&amp;amp; data.size !== &amp;#039;normal&amp;#039;) {&lt;br /&gt;
        marker.push(&amp;#039;size:&amp;#039; + data.size);&lt;br /&gt;
        delete data.size;&lt;br /&gt;
      }&lt;br /&gt;
      else if (data.icon) {&lt;br /&gt;
        marker.push(&amp;#039;icon:&amp;#039; + encodeURI(data.icon));&lt;br /&gt;
        delete data.icon;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.color) {&lt;br /&gt;
        marker.push(&amp;#039;color:&amp;#039; + data.color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;));&lt;br /&gt;
        delete data.color;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.label) {&lt;br /&gt;
        marker.push(&amp;#039;label:&amp;#039; + data.label[0].toUpperCase());&lt;br /&gt;
        delete data.label;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      loc = (data.address ? data.address : data.lat + &amp;#039;,&amp;#039; + data.lng);&lt;br /&gt;
      delete data.address;&lt;br /&gt;
      delete data.lat;&lt;br /&gt;
      delete data.lng;&lt;br /&gt;
&lt;br /&gt;
      for(var param in data){&lt;br /&gt;
        if (data.hasOwnProperty(param)) {&lt;br /&gt;
          marker.push(param + &amp;#039;:&amp;#039; + data[param]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (marker.length || i === 0) {&lt;br /&gt;
        marker.push(loc);&lt;br /&gt;
        marker = marker.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
        parameters.push(&amp;#039;markers=&amp;#039; + encodeURI(marker));&lt;br /&gt;
      }&lt;br /&gt;
      // New marker without styles&lt;br /&gt;
      else {&lt;br /&gt;
        marker = parameters.pop() + encodeURI(&amp;#039;|&amp;#039; + loc);&lt;br /&gt;
        parameters.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Map Styles **/&lt;br /&gt;
  if (styles) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; styles.length; i++) {&lt;br /&gt;
      var styleRule = [];&lt;br /&gt;
      if (styles[i].featureType){&lt;br /&gt;
        styleRule.push(&amp;#039;feature:&amp;#039; + styles[i].featureType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (styles[i].elementType) {&lt;br /&gt;
        styleRule.push(&amp;#039;element:&amp;#039; + styles[i].elementType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      for (var j = 0; j &amp;lt; styles[i].stylers.length; j++) {&lt;br /&gt;
        for (var p in styles[i].stylers[j]) {&lt;br /&gt;
          var ruleArg = styles[i].stylers[j][p];&lt;br /&gt;
          if (p == &amp;#039;hue&amp;#039; || p == &amp;#039;color&amp;#039;) {&lt;br /&gt;
            ruleArg = &amp;#039;0x&amp;#039; + ruleArg.substring(1);&lt;br /&gt;
          }&lt;br /&gt;
          styleRule.push(p + &amp;#039;:&amp;#039; + ruleArg);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var rule = styleRule.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
      if (rule != &amp;#039;&amp;#039;) {&lt;br /&gt;
        parameters.push(&amp;#039;style=&amp;#039; + rule);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Polylines **/&lt;br /&gt;
  function parseColor(color, opacity) {&lt;br /&gt;
    if (color[0] === &amp;#039;#&amp;#039;){&lt;br /&gt;
      color = color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (opacity) {&lt;br /&gt;
        opacity = parseFloat(opacity);&lt;br /&gt;
        opacity = Math.min(1, Math.max(opacity, 0));&lt;br /&gt;
        if (opacity === 0) {&lt;br /&gt;
          return &amp;#039;0x00000000&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        opacity = (opacity * 255).toString(16);&lt;br /&gt;
        if (opacity.length === 1) {&lt;br /&gt;
          opacity += opacity;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        color = color.slice(0,8) + opacity;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return color;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (polyline) {&lt;br /&gt;
    data = polyline;&lt;br /&gt;
    polyline = [];&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeWeight) {&lt;br /&gt;
      polyline.push(&amp;#039;weight:&amp;#039; + parseInt(data.strokeWeight, 10));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeColor) {&lt;br /&gt;
      var color = parseColor(data.strokeColor, data.strokeOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;color:&amp;#039; + color);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.fillColor) {&lt;br /&gt;
      var fillcolor = parseColor(data.fillColor, data.fillOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;fillcolor:&amp;#039; + fillcolor);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var path = data.path;&lt;br /&gt;
    if (path.join) {&lt;br /&gt;
      for (var j=0, pos; pos=path[j]; j++) {&lt;br /&gt;
        polyline.push(pos.join(&amp;#039;,&amp;#039;));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      polyline.push(&amp;#039;enc:&amp;#039; + path);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    polyline = polyline.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
    parameters.push(&amp;#039;path=&amp;#039; + encodeURI(polyline));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Retina support **/&lt;br /&gt;
  var dpi = window.devicePixelRatio || 1;&lt;br /&gt;
  parameters.push(&amp;#039;scale=&amp;#039; + dpi);&lt;br /&gt;
&lt;br /&gt;
  parameters = parameters.join(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
  return static_root + parameters;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMapType = function(mapTypeId, options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTileUrl&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTileUrl&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    options.tileSize = options.tileSize || new google.maps.Size(256, 256);&lt;br /&gt;
&lt;br /&gt;
    var mapType = new google.maps.ImageMapType(options);&lt;br /&gt;
&lt;br /&gt;
    this.map.mapTypes.set(mapTypeId, mapType);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTileUrl&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addOverlayMapType = function(options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTile&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTile&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    var overlayMapTypeIndex = options.index;&lt;br /&gt;
&lt;br /&gt;
    delete options.index;&lt;br /&gt;
&lt;br /&gt;
    this.map.overlayMapTypes.insertAt(overlayMapTypeIndex, options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTile&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlayMapType = function(overlayMapTypeIndex) {&lt;br /&gt;
  this.map.overlayMapTypes.removeAt(overlayMapTypeIndex);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addStyle = function(options) {&lt;br /&gt;
  var styledMapType = new google.maps.StyledMapType(options.styles, { name: options.styledMapName });&lt;br /&gt;
&lt;br /&gt;
  this.map.mapTypes.set(options.mapTypeId, styledMapType);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.setStyle = function(mapTypeId) {&lt;br /&gt;
  this.map.setMapTypeId(mapTypeId);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createPanorama = function(streetview_options) {&lt;br /&gt;
  if (!streetview_options.hasOwnProperty(&amp;#039;lat&amp;#039;) || !streetview_options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    streetview_options.lat = this.getCenter().lat();&lt;br /&gt;
    streetview_options.lng = this.getCenter().lng();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.panorama = GMaps.createPanorama(streetview_options);&lt;br /&gt;
&lt;br /&gt;
  this.map.setStreetView(this.panorama);&lt;br /&gt;
&lt;br /&gt;
  return this.panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.createPanorama = function(options) {&lt;br /&gt;
  var el = getElementById(options.el, options.context);&lt;br /&gt;
&lt;br /&gt;
  options.position = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
&lt;br /&gt;
  delete options.el;&lt;br /&gt;
  delete options.context;&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var streetview_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;links_changed&amp;#039;, &amp;#039;pano_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;pov_changed&amp;#039;, &amp;#039;resize&amp;#039;, &amp;#039;visible_changed&amp;#039;],&lt;br /&gt;
      streetview_options = extend_object({visible : true}, options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    delete streetview_options[streetview_events[i]];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var panorama = new google.maps.StreetViewPanorama(el, streetview_options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(panorama, streetview_events[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.on = function(event_name, handler) {&lt;br /&gt;
  return GMaps.on(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.off = function(event_name) {&lt;br /&gt;
  GMaps.off(event_name, this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.once = function(event_name, handler) {&lt;br /&gt;
  return GMaps.once(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.custom_events = [&amp;#039;marker_added&amp;#039;, &amp;#039;marker_removed&amp;#039;, &amp;#039;polyline_added&amp;#039;, &amp;#039;polyline_removed&amp;#039;, &amp;#039;polygon_added&amp;#039;, &amp;#039;polygon_removed&amp;#039;, &amp;#039;geolocated&amp;#039;, &amp;#039;geolocation_failed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
GMaps.on = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    return google.maps.event.addListener(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    var registered_event = {&lt;br /&gt;
      handler : handler,&lt;br /&gt;
      eventName : event_name&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    object.registered_events[event_name] = object.registered_events[event_name] || [];&lt;br /&gt;
    object.registered_events[event_name].push(registered_event);&lt;br /&gt;
&lt;br /&gt;
    return registered_event;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.off = function(event_name, object) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    google.maps.event.clearListeners(object, event_name);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    object.registered_events[event_name] = [];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.once = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map;&lt;br /&gt;
    return google.maps.event.addListenerOnce(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.fire = function(event_name, object, scope) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    google.maps.event.trigger(object, event_name, Array.prototype.slice.apply(arguments).slice(2));&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if(event_name in scope.registered_events) {&lt;br /&gt;
      var firing_events = scope.registered_events[event_name];&lt;br /&gt;
&lt;br /&gt;
      for(var i = 0; i &amp;lt; firing_events.length; i++) {&lt;br /&gt;
        (function(handler, scope, object) {&lt;br /&gt;
          handler.apply(scope, [object]);&lt;br /&gt;
        })(firing_events[i][&amp;#039;handler&amp;#039;], scope, object);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geolocate = function(options) {&lt;br /&gt;
  var complete_callback = options.always || options.complete;&lt;br /&gt;
&lt;br /&gt;
  if (navigator.geolocation) {&lt;br /&gt;
    navigator.geolocation.getCurrentPosition(function(position) {&lt;br /&gt;
      options.success(position);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, function(error) {&lt;br /&gt;
      options.error(error);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, options.options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    options.not_supported();&lt;br /&gt;
&lt;br /&gt;
    if (complete_callback) {&lt;br /&gt;
      complete_callback();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geocode = function(options) {&lt;br /&gt;
  this.geocoder = new google.maps.Geocoder();&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  if (options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    options.latLng = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
  &lt;br /&gt;
  this.geocoder.geocode(options, function(results, status) {&lt;br /&gt;
    callback(results, status);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
if (typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps) {&lt;br /&gt;
  //==========================&lt;br /&gt;
  // Polygon containsLatLng&lt;br /&gt;
  // https://github.com/tparkin/Google-Maps-Point-in-Polygon&lt;br /&gt;
  // Poygon getBounds extension - google-maps-extensions&lt;br /&gt;
  // http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js&lt;br /&gt;
  if (!google.maps.Polygon.prototype.getBounds) {&lt;br /&gt;
    google.maps.Polygon.prototype.getBounds = function(latLng) {&lt;br /&gt;
      var bounds = new google.maps.LatLngBounds();&lt;br /&gt;
      var paths = this.getPaths();&lt;br /&gt;
      var path;&lt;br /&gt;
&lt;br /&gt;
      for (var p = 0; p &amp;lt; paths.getLength(); p++) {&lt;br /&gt;
        path = paths.getAt(p);&lt;br /&gt;
        for (var i = 0; i &amp;lt; path.getLength(); i++) {&lt;br /&gt;
          bounds.extend(path.getAt(i));&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return bounds;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Polygon.prototype.containsLatLng) {&lt;br /&gt;
    // Polygon containsLatLng - method to determine if a latLng is within a polygon&lt;br /&gt;
    google.maps.Polygon.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      // Exclude points outside of bounds as there is no way they are in the poly&lt;br /&gt;
      var bounds = this.getBounds();&lt;br /&gt;
&lt;br /&gt;
      if (bounds !== null &amp;amp;&amp;amp; !bounds.contains(latLng)) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Raycast point in polygon method&lt;br /&gt;
      var inPoly = false;&lt;br /&gt;
&lt;br /&gt;
      var numPaths = this.getPaths().getLength();&lt;br /&gt;
      for (var p = 0; p &amp;lt; numPaths; p++) {&lt;br /&gt;
        var path = this.getPaths().getAt(p);&lt;br /&gt;
        var numPoints = path.getLength();&lt;br /&gt;
        var j = numPoints - 1;&lt;br /&gt;
&lt;br /&gt;
        for (var i = 0; i &amp;lt; numPoints; i++) {&lt;br /&gt;
          var vertex1 = path.getAt(i);&lt;br /&gt;
          var vertex2 = path.getAt(j);&lt;br /&gt;
&lt;br /&gt;
          if (vertex1.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex2.lng() &amp;gt;= latLng.lng() || vertex2.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex1.lng() &amp;gt;= latLng.lng()) {&lt;br /&gt;
            if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) &amp;lt; latLng.lat()) {&lt;br /&gt;
              inPoly = !inPoly;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          j = i;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return inPoly;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Circle.prototype.containsLatLng) {&lt;br /&gt;
    google.maps.Circle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      if (google.maps.geometry) {&lt;br /&gt;
        return google.maps.geometry.spherical.computeDistanceBetween(this.getCenter(), latLng) &amp;lt;= this.getRadius();&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.Rectangle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.getBounds().contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.setFences = function(fences) {&lt;br /&gt;
    this.fences = fences;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.addFence = function(fence) {&lt;br /&gt;
    this.fences.push(fence);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.getId = function() {&lt;br /&gt;
    return this[&amp;#039;__gm_id&amp;#039;];&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==========================&lt;br /&gt;
// Array indexOf&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf&lt;br /&gt;
if (!Array.prototype.indexOf) {&lt;br /&gt;
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {&lt;br /&gt;
      &amp;quot;use strict&amp;quot;;&lt;br /&gt;
      if (this == null) {&lt;br /&gt;
          throw new TypeError();&lt;br /&gt;
      }&lt;br /&gt;
      var t = Object(this);&lt;br /&gt;
      var len = t.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
      if (len === 0) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var n = 0;&lt;br /&gt;
      if (arguments.length &amp;gt; 1) {&lt;br /&gt;
          n = Number(arguments[1]);&lt;br /&gt;
          if (n != n) { // shortcut for verifying if it&amp;#039;s NaN&lt;br /&gt;
              n = 0;&lt;br /&gt;
          } else if (n != 0 &amp;amp;&amp;amp; n != Infinity &amp;amp;&amp;amp; n != -Infinity) {&lt;br /&gt;
              n = (n &amp;gt; 0 || -1) * Math.floor(Math.abs(n));&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      if (n &amp;gt;= len) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var k = n &amp;gt;= 0 ? n : Math.max(len - Math.abs(n), 0);&lt;br /&gt;
      for (; k &amp;lt; len; k++) {&lt;br /&gt;
          if (k in t &amp;amp;&amp;amp; t[k] === searchElement) {&lt;br /&gt;
              return k;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return GMaps;&lt;br /&gt;
}));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
approve.js&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
howlerjs.com - Cross Plattform Audio&lt;br /&gt;
&lt;br /&gt;
== Browser Fixing ==&lt;br /&gt;
[[JavaScript - iOS Orientation Change Fix]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22919</id>
		<title>JavaScript - Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22919"/>
		<updated>2018-03-30T07:15:46Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Fancybox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Libraries Skripte und Plugins für JavaScript, sortiert nach Kategorien&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.jqueryscript.net/&lt;br /&gt;
&lt;br /&gt;
== Images Loaded ==&lt;br /&gt;
Testen ob alle Bilder geladen sind, um dann weitere Funktionen auzuführen.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Images Loaded]]&lt;br /&gt;
== Events ==&lt;br /&gt;
=== Gesture Recognition ===&lt;br /&gt;
[[JavaScript - hammer.js Webapp Touch Gestures]]&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
=== CreateJS ===&lt;br /&gt;
Tools für Animation und Interaktion&lt;br /&gt;
&lt;br /&gt;
http://createjs.com&lt;br /&gt;
&lt;br /&gt;
=== jQuery Appear ===&lt;br /&gt;
[[jQuery Appear - Plugin]] - Events wenn Elemente im Viewport auftauchen / verschwinden&lt;br /&gt;
&lt;br /&gt;
=== jQuery Easing ===&lt;br /&gt;
Easing Kurven für Animationen [[jQuery Easing - Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Simple Text Rotator ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Simple Text Rotator&lt;br /&gt;
!function(e){var t={animation:&amp;quot;dissolve&amp;quot;,separator:&amp;quot;,&amp;quot;,speed:2e3};e.fn.textrotator=function(n){var r=e.extend({},t,n);return this.each(function(){var t=e(this);var n=[];e.each(t.text().split(r.separator),function(e,t){n.push(t)});t.text(n[0]);var i=function(){switch(r.animation){case&amp;quot;dissolve&amp;quot;:t.animate({textShadowBlur:20,opacity:0},500,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).animate({textShadowBlur:0,opacity:1},500)});break;case&amp;quot;flip&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,transform:&amp;quot; rotateY(-180deg)&amp;quot;});break;case&amp;quot;flipUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,transform:&amp;quot; rotateX(-180deg)&amp;quot;});break;case&amp;quot;flipCube&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,transform:&amp;quot; rotateY(180deg)&amp;quot;});break;case&amp;quot;flipCubeUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,transform:&amp;quot; rotateX(180deg)&amp;quot;});break;case&amp;quot;spin&amp;quot;:if(t.find(&amp;quot;.rotating&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.rotating&amp;quot;).html())}s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating spin&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().text(n[s+1]).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotate(0) scale(1)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,transform:&amp;quot;rotate(0) scale(1)&amp;quot;});break;case&amp;quot;fade&amp;quot;:t.fadeOut(r.speed,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).fadeIn(r.speed)});break}};setInterval(i,r.speed)})}}(window.jQuery)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wow Reveal Animations ===&lt;br /&gt;
Kostenpflichtig für kommerzielle Seiten. Developer Lizenz ca 99$. Enthalten z.B. bei angelajochum.de. Kann kostenlos geladen werden zum testen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthieua/WOW&lt;br /&gt;
&lt;br /&gt;
http://mynameismatthieu.com/WOW/index.html&lt;br /&gt;
&lt;br /&gt;
=== Flippy Text Effekt ===&lt;br /&gt;
https://github.com/yemM/flippy&lt;br /&gt;
&lt;br /&gt;
Verwendet in Hera Template&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
=== Pushy ===&lt;br /&gt;
Gutes Mobiles Off-Canvas Menu&lt;br /&gt;
&lt;br /&gt;
[[Pushy Menu]]&lt;br /&gt;
=== Meanmenu ===&lt;br /&gt;
Verwandelt ein Normales verschachteltes Menu in ein gut zu bediendendes Mobiles Menu.&lt;br /&gt;
&lt;br /&gt;
[[Meanmenu.js - jQuery Plugin]] (1.x,2.x)&lt;br /&gt;
&lt;br /&gt;
=== jQuery Mobile Menu ===&lt;br /&gt;
Mobiles Dropdownmenü aus ul Liste&lt;br /&gt;
&lt;br /&gt;
[[jQuery Mobile Menu - Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Parallax ==&lt;br /&gt;
=== Parallax selbst gemacht ===&lt;br /&gt;
[[Parallax Effekt selbst gemacht]]&lt;br /&gt;
&lt;br /&gt;
=== jquery-parallax (jQuery) ===&lt;br /&gt;
Einfach und effektiv.&lt;br /&gt;
&lt;br /&gt;
[[jquery-parallax]]&lt;br /&gt;
&lt;br /&gt;
=== Stellar.js ===&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/&lt;br /&gt;
&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/docs/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*! Stellar.js v0.6.2 | Copyright 2014, Mark Dalgleish | http://markdalgleish.com/projects/stellar.js | http://markdalgleish.mit-license.org */&lt;br /&gt;
!function(a,b,c,d){function e(b,c){this.element=b,this.options=a.extend({},g,c),this._defaults=g,this._name=f,this.init()}var f=&amp;quot;stellar&amp;quot;,g={scrollProperty:&amp;quot;scroll&amp;quot;,positionProperty:&amp;quot;position&amp;quot;,horizontalScrolling:!0,verticalScrolling:!0,horizontalOffset:0,verticalOffset:0,responsive:!1,parallaxBackgrounds:!0,parallaxElements:!0,hideDistantElements:!0,hideElement:function(a){a.hide()},showElement:function(a){a.show()}},h={scroll:{getLeft:function(a){return a.scrollLeft()},setLeft:function(a,b){a.scrollLeft(b)},getTop:function(a){return a.scrollTop()},setTop:function(a,b){a.scrollTop(b)}},position:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;top&amp;quot;),10)}},margin:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;margin-left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;margin-top&amp;quot;),10)}},transform:{getLeft:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[4],10):0},getTop:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[5],10):0}}},i={position:{setLeft:function(a,b){a.css(&amp;quot;left&amp;quot;,b)},setTop:function(a,b){a.css(&amp;quot;top&amp;quot;,b)}},transform:{setPosition:function(a,b,c,d,e){a[0].style[k]=&amp;quot;translate3d(&amp;quot;+(b-c)+&amp;quot;px, &amp;quot;+(d-e)+&amp;quot;px, 0)&amp;quot;}}},j=function(){var b,c=/^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/,d=a(&amp;quot;script&amp;quot;)[0].style,e=&amp;quot;&amp;quot;;for(b in d)if(c.test(b)){e=b.match(c)[0];break}return&amp;quot;WebkitOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Webkit&amp;quot;),&amp;quot;KhtmlOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Khtml&amp;quot;),function(a){return e+(e.length&amp;gt;0?a.charAt(0).toUpperCase()+a.slice(1):a)}}(),k=j(&amp;quot;transform&amp;quot;),l=a(&amp;quot;&amp;lt;div /&amp;gt;&amp;quot;,{style:&amp;quot;background:#fff&amp;quot;}).css(&amp;quot;background-position-x&amp;quot;)!==d,m=l?function(a,b,c){a.css({&amp;quot;background-position-x&amp;quot;:b,&amp;quot;background-position-y&amp;quot;:c})}:function(a,b,c){a.css(&amp;quot;background-position&amp;quot;,b+&amp;quot; &amp;quot;+c)},n=l?function(a){return[a.css(&amp;quot;background-position-x&amp;quot;),a.css(&amp;quot;background-position-y&amp;quot;)]}:function(a){return a.css(&amp;quot;background-position&amp;quot;).split(&amp;quot; &amp;quot;)},o=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a){setTimeout(a,1e3/60)};e.prototype={init:function(){this.options.name=f+&amp;quot;_&amp;quot;+Math.floor(1e9*Math.random()),this._defineElements(),this._defineGetters(),this._defineSetters(),this._handleWindowLoadAndResize(),this._detectViewport(),this.refresh({firstLoad:!0}),&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this._handleScrollEvent():this._startAnimationLoop()},_defineElements:function(){this.element===c.body&amp;amp;&amp;amp;(this.element=b),this.$scrollElement=a(this.element),this.$element=this.element===b?a(&amp;quot;body&amp;quot;):this.$scrollElement,this.$viewportElement=this.options.viewportElement!==d?a(this.options.viewportElement):this.$scrollElement[0]===b||&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this.$scrollElement:this.$scrollElement.parent()},_defineGetters:function(){var a=this,b=h[a.options.scrollProperty];this._getScrollLeft=function(){return b.getLeft(a.$scrollElement)},this._getScrollTop=function(){return b.getTop(a.$scrollElement)}},_defineSetters:function(){var b=this,c=h[b.options.scrollProperty],d=i[b.options.positionProperty],e=c.setLeft,f=c.setTop;this._setScrollLeft=&amp;quot;function&amp;quot;==typeof e?function(a){e(b.$scrollElement,a)}:a.noop,this._setScrollTop=&amp;quot;function&amp;quot;==typeof f?function(a){f(b.$scrollElement,a)}:a.noop,this._setPosition=d.setPosition||function(a,c,e,f,g){b.options.horizontalScrolling&amp;amp;&amp;amp;d.setLeft(a,c,e),b.options.verticalScrolling&amp;amp;&amp;amp;d.setTop(a,f,g)}},_handleWindowLoadAndResize:function(){var c=this,d=a(b);c.options.responsive&amp;amp;&amp;amp;d.bind(&amp;quot;load.&amp;quot;+this.name,function(){c.refresh()}),d.bind(&amp;quot;resize.&amp;quot;+this.name,function(){c._detectViewport(),c.options.responsive&amp;amp;&amp;amp;c.refresh()})},refresh:function(c){var d=this,e=d._getScrollLeft(),f=d._getScrollTop();c&amp;amp;&amp;amp;c.firstLoad||this._reset(),this._setScrollLeft(0),this._setScrollTop(0),this._setOffsets(),this._findParticles(),this._findBackgrounds(),c&amp;amp;&amp;amp;c.firstLoad&amp;amp;&amp;amp;/WebKit/.test(navigator.userAgent)&amp;amp;&amp;amp;a(b).load(function(){var a=d._getScrollLeft(),b=d._getScrollTop();d._setScrollLeft(a+1),d._setScrollTop(b+1),d._setScrollLeft(a),d._setScrollTop(b)}),this._setScrollLeft(e),this._setScrollTop(f)},_detectViewport:function(){var a=this.$viewportElement.offset(),b=null!==a&amp;amp;&amp;amp;a!==d;this.viewportWidth=this.$viewportElement.width(),this.viewportHeight=this.$viewportElement.height(),this.viewportOffsetTop=b?a.top:0,this.viewportOffsetLeft=b?a.left:0},_findParticles:function(){{var b=this;this._getScrollLeft(),this._getScrollTop()}if(this.particles!==d)for(var c=this.particles.length-1;c&amp;gt;=0;c--)this.particles[c].$element.data(&amp;quot;stellar-elementIsActive&amp;quot;,d);this.particles=[],this.options.parallaxElements&amp;amp;&amp;amp;this.$element.find(&amp;quot;[data-stellar-ratio]&amp;quot;).each(function(){var c,e,f,g,h,i,j,k,l,m=a(this),n=0,o=0,p=0,q=0;if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)){if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)!==this)return}else m.data(&amp;quot;stellar-elementIsActive&amp;quot;,this);b.options.showElement(m),m.data(&amp;quot;stellar-startingLeft&amp;quot;)?(m.css(&amp;quot;left&amp;quot;,m.data(&amp;quot;stellar-startingLeft&amp;quot;)),m.css(&amp;quot;top&amp;quot;,m.data(&amp;quot;stellar-startingTop&amp;quot;))):(m.data(&amp;quot;stellar-startingLeft&amp;quot;,m.css(&amp;quot;left&amp;quot;)),m.data(&amp;quot;stellar-startingTop&amp;quot;,m.css(&amp;quot;top&amp;quot;))),f=m.position().left,g=m.position().top,h=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-top&amp;quot;),10),k=m.offset().left-h,l=m.offset().top-i,m.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(n=p,o=q,j=b,!1):(p+=b.position().left,void(q+=b.position().top))}),c=m.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-horizontal-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-horizontal-offset&amp;quot;):b.horizontalOffset,e=m.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-vertical-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-vertical-offset&amp;quot;):b.verticalOffset,b.particles.push({$element:m,$offsetParent:j,isFixed:&amp;quot;fixed&amp;quot;===m.css(&amp;quot;position&amp;quot;),horizontalOffset:c,verticalOffset:e,startingPositionLeft:f,startingPositionTop:g,startingOffsetLeft:k,startingOffsetTop:l,parentOffsetLeft:n,parentOffsetTop:o,stellarRatio:m.data(&amp;quot;stellar-ratio&amp;quot;)!==d?m.data(&amp;quot;stellar-ratio&amp;quot;):1,width:m.outerWidth(!0),height:m.outerHeight(!0),isHidden:!1})})},_findBackgrounds:function(){var b,c=this,e=this._getScrollLeft(),f=this._getScrollTop();this.backgrounds=[],this.options.parallaxBackgrounds&amp;amp;&amp;amp;(b=this.$element.find(&amp;quot;[data-stellar-background-ratio]&amp;quot;),this.$element.data(&amp;quot;stellar-background-ratio&amp;quot;)&amp;amp;&amp;amp;(b=b.add(this.$element)),b.each(function(){var b,g,h,i,j,k,l,o=a(this),p=n(o),q=0,r=0,s=0,t=0;if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)){if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)!==this)return}else o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;,this);o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;)?m(o,o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;)):(o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,p[0]),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,p[1])),h=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-top&amp;quot;),10),j=o.offset().left-h-e,k=o.offset().top-i-f,o.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(q=s,r=t,l=b,!1):(s+=b.position().left,void(t+=b.position().top))}),b=o.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-horizontal-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-horizontal-offset&amp;quot;):c.horizontalOffset,g=o.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-vertical-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-vertical-offset&amp;quot;):c.verticalOffset,c.backgrounds.push({$element:o,$offsetParent:l,isFixed:&amp;quot;fixed&amp;quot;===o.css(&amp;quot;background-attachment&amp;quot;),horizontalOffset:b,verticalOffset:g,startingValueLeft:p[0],startingValueTop:p[1],startingBackgroundPositionLeft:isNaN(parseInt(p[0],10))?0:parseInt(p[0],10),startingBackgroundPositionTop:isNaN(parseInt(p[1],10))?0:parseInt(p[1],10),startingPositionLeft:o.position().left,startingPositionTop:o.position().top,startingOffsetLeft:j,startingOffsetTop:k,parentOffsetLeft:q,parentOffsetTop:r,stellarRatio:o.data(&amp;quot;stellar-background-ratio&amp;quot;)===d?1:o.data(&amp;quot;stellar-background-ratio&amp;quot;)})}))},_reset:function(){var a,b,c,d,e;for(e=this.particles.length-1;e&amp;gt;=0;e--)a=this.particles[e],b=a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;),c=a.$element.data(&amp;quot;stellar-startingTop&amp;quot;),this._setPosition(a.$element,b,b,c,c),this.options.showElement(a.$element),a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;,null).data(&amp;quot;stellar-elementIsActive&amp;quot;,null).data(&amp;quot;stellar-backgroundIsActive&amp;quot;,null);for(e=this.backgrounds.length-1;e&amp;gt;=0;e--)d=this.backgrounds[e],d.$element.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,null).data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,null),m(d.$element,d.startingValueLeft,d.startingValueTop)},destroy:function(){this._reset(),this.$scrollElement.unbind(&amp;quot;resize.&amp;quot;+this.name).unbind(&amp;quot;scroll.&amp;quot;+this.name),this._animationLoop=a.noop,a(b).unbind(&amp;quot;load.&amp;quot;+this.name).unbind(&amp;quot;resize.&amp;quot;+this.name)},_setOffsets:function(){var c=this,d=a(b);d.unbind(&amp;quot;resize.horizontal-&amp;quot;+this.name).unbind(&amp;quot;resize.vertical-&amp;quot;+this.name),&amp;quot;function&amp;quot;==typeof this.options.horizontalOffset?(this.horizontalOffset=this.options.horizontalOffset(),d.bind(&amp;quot;resize.horizontal-&amp;quot;+this.name,function(){c.horizontalOffset=c.options.horizontalOffset()})):this.horizontalOffset=this.options.horizontalOffset,&amp;quot;function&amp;quot;==typeof this.options.verticalOffset?(this.verticalOffset=this.options.verticalOffset(),d.bind(&amp;quot;resize.vertical-&amp;quot;+this.name,function(){c.verticalOffset=c.options.verticalOffset()})):this.verticalOffset=this.options.verticalOffset},_repositionElements:function(){var a,b,c,d,e,f,g,h,i,j,k=this._getScrollLeft(),l=this._getScrollTop(),n=!0,o=!0;if(this.currentScrollLeft!==k||this.currentScrollTop!==l||this.currentWidth!==this.viewportWidth||this.currentHeight!==this.viewportHeight){for(this.currentScrollLeft=k,this.currentScrollTop=l,this.currentWidth=this.viewportWidth,this.currentHeight=this.viewportHeight,j=this.particles.length-1;j&amp;gt;=0;j--)a=this.particles[j],b=a.isFixed?1:0,this.options.horizontalScrolling?(f=(k+a.horizontalOffset+this.viewportOffsetLeft+a.startingPositionLeft-a.startingOffsetLeft+a.parentOffsetLeft)*-(a.stellarRatio+b-1)+a.startingPositionLeft,h=f-a.startingPositionLeft+a.startingOffsetLeft):(f=a.startingPositionLeft,h=a.startingOffsetLeft),this.options.verticalScrolling?(g=(l+a.verticalOffset+this.viewportOffsetTop+a.startingPositionTop-a.startingOffsetTop+a.parentOffsetTop)*-(a.stellarRatio+b-1)+a.startingPositionTop,i=g-a.startingPositionTop+a.startingOffsetTop):(g=a.startingPositionTop,i=a.startingOffsetTop),this.options.hideDistantElements&amp;amp;&amp;amp;(o=!this.options.horizontalScrolling||h+a.width&amp;gt;(a.isFixed?0:k)&amp;amp;&amp;amp;h&amp;lt;(a.isFixed?0:k)+this.viewportWidth+this.viewportOffsetLeft,n=!this.options.verticalScrolling||i+a.height&amp;gt;(a.isFixed?0:l)&amp;amp;&amp;amp;i&amp;lt;(a.isFixed?0:l)+this.viewportHeight+this.viewportOffsetTop),o&amp;amp;&amp;amp;n?(a.isHidden&amp;amp;&amp;amp;(this.options.showElement(a.$element),a.isHidden=!1),this._setPosition(a.$element,f,a.startingPositionLeft,g,a.startingPositionTop)):a.isHidden||(this.options.hideElement(a.$element),a.isHidden=!0);for(j=this.backgrounds.length-1;j&amp;gt;=0;j--)c=this.backgrounds[j],b=c.isFixed?0:1,d=this.options.horizontalScrolling?(k+c.horizontalOffset-this.viewportOffsetLeft-c.startingOffsetLeft+c.parentOffsetLeft-c.startingBackgroundPositionLeft)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueLeft,e=this.options.verticalScrolling?(l+c.verticalOffset-this.viewportOffsetTop-c.startingOffsetTop+c.parentOffsetTop-c.startingBackgroundPositionTop)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueTop,m(c.$element,d,e)}},_handleScrollEvent:function(){var a=this,b=!1,c=function(){a._repositionElements(),b=!1},d=function(){b||(o(c),b=!0)};this.$scrollElement.bind(&amp;quot;scroll.&amp;quot;+this.name,d),d()},_startAnimationLoop:function(){var a=this;this._animationLoop=function(){o(a._animationLoop),a._repositionElements()},this._animationLoop()}},a.fn[f]=function(b){var c=arguments;return b===d||&amp;quot;object&amp;quot;==typeof b?this.each(function(){a.data(this,&amp;quot;plugin_&amp;quot;+f)||a.data(this,&amp;quot;plugin_&amp;quot;+f,new e(this,b))}):&amp;quot;string&amp;quot;==typeof b&amp;amp;&amp;amp;&amp;quot;_&amp;quot;!==b[0]&amp;amp;&amp;amp;&amp;quot;init&amp;quot;!==b?this.each(function(){var d=a.data(this,&amp;quot;plugin_&amp;quot;+f);d instanceof e&amp;amp;&amp;amp;&amp;quot;function&amp;quot;==typeof d[b]&amp;amp;&amp;amp;d[b].apply(d,Array.prototype.slice.call(c,1)),&amp;quot;destroy&amp;quot;===b&amp;amp;&amp;amp;a.data(this,&amp;quot;plugin_&amp;quot;+f,null)}):void 0},a[f]=function(){var c=a(b);return c.stellar.apply(c,Array.prototype.slice.call(arguments,0))},a[f].scrollProperty=h,a[f].positionProperty=i,b.Stellar=e}(jQuery,this,document);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scrolly ===&lt;br /&gt;
[[JQuery.Scrolly]]&lt;br /&gt;
&lt;br /&gt;
== Lightbox, Gallery &amp;amp; co ==&lt;br /&gt;
&lt;br /&gt;
=== Chocolat ===&lt;br /&gt;
Nette responsive Lightbox für Anfänger und Profis&lt;br /&gt;
&lt;br /&gt;
http://chocolat.insipi.de&lt;br /&gt;
&lt;br /&gt;
[[Chocolat Lightbox]]&lt;br /&gt;
&lt;br /&gt;
=== Lightbox ===&lt;br /&gt;
Der Klassiker: [[Lightbox jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Magnific Popup ===&lt;br /&gt;
Galt lange als DER Nachfolger der Lightbox [[Magnific Popup jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Fancybox ===&lt;br /&gt;
Relativ schlanke Lightbox Alternative mit Übergangseffekten - in der neuen Version 3 kostenpflichtig und nicht mehr ganz so schlank.&lt;br /&gt;
&lt;br /&gt;
== Isotope / Masonry ==&lt;br /&gt;
[[JavaScript - Masonry / Isotope]]&lt;br /&gt;
&lt;br /&gt;
== Charts / Counter ==&lt;br /&gt;
=== jQuery CountTo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// jQuery CountTo&lt;br /&gt;
!function(t){&amp;quot;use strict&amp;quot;;function e(t,e){return t.toFixed(e.decimals)}t.fn.countTo=function(e){return e=e||{},t(this).each(function(){function a(){s+=l,c++,n(s),&amp;quot;function&amp;quot;==typeof o.onUpdate&amp;amp;&amp;amp;o.onUpdate.call(i,s),c&amp;gt;=r&amp;amp;&amp;amp;(f.removeData(&amp;quot;countTo&amp;quot;),clearInterval(d.interval),s=o.to,&amp;quot;function&amp;quot;==typeof o.onComplete&amp;amp;&amp;amp;o.onComplete.call(i,s))}function n(t){var e=o.formatter.call(i,t,o);f.text(e)}var o=t.extend({},t.fn.countTo.defaults,{from:t(this).data(&amp;quot;from&amp;quot;),to:t(this).data(&amp;quot;to&amp;quot;),speed:t(this).data(&amp;quot;speed&amp;quot;),refreshInterval:t(this).data(&amp;quot;refresh-interval&amp;quot;),decimals:t(this).data(&amp;quot;decimals&amp;quot;)},e),r=Math.ceil(o.speed/o.refreshInterval),l=(o.to-o.from)/r,i=this,f=t(this),c=0,s=o.from,d=f.data(&amp;quot;countTo&amp;quot;)||{};f.data(&amp;quot;countTo&amp;quot;,d),d.interval&amp;amp;&amp;amp;clearInterval(d.interval),d.interval=setInterval(a,o.refreshInterval),n(s)})},t.fn.countTo.defaults={from:0,to:0,speed:1e3,refreshInterval:100,decimals:0,formatter:e,onUpdate:null,onComplete:null}}(jQuery);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Easy Pie Chart ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**!&lt;br /&gt;
 * easyPieChart&lt;br /&gt;
 * Lightweight plugin to render simple, animated and retina optimized pie charts&lt;br /&gt;
 *&lt;br /&gt;
 * @license &lt;br /&gt;
 * @author Robert Fleischmann &amp;lt;rendro87@gmail.com&amp;gt; (http://robert-fleischmann.de)&lt;br /&gt;
 * @version 2.1.6&lt;br /&gt;
 **/&lt;br /&gt;
!function(a,b){&amp;quot;object&amp;quot;==typeof exports?module.exports=b(require(&amp;quot;jquery&amp;quot;)):&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement(&amp;quot;canvas&amp;quot;);a.appendChild(d),&amp;quot;undefined&amp;quot;!=typeof G_vmlCanvasManager&amp;amp;&amp;amp;G_vmlCanvasManager.initElement(d);var e=d.getContext(&amp;quot;2d&amp;quot;);d.width=d.height=b.size;var f=1;window.devicePixelRatio&amp;gt;1&amp;amp;&amp;amp;(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,&amp;quot;px&amp;quot;].join(&amp;quot;&amp;quot;),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&amp;amp;&amp;amp;b.scaleLength&amp;amp;&amp;amp;(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0&amp;gt;=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d&amp;gt;0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&amp;amp;&amp;amp;i(),b.trackColor&amp;amp;&amp;amp;h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&amp;amp;&amp;amp;e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d=&amp;quot;function&amp;quot;==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f&amp;gt;=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:&amp;quot;#ef1e25&amp;quot;,trackColor:&amp;quot;#f9f9f9&amp;quot;,scaleColor:&amp;quot;#dfe0e0&amp;quot;,scaleLength:5,lineCap:&amp;quot;round&amp;quot;,lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1&amp;gt;b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if(&amp;quot;undefined&amp;quot;!=typeof b)d.renderer=b;else{if(&amp;quot;undefined&amp;quot;==typeof SVGRenderer)throw new Error(&amp;quot;Please load either the SVG- or the CanvasRenderer&amp;quot;);d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&amp;amp;&amp;amp;(e[b]=c&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof c[b]?c[b]:d[b],&amp;quot;function&amp;quot;==typeof e[b]&amp;amp;&amp;amp;(e[b]=e[b].bind(this)));e.easing=&amp;quot;string&amp;quot;==typeof e.easing&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof jQuery&amp;amp;&amp;amp;jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,&amp;quot;number&amp;quot;==typeof e.animate&amp;amp;&amp;amp;(e.animate={duration:e.animate,enabled:!0}),&amp;quot;boolean&amp;quot;!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&amp;amp;&amp;amp;a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&amp;amp;&amp;amp;a.getAttribute(&amp;quot;data-percent&amp;quot;)&amp;amp;&amp;amp;this.update(parseFloat(a.getAttribute(&amp;quot;data-percent&amp;quot;)))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,&amp;quot;easyPieChart&amp;quot;)||(d=a.extend({},b,a(this).data()),a.data(this,&amp;quot;easyPieChart&amp;quot;,new c(this,d)))})}});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Audio / Video / MediaPlayer ==&lt;br /&gt;
Siehe auch: [[JavaScript - HTML5 Audio]]&lt;br /&gt;
https://ourcodeworld.com/articles/read/148/top-7-best-html5-media-player-javascript-plugins&lt;br /&gt;
&lt;br /&gt;
* Plyr (HTML5, YouTube, Vimeo, accessible, lightweight, customisable, responsive, no dependencies) https://github.com/sampotts/plyr&lt;br /&gt;
* Video.js (Video, build new from ground in 2010, popular)&lt;br /&gt;
* Popcorn.js (HTML5 Event Framework for Filmmakers, Audio Video, Vimeo, YouTube, Soundcloud...)&lt;br /&gt;
* Afterglow ( HTML5 Elements, little Effort)&lt;br /&gt;
* MediaElement.js (Mimics HTML5, Flash Fallback, Accessible)&lt;br /&gt;
* jPlayer (Audio, Video, Skinnable, API&lt;br /&gt;
* Projekktor (OpenSource Video/Audio, Flashfallback different output devices)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FitVids ===&lt;br /&gt;
Embedding Videos from YouTube, Vimeo,...&lt;br /&gt;
&lt;br /&gt;
[[FitVids jQuery Plugin]] https://github.com/davatron5000/FitVids.js&lt;br /&gt;
&lt;br /&gt;
=== Vide - Video Backgrounds ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Vide - v0.5.1&lt;br /&gt;
 *  Easy as hell jQuery plugin for video backgrounds.&lt;br /&gt;
 *  http://vodkabears.github.io/vide/&lt;br /&gt;
 *&lt;br /&gt;
 *  Made by Ilya Makarov&lt;br /&gt;
 *  Under MIT License&lt;br /&gt;
 */&lt;br /&gt;
!function(a,b){&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(&amp;quot;object&amp;quot;==typeof exports?require(&amp;quot;jquery&amp;quot;):a.jQuery)}(this,function(a){&amp;quot;use strict&amp;quot;;function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,&amp;quot;:&amp;quot;).replace(/\s*,\s*/g,&amp;quot;,&amp;quot;).split(&amp;quot;,&amp;quot;),h=0,g=f.length;h&amp;lt;g&amp;amp;&amp;amp;(c=f[h],c.search(/^(http|https|ftp):\/\//)===-1&amp;amp;&amp;amp;c.search(&amp;quot;:&amp;quot;)!==-1);h++)b=c.indexOf(&amp;quot;:&amp;quot;),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=&amp;quot;true&amp;quot;===e||&amp;quot;false&amp;quot;!==e&amp;amp;&amp;amp;e),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=isNaN(e)?e:+e),i[d]=e;return null==d&amp;amp;&amp;amp;null==e?a:i}function c(a){a=&amp;quot;&amp;quot;+a;var b,c,d,e=a.split(/\s+/),f=&amp;quot;50%&amp;quot;,g=&amp;quot;50%&amp;quot;;for(d=0,b=e.length;d&amp;lt;b;d++)c=e[d],&amp;quot;left&amp;quot;===c?f=&amp;quot;0%&amp;quot;:&amp;quot;right&amp;quot;===c?f=&amp;quot;100%&amp;quot;:&amp;quot;top&amp;quot;===c?g=&amp;quot;0%&amp;quot;:&amp;quot;bottom&amp;quot;===c?g=&amp;quot;100%&amp;quot;:&amp;quot;center&amp;quot;===c?0===d?f=&amp;quot;50%&amp;quot;:g=&amp;quot;50%&amp;quot;:0===d?f=c:g=c;return{x:f,y:g}}function d(b,c){var d=function(){c(this.src)};a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.gif&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpeg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.png&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d)}function e(c,d,e){if(this.$element=a(c),&amp;quot;string&amp;quot;==typeof d&amp;amp;&amp;amp;(d=b(d)),e?&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=b(e)):e={},&amp;quot;string&amp;quot;==typeof d)d=d.replace(/\.\w*$/,&amp;quot;&amp;quot;);else if(&amp;quot;object&amp;quot;==typeof d)for(var f in d)d.hasOwnProperty(f)&amp;amp;&amp;amp;(d[f]=d[f].replace(/\.\w*$/,&amp;quot;&amp;quot;));this.settings=a.extend({},g,e),this.path=d;try{this.init()}catch(i){if(i.message!==h)throw i}}var f=&amp;quot;vide&amp;quot;,g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:&amp;quot;50% 50%&amp;quot;,posterType:&amp;quot;detect&amp;quot;,resizing:!0,bgColor:&amp;quot;transparent&amp;quot;,className:&amp;quot;&amp;quot;},h=&amp;quot;Not implemented&amp;quot;;e.prototype.init=function(){var b,e,f=this,g=f.path,i=g,j=&amp;quot;&amp;quot;,k=f.$element,l=f.settings,m=c(l.position),n=l.posterType;e=f.$wrapper=a(&amp;quot;&amp;lt;div&amp;gt;&amp;quot;).addClass(l.className).css({position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:0,left:0,bottom:0,right:0,overflow:&amp;quot;hidden&amp;quot;,&amp;quot;-webkit-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-moz-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-o-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-color&amp;quot;:l.bgColor,&amp;quot;background-repeat&amp;quot;:&amp;quot;no-repeat&amp;quot;,&amp;quot;background-position&amp;quot;:m.x+&amp;quot; &amp;quot;+m.y}),&amp;quot;object&amp;quot;==typeof g&amp;amp;&amp;amp;(g.poster?i=g.poster:g.mp4?i=g.mp4:g.webm?i=g.webm:g.ogv&amp;amp;&amp;amp;(i=g.ogv)),&amp;quot;detect&amp;quot;===n?d(i,function(a){e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+a+&amp;quot;)&amp;quot;)}):&amp;quot;none&amp;quot;!==n&amp;amp;&amp;amp;e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+i+&amp;quot;.&amp;quot;+n+&amp;quot;)&amp;quot;),&amp;quot;static&amp;quot;===k.css(&amp;quot;position&amp;quot;)&amp;amp;&amp;amp;k.css(&amp;quot;position&amp;quot;,&amp;quot;relative&amp;quot;),k.prepend(e),&amp;quot;object&amp;quot;==typeof g?(g.mp4&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.mp4+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;#039;),g.webm&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.webm+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;#039;),g.ogv&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.ogv+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;#039;),b=f.$video=a(&amp;quot;&amp;lt;video&amp;gt;&amp;quot;+j+&amp;quot;&amp;lt;/video&amp;gt;&amp;quot;)):b=f.$video=a(&amp;#039;&amp;lt;video&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;lt;/video&amp;gt;&amp;#039;);try{b.prop({autoplay:l.autoplay,loop:l.loop,volume:l.volume,muted:l.muted,defaultMuted:l.muted,playbackRate:l.playbackRate,defaultPlaybackRate:l.playbackRate})}catch(o){throw new Error(h)}b.css({margin:&amp;quot;auto&amp;quot;,position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:m.y,left:m.x,&amp;quot;-webkit-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-ms-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,transform:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,visibility:&amp;quot;hidden&amp;quot;,opacity:0}).one(&amp;quot;canplaythrough.vide&amp;quot;,function(){f.resize()}).one(&amp;quot;playing.vide&amp;quot;,function(){b.css({visibility:&amp;quot;visible&amp;quot;,opacity:1}),e.css(&amp;quot;background-image&amp;quot;,&amp;quot;none&amp;quot;)}),k.on(&amp;quot;resize.vide&amp;quot;,function(){l.resizing&amp;amp;&amp;amp;f.resize()}),e.append(b)},e.prototype.getVideoObject=function(){return this.$video[0]},e.prototype.resize=function(){if(this.$video){var a=this.$wrapper,b=this.$video,c=b[0],d=c.videoHeight,e=c.videoWidth,f=a.height(),g=a.width();g/e&amp;gt;f/d?b.css({width:g+2,height:&amp;quot;auto&amp;quot;}):b.css({width:&amp;quot;auto&amp;quot;,height:f+2})}},e.prototype.destroy=function(){delete a[f].lookup[this.index],this.$video&amp;amp;&amp;amp;this.$video.off(f),this.$element.off(f).removeData(f),this.$wrapper.remove()},a[f]={lookup:[]},a.fn[f]=function(b,c){var d;return this.each(function(){d=a.data(this,f),d&amp;amp;&amp;amp;d.destroy(),d=new e(this,b,c),d.index=a[f].lookup.push(d)-1,a.data(this,f,d)}),this},a(document).ready(function(){var b=a(window);b.on(&amp;quot;resize.vide&amp;quot;,function(){for(var b,c=a[f].lookup.length,d=0;d&amp;lt;c;d++)b=a[f].lookup[d],b&amp;amp;&amp;amp;b.settings.resizing&amp;amp;&amp;amp;b.resize()}),b.on(&amp;quot;unload.vide&amp;quot;,function(){return!1}),a(document).find(&amp;quot;[data-vide-bg]&amp;quot;).each(function(b,c){var d=a(c),e=d.data(&amp;quot;vide-options&amp;quot;),g=d.data(&amp;quot;vide-bg&amp;quot;);d[f](g,e)})})});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Siehe Extra Seite&lt;br /&gt;
&lt;br /&gt;
== Slider &amp;amp; Carousel ==&lt;br /&gt;
=== Slick Carousel &amp;amp; Slider ===&lt;br /&gt;
Der kann fast alles Slider. Gehört mit Owl Slider zu den vielseitigen.&lt;br /&gt;
&lt;br /&gt;
http://kenwheeler.github.io/slick/&lt;br /&gt;
&lt;br /&gt;
=== Owl Carousel===&lt;br /&gt;
[[Owl Carousel - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Revolution Slider ===&lt;br /&gt;
https://revolution.themepunch.com/examples-jquery/&lt;br /&gt;
&lt;br /&gt;
=== FlexSlider ===&lt;br /&gt;
[[FlexSlider - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Schlichter aber vielseitiger Slider mit schönem KenBurns Effekt und div. Übergängen. Erfordert etwas JS Kenntnisse wenn mehr angepasst werden soll.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Vegas Slider]]&lt;br /&gt;
&lt;br /&gt;
=== MultiScroll.js ===&lt;br /&gt;
http://alvarotrigo.com/multiScroll&lt;br /&gt;
&lt;br /&gt;
Gegenläufiger Scroller&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;jquery.multiscroll.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- This following line is needed in case of using the default easing option or when using another&lt;br /&gt;
 one rather than &amp;quot;linear&amp;quot; or &amp;quot;swing&amp;quot;. You can also add the full jQuery UI instead of this file if you prefer --&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;vendors/jquery.easings.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery.multiscroll.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;multiscroll&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-left&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-right&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Elemente manipulieren ==&lt;br /&gt;
=== Match Heights ===&lt;br /&gt;
Spalten in der Länge anpassen. Siehe auch Flex Grid in CSS3&lt;br /&gt;
&lt;br /&gt;
[[Equal Heights]]&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Match Height]]&lt;br /&gt;
&lt;br /&gt;
=== Fit Viewport ===&lt;br /&gt;
==== Viewport Height ====&lt;br /&gt;
Element an die Höhe des Viewports anpassen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  $(document).ready(function(){&lt;br /&gt;
      $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
          $(window).resize(function(){&lt;br /&gt;
              $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
      });&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scrolling ==&lt;br /&gt;
Hinweis die meisten Scroll To and ScrollTops lassen sich auch mit einfachen jquery Snippets realisieren. &lt;br /&gt;
=== Einfaches jQuery Scroll To Top ===&lt;br /&gt;
Mehr brauchts nicht :-) [[Scroll ToTop (jQuery)]]&lt;br /&gt;
&lt;br /&gt;
=== Perfect Scrollbar ===&lt;br /&gt;
[[Perfect Scrollbar]]&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler ScrollTo ===&lt;br /&gt;
https://github.com/flesler/jquery.scrollTo&lt;br /&gt;
&lt;br /&gt;
Lightweight, cross-browser and highly customizable animated scrolling with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler LocalScroll ===&lt;br /&gt;
https://github.com/flesler/jquery.localScroll&lt;br /&gt;
&lt;br /&gt;
Animated anchor navigation made easy with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Smooth Scroll ===&lt;br /&gt;
Oil for Scrolling - damit ruckelt es nicht so beim Scrollen mit dem Mausrad&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// SmoothScroll for websites v1.4.0 (Balazs Galambosi)&lt;br /&gt;
// http://www.smoothscroll.net/&lt;br /&gt;
//&lt;br /&gt;
// Licensed under the terms of the MIT license.&lt;br /&gt;
//&lt;br /&gt;
// You may use it in your theme if you credit me. &lt;br /&gt;
// It is also free to use on any individual website.&lt;br /&gt;
//&lt;br /&gt;
// Exception:&lt;br /&gt;
// The only restriction is to not publish any  &lt;br /&gt;
// extension for browsers or native application&lt;br /&gt;
// without getting a written permission first.&lt;br /&gt;
//&lt;br /&gt;
!function(){function e(){z.keyboardSupport&amp;amp;&amp;amp;m(&amp;quot;keydown&amp;quot;,a)}function t(){if(!A&amp;amp;&amp;amp;document.body){A=!0;var t=document.body,o=document.documentElement,n=window.innerHeight,r=t.scrollHeight;if(B=document.compatMode.indexOf(&amp;quot;CSS&amp;quot;)&amp;gt;=0?o:t,D=t,e(),top!=self)X=!0;else if(r&amp;gt;n&amp;amp;&amp;amp;(t.offsetHeight&amp;lt;=n||o.offsetHeight&amp;lt;=n)){var a=document.createElement(&amp;quot;div&amp;quot;);a.style.cssText=&amp;quot;position:absolute; z-index:-10000; top:0; left:0; right:0; height:&amp;quot;+B.scrollHeight+&amp;quot;px&amp;quot;,document.body.appendChild(a);var i;T=function(){i||(i=setTimeout(function(){L||(a.style.height=&amp;quot;0&amp;quot;,a.style.height=B.scrollHeight+&amp;quot;px&amp;quot;,i=null)},500))},setTimeout(T,10),m(&amp;quot;resize&amp;quot;,T);var l={attributes:!0,childList:!0,characterData:!1};if(M=new V(T),M.observe(t,l),B.offsetHeight&amp;lt;=n){var c=document.createElement(&amp;quot;div&amp;quot;);c.style.clear=&amp;quot;both&amp;quot;,t.appendChild(c)}}z.fixedBackground||L||(t.style.backgroundAttachment=&amp;quot;scroll&amp;quot;,o.style.backgroundAttachment=&amp;quot;scroll&amp;quot;)}}function o(){M&amp;amp;&amp;amp;M.disconnect(),h(I,r),h(&amp;quot;mousedown&amp;quot;,i),h(&amp;quot;keydown&amp;quot;,a),h(&amp;quot;resize&amp;quot;,T),h(&amp;quot;load&amp;quot;,t)}function n(e,t,o){if(p(t,o),1!=z.accelerationMax){var n=Date.now(),r=n-R;if(r&amp;lt;z.accelerationDelta){var a=(1+50/r)/2;a&amp;gt;1&amp;amp;&amp;amp;(a=Math.min(a,z.accelerationMax),t*=a,o*=a)}R=Date.now()}if(q.push({x:t,y:o,lastX:0&amp;gt;t?.99:-.99,lastY:0&amp;gt;o?.99:-.99,start:Date.now()}),!P){var i=e===document.body,l=function(n){for(var r=Date.now(),a=0,c=0,u=0;u&amp;lt;q.length;u++){var d=q[u],s=r-d.start,f=s&amp;gt;=z.animationTime,m=f?1:s/z.animationTime;z.pulseAlgorithm&amp;amp;&amp;amp;(m=x(m));var h=d.x*m-d.lastX&amp;gt;&amp;gt;0,w=d.y*m-d.lastY&amp;gt;&amp;gt;0;a+=h,c+=w,d.lastX+=h,d.lastY+=w,f&amp;amp;&amp;amp;(q.splice(u,1),u--)}i?window.scrollBy(a,c):(a&amp;amp;&amp;amp;(e.scrollLeft+=a),c&amp;amp;&amp;amp;(e.scrollTop+=c)),t||o||(q=[]),q.length?_(l,e,1e3/z.frameRate+1):P=!1};_(l,e,0),P=!0}}function r(e){A||t();var o=e.target,r=u(o);if(!r||e.defaultPrevented||e.ctrlKey)return!0;if(w(D,&amp;quot;embed&amp;quot;)||w(o,&amp;quot;embed&amp;quot;)&amp;amp;&amp;amp;/\.pdf/i.test(o.src)||w(D,&amp;quot;object&amp;quot;))return!0;var a=-e.wheelDeltaX||e.deltaX||0,i=-e.wheelDeltaY||e.deltaY||0;return K&amp;amp;&amp;amp;(e.wheelDeltaX&amp;amp;&amp;amp;b(e.wheelDeltaX,120)&amp;amp;&amp;amp;(a=-120*(e.wheelDeltaX/Math.abs(e.wheelDeltaX))),e.wheelDeltaY&amp;amp;&amp;amp;b(e.wheelDeltaY,120)&amp;amp;&amp;amp;(i=-120*(e.wheelDeltaY/Math.abs(e.wheelDeltaY)))),a||i||(i=-e.wheelDelta||0),1===e.deltaMode&amp;amp;&amp;amp;(a*=40,i*=40),!z.touchpadSupport&amp;amp;&amp;amp;v(i)?!0:(Math.abs(a)&amp;gt;1.2&amp;amp;&amp;amp;(a*=z.stepSize/120),Math.abs(i)&amp;gt;1.2&amp;amp;&amp;amp;(i*=z.stepSize/120),n(r,a,i),e.preventDefault(),void l())}function a(e){var t=e.target,o=e.ctrlKey||e.altKey||e.metaKey||e.shiftKey&amp;amp;&amp;amp;e.keyCode!==N.spacebar;document.contains(D)||(D=document.activeElement);var r=/^(textarea|select|embed|object)$/i,a=/^(button|submit|radio|checkbox|file|color|image)$/i;if(r.test(t.nodeName)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;!a.test(t.type)||w(D,&amp;quot;video&amp;quot;)||y(e)||t.isContentEditable||e.defaultPrevented||o)return!0;if((w(t,&amp;quot;button&amp;quot;)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;a.test(t.type))&amp;amp;&amp;amp;e.keyCode===N.spacebar)return!0;var i,c=0,d=0,s=u(D),f=s.clientHeight;switch(s==document.body&amp;amp;&amp;amp;(f=window.innerHeight),e.keyCode){case N.up:d=-z.arrowScroll;break;case N.down:d=z.arrowScroll;break;case N.spacebar:i=e.shiftKey?1:-1,d=-i*f*.9;break;case N.pageup:d=.9*-f;break;case N.pagedown:d=.9*f;break;case N.home:d=-s.scrollTop;break;case N.end:var m=s.scrollHeight-s.scrollTop-f;d=m&amp;gt;0?m+10:0;break;case N.left:c=-z.arrowScroll;break;case N.right:c=z.arrowScroll;break;default:return!0}n(s,c,d),e.preventDefault(),l()}function i(e){D=e.target}function l(){clearTimeout(E),E=setInterval(function(){F={}},1e3)}function c(e,t){for(var o=e.length;o--;)F[j(e[o])]=t;return t}function u(e){var t=[],o=document.body,n=B.scrollHeight;do{var r=F[j(e)];if(r)return c(t,r);if(t.push(e),n===e.scrollHeight){var a=s(B)&amp;amp;&amp;amp;s(o),i=a||f(B);if(X&amp;amp;&amp;amp;d(B)||!X&amp;amp;&amp;amp;i)return c(t,$())}else if(d(e)&amp;amp;&amp;amp;f(e))return c(t,e)}while(e=e.parentElement)}function d(e){return e.clientHeight+10&amp;lt;e.scrollHeight}function s(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;hidden&amp;quot;!==t}function f(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;scroll&amp;quot;===t||&amp;quot;auto&amp;quot;===t}function m(e,t){window.addEventListener(e,t,!1)}function h(e,t){window.removeEventListener(e,t,!1)}function w(e,t){return(e.nodeName||&amp;quot;&amp;quot;).toLowerCase()===t.toLowerCase()}function p(e,t){e=e&amp;gt;0?1:-1,t=t&amp;gt;0?1:-1,(Y.x!==e||Y.y!==t)&amp;amp;&amp;amp;(Y.x=e,Y.y=t,q=[],R=0)}function v(e){return e?(O.length||(O=[e,e,e]),e=Math.abs(e),O.push(e),O.shift(),clearTimeout(H),H=setTimeout(function(){window.localStorage&amp;amp;&amp;amp;(localStorage.SS_deltaBuffer=O.join(&amp;quot;,&amp;quot;))},1e3),!g(120)&amp;amp;&amp;amp;!g(100)):void 0}function b(e,t){return Math.floor(e/t)==e/t}function g(e){return b(O[0],e)&amp;amp;&amp;amp;b(O[1],e)&amp;amp;&amp;amp;b(O[2],e)}function y(e){var t=e.target,o=!1;if(-1!=document.URL.indexOf(&amp;quot;www.youtube.com/watch&amp;quot;))do if(o=t.classList&amp;amp;&amp;amp;t.classList.contains(&amp;quot;html5-video-controls&amp;quot;))break;while(t=t.parentNode);return o}function S(e){var t,o,n;return e*=z.pulseScale,1&amp;gt;e?t=e-(1-Math.exp(-e)):(o=Math.exp(-1),e-=1,n=1-Math.exp(-e),t=o+n*(1-o)),t*z.pulseNormalize}function x(e){return e&amp;gt;=1?1:0&amp;gt;=e?0:(1==z.pulseNormalize&amp;amp;&amp;amp;(z.pulseNormalize/=S(1)),S(e))}function k(e){for(var t in e)C.hasOwnProperty(t)&amp;amp;&amp;amp;(z[t]=e[t])}var D,M,T,E,H,C={frameRate:150,animationTime:400,stepSize:100,pulseAlgorithm:!0,pulseScale:4,pulseNormalize:1,accelerationDelta:50,accelerationMax:3,keyboardSupport:!0,arrowScroll:50,touchpadSupport:!1,fixedBackground:!0,excluded:&amp;quot;&amp;quot;},z=C,L=!1,X=!1,Y={x:0,y:0},A=!1,B=document.documentElement,O=[],K=/^Mac/.test(navigator.platform),N={left:37,up:38,right:39,down:40,spacebar:32,pageup:33,pagedown:34,end:35,home:36},q=[],P=!1,R=Date.now(),j=function(){var e=0;return function(t){return t.uniqueID||(t.uniqueID=e++)}}(),F={};window.localStorage&amp;amp;&amp;amp;localStorage.SS_deltaBuffer&amp;amp;&amp;amp;(O=localStorage.SS_deltaBuffer.split(&amp;quot;,&amp;quot;));var I,_=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e,t,o){window.setTimeout(e,o||1e3/60)}}(),V=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,$=function(){var e;return function(){if(!e){var t=document.createElement(&amp;quot;div&amp;quot;);t.style.cssText=&amp;quot;height:10000px;width:1px;&amp;quot;,document.body.appendChild(t);var o=document.body.scrollTop;document.documentElement.scrollTop;window.scrollBy(0,1),e=document.body.scrollTop!=o?document.body:document.documentElement,window.scrollBy(0,-1),document.body.removeChild(t)}return e}}(),U=window.navigator.userAgent,W=/Edge/.test(U),G=/chrome/i.test(U)&amp;amp;&amp;amp;!W,J=/safari/i.test(U)&amp;amp;&amp;amp;!W,Q=/mobile/i.test(U),Z=(G||J)&amp;amp;&amp;amp;!Q;&amp;quot;onwheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)?I=&amp;quot;wheel&amp;quot;:&amp;quot;onmousewheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)&amp;amp;&amp;amp;(I=&amp;quot;mousewheel&amp;quot;),I&amp;amp;&amp;amp;Z&amp;amp;&amp;amp;(m(I,r),m(&amp;quot;mousedown&amp;quot;,i),m(&amp;quot;load&amp;quot;,t)),k.destroy=o,window.SmoothScrollOptions&amp;amp;&amp;amp;k(window.SmoothScrollOptions),&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define(function(){return k}):&amp;quot;object&amp;quot;==typeof exports?module.exports=k:window.SmoothScroll=k}();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Typography, Fonts, etc==&lt;br /&gt;
=== Letter.js ===&lt;br /&gt;
Zerpflückt Texte und wrappt Buchstaben / Wörter / Zeilen in durchnummerierte Klassen. Diese kann man dann cool Stylen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/davatron5000/Lettering.js&lt;br /&gt;
&lt;br /&gt;
=== Fittext ===&lt;br /&gt;
Responsive Textgrößen in Typographie-Spielereien für Überschriften etc.&lt;br /&gt;
&lt;br /&gt;
http://fittextjs.com/&lt;br /&gt;
&lt;br /&gt;
=== Prism.js ===&lt;br /&gt;
Syntaxhighlighter&lt;br /&gt;
&lt;br /&gt;
== Google Maps mit gmaps.js ==&lt;br /&gt;
https://hpneo.github.io/gmaps/&lt;br /&gt;
Einfache Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
new GMaps({&lt;br /&gt;
  div: &amp;#039;#map&amp;#039;,&lt;br /&gt;
  lat: -12.043333,&lt;br /&gt;
  lng: -77.028333&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Grey Style Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Google map	&lt;br /&gt;
/*global $:false */&lt;br /&gt;
    var map;&lt;br /&gt;
    $(document).ready(function(){&amp;quot;use strict&amp;quot;;&lt;br /&gt;
      map = new GMaps({&lt;br /&gt;
    disableDefaultUI: true,&lt;br /&gt;
    scrollwheel: false,&lt;br /&gt;
        el: &amp;#039;#map&amp;#039;,&lt;br /&gt;
        lat: 48.4912812,&lt;br /&gt;
        lng: 9.2175255&lt;br /&gt;
      });&lt;br /&gt;
      map.drawOverlay({&lt;br /&gt;
        lat: map.getCenter().lat(),&lt;br /&gt;
        lng: map.getCenter().lng(),&lt;br /&gt;
        layer: &amp;#039;overlayLayer&amp;#039;,&lt;br /&gt;
        content: &amp;#039;&amp;lt;div class=&amp;quot;overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
        verticalAlign: &amp;#039;center&amp;#039;,&lt;br /&gt;
        horizontalAlign: &amp;#039;center&amp;#039;&lt;br /&gt;
      });&lt;br /&gt;
        var styles = [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;visibility&amp;quot;: &amp;quot;on&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.9 },&lt;br /&gt;
      { &amp;quot;lightness&amp;quot;: 37 },&lt;br /&gt;
      { &amp;quot;gamma&amp;quot;: 0.62 },&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -93 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -1 },&lt;br /&gt;
      { &amp;quot;color&amp;quot;: &amp;quot;#ffffff&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.2 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;road&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -98 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;landscape&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -89 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;water&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#cfa144&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.4 },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -38 }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
];&lt;br /&gt;
        &lt;br /&gt;
        map.addStyle({&lt;br /&gt;
            styledMapName:&amp;quot;Styled Map&amp;quot;,&lt;br /&gt;
            styles: styles,&lt;br /&gt;
            mapTypeId: &amp;quot;map_style&amp;quot;  &lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        map.setStyle(&amp;quot;map_style&amp;quot;);	&lt;br /&gt;
		&lt;br /&gt;
    });			&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
(function(root, factory) {&lt;br /&gt;
  if(typeof exports === &amp;#039;object&amp;#039;) {&lt;br /&gt;
    module.exports = factory();&lt;br /&gt;
  }&lt;br /&gt;
  else if(typeof define === &amp;#039;function&amp;#039; &amp;amp;&amp;amp; define.amd) {&lt;br /&gt;
    define([&amp;#039;jquery&amp;#039;, &amp;#039;googlemaps!&amp;#039;], factory);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    root.GMaps = factory();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}(this, function() {&lt;br /&gt;
&lt;br /&gt;
/*!&lt;br /&gt;
 * GMaps.js v0.4.25&lt;br /&gt;
 * http://hpneo.github.com/gmaps/&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2017, Gustavo Leon&lt;br /&gt;
 * Released under the MIT License.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var extend_object = function(obj, new_obj) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === new_obj) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in new_obj) {&lt;br /&gt;
    if (new_obj[name] !== undefined) {&lt;br /&gt;
      obj[name] = new_obj[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var replace_object = function(obj, replace) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === replace) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in replace) {&lt;br /&gt;
    if (obj[name] != undefined) {&lt;br /&gt;
      obj[name] = replace[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_map = function(array, callback) {&lt;br /&gt;
  var original_callback_params = Array.prototype.slice.call(arguments, 2),&lt;br /&gt;
      array_return = [],&lt;br /&gt;
      array_length = array.length,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  if (Array.prototype.map &amp;amp;&amp;amp; array.map === Array.prototype.map) {&lt;br /&gt;
    array_return = Array.prototype.map.call(array, function(item) {&lt;br /&gt;
      var callback_params = original_callback_params.slice(0);&lt;br /&gt;
      callback_params.splice(0, 0, item);&lt;br /&gt;
&lt;br /&gt;
      return callback.apply(this, callback_params);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (i = 0; i &amp;lt; array_length; i++) {&lt;br /&gt;
      callback_params = original_callback_params;&lt;br /&gt;
      callback_params.splice(0, 0, array[i]);&lt;br /&gt;
      array_return.push(callback.apply(this, callback_params));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return array_return;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_flat = function(array) {&lt;br /&gt;
  var new_array = [],&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
    new_array = new_array.concat(array[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new_array;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var coordsToLatLngs = function(coords, useGeoJSON) {&lt;br /&gt;
  var first_coord = coords[0],&lt;br /&gt;
      second_coord = coords[1];&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON) {&lt;br /&gt;
    first_coord = coords[1];&lt;br /&gt;
    second_coord = coords[0];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new google.maps.LatLng(first_coord, second_coord);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var arrayToLatLng = function(coords, useGeoJSON) {&lt;br /&gt;
  var i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; coords.length; i++) {&lt;br /&gt;
    if (!(coords[i] instanceof google.maps.LatLng)) {&lt;br /&gt;
      if (coords[i].length &amp;gt; 0 &amp;amp;&amp;amp; typeof(coords[i][0]) === &amp;quot;object&amp;quot;) {&lt;br /&gt;
        coords[i] = arrayToLatLng(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        coords[i] = coordsToLatLngs(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return coords;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementsByClassName = function (class_name, context) {&lt;br /&gt;
    var element,&lt;br /&gt;
        _class = class_name.replace(&amp;#039;.&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    if (&amp;#039;jQuery&amp;#039; in this &amp;amp;&amp;amp; context) {&lt;br /&gt;
        element = $(&amp;quot;.&amp;quot; + _class, context)[0];&lt;br /&gt;
    } else {&lt;br /&gt;
        element = document.getElementsByClassName(_class)[0];&lt;br /&gt;
    }&lt;br /&gt;
    return element;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementById = function(id, context) {&lt;br /&gt;
  var element,&lt;br /&gt;
  id = id.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  if (&amp;#039;jQuery&amp;#039; in window &amp;amp;&amp;amp; context) {&lt;br /&gt;
    element = $(&amp;#039;#&amp;#039; + id, context)[0];&lt;br /&gt;
  } else {&lt;br /&gt;
    element = document.getElementById(id);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return element;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var findAbsolutePosition = function(obj)  {&lt;br /&gt;
  var curleft = 0,&lt;br /&gt;
      curtop = 0;&lt;br /&gt;
&lt;br /&gt;
  if (obj.getBoundingClientRect) {&lt;br /&gt;
      var rect = obj.getBoundingClientRect();&lt;br /&gt;
      var sx = -(window.scrollX ? window.scrollX : window.pageXOffset);&lt;br /&gt;
      var sy = -(window.scrollY ? window.scrollY : window.pageYOffset);&lt;br /&gt;
&lt;br /&gt;
      return [(rect.left - sx), (rect.top - sy)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (obj.offsetParent) {&lt;br /&gt;
    do {&lt;br /&gt;
      curleft += obj.offsetLeft;&lt;br /&gt;
      curtop += obj.offsetTop;&lt;br /&gt;
    } while (obj = obj.offsetParent);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return [curleft, curtop];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var GMaps = (function(global) {&lt;br /&gt;
  &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  var doc = document;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new GMaps instance, including a Google Maps map.&lt;br /&gt;
   * @class GMaps&lt;br /&gt;
   * @constructs&lt;br /&gt;
   * @param {object} options - `options` accepts all the [MapOptions](https://developers.google.com/maps/documentation/javascript/reference#MapOptions) and [events](https://developers.google.com/maps/documentation/javascript/reference#Map) listed in the Google Maps API. Also accepts:&lt;br /&gt;
   * * `lat` (number): Latitude of the map&amp;#039;s center&lt;br /&gt;
   * * `lng` (number): Longitude of the map&amp;#039;s center&lt;br /&gt;
   * * `el` (string or HTMLElement): container where the map will be rendered&lt;br /&gt;
   * * `markerClusterer` (function): A function to create a marker cluster. You can use MarkerClusterer or MarkerClustererPlus.&lt;br /&gt;
   */&lt;br /&gt;
  var GMaps = function(options) {&lt;br /&gt;
&lt;br /&gt;
    if (!(typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps)) {&lt;br /&gt;
      if (typeof window.console === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.console.error) {&lt;br /&gt;
        console.error(&amp;#039;Google Maps API is required. Please register the following JavaScript library https://maps.googleapis.com/maps/api/js.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return function() {};&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!this) return new GMaps(options);&lt;br /&gt;
&lt;br /&gt;
    options.zoom = options.zoom || 15;&lt;br /&gt;
    options.mapType = options.mapType || &amp;#039;roadmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var valueOrDefault = function(value, defaultValue) {&lt;br /&gt;
      return value === undefined ? defaultValue : value;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var self = this,&lt;br /&gt;
        i,&lt;br /&gt;
        events_that_hide_context_menu = [&lt;br /&gt;
          &amp;#039;bounds_changed&amp;#039;, &amp;#039;center_changed&amp;#039;, &amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;,&lt;br /&gt;
          &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;idle&amp;#039;, &amp;#039;maptypeid_changed&amp;#039;, &amp;#039;projection_changed&amp;#039;,&lt;br /&gt;
          &amp;#039;resize&amp;#039;, &amp;#039;tilesloaded&amp;#039;, &amp;#039;zoom_changed&amp;#039;&lt;br /&gt;
        ],&lt;br /&gt;
        events_that_doesnt_hide_context_menu = [&amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;],&lt;br /&gt;
        options_to_be_deleted = [&amp;#039;el&amp;#039;, &amp;#039;lat&amp;#039;, &amp;#039;lng&amp;#039;, &amp;#039;mapType&amp;#039;, &amp;#039;width&amp;#039;, &amp;#039;height&amp;#039;, &amp;#039;markerClusterer&amp;#039;, &amp;#039;enableNewStyle&amp;#039;],&lt;br /&gt;
        identifier = options.el || options.div,&lt;br /&gt;
        markerClustererFunction = options.markerClusterer,&lt;br /&gt;
        mapType = google.maps.MapTypeId[options.mapType.toUpperCase()],&lt;br /&gt;
        map_center = new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        zoomControl = valueOrDefault(options.zoomControl, true),&lt;br /&gt;
        zoomControlOpt = options.zoomControlOpt || {&lt;br /&gt;
          style: &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
          position: &amp;#039;TOP_LEFT&amp;#039;&lt;br /&gt;
        },&lt;br /&gt;
        zoomControlStyle = zoomControlOpt.style || &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
        zoomControlPosition = zoomControlOpt.position || &amp;#039;TOP_LEFT&amp;#039;,&lt;br /&gt;
        panControl = valueOrDefault(options.panControl, true),&lt;br /&gt;
        mapTypeControl = valueOrDefault(options.mapTypeControl, true),&lt;br /&gt;
        scaleControl = valueOrDefault(options.scaleControl, true),&lt;br /&gt;
        streetViewControl = valueOrDefault(options.streetViewControl, true),&lt;br /&gt;
        overviewMapControl = valueOrDefault(overviewMapControl, true),&lt;br /&gt;
        map_options = {},&lt;br /&gt;
        map_base_options = {&lt;br /&gt;
          zoom: this.zoom,&lt;br /&gt;
          center: map_center,&lt;br /&gt;
          mapTypeId: mapType&lt;br /&gt;
        },&lt;br /&gt;
        map_controls_options = {&lt;br /&gt;
          panControl: panControl,&lt;br /&gt;
          zoomControl: zoomControl,&lt;br /&gt;
          zoomControlOptions: {&lt;br /&gt;
            style: google.maps.ZoomControlStyle[zoomControlStyle],&lt;br /&gt;
            position: google.maps.ControlPosition[zoomControlPosition]&lt;br /&gt;
          },&lt;br /&gt;
          mapTypeControl: mapTypeControl,&lt;br /&gt;
          scaleControl: scaleControl,&lt;br /&gt;
          streetViewControl: streetViewControl,&lt;br /&gt;
          overviewMapControl: overviewMapControl&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
      if (typeof(options.el) === &amp;#039;string&amp;#039; || typeof(options.div) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
        if (identifier.indexOf(&amp;quot;#&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Container element&lt;br /&gt;
             *&lt;br /&gt;
             * @type {HTMLElement}&lt;br /&gt;
             */&lt;br /&gt;
            this.el = getElementById(identifier, options.context);&lt;br /&gt;
        } else {&lt;br /&gt;
            this.el = getElementsByClassName.apply(this, [identifier, options.context]);&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
          this.el = identifier;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if (typeof(this.el) === &amp;#039;undefined&amp;#039; || this.el === null) {&lt;br /&gt;
      throw &amp;#039;No element defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.context_menu = window.context_menu || {};&lt;br /&gt;
    window.context_menu[self.el.id] = {};&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of custom controls in the map UI&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.controls = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s overlays&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.overlays = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of KML/GeoRSS and FusionTable layers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.layers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of data layers (See {@link GMaps#addLayer})&lt;br /&gt;
     *&lt;br /&gt;
     * @type {object}&lt;br /&gt;
     */&lt;br /&gt;
    this.singleLayers = {};&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s markers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.markers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s lines&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polylines = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s routes requested by {@link GMaps#getRoutes}, {@link GMaps#renderRoute}, {@link GMaps#drawRoute}, {@link GMaps#travelRoute} or {@link GMaps#drawSteppedRoute}&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.routes = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s polygons&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polygons = [];&lt;br /&gt;
    this.infoWindow = null;&lt;br /&gt;
    this.overlay_el = null;&lt;br /&gt;
    /**&lt;br /&gt;
     * Current map&amp;#039;s zoom&lt;br /&gt;
     *&lt;br /&gt;
     * @type {number}&lt;br /&gt;
     */&lt;br /&gt;
    this.zoom = options.zoom;&lt;br /&gt;
    this.registered_events = {};&lt;br /&gt;
&lt;br /&gt;
    this.el.style.width = options.width || this.el.scrollWidth || this.el.offsetWidth;&lt;br /&gt;
    this.el.style.height = options.height || this.el.scrollHeight || this.el.offsetHeight;&lt;br /&gt;
&lt;br /&gt;
    google.maps.visualRefresh = options.enableNewStyle;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; options_to_be_deleted.length; i++) {&lt;br /&gt;
      delete options[options_to_be_deleted[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(options.disableDefaultUI != true) {&lt;br /&gt;
      map_base_options = extend_object(map_base_options, map_controls_options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    map_options = extend_object(map_base_options, options);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_doesnt_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_doesnt_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Google Maps map instance&lt;br /&gt;
     *&lt;br /&gt;
     * @type {google.maps.Map}&lt;br /&gt;
     */&lt;br /&gt;
    this.map = new google.maps.Map(this.el, map_options);&lt;br /&gt;
&lt;br /&gt;
    if (markerClustererFunction) {&lt;br /&gt;
      /**&lt;br /&gt;
       * Marker Clusterer instance&lt;br /&gt;
       *&lt;br /&gt;
       * @type {object}&lt;br /&gt;
       */&lt;br /&gt;
      this.markerClusterer = markerClustererFunction.apply(this, [this.map]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var buildContextMenuHTML = function(control, e) {&lt;br /&gt;
      var html = &amp;#039;&amp;#039;,&lt;br /&gt;
          options = window.context_menu[self.el.id][control];&lt;br /&gt;
&lt;br /&gt;
      for (var i in options){&lt;br /&gt;
        if (options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options[i];&lt;br /&gt;
&lt;br /&gt;
          html += &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a id=&amp;quot;&amp;#039; + control + &amp;#039;_&amp;#039; + i + &amp;#039;&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;&amp;#039; + option.title + &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) return;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.innerHTML = html;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_items = context_menu_element.getElementsByTagName(&amp;#039;a&amp;#039;),&lt;br /&gt;
          context_menu_items_count = context_menu_items.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; context_menu_items_count; i++) {&lt;br /&gt;
        var context_menu_item = context_menu_items[i];&lt;br /&gt;
&lt;br /&gt;
        var assign_menu_item_action = function(ev){&lt;br /&gt;
          ev.preventDefault();&lt;br /&gt;
&lt;br /&gt;
          options[this.id.replace(control + &amp;#039;_&amp;#039;, &amp;#039;&amp;#039;)].action.apply(self, [e]);&lt;br /&gt;
          self.hideContextMenu();&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        google.maps.event.clearListeners(context_menu_item, &amp;#039;click&amp;#039;);&lt;br /&gt;
        google.maps.event.addDomListenerOnce(context_menu_item, &amp;#039;click&amp;#039;, assign_menu_item_action, false);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var position = findAbsolutePosition.apply(this, [self.el]),&lt;br /&gt;
          left = position[0] + e.pixel.x - 15,&lt;br /&gt;
          top = position[1] + e.pixel.y- 15;&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.style.left = left + &amp;quot;px&amp;quot;;&lt;br /&gt;
      context_menu_element.style.top = top + &amp;quot;px&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      // context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this.buildContextMenu = function(control, e) {&lt;br /&gt;
      if (control === &amp;#039;marker&amp;#039;) {&lt;br /&gt;
        e.pixel = {};&lt;br /&gt;
&lt;br /&gt;
        var overlay = new google.maps.OverlayView();&lt;br /&gt;
        overlay.setMap(self.map);&lt;br /&gt;
&lt;br /&gt;
        overlay.draw = function() {&lt;br /&gt;
          var projection = overlay.getProjection(),&lt;br /&gt;
              position = e.marker.getPosition();&lt;br /&gt;
&lt;br /&gt;
          e.pixel = projection.fromLatLngToContainerPixel(position);&lt;br /&gt;
&lt;br /&gt;
          buildContextMenuHTML(control, e);&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        buildContextMenuHTML(control, e);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      setTimeout(function() {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
      }, 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Add a context menu for a map or a marker.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {object} options - The `options` object should contain:&lt;br /&gt;
     * * `control` (string): Kind of control the context menu will be attached. Can be &amp;quot;map&amp;quot; or &amp;quot;marker&amp;quot;.&lt;br /&gt;
     * * `options` (array): A collection of context menu items:&lt;br /&gt;
     *   * `title` (string): Item&amp;#039;s title shown in the context menu.&lt;br /&gt;
     *   * `name` (string): Item&amp;#039;s identifier.&lt;br /&gt;
     *   * `action` (function): Function triggered after selecting the context menu item.&lt;br /&gt;
     */&lt;br /&gt;
    this.setContextMenu = function(options) {&lt;br /&gt;
      window.context_menu[self.el.id][options.control] = {};&lt;br /&gt;
&lt;br /&gt;
      var i,&lt;br /&gt;
          ul = doc.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      for (i in options.options) {&lt;br /&gt;
        if (options.options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options.options[i];&lt;br /&gt;
&lt;br /&gt;
          window.context_menu[self.el.id][options.control][option.name] = {&lt;br /&gt;
            title: option.title,&lt;br /&gt;
            action: option.action&lt;br /&gt;
          };&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ul.id = &amp;#039;gmaps_context_menu&amp;#039;;&lt;br /&gt;
      ul.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.position = &amp;#039;absolute&amp;#039;;&lt;br /&gt;
      ul.style.minWidth = &amp;#039;100px&amp;#039;;&lt;br /&gt;
      ul.style.background = &amp;#039;white&amp;#039;;&lt;br /&gt;
      ul.style.listStyle = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.padding = &amp;#039;8px&amp;#039;;&lt;br /&gt;
      ul.style.boxShadow = &amp;#039;2px 2px 6px #ccc&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) {&lt;br /&gt;
        doc.body.appendChild(ul);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      google.maps.event.addDomListener(context_menu_element, &amp;#039;mouseout&amp;#039;, function(ev) {&lt;br /&gt;
        if (!ev.relatedTarget || !this.contains(ev.relatedTarget)) {&lt;br /&gt;
          window.setTimeout(function(){&lt;br /&gt;
            context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
          }, 400);&lt;br /&gt;
        }&lt;br /&gt;
      }, false);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Hide the current context menu&lt;br /&gt;
     */&lt;br /&gt;
    this.hideContextMenu = function() {&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (context_menu_element) {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var setupListener = function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
        if (e == undefined) {&lt;br /&gt;
          e = this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        options[name].apply(this, [e]);&lt;br /&gt;
&lt;br /&gt;
        self.hideContextMenu();&lt;br /&gt;
      });&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    //google.maps.event.addListener(this.map, &amp;#039;idle&amp;#039;, this.hideContextMenu);&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;zoom_changed&amp;#039;, this.hideContextMenu);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_doesnt_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_doesnt_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
      if (options.rightclick) {&lt;br /&gt;
        options.rightclick.apply(this, [e]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(window.context_menu[self.el.id][&amp;#039;map&amp;#039;] != undefined) {&lt;br /&gt;
        self.buildContextMenu(&amp;#039;map&amp;#039;, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Trigger a `resize` event, useful if you need to repaint the current map (for changes in the viewport or display / hide actions).&lt;br /&gt;
     */&lt;br /&gt;
    this.refresh = function() {&lt;br /&gt;
      google.maps.event.trigger(this.map, &amp;#039;resize&amp;#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the markers added in the map.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitZoom = function() {&lt;br /&gt;
      var latLngs = [],&lt;br /&gt;
          markers_length = this.markers.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; markers_length; i++) {&lt;br /&gt;
        if(typeof(this.markers[i].visible) === &amp;#039;boolean&amp;#039; &amp;amp;&amp;amp; this.markers[i].visible) {&lt;br /&gt;
          latLngs.push(this.markers[i].getPosition());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.fitLatLngBounds(latLngs);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the coordinates in the `latLngs` array.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {array} latLngs - Collection of `google.maps.LatLng` objects.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitLatLngBounds = function(latLngs) {&lt;br /&gt;
      var total = latLngs.length,&lt;br /&gt;
          bounds = new google.maps.LatLngBounds(),&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for(i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
        bounds.extend(latLngs[i]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.map.fitBounds(bounds);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Center the map using the `lat` and `lng` coordinates.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} lat - Latitude of the coordinate.&lt;br /&gt;
     * @param {number} lng - Longitude of the coordinate.&lt;br /&gt;
     * @param {function} [callback] - Callback that will be executed after the map is centered.&lt;br /&gt;
     */&lt;br /&gt;
    this.setCenter = function(lat, lng, callback) {&lt;br /&gt;
      this.map.panTo(new google.maps.LatLng(lat, lng));&lt;br /&gt;
&lt;br /&gt;
      if (callback) {&lt;br /&gt;
        callback();&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Return the HTML element container of the map.&lt;br /&gt;
     *&lt;br /&gt;
     * @returns {HTMLElement} the element container.&lt;br /&gt;
     */&lt;br /&gt;
    this.getElement = function() {&lt;br /&gt;
      return this.el;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Increase the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed in.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomIn = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() + value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Decrease the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed out.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomOut = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() - value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var native_methods = [],&lt;br /&gt;
        method;&lt;br /&gt;
&lt;br /&gt;
    for (method in this.map) {&lt;br /&gt;
      if (typeof(this.map[method]) == &amp;#039;function&amp;#039; &amp;amp;&amp;amp; !this[method]) {&lt;br /&gt;
        native_methods.push(method);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; native_methods.length; i++) {&lt;br /&gt;
      (function(gmaps, scope, method_name) {&lt;br /&gt;
        gmaps[method_name] = function(){&lt;br /&gt;
          return scope[method_name].apply(scope, arguments);&lt;br /&gt;
        };&lt;br /&gt;
      })(this, this.map, native_methods[i]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return GMaps;&lt;br /&gt;
})(this);&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createControl = function(options) {&lt;br /&gt;
  var control = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  control.style.cursor = &amp;#039;pointer&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.disableDefaultStyles !== true) {&lt;br /&gt;
    control.style.fontFamily = &amp;#039;Roboto, Arial, sans-serif&amp;#039;;&lt;br /&gt;
    control.style.fontSize = &amp;#039;11px&amp;#039;;&lt;br /&gt;
    control.style.boxShadow = &amp;#039;rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var option in options.style) {&lt;br /&gt;
    control.style[option] = options.style[option];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.id) {&lt;br /&gt;
    control.id = options.id;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.title) {&lt;br /&gt;
    control.title = options.title;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.classes) {&lt;br /&gt;
    control.className = options.classes;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.content) {&lt;br /&gt;
    if (typeof options.content === &amp;#039;string&amp;#039;) {&lt;br /&gt;
      control.innerHTML = options.content;&lt;br /&gt;
    }&lt;br /&gt;
    else if (options.content instanceof HTMLElement) {&lt;br /&gt;
      control.appendChild(options.content);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.position) {&lt;br /&gt;
    control.position = google.maps.ControlPosition[options.position.toUpperCase()];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev in options.events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addDomListener(object, name, function(){&lt;br /&gt;
        options.events[name].apply(this, [this]);&lt;br /&gt;
      });&lt;br /&gt;
    })(control, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  control.index = 1;&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Add a custom control to the map UI.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {object} options - The `options` object should contain:&lt;br /&gt;
 * * `style` (object): The keys and values of this object should be valid CSS properties and values.&lt;br /&gt;
 * * `id` (string): The HTML id for the custom control.&lt;br /&gt;
 * * `classes` (string): A string containing all the HTML classes for the custom control.&lt;br /&gt;
 * * `content` (string or HTML element): The content of the custom control.&lt;br /&gt;
 * * `position` (string): Any valid [`google.maps.ControlPosition`](https://developers.google.com/maps/documentation/javascript/controls#ControlPositioning) value, in lower or upper case.&lt;br /&gt;
 * * `events` (object): The keys of this object should be valid DOM events. The values should be functions.&lt;br /&gt;
 * * `disableDefaultStyles` (boolean): If false, removes the default styles for the controls like font (family and size), and box shadow.&lt;br /&gt;
 * @returns {HTMLElement}&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.addControl = function(options) {&lt;br /&gt;
  var control = this.createControl(options);&lt;br /&gt;
&lt;br /&gt;
  this.controls.push(control);&lt;br /&gt;
  this.map.controls[control.position].push(control);&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Remove a control from the map. `control` should be a control returned by `addControl()`.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {HTMLElement} control - One of the controls returned by `addControl()`.&lt;br /&gt;
 * @returns {HTMLElement} the removed control.&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.removeControl = function(control) {&lt;br /&gt;
  var position = null,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; this.controls.length; i++) {&lt;br /&gt;
    if (this.controls[i] == control) {&lt;br /&gt;
      position = this.controls[i].position;&lt;br /&gt;
      this.controls.splice(i, 1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (position) {&lt;br /&gt;
    for (i = 0; i &amp;lt; this.map.controls.length; i++) {&lt;br /&gt;
      var controlsForPosition = this.map.controls[control.position];&lt;br /&gt;
&lt;br /&gt;
      if (controlsForPosition.getAt(i) == control) {&lt;br /&gt;
        controlsForPosition.removeAt(i);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createMarker = function(options) {&lt;br /&gt;
  if (options.lat == undefined &amp;amp;&amp;amp; options.lng == undefined &amp;amp;&amp;amp; options.position == undefined) {&lt;br /&gt;
    throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      details = options.details,&lt;br /&gt;
      fences = options.fences,&lt;br /&gt;
      outside = options.outside,&lt;br /&gt;
      base_options = {&lt;br /&gt;
        position: new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        map: null&lt;br /&gt;
      },&lt;br /&gt;
      marker_options = extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  delete marker_options.lat;&lt;br /&gt;
  delete marker_options.lng;&lt;br /&gt;
  delete marker_options.fences;&lt;br /&gt;
  delete marker_options.outside;&lt;br /&gt;
&lt;br /&gt;
  var marker = new google.maps.Marker(marker_options);&lt;br /&gt;
&lt;br /&gt;
  marker.fences = fences;&lt;br /&gt;
&lt;br /&gt;
  if (options.infoWindow) {&lt;br /&gt;
    marker.infoWindow = new google.maps.InfoWindow(options.infoWindow);&lt;br /&gt;
&lt;br /&gt;
    var info_window_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;content_changed&amp;#039;, &amp;#039;domready&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; info_window_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        if (options.infoWindow[name]) {&lt;br /&gt;
          google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
            options.infoWindow[name].apply(this, [e]);&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      })(marker.infoWindow, info_window_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var marker_events = [&amp;#039;animation_changed&amp;#039;, &amp;#039;clickable_changed&amp;#039;, &amp;#039;cursor_changed&amp;#039;, &amp;#039;draggable_changed&amp;#039;, &amp;#039;flat_changed&amp;#039;, &amp;#039;icon_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;shadow_changed&amp;#039;, &amp;#039;shape_changed&amp;#039;, &amp;#039;title_changed&amp;#039;, &amp;#039;visible_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  var marker_events_with_mouse = [&amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;, &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this, [this]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(marker, marker_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events_with_mouse.length; ev++) {&lt;br /&gt;
    (function(map, object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(me){&lt;br /&gt;
          if(!me.pixel){&lt;br /&gt;
            me.pixel = map.getProjection().fromLatLngToPoint(me.latLng)&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          options[name].apply(this, [me]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(this.map, marker, marker_events_with_mouse[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
    this.details = details;&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      options.click.apply(this, [this]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      self.hideInfoWindows();&lt;br /&gt;
      marker.infoWindow.open(self.map, marker);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
    e.marker = this;&lt;br /&gt;
&lt;br /&gt;
    if (options.rightclick) {&lt;br /&gt;
      options.rightclick.apply(this, [e]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (window.context_menu[self.el.id][&amp;#039;marker&amp;#039;] != undefined) {&lt;br /&gt;
      self.buildContextMenu(&amp;#039;marker&amp;#039;, e);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    google.maps.event.addListener(marker, &amp;#039;dragend&amp;#039;, function() {&lt;br /&gt;
      self.checkMarkerGeofence(marker, function(m, f) {&lt;br /&gt;
        outside(m, f);&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarker = function(options) {&lt;br /&gt;
  var marker;&lt;br /&gt;
  if(options.hasOwnProperty(&amp;#039;gm_accessors_&amp;#039;)) {&lt;br /&gt;
    // Native google.maps.Marker object&lt;br /&gt;
    marker = options;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if ((options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) || options.position) {&lt;br /&gt;
      marker = this.createMarker(options);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  marker.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if(this.markerClusterer) {&lt;br /&gt;
    this.markerClusterer.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.markers.push(marker);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;marker_added&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarkers = function(array) {&lt;br /&gt;
  for (var i = 0, marker; marker=array[i]; i++) {&lt;br /&gt;
    this.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return this.markers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.hideInfoWindows = function() {&lt;br /&gt;
  for (var i = 0, marker; marker = this.markers[i]; i++){&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      marker.infoWindow.close();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarker = function(marker) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
    if (this.markers[i] === marker) {&lt;br /&gt;
      this.markers[i].setMap(null);&lt;br /&gt;
      this.markers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      if(this.markerClusterer) {&lt;br /&gt;
        this.markerClusterer.removeMarker(marker);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarkers = function (collection) {&lt;br /&gt;
  var new_markers = [];&lt;br /&gt;
&lt;br /&gt;
  if (typeof collection == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(this.markerClusterer &amp;amp;&amp;amp; this.markerClusterer.clearMarkers) {&lt;br /&gt;
      this.markerClusterer.clearMarkers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; collection.length; i++) {&lt;br /&gt;
      var index = this.markers.indexOf(collection[i]);&lt;br /&gt;
&lt;br /&gt;
      if (index &amp;gt; -1) {&lt;br /&gt;
        var marker = this.markers[index];&lt;br /&gt;
        marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
        if(this.markerClusterer) {&lt;br /&gt;
          this.markerClusterer.removeMarker(marker);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      if (marker.getMap() != null) {&lt;br /&gt;
        new_markers.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawOverlay = function(options) {&lt;br /&gt;
  var overlay = new google.maps.OverlayView(),&lt;br /&gt;
      auto_show = true;&lt;br /&gt;
&lt;br /&gt;
  overlay.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if (options.auto_show != null) {&lt;br /&gt;
    auto_show = options.auto_show;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  overlay.onAdd = function() {&lt;br /&gt;
    var el = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    el.style.borderStyle = &amp;quot;none&amp;quot;;&lt;br /&gt;
    el.style.borderWidth = &amp;quot;0px&amp;quot;;&lt;br /&gt;
    el.style.position = &amp;quot;absolute&amp;quot;;&lt;br /&gt;
    el.style.zIndex = 100;&lt;br /&gt;
    el.innerHTML = options.content;&lt;br /&gt;
&lt;br /&gt;
    overlay.el = el;&lt;br /&gt;
&lt;br /&gt;
    if (!options.layer) {&lt;br /&gt;
      options.layer = &amp;#039;overlayLayer&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var panes = this.getPanes(),&lt;br /&gt;
        overlayLayer = panes[options.layer],&lt;br /&gt;
        stop_overlay_events = [&amp;#039;contextmenu&amp;#039;, &amp;#039;DOMMouseScroll&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    overlayLayer.appendChild(el);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; stop_overlay_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        google.maps.event.addDomListener(object, name, function(e){&lt;br /&gt;
          if (navigator.userAgent.toLowerCase().indexOf(&amp;#039;msie&amp;#039;) != -1 &amp;amp;&amp;amp; document.all) {&lt;br /&gt;
            e.cancelBubble = true;&lt;br /&gt;
            e.returnValue = false;&lt;br /&gt;
          }&lt;br /&gt;
          else {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
      })(el, stop_overlay_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      panes.overlayMouseTarget.appendChild(overlay.el);&lt;br /&gt;
      google.maps.event.addDomListener(overlay.el, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
        options.click.apply(overlay, [overlay]);&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.trigger(this, &amp;#039;ready&amp;#039;);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.draw = function() {&lt;br /&gt;
    var projection = this.getProjection(),&lt;br /&gt;
        pixel = projection.fromLatLngToDivPixel(new google.maps.LatLng(options.lat, options.lng));&lt;br /&gt;
&lt;br /&gt;
    options.horizontalOffset = options.horizontalOffset || 0;&lt;br /&gt;
    options.verticalOffset = options.verticalOffset || 0;&lt;br /&gt;
&lt;br /&gt;
    var el = overlay.el,&lt;br /&gt;
        content = el.children[0],&lt;br /&gt;
        content_height = content.clientHeight,&lt;br /&gt;
        content_width = content.clientWidth;&lt;br /&gt;
&lt;br /&gt;
    switch (options.verticalAlign) {&lt;br /&gt;
      case &amp;#039;top&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - content_height + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;middle&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - (content_height / 2) + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;bottom&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (options.horizontalAlign) {&lt;br /&gt;
      case &amp;#039;left&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - content_width + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;center&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - (content_width / 2) + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;right&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    el.style.display = auto_show ? &amp;#039;block&amp;#039; : &amp;#039;none&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (!auto_show) {&lt;br /&gt;
      options.show.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.onRemove = function() {&lt;br /&gt;
    var el = overlay.el;&lt;br /&gt;
&lt;br /&gt;
    if (options.remove) {&lt;br /&gt;
      options.remove.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      overlay.el.parentNode.removeChild(overlay.el);&lt;br /&gt;
      overlay.el = null;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.overlays.push(overlay);&lt;br /&gt;
  return overlay;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlay = function(overlay) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.overlays.length; i++) {&lt;br /&gt;
    if (this.overlays[i] === overlay) {&lt;br /&gt;
      this.overlays[i].setMap(null);&lt;br /&gt;
      this.overlays.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlays = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.overlays[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.overlays = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolyline = function(options) {&lt;br /&gt;
  var path = [],&lt;br /&gt;
      points = options.path;&lt;br /&gt;
&lt;br /&gt;
  if (points.length) {&lt;br /&gt;
    if (points[0][0] === undefined) {&lt;br /&gt;
      path = points;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      for (var i = 0, latlng; latlng = points[i]; i++) {&lt;br /&gt;
        path.push(new google.maps.LatLng(latlng[0], latlng[1]));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    path: path,&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight,&lt;br /&gt;
    geodesic: options.geodesic,&lt;br /&gt;
    clickable: true,&lt;br /&gt;
    editable: false,&lt;br /&gt;
    visible: true&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;clickable&amp;quot;)) {&lt;br /&gt;
    polyline_options.clickable = options.clickable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;editable&amp;quot;)) {&lt;br /&gt;
    polyline_options.editable = options.editable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;zIndex&amp;quot;)) {&lt;br /&gt;
    polyline_options.zIndex = options.zIndex;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline = new google.maps.Polyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
  var polyline_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polyline_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polyline, polyline_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines.push(polyline);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polyline_added&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
  return polyline;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolyline = function(polyline) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polylines.length; i++) {&lt;br /&gt;
    if (this.polylines[i] === polyline) {&lt;br /&gt;
      this.polylines[i].setMap(null);&lt;br /&gt;
      this.polylines.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polyline_removed&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolylines = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polylines[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawCircle = function(options) {&lt;br /&gt;
  options =  extend_object({&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    center: new google.maps.LatLng(options.lat, options.lng)&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Circle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRectangle = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  var latLngBounds = new google.maps.LatLngBounds(&lt;br /&gt;
    new google.maps.LatLng(options.bounds[0][0], options.bounds[0][1]),&lt;br /&gt;
    new google.maps.LatLng(options.bounds[1][0], options.bounds[1][1])&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  options.bounds = latLngBounds;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Rectangle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolygon = function(options) {&lt;br /&gt;
  var useGeoJSON = false;&lt;br /&gt;
&lt;br /&gt;
  if(options.hasOwnProperty(&amp;quot;useGeoJSON&amp;quot;)) {&lt;br /&gt;
    useGeoJSON = options.useGeoJSON;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.useGeoJSON;&lt;br /&gt;
&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON == false) {&lt;br /&gt;
    options.paths = [options.paths.slice(0)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.paths.length &amp;gt; 0) {&lt;br /&gt;
    if (options.paths[0].length &amp;gt; 0) {&lt;br /&gt;
      options.paths = array_flat(array_map(options.paths, arrayToLatLng, useGeoJSON));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Polygon(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polygon_added&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygon = function(polygon) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polygons.length; i++) {&lt;br /&gt;
    if (this.polygons[i] === polygon) {&lt;br /&gt;
      this.polygons[i].setMap(null);&lt;br /&gt;
      this.polygons.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polygon_removed&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygons = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polygons[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromFusionTables = function(options) {&lt;br /&gt;
  var events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var fusion_tables_options = options,&lt;br /&gt;
      layer = new google.maps.FusionTablesLayer(fusion_tables_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromFusionTables = function(options) {&lt;br /&gt;
  var layer = this.getFromFusionTables(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromKML = function(options) {&lt;br /&gt;
  var url = options.url,&lt;br /&gt;
      events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.url;&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var kml_options = options,&lt;br /&gt;
      layer = new google.maps.KmlLayer(url, kml_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromKML = function(options) {&lt;br /&gt;
  var layer = this.getFromKML(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addLayer = function(layerName, options) {&lt;br /&gt;
  //var default_layers = [&amp;#039;weather&amp;#039;, &amp;#039;clouds&amp;#039;, &amp;#039;traffic&amp;#039;, &amp;#039;transit&amp;#039;, &amp;#039;bicycling&amp;#039;, &amp;#039;panoramio&amp;#039;, &amp;#039;places&amp;#039;];&lt;br /&gt;
  options = options || {};&lt;br /&gt;
  var layer;&lt;br /&gt;
&lt;br /&gt;
  switch(layerName) {&lt;br /&gt;
    case &amp;#039;weather&amp;#039;: this.singleLayers.weather = layer = new google.maps.weather.WeatherLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;clouds&amp;#039;: this.singleLayers.clouds = layer = new google.maps.weather.CloudLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;traffic&amp;#039;: this.singleLayers.traffic = layer = new google.maps.TrafficLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;: this.singleLayers.transit = layer = new google.maps.TransitLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;: this.singleLayers.bicycling = layer = new google.maps.BicyclingLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;panoramio&amp;#039;:&lt;br /&gt;
        this.singleLayers.panoramio = layer = new google.maps.panoramio.PanoramioLayer();&lt;br /&gt;
        layer.setTag(options.filter);&lt;br /&gt;
        delete options.filter;&lt;br /&gt;
&lt;br /&gt;
        //click event&lt;br /&gt;
        if (options.click) {&lt;br /&gt;
          google.maps.event.addListener(layer, &amp;#039;click&amp;#039;, function(event) {&lt;br /&gt;
            options.click(event);&lt;br /&gt;
            delete options.click;&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
      case &amp;#039;places&amp;#039;:&lt;br /&gt;
        this.singleLayers.places = layer = new google.maps.places.PlacesService(this.map);&lt;br /&gt;
&lt;br /&gt;
        //search, nearbySearch, radarSearch callback, Both are the same&lt;br /&gt;
        if (options.search || options.nearbySearch || options.radarSearch) {&lt;br /&gt;
          var placeSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            keyword : options.keyword || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            name : options.name || null,&lt;br /&gt;
            radius : options.radius || null,&lt;br /&gt;
            rankBy : options.rankBy || null,&lt;br /&gt;
            types : options.types || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          if (options.radarSearch) {&lt;br /&gt;
            layer.radarSearch(placeSearchRequest, options.radarSearch);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.search) {&lt;br /&gt;
            layer.search(placeSearchRequest, options.search);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.nearbySearch) {&lt;br /&gt;
            layer.nearbySearch(placeSearchRequest, options.nearbySearch);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //textSearch callback&lt;br /&gt;
        if (options.textSearch) {&lt;br /&gt;
          var textSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            query : options.query || null,&lt;br /&gt;
            radius : options.radius || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          layer.textSearch(textSearchRequest, options.textSearch);&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (layer !== undefined) {&lt;br /&gt;
    if (typeof layer.setOptions == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setOptions(options);&lt;br /&gt;
    }&lt;br /&gt;
    if (typeof layer.setMap == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setMap(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return layer;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeLayer = function(layer) {&lt;br /&gt;
  if (typeof(layer) == &amp;quot;string&amp;quot; &amp;amp;&amp;amp; this.singleLayers[layer] !== undefined) {&lt;br /&gt;
     this.singleLayers[layer].setMap(null);&lt;br /&gt;
&lt;br /&gt;
     delete this.singleLayers[layer];&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.layers.length; i++) {&lt;br /&gt;
      if (this.layers[i] === layer) {&lt;br /&gt;
        this.layers[i].setMap(null);&lt;br /&gt;
        this.layers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var travelMode, unitSystem;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getRoutes = function(options) {&lt;br /&gt;
  switch (options.travelMode) {&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.BICYCLING;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.TRANSIT;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;driving&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.DRIVING;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      travelMode = google.maps.TravelMode.WALKING;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.unitSystem === &amp;#039;imperial&amp;#039;) {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.IMPERIAL;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.METRIC;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var base_options = {&lt;br /&gt;
        avoidHighways: false,&lt;br /&gt;
        avoidTolls: false,&lt;br /&gt;
        optimizeWaypoints: false,&lt;br /&gt;
        waypoints: []&lt;br /&gt;
      },&lt;br /&gt;
      request_options =  extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]);&lt;br /&gt;
  request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]);&lt;br /&gt;
  request_options.travelMode = travelMode;&lt;br /&gt;
  request_options.unitSystem = unitSystem;&lt;br /&gt;
&lt;br /&gt;
  delete request_options.callback;&lt;br /&gt;
  delete request_options.error;&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      routes = [],&lt;br /&gt;
      service = new google.maps.DirectionsService();&lt;br /&gt;
&lt;br /&gt;
  service.route(request_options, function(result, status) {&lt;br /&gt;
    if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
      for (var r in result.routes) {&lt;br /&gt;
        if (result.routes.hasOwnProperty(r)) {&lt;br /&gt;
          routes.push(result.routes[r]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback(routes, result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      if (options.error) {&lt;br /&gt;
        options.error(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeRoutes = function() {&lt;br /&gt;
  this.routes.length = 0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getElevations = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    locations: [],&lt;br /&gt;
    path : false,&lt;br /&gt;
    samples : 256&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (options.locations.length &amp;gt; 0) {&lt;br /&gt;
    if (options.locations[0].length &amp;gt; 0) {&lt;br /&gt;
      options.locations = array_flat(array_map([options.locations], arrayToLatLng,  false));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
&lt;br /&gt;
  var service = new google.maps.ElevationService();&lt;br /&gt;
&lt;br /&gt;
  //location request&lt;br /&gt;
  if (!options.path) {&lt;br /&gt;
    delete options.path;&lt;br /&gt;
    delete options.samples;&lt;br /&gt;
&lt;br /&gt;
    service.getElevationForLocations(options, function(result, status) {&lt;br /&gt;
      if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  //path request&lt;br /&gt;
  } else {&lt;br /&gt;
    var pathRequest = {&lt;br /&gt;
      path : options.locations,&lt;br /&gt;
      samples : options.samples&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    service.getElevationAlongPath(pathRequest, function(result, status) {&lt;br /&gt;
     if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.renderRoute = function(options, renderOptions) {&lt;br /&gt;
  var self = this,&lt;br /&gt;
      panel = ((typeof renderOptions.panel === &amp;#039;string&amp;#039;) ? document.getElementById(renderOptions.panel.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;)) : renderOptions.panel),&lt;br /&gt;
      display;&lt;br /&gt;
&lt;br /&gt;
  renderOptions.panel = panel;&lt;br /&gt;
  renderOptions = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, renderOptions);&lt;br /&gt;
  display = new google.maps.DirectionsRenderer(renderOptions);&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes, response, status) {&lt;br /&gt;
      if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
        display.setDirections(response);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes) {&lt;br /&gt;
      if (routes.length &amp;gt; 0) {&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: routes[routes.length - 1].overview_path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
        if (options.callback) {&lt;br /&gt;
          options.callback(routes[routes.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.travelRoute = function(options) {&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      unitSystem: options.unitSystem,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawSteppedRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              var polyline_options = {&lt;br /&gt;
                path: step.path,&lt;br /&gt;
                strokeColor: options.strokeColor,&lt;br /&gt;
                strokeOpacity: options.strokeOpacity,&lt;br /&gt;
                strokeWeight: options.strokeWeight&lt;br /&gt;
              };&lt;br /&gt;
&lt;br /&gt;
              if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
                polyline_options.icons = options.icons;&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              self.drawPolyline(polyline_options);&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: step.path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route = function(options) {&lt;br /&gt;
  this.origin = options.origin;&lt;br /&gt;
  this.destination = options.destination;&lt;br /&gt;
  this.waypoints = options.waypoints;&lt;br /&gt;
&lt;br /&gt;
  this.map = options.map;&lt;br /&gt;
  this.route = options.route;&lt;br /&gt;
  this.step_count = 0;&lt;br /&gt;
  this.steps = this.route.legs[0].steps;&lt;br /&gt;
  this.steps_length = this.steps.length;&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    path: new google.maps.MVCArray(),&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polyline = this.map.drawPolyline(polyline_options).getPath();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.getRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.map.getRoutes({&lt;br /&gt;
    origin : this.origin,&lt;br /&gt;
    destination : this.destination,&lt;br /&gt;
    travelMode : options.travelMode,&lt;br /&gt;
    waypoints : this.waypoints || [],&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    callback : function() {&lt;br /&gt;
      self.route = e[0];&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback.call(self);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.back = function() {&lt;br /&gt;
  if (this.step_count &amp;gt; 0) {&lt;br /&gt;
    this.step_count--;&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.pop();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.forward = function() {&lt;br /&gt;
  if (this.step_count &amp;lt; this.steps_length) {&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.push(path[p]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    this.step_count++;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkGeofence = function(lat, lng, fence) {&lt;br /&gt;
  return fence.containsLatLng(new google.maps.LatLng(lat, lng));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkMarkerGeofence = function(marker, outside_callback) {&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    for (var i = 0, fence; fence = marker.fences[i]; i++) {&lt;br /&gt;
      var pos = marker.getPosition();&lt;br /&gt;
      if (!this.checkGeofence(pos.lat(), pos.lng(), fence)) {&lt;br /&gt;
        outside_callback(marker, fence);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.toImage = function(options) {&lt;br /&gt;
  var options = options || {},&lt;br /&gt;
      static_map_options = {};&lt;br /&gt;
&lt;br /&gt;
  static_map_options[&amp;#039;size&amp;#039;] = options[&amp;#039;size&amp;#039;] || [this.el.clientWidth, this.el.clientHeight];&lt;br /&gt;
  static_map_options[&amp;#039;lat&amp;#039;] = this.getCenter().lat();&lt;br /&gt;
  static_map_options[&amp;#039;lng&amp;#039;] = this.getCenter().lng();&lt;br /&gt;
&lt;br /&gt;
  if (this.markers.length &amp;gt; 0) {&lt;br /&gt;
    static_map_options[&amp;#039;markers&amp;#039;] = [];&lt;br /&gt;
    &lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      static_map_options[&amp;#039;markers&amp;#039;].push({&lt;br /&gt;
        lat: this.markers[i].getPosition().lat(),&lt;br /&gt;
        lng: this.markers[i].getPosition().lng()&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (this.polylines.length &amp;gt; 0) {&lt;br /&gt;
    var polyline = this.polylines[0];&lt;br /&gt;
    &lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;] = {};&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;path&amp;#039;] = google.maps.geometry.encoding.encodePath(polyline.getPath());&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeColor&amp;#039;] = polyline.strokeColor&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeOpacity&amp;#039;] = polyline.strokeOpacity&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeWeight&amp;#039;] = polyline.strokeWeight&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return GMaps.staticMapURL(static_map_options);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.staticMapURL = function(options){&lt;br /&gt;
  var parameters = [],&lt;br /&gt;
      data,&lt;br /&gt;
      static_root = (location.protocol === &amp;#039;file:&amp;#039; ? &amp;#039;http:&amp;#039; : location.protocol ) + &amp;#039;//maps.googleapis.com/maps/api/staticmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.url) {&lt;br /&gt;
    static_root = options.url;&lt;br /&gt;
    delete options.url;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  static_root += &amp;#039;?&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  var markers = options.markers;&lt;br /&gt;
  &lt;br /&gt;
  delete options.markers;&lt;br /&gt;
&lt;br /&gt;
  if (!markers &amp;amp;&amp;amp; options.marker) {&lt;br /&gt;
    markers = [options.marker];&lt;br /&gt;
    delete options.marker;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var styles = options.styles;&lt;br /&gt;
&lt;br /&gt;
  delete options.styles;&lt;br /&gt;
&lt;br /&gt;
  var polyline = options.polyline;&lt;br /&gt;
  delete options.polyline;&lt;br /&gt;
&lt;br /&gt;
  /** Map options **/&lt;br /&gt;
  if (options.center) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.center);&lt;br /&gt;
    delete options.center;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.address) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.address);&lt;br /&gt;
    delete options.address;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.lat) {&lt;br /&gt;
    parameters.push([&amp;#039;center=&amp;#039;, options.lat, &amp;#039;,&amp;#039;, options.lng].join(&amp;#039;&amp;#039;));&lt;br /&gt;
    delete options.lat;&lt;br /&gt;
    delete options.lng;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.visible) {&lt;br /&gt;
    var visible = encodeURI(options.visible.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
    parameters.push(&amp;#039;visible=&amp;#039; + visible);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var size = options.size;&lt;br /&gt;
  if (size) {&lt;br /&gt;
    if (size.join) {&lt;br /&gt;
      size = size.join(&amp;#039;x&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    delete options.size;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    size = &amp;#039;630x300&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  parameters.push(&amp;#039;size=&amp;#039; + size);&lt;br /&gt;
&lt;br /&gt;
  if (!options.zoom &amp;amp;&amp;amp; options.zoom !== false) {&lt;br /&gt;
    options.zoom = 15;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var sensor = options.hasOwnProperty(&amp;#039;sensor&amp;#039;) ? !!options.sensor : true;&lt;br /&gt;
  delete options.sensor;&lt;br /&gt;
  parameters.push(&amp;#039;sensor=&amp;#039; + sensor);&lt;br /&gt;
&lt;br /&gt;
  for (var param in options) {&lt;br /&gt;
    if (options.hasOwnProperty(param)) {&lt;br /&gt;
      parameters.push(param + &amp;#039;=&amp;#039; + options[param]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Markers **/&lt;br /&gt;
  if (markers) {&lt;br /&gt;
    var marker, loc;&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; data = markers[i]; i++) {&lt;br /&gt;
      marker = [];&lt;br /&gt;
&lt;br /&gt;
      if (data.size &amp;amp;&amp;amp; data.size !== &amp;#039;normal&amp;#039;) {&lt;br /&gt;
        marker.push(&amp;#039;size:&amp;#039; + data.size);&lt;br /&gt;
        delete data.size;&lt;br /&gt;
      }&lt;br /&gt;
      else if (data.icon) {&lt;br /&gt;
        marker.push(&amp;#039;icon:&amp;#039; + encodeURI(data.icon));&lt;br /&gt;
        delete data.icon;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.color) {&lt;br /&gt;
        marker.push(&amp;#039;color:&amp;#039; + data.color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;));&lt;br /&gt;
        delete data.color;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.label) {&lt;br /&gt;
        marker.push(&amp;#039;label:&amp;#039; + data.label[0].toUpperCase());&lt;br /&gt;
        delete data.label;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      loc = (data.address ? data.address : data.lat + &amp;#039;,&amp;#039; + data.lng);&lt;br /&gt;
      delete data.address;&lt;br /&gt;
      delete data.lat;&lt;br /&gt;
      delete data.lng;&lt;br /&gt;
&lt;br /&gt;
      for(var param in data){&lt;br /&gt;
        if (data.hasOwnProperty(param)) {&lt;br /&gt;
          marker.push(param + &amp;#039;:&amp;#039; + data[param]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (marker.length || i === 0) {&lt;br /&gt;
        marker.push(loc);&lt;br /&gt;
        marker = marker.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
        parameters.push(&amp;#039;markers=&amp;#039; + encodeURI(marker));&lt;br /&gt;
      }&lt;br /&gt;
      // New marker without styles&lt;br /&gt;
      else {&lt;br /&gt;
        marker = parameters.pop() + encodeURI(&amp;#039;|&amp;#039; + loc);&lt;br /&gt;
        parameters.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Map Styles **/&lt;br /&gt;
  if (styles) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; styles.length; i++) {&lt;br /&gt;
      var styleRule = [];&lt;br /&gt;
      if (styles[i].featureType){&lt;br /&gt;
        styleRule.push(&amp;#039;feature:&amp;#039; + styles[i].featureType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (styles[i].elementType) {&lt;br /&gt;
        styleRule.push(&amp;#039;element:&amp;#039; + styles[i].elementType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      for (var j = 0; j &amp;lt; styles[i].stylers.length; j++) {&lt;br /&gt;
        for (var p in styles[i].stylers[j]) {&lt;br /&gt;
          var ruleArg = styles[i].stylers[j][p];&lt;br /&gt;
          if (p == &amp;#039;hue&amp;#039; || p == &amp;#039;color&amp;#039;) {&lt;br /&gt;
            ruleArg = &amp;#039;0x&amp;#039; + ruleArg.substring(1);&lt;br /&gt;
          }&lt;br /&gt;
          styleRule.push(p + &amp;#039;:&amp;#039; + ruleArg);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var rule = styleRule.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
      if (rule != &amp;#039;&amp;#039;) {&lt;br /&gt;
        parameters.push(&amp;#039;style=&amp;#039; + rule);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Polylines **/&lt;br /&gt;
  function parseColor(color, opacity) {&lt;br /&gt;
    if (color[0] === &amp;#039;#&amp;#039;){&lt;br /&gt;
      color = color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (opacity) {&lt;br /&gt;
        opacity = parseFloat(opacity);&lt;br /&gt;
        opacity = Math.min(1, Math.max(opacity, 0));&lt;br /&gt;
        if (opacity === 0) {&lt;br /&gt;
          return &amp;#039;0x00000000&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        opacity = (opacity * 255).toString(16);&lt;br /&gt;
        if (opacity.length === 1) {&lt;br /&gt;
          opacity += opacity;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        color = color.slice(0,8) + opacity;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return color;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (polyline) {&lt;br /&gt;
    data = polyline;&lt;br /&gt;
    polyline = [];&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeWeight) {&lt;br /&gt;
      polyline.push(&amp;#039;weight:&amp;#039; + parseInt(data.strokeWeight, 10));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeColor) {&lt;br /&gt;
      var color = parseColor(data.strokeColor, data.strokeOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;color:&amp;#039; + color);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.fillColor) {&lt;br /&gt;
      var fillcolor = parseColor(data.fillColor, data.fillOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;fillcolor:&amp;#039; + fillcolor);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var path = data.path;&lt;br /&gt;
    if (path.join) {&lt;br /&gt;
      for (var j=0, pos; pos=path[j]; j++) {&lt;br /&gt;
        polyline.push(pos.join(&amp;#039;,&amp;#039;));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      polyline.push(&amp;#039;enc:&amp;#039; + path);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    polyline = polyline.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
    parameters.push(&amp;#039;path=&amp;#039; + encodeURI(polyline));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Retina support **/&lt;br /&gt;
  var dpi = window.devicePixelRatio || 1;&lt;br /&gt;
  parameters.push(&amp;#039;scale=&amp;#039; + dpi);&lt;br /&gt;
&lt;br /&gt;
  parameters = parameters.join(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
  return static_root + parameters;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMapType = function(mapTypeId, options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTileUrl&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTileUrl&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    options.tileSize = options.tileSize || new google.maps.Size(256, 256);&lt;br /&gt;
&lt;br /&gt;
    var mapType = new google.maps.ImageMapType(options);&lt;br /&gt;
&lt;br /&gt;
    this.map.mapTypes.set(mapTypeId, mapType);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTileUrl&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addOverlayMapType = function(options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTile&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTile&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    var overlayMapTypeIndex = options.index;&lt;br /&gt;
&lt;br /&gt;
    delete options.index;&lt;br /&gt;
&lt;br /&gt;
    this.map.overlayMapTypes.insertAt(overlayMapTypeIndex, options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTile&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlayMapType = function(overlayMapTypeIndex) {&lt;br /&gt;
  this.map.overlayMapTypes.removeAt(overlayMapTypeIndex);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addStyle = function(options) {&lt;br /&gt;
  var styledMapType = new google.maps.StyledMapType(options.styles, { name: options.styledMapName });&lt;br /&gt;
&lt;br /&gt;
  this.map.mapTypes.set(options.mapTypeId, styledMapType);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.setStyle = function(mapTypeId) {&lt;br /&gt;
  this.map.setMapTypeId(mapTypeId);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createPanorama = function(streetview_options) {&lt;br /&gt;
  if (!streetview_options.hasOwnProperty(&amp;#039;lat&amp;#039;) || !streetview_options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    streetview_options.lat = this.getCenter().lat();&lt;br /&gt;
    streetview_options.lng = this.getCenter().lng();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.panorama = GMaps.createPanorama(streetview_options);&lt;br /&gt;
&lt;br /&gt;
  this.map.setStreetView(this.panorama);&lt;br /&gt;
&lt;br /&gt;
  return this.panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.createPanorama = function(options) {&lt;br /&gt;
  var el = getElementById(options.el, options.context);&lt;br /&gt;
&lt;br /&gt;
  options.position = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
&lt;br /&gt;
  delete options.el;&lt;br /&gt;
  delete options.context;&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var streetview_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;links_changed&amp;#039;, &amp;#039;pano_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;pov_changed&amp;#039;, &amp;#039;resize&amp;#039;, &amp;#039;visible_changed&amp;#039;],&lt;br /&gt;
      streetview_options = extend_object({visible : true}, options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    delete streetview_options[streetview_events[i]];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var panorama = new google.maps.StreetViewPanorama(el, streetview_options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(panorama, streetview_events[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.on = function(event_name, handler) {&lt;br /&gt;
  return GMaps.on(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.off = function(event_name) {&lt;br /&gt;
  GMaps.off(event_name, this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.once = function(event_name, handler) {&lt;br /&gt;
  return GMaps.once(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.custom_events = [&amp;#039;marker_added&amp;#039;, &amp;#039;marker_removed&amp;#039;, &amp;#039;polyline_added&amp;#039;, &amp;#039;polyline_removed&amp;#039;, &amp;#039;polygon_added&amp;#039;, &amp;#039;polygon_removed&amp;#039;, &amp;#039;geolocated&amp;#039;, &amp;#039;geolocation_failed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
GMaps.on = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    return google.maps.event.addListener(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    var registered_event = {&lt;br /&gt;
      handler : handler,&lt;br /&gt;
      eventName : event_name&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    object.registered_events[event_name] = object.registered_events[event_name] || [];&lt;br /&gt;
    object.registered_events[event_name].push(registered_event);&lt;br /&gt;
&lt;br /&gt;
    return registered_event;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.off = function(event_name, object) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    google.maps.event.clearListeners(object, event_name);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    object.registered_events[event_name] = [];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.once = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map;&lt;br /&gt;
    return google.maps.event.addListenerOnce(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.fire = function(event_name, object, scope) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    google.maps.event.trigger(object, event_name, Array.prototype.slice.apply(arguments).slice(2));&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if(event_name in scope.registered_events) {&lt;br /&gt;
      var firing_events = scope.registered_events[event_name];&lt;br /&gt;
&lt;br /&gt;
      for(var i = 0; i &amp;lt; firing_events.length; i++) {&lt;br /&gt;
        (function(handler, scope, object) {&lt;br /&gt;
          handler.apply(scope, [object]);&lt;br /&gt;
        })(firing_events[i][&amp;#039;handler&amp;#039;], scope, object);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geolocate = function(options) {&lt;br /&gt;
  var complete_callback = options.always || options.complete;&lt;br /&gt;
&lt;br /&gt;
  if (navigator.geolocation) {&lt;br /&gt;
    navigator.geolocation.getCurrentPosition(function(position) {&lt;br /&gt;
      options.success(position);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, function(error) {&lt;br /&gt;
      options.error(error);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, options.options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    options.not_supported();&lt;br /&gt;
&lt;br /&gt;
    if (complete_callback) {&lt;br /&gt;
      complete_callback();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geocode = function(options) {&lt;br /&gt;
  this.geocoder = new google.maps.Geocoder();&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  if (options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    options.latLng = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
  &lt;br /&gt;
  this.geocoder.geocode(options, function(results, status) {&lt;br /&gt;
    callback(results, status);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
if (typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps) {&lt;br /&gt;
  //==========================&lt;br /&gt;
  // Polygon containsLatLng&lt;br /&gt;
  // https://github.com/tparkin/Google-Maps-Point-in-Polygon&lt;br /&gt;
  // Poygon getBounds extension - google-maps-extensions&lt;br /&gt;
  // http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js&lt;br /&gt;
  if (!google.maps.Polygon.prototype.getBounds) {&lt;br /&gt;
    google.maps.Polygon.prototype.getBounds = function(latLng) {&lt;br /&gt;
      var bounds = new google.maps.LatLngBounds();&lt;br /&gt;
      var paths = this.getPaths();&lt;br /&gt;
      var path;&lt;br /&gt;
&lt;br /&gt;
      for (var p = 0; p &amp;lt; paths.getLength(); p++) {&lt;br /&gt;
        path = paths.getAt(p);&lt;br /&gt;
        for (var i = 0; i &amp;lt; path.getLength(); i++) {&lt;br /&gt;
          bounds.extend(path.getAt(i));&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return bounds;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Polygon.prototype.containsLatLng) {&lt;br /&gt;
    // Polygon containsLatLng - method to determine if a latLng is within a polygon&lt;br /&gt;
    google.maps.Polygon.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      // Exclude points outside of bounds as there is no way they are in the poly&lt;br /&gt;
      var bounds = this.getBounds();&lt;br /&gt;
&lt;br /&gt;
      if (bounds !== null &amp;amp;&amp;amp; !bounds.contains(latLng)) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Raycast point in polygon method&lt;br /&gt;
      var inPoly = false;&lt;br /&gt;
&lt;br /&gt;
      var numPaths = this.getPaths().getLength();&lt;br /&gt;
      for (var p = 0; p &amp;lt; numPaths; p++) {&lt;br /&gt;
        var path = this.getPaths().getAt(p);&lt;br /&gt;
        var numPoints = path.getLength();&lt;br /&gt;
        var j = numPoints - 1;&lt;br /&gt;
&lt;br /&gt;
        for (var i = 0; i &amp;lt; numPoints; i++) {&lt;br /&gt;
          var vertex1 = path.getAt(i);&lt;br /&gt;
          var vertex2 = path.getAt(j);&lt;br /&gt;
&lt;br /&gt;
          if (vertex1.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex2.lng() &amp;gt;= latLng.lng() || vertex2.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex1.lng() &amp;gt;= latLng.lng()) {&lt;br /&gt;
            if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) &amp;lt; latLng.lat()) {&lt;br /&gt;
              inPoly = !inPoly;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          j = i;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return inPoly;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Circle.prototype.containsLatLng) {&lt;br /&gt;
    google.maps.Circle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      if (google.maps.geometry) {&lt;br /&gt;
        return google.maps.geometry.spherical.computeDistanceBetween(this.getCenter(), latLng) &amp;lt;= this.getRadius();&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.Rectangle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.getBounds().contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.setFences = function(fences) {&lt;br /&gt;
    this.fences = fences;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.addFence = function(fence) {&lt;br /&gt;
    this.fences.push(fence);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.getId = function() {&lt;br /&gt;
    return this[&amp;#039;__gm_id&amp;#039;];&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==========================&lt;br /&gt;
// Array indexOf&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf&lt;br /&gt;
if (!Array.prototype.indexOf) {&lt;br /&gt;
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {&lt;br /&gt;
      &amp;quot;use strict&amp;quot;;&lt;br /&gt;
      if (this == null) {&lt;br /&gt;
          throw new TypeError();&lt;br /&gt;
      }&lt;br /&gt;
      var t = Object(this);&lt;br /&gt;
      var len = t.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
      if (len === 0) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var n = 0;&lt;br /&gt;
      if (arguments.length &amp;gt; 1) {&lt;br /&gt;
          n = Number(arguments[1]);&lt;br /&gt;
          if (n != n) { // shortcut for verifying if it&amp;#039;s NaN&lt;br /&gt;
              n = 0;&lt;br /&gt;
          } else if (n != 0 &amp;amp;&amp;amp; n != Infinity &amp;amp;&amp;amp; n != -Infinity) {&lt;br /&gt;
              n = (n &amp;gt; 0 || -1) * Math.floor(Math.abs(n));&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      if (n &amp;gt;= len) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var k = n &amp;gt;= 0 ? n : Math.max(len - Math.abs(n), 0);&lt;br /&gt;
      for (; k &amp;lt; len; k++) {&lt;br /&gt;
          if (k in t &amp;amp;&amp;amp; t[k] === searchElement) {&lt;br /&gt;
              return k;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return GMaps;&lt;br /&gt;
}));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
approve.js&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
howlerjs.com - Cross Plattform Audio&lt;br /&gt;
&lt;br /&gt;
== Browser Fixing ==&lt;br /&gt;
[[JavaScript - iOS Orientation Change Fix]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22918</id>
		<title>JavaScript - Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22918"/>
		<updated>2018-03-29T20:03:25Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Lightbox, Gallery &amp;amp; co */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Libraries Skripte und Plugins für JavaScript, sortiert nach Kategorien&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.jqueryscript.net/&lt;br /&gt;
&lt;br /&gt;
== Images Loaded ==&lt;br /&gt;
Testen ob alle Bilder geladen sind, um dann weitere Funktionen auzuführen.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Images Loaded]]&lt;br /&gt;
== Events ==&lt;br /&gt;
=== Gesture Recognition ===&lt;br /&gt;
[[JavaScript - hammer.js Webapp Touch Gestures]]&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
=== CreateJS ===&lt;br /&gt;
Tools für Animation und Interaktion&lt;br /&gt;
&lt;br /&gt;
http://createjs.com&lt;br /&gt;
&lt;br /&gt;
=== jQuery Appear ===&lt;br /&gt;
[[jQuery Appear - Plugin]] - Events wenn Elemente im Viewport auftauchen / verschwinden&lt;br /&gt;
&lt;br /&gt;
=== jQuery Easing ===&lt;br /&gt;
Easing Kurven für Animationen [[jQuery Easing - Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Simple Text Rotator ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Simple Text Rotator&lt;br /&gt;
!function(e){var t={animation:&amp;quot;dissolve&amp;quot;,separator:&amp;quot;,&amp;quot;,speed:2e3};e.fn.textrotator=function(n){var r=e.extend({},t,n);return this.each(function(){var t=e(this);var n=[];e.each(t.text().split(r.separator),function(e,t){n.push(t)});t.text(n[0]);var i=function(){switch(r.animation){case&amp;quot;dissolve&amp;quot;:t.animate({textShadowBlur:20,opacity:0},500,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).animate({textShadowBlur:0,opacity:1},500)});break;case&amp;quot;flip&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,transform:&amp;quot; rotateY(-180deg)&amp;quot;});break;case&amp;quot;flipUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,transform:&amp;quot; rotateX(-180deg)&amp;quot;});break;case&amp;quot;flipCube&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,transform:&amp;quot; rotateY(180deg)&amp;quot;});break;case&amp;quot;flipCubeUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,transform:&amp;quot; rotateX(180deg)&amp;quot;});break;case&amp;quot;spin&amp;quot;:if(t.find(&amp;quot;.rotating&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.rotating&amp;quot;).html())}s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating spin&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().text(n[s+1]).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotate(0) scale(1)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,transform:&amp;quot;rotate(0) scale(1)&amp;quot;});break;case&amp;quot;fade&amp;quot;:t.fadeOut(r.speed,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).fadeIn(r.speed)});break}};setInterval(i,r.speed)})}}(window.jQuery)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wow Reveal Animations ===&lt;br /&gt;
Kostenpflichtig für kommerzielle Seiten. Developer Lizenz ca 99$. Enthalten z.B. bei angelajochum.de. Kann kostenlos geladen werden zum testen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthieua/WOW&lt;br /&gt;
&lt;br /&gt;
http://mynameismatthieu.com/WOW/index.html&lt;br /&gt;
&lt;br /&gt;
=== Flippy Text Effekt ===&lt;br /&gt;
https://github.com/yemM/flippy&lt;br /&gt;
&lt;br /&gt;
Verwendet in Hera Template&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
=== Pushy ===&lt;br /&gt;
Gutes Mobiles Off-Canvas Menu&lt;br /&gt;
&lt;br /&gt;
[[Pushy Menu]]&lt;br /&gt;
=== Meanmenu ===&lt;br /&gt;
Verwandelt ein Normales verschachteltes Menu in ein gut zu bediendendes Mobiles Menu.&lt;br /&gt;
&lt;br /&gt;
[[Meanmenu.js - jQuery Plugin]] (1.x,2.x)&lt;br /&gt;
&lt;br /&gt;
=== jQuery Mobile Menu ===&lt;br /&gt;
Mobiles Dropdownmenü aus ul Liste&lt;br /&gt;
&lt;br /&gt;
[[jQuery Mobile Menu - Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Parallax ==&lt;br /&gt;
=== Parallax selbst gemacht ===&lt;br /&gt;
[[Parallax Effekt selbst gemacht]]&lt;br /&gt;
&lt;br /&gt;
=== jquery-parallax (jQuery) ===&lt;br /&gt;
Einfach und effektiv.&lt;br /&gt;
&lt;br /&gt;
[[jquery-parallax]]&lt;br /&gt;
&lt;br /&gt;
=== Stellar.js ===&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/&lt;br /&gt;
&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/docs/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*! Stellar.js v0.6.2 | Copyright 2014, Mark Dalgleish | http://markdalgleish.com/projects/stellar.js | http://markdalgleish.mit-license.org */&lt;br /&gt;
!function(a,b,c,d){function e(b,c){this.element=b,this.options=a.extend({},g,c),this._defaults=g,this._name=f,this.init()}var f=&amp;quot;stellar&amp;quot;,g={scrollProperty:&amp;quot;scroll&amp;quot;,positionProperty:&amp;quot;position&amp;quot;,horizontalScrolling:!0,verticalScrolling:!0,horizontalOffset:0,verticalOffset:0,responsive:!1,parallaxBackgrounds:!0,parallaxElements:!0,hideDistantElements:!0,hideElement:function(a){a.hide()},showElement:function(a){a.show()}},h={scroll:{getLeft:function(a){return a.scrollLeft()},setLeft:function(a,b){a.scrollLeft(b)},getTop:function(a){return a.scrollTop()},setTop:function(a,b){a.scrollTop(b)}},position:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;top&amp;quot;),10)}},margin:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;margin-left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;margin-top&amp;quot;),10)}},transform:{getLeft:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[4],10):0},getTop:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[5],10):0}}},i={position:{setLeft:function(a,b){a.css(&amp;quot;left&amp;quot;,b)},setTop:function(a,b){a.css(&amp;quot;top&amp;quot;,b)}},transform:{setPosition:function(a,b,c,d,e){a[0].style[k]=&amp;quot;translate3d(&amp;quot;+(b-c)+&amp;quot;px, &amp;quot;+(d-e)+&amp;quot;px, 0)&amp;quot;}}},j=function(){var b,c=/^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/,d=a(&amp;quot;script&amp;quot;)[0].style,e=&amp;quot;&amp;quot;;for(b in d)if(c.test(b)){e=b.match(c)[0];break}return&amp;quot;WebkitOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Webkit&amp;quot;),&amp;quot;KhtmlOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Khtml&amp;quot;),function(a){return e+(e.length&amp;gt;0?a.charAt(0).toUpperCase()+a.slice(1):a)}}(),k=j(&amp;quot;transform&amp;quot;),l=a(&amp;quot;&amp;lt;div /&amp;gt;&amp;quot;,{style:&amp;quot;background:#fff&amp;quot;}).css(&amp;quot;background-position-x&amp;quot;)!==d,m=l?function(a,b,c){a.css({&amp;quot;background-position-x&amp;quot;:b,&amp;quot;background-position-y&amp;quot;:c})}:function(a,b,c){a.css(&amp;quot;background-position&amp;quot;,b+&amp;quot; &amp;quot;+c)},n=l?function(a){return[a.css(&amp;quot;background-position-x&amp;quot;),a.css(&amp;quot;background-position-y&amp;quot;)]}:function(a){return a.css(&amp;quot;background-position&amp;quot;).split(&amp;quot; &amp;quot;)},o=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a){setTimeout(a,1e3/60)};e.prototype={init:function(){this.options.name=f+&amp;quot;_&amp;quot;+Math.floor(1e9*Math.random()),this._defineElements(),this._defineGetters(),this._defineSetters(),this._handleWindowLoadAndResize(),this._detectViewport(),this.refresh({firstLoad:!0}),&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this._handleScrollEvent():this._startAnimationLoop()},_defineElements:function(){this.element===c.body&amp;amp;&amp;amp;(this.element=b),this.$scrollElement=a(this.element),this.$element=this.element===b?a(&amp;quot;body&amp;quot;):this.$scrollElement,this.$viewportElement=this.options.viewportElement!==d?a(this.options.viewportElement):this.$scrollElement[0]===b||&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this.$scrollElement:this.$scrollElement.parent()},_defineGetters:function(){var a=this,b=h[a.options.scrollProperty];this._getScrollLeft=function(){return b.getLeft(a.$scrollElement)},this._getScrollTop=function(){return b.getTop(a.$scrollElement)}},_defineSetters:function(){var b=this,c=h[b.options.scrollProperty],d=i[b.options.positionProperty],e=c.setLeft,f=c.setTop;this._setScrollLeft=&amp;quot;function&amp;quot;==typeof e?function(a){e(b.$scrollElement,a)}:a.noop,this._setScrollTop=&amp;quot;function&amp;quot;==typeof f?function(a){f(b.$scrollElement,a)}:a.noop,this._setPosition=d.setPosition||function(a,c,e,f,g){b.options.horizontalScrolling&amp;amp;&amp;amp;d.setLeft(a,c,e),b.options.verticalScrolling&amp;amp;&amp;amp;d.setTop(a,f,g)}},_handleWindowLoadAndResize:function(){var c=this,d=a(b);c.options.responsive&amp;amp;&amp;amp;d.bind(&amp;quot;load.&amp;quot;+this.name,function(){c.refresh()}),d.bind(&amp;quot;resize.&amp;quot;+this.name,function(){c._detectViewport(),c.options.responsive&amp;amp;&amp;amp;c.refresh()})},refresh:function(c){var d=this,e=d._getScrollLeft(),f=d._getScrollTop();c&amp;amp;&amp;amp;c.firstLoad||this._reset(),this._setScrollLeft(0),this._setScrollTop(0),this._setOffsets(),this._findParticles(),this._findBackgrounds(),c&amp;amp;&amp;amp;c.firstLoad&amp;amp;&amp;amp;/WebKit/.test(navigator.userAgent)&amp;amp;&amp;amp;a(b).load(function(){var a=d._getScrollLeft(),b=d._getScrollTop();d._setScrollLeft(a+1),d._setScrollTop(b+1),d._setScrollLeft(a),d._setScrollTop(b)}),this._setScrollLeft(e),this._setScrollTop(f)},_detectViewport:function(){var a=this.$viewportElement.offset(),b=null!==a&amp;amp;&amp;amp;a!==d;this.viewportWidth=this.$viewportElement.width(),this.viewportHeight=this.$viewportElement.height(),this.viewportOffsetTop=b?a.top:0,this.viewportOffsetLeft=b?a.left:0},_findParticles:function(){{var b=this;this._getScrollLeft(),this._getScrollTop()}if(this.particles!==d)for(var c=this.particles.length-1;c&amp;gt;=0;c--)this.particles[c].$element.data(&amp;quot;stellar-elementIsActive&amp;quot;,d);this.particles=[],this.options.parallaxElements&amp;amp;&amp;amp;this.$element.find(&amp;quot;[data-stellar-ratio]&amp;quot;).each(function(){var c,e,f,g,h,i,j,k,l,m=a(this),n=0,o=0,p=0,q=0;if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)){if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)!==this)return}else m.data(&amp;quot;stellar-elementIsActive&amp;quot;,this);b.options.showElement(m),m.data(&amp;quot;stellar-startingLeft&amp;quot;)?(m.css(&amp;quot;left&amp;quot;,m.data(&amp;quot;stellar-startingLeft&amp;quot;)),m.css(&amp;quot;top&amp;quot;,m.data(&amp;quot;stellar-startingTop&amp;quot;))):(m.data(&amp;quot;stellar-startingLeft&amp;quot;,m.css(&amp;quot;left&amp;quot;)),m.data(&amp;quot;stellar-startingTop&amp;quot;,m.css(&amp;quot;top&amp;quot;))),f=m.position().left,g=m.position().top,h=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-top&amp;quot;),10),k=m.offset().left-h,l=m.offset().top-i,m.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(n=p,o=q,j=b,!1):(p+=b.position().left,void(q+=b.position().top))}),c=m.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-horizontal-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-horizontal-offset&amp;quot;):b.horizontalOffset,e=m.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-vertical-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-vertical-offset&amp;quot;):b.verticalOffset,b.particles.push({$element:m,$offsetParent:j,isFixed:&amp;quot;fixed&amp;quot;===m.css(&amp;quot;position&amp;quot;),horizontalOffset:c,verticalOffset:e,startingPositionLeft:f,startingPositionTop:g,startingOffsetLeft:k,startingOffsetTop:l,parentOffsetLeft:n,parentOffsetTop:o,stellarRatio:m.data(&amp;quot;stellar-ratio&amp;quot;)!==d?m.data(&amp;quot;stellar-ratio&amp;quot;):1,width:m.outerWidth(!0),height:m.outerHeight(!0),isHidden:!1})})},_findBackgrounds:function(){var b,c=this,e=this._getScrollLeft(),f=this._getScrollTop();this.backgrounds=[],this.options.parallaxBackgrounds&amp;amp;&amp;amp;(b=this.$element.find(&amp;quot;[data-stellar-background-ratio]&amp;quot;),this.$element.data(&amp;quot;stellar-background-ratio&amp;quot;)&amp;amp;&amp;amp;(b=b.add(this.$element)),b.each(function(){var b,g,h,i,j,k,l,o=a(this),p=n(o),q=0,r=0,s=0,t=0;if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)){if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)!==this)return}else o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;,this);o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;)?m(o,o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;)):(o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,p[0]),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,p[1])),h=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-top&amp;quot;),10),j=o.offset().left-h-e,k=o.offset().top-i-f,o.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(q=s,r=t,l=b,!1):(s+=b.position().left,void(t+=b.position().top))}),b=o.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-horizontal-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-horizontal-offset&amp;quot;):c.horizontalOffset,g=o.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-vertical-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-vertical-offset&amp;quot;):c.verticalOffset,c.backgrounds.push({$element:o,$offsetParent:l,isFixed:&amp;quot;fixed&amp;quot;===o.css(&amp;quot;background-attachment&amp;quot;),horizontalOffset:b,verticalOffset:g,startingValueLeft:p[0],startingValueTop:p[1],startingBackgroundPositionLeft:isNaN(parseInt(p[0],10))?0:parseInt(p[0],10),startingBackgroundPositionTop:isNaN(parseInt(p[1],10))?0:parseInt(p[1],10),startingPositionLeft:o.position().left,startingPositionTop:o.position().top,startingOffsetLeft:j,startingOffsetTop:k,parentOffsetLeft:q,parentOffsetTop:r,stellarRatio:o.data(&amp;quot;stellar-background-ratio&amp;quot;)===d?1:o.data(&amp;quot;stellar-background-ratio&amp;quot;)})}))},_reset:function(){var a,b,c,d,e;for(e=this.particles.length-1;e&amp;gt;=0;e--)a=this.particles[e],b=a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;),c=a.$element.data(&amp;quot;stellar-startingTop&amp;quot;),this._setPosition(a.$element,b,b,c,c),this.options.showElement(a.$element),a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;,null).data(&amp;quot;stellar-elementIsActive&amp;quot;,null).data(&amp;quot;stellar-backgroundIsActive&amp;quot;,null);for(e=this.backgrounds.length-1;e&amp;gt;=0;e--)d=this.backgrounds[e],d.$element.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,null).data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,null),m(d.$element,d.startingValueLeft,d.startingValueTop)},destroy:function(){this._reset(),this.$scrollElement.unbind(&amp;quot;resize.&amp;quot;+this.name).unbind(&amp;quot;scroll.&amp;quot;+this.name),this._animationLoop=a.noop,a(b).unbind(&amp;quot;load.&amp;quot;+this.name).unbind(&amp;quot;resize.&amp;quot;+this.name)},_setOffsets:function(){var c=this,d=a(b);d.unbind(&amp;quot;resize.horizontal-&amp;quot;+this.name).unbind(&amp;quot;resize.vertical-&amp;quot;+this.name),&amp;quot;function&amp;quot;==typeof this.options.horizontalOffset?(this.horizontalOffset=this.options.horizontalOffset(),d.bind(&amp;quot;resize.horizontal-&amp;quot;+this.name,function(){c.horizontalOffset=c.options.horizontalOffset()})):this.horizontalOffset=this.options.horizontalOffset,&amp;quot;function&amp;quot;==typeof this.options.verticalOffset?(this.verticalOffset=this.options.verticalOffset(),d.bind(&amp;quot;resize.vertical-&amp;quot;+this.name,function(){c.verticalOffset=c.options.verticalOffset()})):this.verticalOffset=this.options.verticalOffset},_repositionElements:function(){var a,b,c,d,e,f,g,h,i,j,k=this._getScrollLeft(),l=this._getScrollTop(),n=!0,o=!0;if(this.currentScrollLeft!==k||this.currentScrollTop!==l||this.currentWidth!==this.viewportWidth||this.currentHeight!==this.viewportHeight){for(this.currentScrollLeft=k,this.currentScrollTop=l,this.currentWidth=this.viewportWidth,this.currentHeight=this.viewportHeight,j=this.particles.length-1;j&amp;gt;=0;j--)a=this.particles[j],b=a.isFixed?1:0,this.options.horizontalScrolling?(f=(k+a.horizontalOffset+this.viewportOffsetLeft+a.startingPositionLeft-a.startingOffsetLeft+a.parentOffsetLeft)*-(a.stellarRatio+b-1)+a.startingPositionLeft,h=f-a.startingPositionLeft+a.startingOffsetLeft):(f=a.startingPositionLeft,h=a.startingOffsetLeft),this.options.verticalScrolling?(g=(l+a.verticalOffset+this.viewportOffsetTop+a.startingPositionTop-a.startingOffsetTop+a.parentOffsetTop)*-(a.stellarRatio+b-1)+a.startingPositionTop,i=g-a.startingPositionTop+a.startingOffsetTop):(g=a.startingPositionTop,i=a.startingOffsetTop),this.options.hideDistantElements&amp;amp;&amp;amp;(o=!this.options.horizontalScrolling||h+a.width&amp;gt;(a.isFixed?0:k)&amp;amp;&amp;amp;h&amp;lt;(a.isFixed?0:k)+this.viewportWidth+this.viewportOffsetLeft,n=!this.options.verticalScrolling||i+a.height&amp;gt;(a.isFixed?0:l)&amp;amp;&amp;amp;i&amp;lt;(a.isFixed?0:l)+this.viewportHeight+this.viewportOffsetTop),o&amp;amp;&amp;amp;n?(a.isHidden&amp;amp;&amp;amp;(this.options.showElement(a.$element),a.isHidden=!1),this._setPosition(a.$element,f,a.startingPositionLeft,g,a.startingPositionTop)):a.isHidden||(this.options.hideElement(a.$element),a.isHidden=!0);for(j=this.backgrounds.length-1;j&amp;gt;=0;j--)c=this.backgrounds[j],b=c.isFixed?0:1,d=this.options.horizontalScrolling?(k+c.horizontalOffset-this.viewportOffsetLeft-c.startingOffsetLeft+c.parentOffsetLeft-c.startingBackgroundPositionLeft)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueLeft,e=this.options.verticalScrolling?(l+c.verticalOffset-this.viewportOffsetTop-c.startingOffsetTop+c.parentOffsetTop-c.startingBackgroundPositionTop)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueTop,m(c.$element,d,e)}},_handleScrollEvent:function(){var a=this,b=!1,c=function(){a._repositionElements(),b=!1},d=function(){b||(o(c),b=!0)};this.$scrollElement.bind(&amp;quot;scroll.&amp;quot;+this.name,d),d()},_startAnimationLoop:function(){var a=this;this._animationLoop=function(){o(a._animationLoop),a._repositionElements()},this._animationLoop()}},a.fn[f]=function(b){var c=arguments;return b===d||&amp;quot;object&amp;quot;==typeof b?this.each(function(){a.data(this,&amp;quot;plugin_&amp;quot;+f)||a.data(this,&amp;quot;plugin_&amp;quot;+f,new e(this,b))}):&amp;quot;string&amp;quot;==typeof b&amp;amp;&amp;amp;&amp;quot;_&amp;quot;!==b[0]&amp;amp;&amp;amp;&amp;quot;init&amp;quot;!==b?this.each(function(){var d=a.data(this,&amp;quot;plugin_&amp;quot;+f);d instanceof e&amp;amp;&amp;amp;&amp;quot;function&amp;quot;==typeof d[b]&amp;amp;&amp;amp;d[b].apply(d,Array.prototype.slice.call(c,1)),&amp;quot;destroy&amp;quot;===b&amp;amp;&amp;amp;a.data(this,&amp;quot;plugin_&amp;quot;+f,null)}):void 0},a[f]=function(){var c=a(b);return c.stellar.apply(c,Array.prototype.slice.call(arguments,0))},a[f].scrollProperty=h,a[f].positionProperty=i,b.Stellar=e}(jQuery,this,document);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scrolly ===&lt;br /&gt;
[[JQuery.Scrolly]]&lt;br /&gt;
&lt;br /&gt;
== Lightbox, Gallery &amp;amp; co ==&lt;br /&gt;
&lt;br /&gt;
=== Chocolat ===&lt;br /&gt;
Nette responsive Lightbox für Anfänger und Profis&lt;br /&gt;
&lt;br /&gt;
http://chocolat.insipi.de&lt;br /&gt;
&lt;br /&gt;
[[Chocolat Lightbox]]&lt;br /&gt;
&lt;br /&gt;
=== Lightbox ===&lt;br /&gt;
Der Klassiker: [[Lightbox jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Magnific Popup ===&lt;br /&gt;
Galt lange als DER Nachfolger der Lightbox [[Magnific Popup jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Fancybox ===&lt;br /&gt;
Relativ schlanke Lightbox Alternative mit Übergangseffekten&lt;br /&gt;
&lt;br /&gt;
== Isotope / Masonry ==&lt;br /&gt;
[[JavaScript - Masonry / Isotope]]&lt;br /&gt;
&lt;br /&gt;
== Charts / Counter ==&lt;br /&gt;
=== jQuery CountTo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// jQuery CountTo&lt;br /&gt;
!function(t){&amp;quot;use strict&amp;quot;;function e(t,e){return t.toFixed(e.decimals)}t.fn.countTo=function(e){return e=e||{},t(this).each(function(){function a(){s+=l,c++,n(s),&amp;quot;function&amp;quot;==typeof o.onUpdate&amp;amp;&amp;amp;o.onUpdate.call(i,s),c&amp;gt;=r&amp;amp;&amp;amp;(f.removeData(&amp;quot;countTo&amp;quot;),clearInterval(d.interval),s=o.to,&amp;quot;function&amp;quot;==typeof o.onComplete&amp;amp;&amp;amp;o.onComplete.call(i,s))}function n(t){var e=o.formatter.call(i,t,o);f.text(e)}var o=t.extend({},t.fn.countTo.defaults,{from:t(this).data(&amp;quot;from&amp;quot;),to:t(this).data(&amp;quot;to&amp;quot;),speed:t(this).data(&amp;quot;speed&amp;quot;),refreshInterval:t(this).data(&amp;quot;refresh-interval&amp;quot;),decimals:t(this).data(&amp;quot;decimals&amp;quot;)},e),r=Math.ceil(o.speed/o.refreshInterval),l=(o.to-o.from)/r,i=this,f=t(this),c=0,s=o.from,d=f.data(&amp;quot;countTo&amp;quot;)||{};f.data(&amp;quot;countTo&amp;quot;,d),d.interval&amp;amp;&amp;amp;clearInterval(d.interval),d.interval=setInterval(a,o.refreshInterval),n(s)})},t.fn.countTo.defaults={from:0,to:0,speed:1e3,refreshInterval:100,decimals:0,formatter:e,onUpdate:null,onComplete:null}}(jQuery);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Easy Pie Chart ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**!&lt;br /&gt;
 * easyPieChart&lt;br /&gt;
 * Lightweight plugin to render simple, animated and retina optimized pie charts&lt;br /&gt;
 *&lt;br /&gt;
 * @license &lt;br /&gt;
 * @author Robert Fleischmann &amp;lt;rendro87@gmail.com&amp;gt; (http://robert-fleischmann.de)&lt;br /&gt;
 * @version 2.1.6&lt;br /&gt;
 **/&lt;br /&gt;
!function(a,b){&amp;quot;object&amp;quot;==typeof exports?module.exports=b(require(&amp;quot;jquery&amp;quot;)):&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement(&amp;quot;canvas&amp;quot;);a.appendChild(d),&amp;quot;undefined&amp;quot;!=typeof G_vmlCanvasManager&amp;amp;&amp;amp;G_vmlCanvasManager.initElement(d);var e=d.getContext(&amp;quot;2d&amp;quot;);d.width=d.height=b.size;var f=1;window.devicePixelRatio&amp;gt;1&amp;amp;&amp;amp;(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,&amp;quot;px&amp;quot;].join(&amp;quot;&amp;quot;),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&amp;amp;&amp;amp;b.scaleLength&amp;amp;&amp;amp;(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0&amp;gt;=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d&amp;gt;0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&amp;amp;&amp;amp;i(),b.trackColor&amp;amp;&amp;amp;h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&amp;amp;&amp;amp;e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d=&amp;quot;function&amp;quot;==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f&amp;gt;=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:&amp;quot;#ef1e25&amp;quot;,trackColor:&amp;quot;#f9f9f9&amp;quot;,scaleColor:&amp;quot;#dfe0e0&amp;quot;,scaleLength:5,lineCap:&amp;quot;round&amp;quot;,lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1&amp;gt;b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if(&amp;quot;undefined&amp;quot;!=typeof b)d.renderer=b;else{if(&amp;quot;undefined&amp;quot;==typeof SVGRenderer)throw new Error(&amp;quot;Please load either the SVG- or the CanvasRenderer&amp;quot;);d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&amp;amp;&amp;amp;(e[b]=c&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof c[b]?c[b]:d[b],&amp;quot;function&amp;quot;==typeof e[b]&amp;amp;&amp;amp;(e[b]=e[b].bind(this)));e.easing=&amp;quot;string&amp;quot;==typeof e.easing&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof jQuery&amp;amp;&amp;amp;jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,&amp;quot;number&amp;quot;==typeof e.animate&amp;amp;&amp;amp;(e.animate={duration:e.animate,enabled:!0}),&amp;quot;boolean&amp;quot;!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&amp;amp;&amp;amp;a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&amp;amp;&amp;amp;a.getAttribute(&amp;quot;data-percent&amp;quot;)&amp;amp;&amp;amp;this.update(parseFloat(a.getAttribute(&amp;quot;data-percent&amp;quot;)))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,&amp;quot;easyPieChart&amp;quot;)||(d=a.extend({},b,a(this).data()),a.data(this,&amp;quot;easyPieChart&amp;quot;,new c(this,d)))})}});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Audio / Video / MediaPlayer ==&lt;br /&gt;
Siehe auch: [[JavaScript - HTML5 Audio]]&lt;br /&gt;
https://ourcodeworld.com/articles/read/148/top-7-best-html5-media-player-javascript-plugins&lt;br /&gt;
&lt;br /&gt;
* Plyr (HTML5, YouTube, Vimeo, accessible, lightweight, customisable, responsive, no dependencies) https://github.com/sampotts/plyr&lt;br /&gt;
* Video.js (Video, build new from ground in 2010, popular)&lt;br /&gt;
* Popcorn.js (HTML5 Event Framework for Filmmakers, Audio Video, Vimeo, YouTube, Soundcloud...)&lt;br /&gt;
* Afterglow ( HTML5 Elements, little Effort)&lt;br /&gt;
* MediaElement.js (Mimics HTML5, Flash Fallback, Accessible)&lt;br /&gt;
* jPlayer (Audio, Video, Skinnable, API&lt;br /&gt;
* Projekktor (OpenSource Video/Audio, Flashfallback different output devices)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FitVids ===&lt;br /&gt;
Embedding Videos from YouTube, Vimeo,...&lt;br /&gt;
&lt;br /&gt;
[[FitVids jQuery Plugin]] https://github.com/davatron5000/FitVids.js&lt;br /&gt;
&lt;br /&gt;
=== Vide - Video Backgrounds ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Vide - v0.5.1&lt;br /&gt;
 *  Easy as hell jQuery plugin for video backgrounds.&lt;br /&gt;
 *  http://vodkabears.github.io/vide/&lt;br /&gt;
 *&lt;br /&gt;
 *  Made by Ilya Makarov&lt;br /&gt;
 *  Under MIT License&lt;br /&gt;
 */&lt;br /&gt;
!function(a,b){&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(&amp;quot;object&amp;quot;==typeof exports?require(&amp;quot;jquery&amp;quot;):a.jQuery)}(this,function(a){&amp;quot;use strict&amp;quot;;function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,&amp;quot;:&amp;quot;).replace(/\s*,\s*/g,&amp;quot;,&amp;quot;).split(&amp;quot;,&amp;quot;),h=0,g=f.length;h&amp;lt;g&amp;amp;&amp;amp;(c=f[h],c.search(/^(http|https|ftp):\/\//)===-1&amp;amp;&amp;amp;c.search(&amp;quot;:&amp;quot;)!==-1);h++)b=c.indexOf(&amp;quot;:&amp;quot;),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=&amp;quot;true&amp;quot;===e||&amp;quot;false&amp;quot;!==e&amp;amp;&amp;amp;e),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=isNaN(e)?e:+e),i[d]=e;return null==d&amp;amp;&amp;amp;null==e?a:i}function c(a){a=&amp;quot;&amp;quot;+a;var b,c,d,e=a.split(/\s+/),f=&amp;quot;50%&amp;quot;,g=&amp;quot;50%&amp;quot;;for(d=0,b=e.length;d&amp;lt;b;d++)c=e[d],&amp;quot;left&amp;quot;===c?f=&amp;quot;0%&amp;quot;:&amp;quot;right&amp;quot;===c?f=&amp;quot;100%&amp;quot;:&amp;quot;top&amp;quot;===c?g=&amp;quot;0%&amp;quot;:&amp;quot;bottom&amp;quot;===c?g=&amp;quot;100%&amp;quot;:&amp;quot;center&amp;quot;===c?0===d?f=&amp;quot;50%&amp;quot;:g=&amp;quot;50%&amp;quot;:0===d?f=c:g=c;return{x:f,y:g}}function d(b,c){var d=function(){c(this.src)};a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.gif&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpeg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.png&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d)}function e(c,d,e){if(this.$element=a(c),&amp;quot;string&amp;quot;==typeof d&amp;amp;&amp;amp;(d=b(d)),e?&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=b(e)):e={},&amp;quot;string&amp;quot;==typeof d)d=d.replace(/\.\w*$/,&amp;quot;&amp;quot;);else if(&amp;quot;object&amp;quot;==typeof d)for(var f in d)d.hasOwnProperty(f)&amp;amp;&amp;amp;(d[f]=d[f].replace(/\.\w*$/,&amp;quot;&amp;quot;));this.settings=a.extend({},g,e),this.path=d;try{this.init()}catch(i){if(i.message!==h)throw i}}var f=&amp;quot;vide&amp;quot;,g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:&amp;quot;50% 50%&amp;quot;,posterType:&amp;quot;detect&amp;quot;,resizing:!0,bgColor:&amp;quot;transparent&amp;quot;,className:&amp;quot;&amp;quot;},h=&amp;quot;Not implemented&amp;quot;;e.prototype.init=function(){var b,e,f=this,g=f.path,i=g,j=&amp;quot;&amp;quot;,k=f.$element,l=f.settings,m=c(l.position),n=l.posterType;e=f.$wrapper=a(&amp;quot;&amp;lt;div&amp;gt;&amp;quot;).addClass(l.className).css({position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:0,left:0,bottom:0,right:0,overflow:&amp;quot;hidden&amp;quot;,&amp;quot;-webkit-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-moz-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-o-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-color&amp;quot;:l.bgColor,&amp;quot;background-repeat&amp;quot;:&amp;quot;no-repeat&amp;quot;,&amp;quot;background-position&amp;quot;:m.x+&amp;quot; &amp;quot;+m.y}),&amp;quot;object&amp;quot;==typeof g&amp;amp;&amp;amp;(g.poster?i=g.poster:g.mp4?i=g.mp4:g.webm?i=g.webm:g.ogv&amp;amp;&amp;amp;(i=g.ogv)),&amp;quot;detect&amp;quot;===n?d(i,function(a){e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+a+&amp;quot;)&amp;quot;)}):&amp;quot;none&amp;quot;!==n&amp;amp;&amp;amp;e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+i+&amp;quot;.&amp;quot;+n+&amp;quot;)&amp;quot;),&amp;quot;static&amp;quot;===k.css(&amp;quot;position&amp;quot;)&amp;amp;&amp;amp;k.css(&amp;quot;position&amp;quot;,&amp;quot;relative&amp;quot;),k.prepend(e),&amp;quot;object&amp;quot;==typeof g?(g.mp4&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.mp4+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;#039;),g.webm&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.webm+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;#039;),g.ogv&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.ogv+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;#039;),b=f.$video=a(&amp;quot;&amp;lt;video&amp;gt;&amp;quot;+j+&amp;quot;&amp;lt;/video&amp;gt;&amp;quot;)):b=f.$video=a(&amp;#039;&amp;lt;video&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;lt;/video&amp;gt;&amp;#039;);try{b.prop({autoplay:l.autoplay,loop:l.loop,volume:l.volume,muted:l.muted,defaultMuted:l.muted,playbackRate:l.playbackRate,defaultPlaybackRate:l.playbackRate})}catch(o){throw new Error(h)}b.css({margin:&amp;quot;auto&amp;quot;,position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:m.y,left:m.x,&amp;quot;-webkit-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-ms-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,transform:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,visibility:&amp;quot;hidden&amp;quot;,opacity:0}).one(&amp;quot;canplaythrough.vide&amp;quot;,function(){f.resize()}).one(&amp;quot;playing.vide&amp;quot;,function(){b.css({visibility:&amp;quot;visible&amp;quot;,opacity:1}),e.css(&amp;quot;background-image&amp;quot;,&amp;quot;none&amp;quot;)}),k.on(&amp;quot;resize.vide&amp;quot;,function(){l.resizing&amp;amp;&amp;amp;f.resize()}),e.append(b)},e.prototype.getVideoObject=function(){return this.$video[0]},e.prototype.resize=function(){if(this.$video){var a=this.$wrapper,b=this.$video,c=b[0],d=c.videoHeight,e=c.videoWidth,f=a.height(),g=a.width();g/e&amp;gt;f/d?b.css({width:g+2,height:&amp;quot;auto&amp;quot;}):b.css({width:&amp;quot;auto&amp;quot;,height:f+2})}},e.prototype.destroy=function(){delete a[f].lookup[this.index],this.$video&amp;amp;&amp;amp;this.$video.off(f),this.$element.off(f).removeData(f),this.$wrapper.remove()},a[f]={lookup:[]},a.fn[f]=function(b,c){var d;return this.each(function(){d=a.data(this,f),d&amp;amp;&amp;amp;d.destroy(),d=new e(this,b,c),d.index=a[f].lookup.push(d)-1,a.data(this,f,d)}),this},a(document).ready(function(){var b=a(window);b.on(&amp;quot;resize.vide&amp;quot;,function(){for(var b,c=a[f].lookup.length,d=0;d&amp;lt;c;d++)b=a[f].lookup[d],b&amp;amp;&amp;amp;b.settings.resizing&amp;amp;&amp;amp;b.resize()}),b.on(&amp;quot;unload.vide&amp;quot;,function(){return!1}),a(document).find(&amp;quot;[data-vide-bg]&amp;quot;).each(function(b,c){var d=a(c),e=d.data(&amp;quot;vide-options&amp;quot;),g=d.data(&amp;quot;vide-bg&amp;quot;);d[f](g,e)})})});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Siehe Extra Seite&lt;br /&gt;
&lt;br /&gt;
== Slider &amp;amp; Carousel ==&lt;br /&gt;
=== Slick Carousel &amp;amp; Slider ===&lt;br /&gt;
Der kann fast alles Slider. Gehört mit Owl Slider zu den vielseitigen.&lt;br /&gt;
&lt;br /&gt;
http://kenwheeler.github.io/slick/&lt;br /&gt;
&lt;br /&gt;
=== Owl Carousel===&lt;br /&gt;
[[Owl Carousel - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Revolution Slider ===&lt;br /&gt;
https://revolution.themepunch.com/examples-jquery/&lt;br /&gt;
&lt;br /&gt;
=== FlexSlider ===&lt;br /&gt;
[[FlexSlider - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Schlichter aber vielseitiger Slider mit schönem KenBurns Effekt und div. Übergängen. Erfordert etwas JS Kenntnisse wenn mehr angepasst werden soll.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Vegas Slider]]&lt;br /&gt;
&lt;br /&gt;
=== MultiScroll.js ===&lt;br /&gt;
http://alvarotrigo.com/multiScroll&lt;br /&gt;
&lt;br /&gt;
Gegenläufiger Scroller&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;jquery.multiscroll.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- This following line is needed in case of using the default easing option or when using another&lt;br /&gt;
 one rather than &amp;quot;linear&amp;quot; or &amp;quot;swing&amp;quot;. You can also add the full jQuery UI instead of this file if you prefer --&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;vendors/jquery.easings.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery.multiscroll.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;multiscroll&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-left&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-right&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Elemente manipulieren ==&lt;br /&gt;
=== Match Heights ===&lt;br /&gt;
Spalten in der Länge anpassen. Siehe auch Flex Grid in CSS3&lt;br /&gt;
&lt;br /&gt;
[[Equal Heights]]&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Match Height]]&lt;br /&gt;
&lt;br /&gt;
=== Fit Viewport ===&lt;br /&gt;
==== Viewport Height ====&lt;br /&gt;
Element an die Höhe des Viewports anpassen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  $(document).ready(function(){&lt;br /&gt;
      $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
          $(window).resize(function(){&lt;br /&gt;
              $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
      });&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scrolling ==&lt;br /&gt;
Hinweis die meisten Scroll To and ScrollTops lassen sich auch mit einfachen jquery Snippets realisieren. &lt;br /&gt;
=== Einfaches jQuery Scroll To Top ===&lt;br /&gt;
Mehr brauchts nicht :-) [[Scroll ToTop (jQuery)]]&lt;br /&gt;
&lt;br /&gt;
=== Perfect Scrollbar ===&lt;br /&gt;
[[Perfect Scrollbar]]&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler ScrollTo ===&lt;br /&gt;
https://github.com/flesler/jquery.scrollTo&lt;br /&gt;
&lt;br /&gt;
Lightweight, cross-browser and highly customizable animated scrolling with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler LocalScroll ===&lt;br /&gt;
https://github.com/flesler/jquery.localScroll&lt;br /&gt;
&lt;br /&gt;
Animated anchor navigation made easy with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Smooth Scroll ===&lt;br /&gt;
Oil for Scrolling - damit ruckelt es nicht so beim Scrollen mit dem Mausrad&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// SmoothScroll for websites v1.4.0 (Balazs Galambosi)&lt;br /&gt;
// http://www.smoothscroll.net/&lt;br /&gt;
//&lt;br /&gt;
// Licensed under the terms of the MIT license.&lt;br /&gt;
//&lt;br /&gt;
// You may use it in your theme if you credit me. &lt;br /&gt;
// It is also free to use on any individual website.&lt;br /&gt;
//&lt;br /&gt;
// Exception:&lt;br /&gt;
// The only restriction is to not publish any  &lt;br /&gt;
// extension for browsers or native application&lt;br /&gt;
// without getting a written permission first.&lt;br /&gt;
//&lt;br /&gt;
!function(){function e(){z.keyboardSupport&amp;amp;&amp;amp;m(&amp;quot;keydown&amp;quot;,a)}function t(){if(!A&amp;amp;&amp;amp;document.body){A=!0;var t=document.body,o=document.documentElement,n=window.innerHeight,r=t.scrollHeight;if(B=document.compatMode.indexOf(&amp;quot;CSS&amp;quot;)&amp;gt;=0?o:t,D=t,e(),top!=self)X=!0;else if(r&amp;gt;n&amp;amp;&amp;amp;(t.offsetHeight&amp;lt;=n||o.offsetHeight&amp;lt;=n)){var a=document.createElement(&amp;quot;div&amp;quot;);a.style.cssText=&amp;quot;position:absolute; z-index:-10000; top:0; left:0; right:0; height:&amp;quot;+B.scrollHeight+&amp;quot;px&amp;quot;,document.body.appendChild(a);var i;T=function(){i||(i=setTimeout(function(){L||(a.style.height=&amp;quot;0&amp;quot;,a.style.height=B.scrollHeight+&amp;quot;px&amp;quot;,i=null)},500))},setTimeout(T,10),m(&amp;quot;resize&amp;quot;,T);var l={attributes:!0,childList:!0,characterData:!1};if(M=new V(T),M.observe(t,l),B.offsetHeight&amp;lt;=n){var c=document.createElement(&amp;quot;div&amp;quot;);c.style.clear=&amp;quot;both&amp;quot;,t.appendChild(c)}}z.fixedBackground||L||(t.style.backgroundAttachment=&amp;quot;scroll&amp;quot;,o.style.backgroundAttachment=&amp;quot;scroll&amp;quot;)}}function o(){M&amp;amp;&amp;amp;M.disconnect(),h(I,r),h(&amp;quot;mousedown&amp;quot;,i),h(&amp;quot;keydown&amp;quot;,a),h(&amp;quot;resize&amp;quot;,T),h(&amp;quot;load&amp;quot;,t)}function n(e,t,o){if(p(t,o),1!=z.accelerationMax){var n=Date.now(),r=n-R;if(r&amp;lt;z.accelerationDelta){var a=(1+50/r)/2;a&amp;gt;1&amp;amp;&amp;amp;(a=Math.min(a,z.accelerationMax),t*=a,o*=a)}R=Date.now()}if(q.push({x:t,y:o,lastX:0&amp;gt;t?.99:-.99,lastY:0&amp;gt;o?.99:-.99,start:Date.now()}),!P){var i=e===document.body,l=function(n){for(var r=Date.now(),a=0,c=0,u=0;u&amp;lt;q.length;u++){var d=q[u],s=r-d.start,f=s&amp;gt;=z.animationTime,m=f?1:s/z.animationTime;z.pulseAlgorithm&amp;amp;&amp;amp;(m=x(m));var h=d.x*m-d.lastX&amp;gt;&amp;gt;0,w=d.y*m-d.lastY&amp;gt;&amp;gt;0;a+=h,c+=w,d.lastX+=h,d.lastY+=w,f&amp;amp;&amp;amp;(q.splice(u,1),u--)}i?window.scrollBy(a,c):(a&amp;amp;&amp;amp;(e.scrollLeft+=a),c&amp;amp;&amp;amp;(e.scrollTop+=c)),t||o||(q=[]),q.length?_(l,e,1e3/z.frameRate+1):P=!1};_(l,e,0),P=!0}}function r(e){A||t();var o=e.target,r=u(o);if(!r||e.defaultPrevented||e.ctrlKey)return!0;if(w(D,&amp;quot;embed&amp;quot;)||w(o,&amp;quot;embed&amp;quot;)&amp;amp;&amp;amp;/\.pdf/i.test(o.src)||w(D,&amp;quot;object&amp;quot;))return!0;var a=-e.wheelDeltaX||e.deltaX||0,i=-e.wheelDeltaY||e.deltaY||0;return K&amp;amp;&amp;amp;(e.wheelDeltaX&amp;amp;&amp;amp;b(e.wheelDeltaX,120)&amp;amp;&amp;amp;(a=-120*(e.wheelDeltaX/Math.abs(e.wheelDeltaX))),e.wheelDeltaY&amp;amp;&amp;amp;b(e.wheelDeltaY,120)&amp;amp;&amp;amp;(i=-120*(e.wheelDeltaY/Math.abs(e.wheelDeltaY)))),a||i||(i=-e.wheelDelta||0),1===e.deltaMode&amp;amp;&amp;amp;(a*=40,i*=40),!z.touchpadSupport&amp;amp;&amp;amp;v(i)?!0:(Math.abs(a)&amp;gt;1.2&amp;amp;&amp;amp;(a*=z.stepSize/120),Math.abs(i)&amp;gt;1.2&amp;amp;&amp;amp;(i*=z.stepSize/120),n(r,a,i),e.preventDefault(),void l())}function a(e){var t=e.target,o=e.ctrlKey||e.altKey||e.metaKey||e.shiftKey&amp;amp;&amp;amp;e.keyCode!==N.spacebar;document.contains(D)||(D=document.activeElement);var r=/^(textarea|select|embed|object)$/i,a=/^(button|submit|radio|checkbox|file|color|image)$/i;if(r.test(t.nodeName)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;!a.test(t.type)||w(D,&amp;quot;video&amp;quot;)||y(e)||t.isContentEditable||e.defaultPrevented||o)return!0;if((w(t,&amp;quot;button&amp;quot;)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;a.test(t.type))&amp;amp;&amp;amp;e.keyCode===N.spacebar)return!0;var i,c=0,d=0,s=u(D),f=s.clientHeight;switch(s==document.body&amp;amp;&amp;amp;(f=window.innerHeight),e.keyCode){case N.up:d=-z.arrowScroll;break;case N.down:d=z.arrowScroll;break;case N.spacebar:i=e.shiftKey?1:-1,d=-i*f*.9;break;case N.pageup:d=.9*-f;break;case N.pagedown:d=.9*f;break;case N.home:d=-s.scrollTop;break;case N.end:var m=s.scrollHeight-s.scrollTop-f;d=m&amp;gt;0?m+10:0;break;case N.left:c=-z.arrowScroll;break;case N.right:c=z.arrowScroll;break;default:return!0}n(s,c,d),e.preventDefault(),l()}function i(e){D=e.target}function l(){clearTimeout(E),E=setInterval(function(){F={}},1e3)}function c(e,t){for(var o=e.length;o--;)F[j(e[o])]=t;return t}function u(e){var t=[],o=document.body,n=B.scrollHeight;do{var r=F[j(e)];if(r)return c(t,r);if(t.push(e),n===e.scrollHeight){var a=s(B)&amp;amp;&amp;amp;s(o),i=a||f(B);if(X&amp;amp;&amp;amp;d(B)||!X&amp;amp;&amp;amp;i)return c(t,$())}else if(d(e)&amp;amp;&amp;amp;f(e))return c(t,e)}while(e=e.parentElement)}function d(e){return e.clientHeight+10&amp;lt;e.scrollHeight}function s(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;hidden&amp;quot;!==t}function f(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;scroll&amp;quot;===t||&amp;quot;auto&amp;quot;===t}function m(e,t){window.addEventListener(e,t,!1)}function h(e,t){window.removeEventListener(e,t,!1)}function w(e,t){return(e.nodeName||&amp;quot;&amp;quot;).toLowerCase()===t.toLowerCase()}function p(e,t){e=e&amp;gt;0?1:-1,t=t&amp;gt;0?1:-1,(Y.x!==e||Y.y!==t)&amp;amp;&amp;amp;(Y.x=e,Y.y=t,q=[],R=0)}function v(e){return e?(O.length||(O=[e,e,e]),e=Math.abs(e),O.push(e),O.shift(),clearTimeout(H),H=setTimeout(function(){window.localStorage&amp;amp;&amp;amp;(localStorage.SS_deltaBuffer=O.join(&amp;quot;,&amp;quot;))},1e3),!g(120)&amp;amp;&amp;amp;!g(100)):void 0}function b(e,t){return Math.floor(e/t)==e/t}function g(e){return b(O[0],e)&amp;amp;&amp;amp;b(O[1],e)&amp;amp;&amp;amp;b(O[2],e)}function y(e){var t=e.target,o=!1;if(-1!=document.URL.indexOf(&amp;quot;www.youtube.com/watch&amp;quot;))do if(o=t.classList&amp;amp;&amp;amp;t.classList.contains(&amp;quot;html5-video-controls&amp;quot;))break;while(t=t.parentNode);return o}function S(e){var t,o,n;return e*=z.pulseScale,1&amp;gt;e?t=e-(1-Math.exp(-e)):(o=Math.exp(-1),e-=1,n=1-Math.exp(-e),t=o+n*(1-o)),t*z.pulseNormalize}function x(e){return e&amp;gt;=1?1:0&amp;gt;=e?0:(1==z.pulseNormalize&amp;amp;&amp;amp;(z.pulseNormalize/=S(1)),S(e))}function k(e){for(var t in e)C.hasOwnProperty(t)&amp;amp;&amp;amp;(z[t]=e[t])}var D,M,T,E,H,C={frameRate:150,animationTime:400,stepSize:100,pulseAlgorithm:!0,pulseScale:4,pulseNormalize:1,accelerationDelta:50,accelerationMax:3,keyboardSupport:!0,arrowScroll:50,touchpadSupport:!1,fixedBackground:!0,excluded:&amp;quot;&amp;quot;},z=C,L=!1,X=!1,Y={x:0,y:0},A=!1,B=document.documentElement,O=[],K=/^Mac/.test(navigator.platform),N={left:37,up:38,right:39,down:40,spacebar:32,pageup:33,pagedown:34,end:35,home:36},q=[],P=!1,R=Date.now(),j=function(){var e=0;return function(t){return t.uniqueID||(t.uniqueID=e++)}}(),F={};window.localStorage&amp;amp;&amp;amp;localStorage.SS_deltaBuffer&amp;amp;&amp;amp;(O=localStorage.SS_deltaBuffer.split(&amp;quot;,&amp;quot;));var I,_=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e,t,o){window.setTimeout(e,o||1e3/60)}}(),V=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,$=function(){var e;return function(){if(!e){var t=document.createElement(&amp;quot;div&amp;quot;);t.style.cssText=&amp;quot;height:10000px;width:1px;&amp;quot;,document.body.appendChild(t);var o=document.body.scrollTop;document.documentElement.scrollTop;window.scrollBy(0,1),e=document.body.scrollTop!=o?document.body:document.documentElement,window.scrollBy(0,-1),document.body.removeChild(t)}return e}}(),U=window.navigator.userAgent,W=/Edge/.test(U),G=/chrome/i.test(U)&amp;amp;&amp;amp;!W,J=/safari/i.test(U)&amp;amp;&amp;amp;!W,Q=/mobile/i.test(U),Z=(G||J)&amp;amp;&amp;amp;!Q;&amp;quot;onwheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)?I=&amp;quot;wheel&amp;quot;:&amp;quot;onmousewheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)&amp;amp;&amp;amp;(I=&amp;quot;mousewheel&amp;quot;),I&amp;amp;&amp;amp;Z&amp;amp;&amp;amp;(m(I,r),m(&amp;quot;mousedown&amp;quot;,i),m(&amp;quot;load&amp;quot;,t)),k.destroy=o,window.SmoothScrollOptions&amp;amp;&amp;amp;k(window.SmoothScrollOptions),&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define(function(){return k}):&amp;quot;object&amp;quot;==typeof exports?module.exports=k:window.SmoothScroll=k}();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Typography, Fonts, etc==&lt;br /&gt;
=== Letter.js ===&lt;br /&gt;
Zerpflückt Texte und wrappt Buchstaben / Wörter / Zeilen in durchnummerierte Klassen. Diese kann man dann cool Stylen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/davatron5000/Lettering.js&lt;br /&gt;
&lt;br /&gt;
=== Fittext ===&lt;br /&gt;
Responsive Textgrößen in Typographie-Spielereien für Überschriften etc.&lt;br /&gt;
&lt;br /&gt;
http://fittextjs.com/&lt;br /&gt;
&lt;br /&gt;
=== Prism.js ===&lt;br /&gt;
Syntaxhighlighter&lt;br /&gt;
&lt;br /&gt;
== Google Maps mit gmaps.js ==&lt;br /&gt;
https://hpneo.github.io/gmaps/&lt;br /&gt;
Einfache Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
new GMaps({&lt;br /&gt;
  div: &amp;#039;#map&amp;#039;,&lt;br /&gt;
  lat: -12.043333,&lt;br /&gt;
  lng: -77.028333&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Grey Style Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Google map	&lt;br /&gt;
/*global $:false */&lt;br /&gt;
    var map;&lt;br /&gt;
    $(document).ready(function(){&amp;quot;use strict&amp;quot;;&lt;br /&gt;
      map = new GMaps({&lt;br /&gt;
    disableDefaultUI: true,&lt;br /&gt;
    scrollwheel: false,&lt;br /&gt;
        el: &amp;#039;#map&amp;#039;,&lt;br /&gt;
        lat: 48.4912812,&lt;br /&gt;
        lng: 9.2175255&lt;br /&gt;
      });&lt;br /&gt;
      map.drawOverlay({&lt;br /&gt;
        lat: map.getCenter().lat(),&lt;br /&gt;
        lng: map.getCenter().lng(),&lt;br /&gt;
        layer: &amp;#039;overlayLayer&amp;#039;,&lt;br /&gt;
        content: &amp;#039;&amp;lt;div class=&amp;quot;overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
        verticalAlign: &amp;#039;center&amp;#039;,&lt;br /&gt;
        horizontalAlign: &amp;#039;center&amp;#039;&lt;br /&gt;
      });&lt;br /&gt;
        var styles = [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;visibility&amp;quot;: &amp;quot;on&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.9 },&lt;br /&gt;
      { &amp;quot;lightness&amp;quot;: 37 },&lt;br /&gt;
      { &amp;quot;gamma&amp;quot;: 0.62 },&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -93 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -1 },&lt;br /&gt;
      { &amp;quot;color&amp;quot;: &amp;quot;#ffffff&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.2 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;road&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -98 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;landscape&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -89 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;water&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#cfa144&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.4 },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -38 }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
];&lt;br /&gt;
        &lt;br /&gt;
        map.addStyle({&lt;br /&gt;
            styledMapName:&amp;quot;Styled Map&amp;quot;,&lt;br /&gt;
            styles: styles,&lt;br /&gt;
            mapTypeId: &amp;quot;map_style&amp;quot;  &lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        map.setStyle(&amp;quot;map_style&amp;quot;);	&lt;br /&gt;
		&lt;br /&gt;
    });			&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
(function(root, factory) {&lt;br /&gt;
  if(typeof exports === &amp;#039;object&amp;#039;) {&lt;br /&gt;
    module.exports = factory();&lt;br /&gt;
  }&lt;br /&gt;
  else if(typeof define === &amp;#039;function&amp;#039; &amp;amp;&amp;amp; define.amd) {&lt;br /&gt;
    define([&amp;#039;jquery&amp;#039;, &amp;#039;googlemaps!&amp;#039;], factory);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    root.GMaps = factory();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}(this, function() {&lt;br /&gt;
&lt;br /&gt;
/*!&lt;br /&gt;
 * GMaps.js v0.4.25&lt;br /&gt;
 * http://hpneo.github.com/gmaps/&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2017, Gustavo Leon&lt;br /&gt;
 * Released under the MIT License.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var extend_object = function(obj, new_obj) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === new_obj) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in new_obj) {&lt;br /&gt;
    if (new_obj[name] !== undefined) {&lt;br /&gt;
      obj[name] = new_obj[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var replace_object = function(obj, replace) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === replace) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in replace) {&lt;br /&gt;
    if (obj[name] != undefined) {&lt;br /&gt;
      obj[name] = replace[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_map = function(array, callback) {&lt;br /&gt;
  var original_callback_params = Array.prototype.slice.call(arguments, 2),&lt;br /&gt;
      array_return = [],&lt;br /&gt;
      array_length = array.length,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  if (Array.prototype.map &amp;amp;&amp;amp; array.map === Array.prototype.map) {&lt;br /&gt;
    array_return = Array.prototype.map.call(array, function(item) {&lt;br /&gt;
      var callback_params = original_callback_params.slice(0);&lt;br /&gt;
      callback_params.splice(0, 0, item);&lt;br /&gt;
&lt;br /&gt;
      return callback.apply(this, callback_params);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (i = 0; i &amp;lt; array_length; i++) {&lt;br /&gt;
      callback_params = original_callback_params;&lt;br /&gt;
      callback_params.splice(0, 0, array[i]);&lt;br /&gt;
      array_return.push(callback.apply(this, callback_params));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return array_return;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_flat = function(array) {&lt;br /&gt;
  var new_array = [],&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
    new_array = new_array.concat(array[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new_array;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var coordsToLatLngs = function(coords, useGeoJSON) {&lt;br /&gt;
  var first_coord = coords[0],&lt;br /&gt;
      second_coord = coords[1];&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON) {&lt;br /&gt;
    first_coord = coords[1];&lt;br /&gt;
    second_coord = coords[0];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new google.maps.LatLng(first_coord, second_coord);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var arrayToLatLng = function(coords, useGeoJSON) {&lt;br /&gt;
  var i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; coords.length; i++) {&lt;br /&gt;
    if (!(coords[i] instanceof google.maps.LatLng)) {&lt;br /&gt;
      if (coords[i].length &amp;gt; 0 &amp;amp;&amp;amp; typeof(coords[i][0]) === &amp;quot;object&amp;quot;) {&lt;br /&gt;
        coords[i] = arrayToLatLng(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        coords[i] = coordsToLatLngs(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return coords;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementsByClassName = function (class_name, context) {&lt;br /&gt;
    var element,&lt;br /&gt;
        _class = class_name.replace(&amp;#039;.&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    if (&amp;#039;jQuery&amp;#039; in this &amp;amp;&amp;amp; context) {&lt;br /&gt;
        element = $(&amp;quot;.&amp;quot; + _class, context)[0];&lt;br /&gt;
    } else {&lt;br /&gt;
        element = document.getElementsByClassName(_class)[0];&lt;br /&gt;
    }&lt;br /&gt;
    return element;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementById = function(id, context) {&lt;br /&gt;
  var element,&lt;br /&gt;
  id = id.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  if (&amp;#039;jQuery&amp;#039; in window &amp;amp;&amp;amp; context) {&lt;br /&gt;
    element = $(&amp;#039;#&amp;#039; + id, context)[0];&lt;br /&gt;
  } else {&lt;br /&gt;
    element = document.getElementById(id);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return element;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var findAbsolutePosition = function(obj)  {&lt;br /&gt;
  var curleft = 0,&lt;br /&gt;
      curtop = 0;&lt;br /&gt;
&lt;br /&gt;
  if (obj.getBoundingClientRect) {&lt;br /&gt;
      var rect = obj.getBoundingClientRect();&lt;br /&gt;
      var sx = -(window.scrollX ? window.scrollX : window.pageXOffset);&lt;br /&gt;
      var sy = -(window.scrollY ? window.scrollY : window.pageYOffset);&lt;br /&gt;
&lt;br /&gt;
      return [(rect.left - sx), (rect.top - sy)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (obj.offsetParent) {&lt;br /&gt;
    do {&lt;br /&gt;
      curleft += obj.offsetLeft;&lt;br /&gt;
      curtop += obj.offsetTop;&lt;br /&gt;
    } while (obj = obj.offsetParent);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return [curleft, curtop];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var GMaps = (function(global) {&lt;br /&gt;
  &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  var doc = document;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new GMaps instance, including a Google Maps map.&lt;br /&gt;
   * @class GMaps&lt;br /&gt;
   * @constructs&lt;br /&gt;
   * @param {object} options - `options` accepts all the [MapOptions](https://developers.google.com/maps/documentation/javascript/reference#MapOptions) and [events](https://developers.google.com/maps/documentation/javascript/reference#Map) listed in the Google Maps API. Also accepts:&lt;br /&gt;
   * * `lat` (number): Latitude of the map&amp;#039;s center&lt;br /&gt;
   * * `lng` (number): Longitude of the map&amp;#039;s center&lt;br /&gt;
   * * `el` (string or HTMLElement): container where the map will be rendered&lt;br /&gt;
   * * `markerClusterer` (function): A function to create a marker cluster. You can use MarkerClusterer or MarkerClustererPlus.&lt;br /&gt;
   */&lt;br /&gt;
  var GMaps = function(options) {&lt;br /&gt;
&lt;br /&gt;
    if (!(typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps)) {&lt;br /&gt;
      if (typeof window.console === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.console.error) {&lt;br /&gt;
        console.error(&amp;#039;Google Maps API is required. Please register the following JavaScript library https://maps.googleapis.com/maps/api/js.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return function() {};&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!this) return new GMaps(options);&lt;br /&gt;
&lt;br /&gt;
    options.zoom = options.zoom || 15;&lt;br /&gt;
    options.mapType = options.mapType || &amp;#039;roadmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var valueOrDefault = function(value, defaultValue) {&lt;br /&gt;
      return value === undefined ? defaultValue : value;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var self = this,&lt;br /&gt;
        i,&lt;br /&gt;
        events_that_hide_context_menu = [&lt;br /&gt;
          &amp;#039;bounds_changed&amp;#039;, &amp;#039;center_changed&amp;#039;, &amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;,&lt;br /&gt;
          &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;idle&amp;#039;, &amp;#039;maptypeid_changed&amp;#039;, &amp;#039;projection_changed&amp;#039;,&lt;br /&gt;
          &amp;#039;resize&amp;#039;, &amp;#039;tilesloaded&amp;#039;, &amp;#039;zoom_changed&amp;#039;&lt;br /&gt;
        ],&lt;br /&gt;
        events_that_doesnt_hide_context_menu = [&amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;],&lt;br /&gt;
        options_to_be_deleted = [&amp;#039;el&amp;#039;, &amp;#039;lat&amp;#039;, &amp;#039;lng&amp;#039;, &amp;#039;mapType&amp;#039;, &amp;#039;width&amp;#039;, &amp;#039;height&amp;#039;, &amp;#039;markerClusterer&amp;#039;, &amp;#039;enableNewStyle&amp;#039;],&lt;br /&gt;
        identifier = options.el || options.div,&lt;br /&gt;
        markerClustererFunction = options.markerClusterer,&lt;br /&gt;
        mapType = google.maps.MapTypeId[options.mapType.toUpperCase()],&lt;br /&gt;
        map_center = new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        zoomControl = valueOrDefault(options.zoomControl, true),&lt;br /&gt;
        zoomControlOpt = options.zoomControlOpt || {&lt;br /&gt;
          style: &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
          position: &amp;#039;TOP_LEFT&amp;#039;&lt;br /&gt;
        },&lt;br /&gt;
        zoomControlStyle = zoomControlOpt.style || &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
        zoomControlPosition = zoomControlOpt.position || &amp;#039;TOP_LEFT&amp;#039;,&lt;br /&gt;
        panControl = valueOrDefault(options.panControl, true),&lt;br /&gt;
        mapTypeControl = valueOrDefault(options.mapTypeControl, true),&lt;br /&gt;
        scaleControl = valueOrDefault(options.scaleControl, true),&lt;br /&gt;
        streetViewControl = valueOrDefault(options.streetViewControl, true),&lt;br /&gt;
        overviewMapControl = valueOrDefault(overviewMapControl, true),&lt;br /&gt;
        map_options = {},&lt;br /&gt;
        map_base_options = {&lt;br /&gt;
          zoom: this.zoom,&lt;br /&gt;
          center: map_center,&lt;br /&gt;
          mapTypeId: mapType&lt;br /&gt;
        },&lt;br /&gt;
        map_controls_options = {&lt;br /&gt;
          panControl: panControl,&lt;br /&gt;
          zoomControl: zoomControl,&lt;br /&gt;
          zoomControlOptions: {&lt;br /&gt;
            style: google.maps.ZoomControlStyle[zoomControlStyle],&lt;br /&gt;
            position: google.maps.ControlPosition[zoomControlPosition]&lt;br /&gt;
          },&lt;br /&gt;
          mapTypeControl: mapTypeControl,&lt;br /&gt;
          scaleControl: scaleControl,&lt;br /&gt;
          streetViewControl: streetViewControl,&lt;br /&gt;
          overviewMapControl: overviewMapControl&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
      if (typeof(options.el) === &amp;#039;string&amp;#039; || typeof(options.div) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
        if (identifier.indexOf(&amp;quot;#&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Container element&lt;br /&gt;
             *&lt;br /&gt;
             * @type {HTMLElement}&lt;br /&gt;
             */&lt;br /&gt;
            this.el = getElementById(identifier, options.context);&lt;br /&gt;
        } else {&lt;br /&gt;
            this.el = getElementsByClassName.apply(this, [identifier, options.context]);&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
          this.el = identifier;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if (typeof(this.el) === &amp;#039;undefined&amp;#039; || this.el === null) {&lt;br /&gt;
      throw &amp;#039;No element defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.context_menu = window.context_menu || {};&lt;br /&gt;
    window.context_menu[self.el.id] = {};&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of custom controls in the map UI&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.controls = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s overlays&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.overlays = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of KML/GeoRSS and FusionTable layers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.layers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of data layers (See {@link GMaps#addLayer})&lt;br /&gt;
     *&lt;br /&gt;
     * @type {object}&lt;br /&gt;
     */&lt;br /&gt;
    this.singleLayers = {};&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s markers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.markers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s lines&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polylines = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s routes requested by {@link GMaps#getRoutes}, {@link GMaps#renderRoute}, {@link GMaps#drawRoute}, {@link GMaps#travelRoute} or {@link GMaps#drawSteppedRoute}&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.routes = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s polygons&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polygons = [];&lt;br /&gt;
    this.infoWindow = null;&lt;br /&gt;
    this.overlay_el = null;&lt;br /&gt;
    /**&lt;br /&gt;
     * Current map&amp;#039;s zoom&lt;br /&gt;
     *&lt;br /&gt;
     * @type {number}&lt;br /&gt;
     */&lt;br /&gt;
    this.zoom = options.zoom;&lt;br /&gt;
    this.registered_events = {};&lt;br /&gt;
&lt;br /&gt;
    this.el.style.width = options.width || this.el.scrollWidth || this.el.offsetWidth;&lt;br /&gt;
    this.el.style.height = options.height || this.el.scrollHeight || this.el.offsetHeight;&lt;br /&gt;
&lt;br /&gt;
    google.maps.visualRefresh = options.enableNewStyle;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; options_to_be_deleted.length; i++) {&lt;br /&gt;
      delete options[options_to_be_deleted[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(options.disableDefaultUI != true) {&lt;br /&gt;
      map_base_options = extend_object(map_base_options, map_controls_options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    map_options = extend_object(map_base_options, options);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_doesnt_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_doesnt_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Google Maps map instance&lt;br /&gt;
     *&lt;br /&gt;
     * @type {google.maps.Map}&lt;br /&gt;
     */&lt;br /&gt;
    this.map = new google.maps.Map(this.el, map_options);&lt;br /&gt;
&lt;br /&gt;
    if (markerClustererFunction) {&lt;br /&gt;
      /**&lt;br /&gt;
       * Marker Clusterer instance&lt;br /&gt;
       *&lt;br /&gt;
       * @type {object}&lt;br /&gt;
       */&lt;br /&gt;
      this.markerClusterer = markerClustererFunction.apply(this, [this.map]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var buildContextMenuHTML = function(control, e) {&lt;br /&gt;
      var html = &amp;#039;&amp;#039;,&lt;br /&gt;
          options = window.context_menu[self.el.id][control];&lt;br /&gt;
&lt;br /&gt;
      for (var i in options){&lt;br /&gt;
        if (options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options[i];&lt;br /&gt;
&lt;br /&gt;
          html += &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a id=&amp;quot;&amp;#039; + control + &amp;#039;_&amp;#039; + i + &amp;#039;&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;&amp;#039; + option.title + &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) return;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.innerHTML = html;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_items = context_menu_element.getElementsByTagName(&amp;#039;a&amp;#039;),&lt;br /&gt;
          context_menu_items_count = context_menu_items.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; context_menu_items_count; i++) {&lt;br /&gt;
        var context_menu_item = context_menu_items[i];&lt;br /&gt;
&lt;br /&gt;
        var assign_menu_item_action = function(ev){&lt;br /&gt;
          ev.preventDefault();&lt;br /&gt;
&lt;br /&gt;
          options[this.id.replace(control + &amp;#039;_&amp;#039;, &amp;#039;&amp;#039;)].action.apply(self, [e]);&lt;br /&gt;
          self.hideContextMenu();&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        google.maps.event.clearListeners(context_menu_item, &amp;#039;click&amp;#039;);&lt;br /&gt;
        google.maps.event.addDomListenerOnce(context_menu_item, &amp;#039;click&amp;#039;, assign_menu_item_action, false);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var position = findAbsolutePosition.apply(this, [self.el]),&lt;br /&gt;
          left = position[0] + e.pixel.x - 15,&lt;br /&gt;
          top = position[1] + e.pixel.y- 15;&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.style.left = left + &amp;quot;px&amp;quot;;&lt;br /&gt;
      context_menu_element.style.top = top + &amp;quot;px&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      // context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this.buildContextMenu = function(control, e) {&lt;br /&gt;
      if (control === &amp;#039;marker&amp;#039;) {&lt;br /&gt;
        e.pixel = {};&lt;br /&gt;
&lt;br /&gt;
        var overlay = new google.maps.OverlayView();&lt;br /&gt;
        overlay.setMap(self.map);&lt;br /&gt;
&lt;br /&gt;
        overlay.draw = function() {&lt;br /&gt;
          var projection = overlay.getProjection(),&lt;br /&gt;
              position = e.marker.getPosition();&lt;br /&gt;
&lt;br /&gt;
          e.pixel = projection.fromLatLngToContainerPixel(position);&lt;br /&gt;
&lt;br /&gt;
          buildContextMenuHTML(control, e);&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        buildContextMenuHTML(control, e);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      setTimeout(function() {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
      }, 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Add a context menu for a map or a marker.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {object} options - The `options` object should contain:&lt;br /&gt;
     * * `control` (string): Kind of control the context menu will be attached. Can be &amp;quot;map&amp;quot; or &amp;quot;marker&amp;quot;.&lt;br /&gt;
     * * `options` (array): A collection of context menu items:&lt;br /&gt;
     *   * `title` (string): Item&amp;#039;s title shown in the context menu.&lt;br /&gt;
     *   * `name` (string): Item&amp;#039;s identifier.&lt;br /&gt;
     *   * `action` (function): Function triggered after selecting the context menu item.&lt;br /&gt;
     */&lt;br /&gt;
    this.setContextMenu = function(options) {&lt;br /&gt;
      window.context_menu[self.el.id][options.control] = {};&lt;br /&gt;
&lt;br /&gt;
      var i,&lt;br /&gt;
          ul = doc.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      for (i in options.options) {&lt;br /&gt;
        if (options.options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options.options[i];&lt;br /&gt;
&lt;br /&gt;
          window.context_menu[self.el.id][options.control][option.name] = {&lt;br /&gt;
            title: option.title,&lt;br /&gt;
            action: option.action&lt;br /&gt;
          };&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ul.id = &amp;#039;gmaps_context_menu&amp;#039;;&lt;br /&gt;
      ul.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.position = &amp;#039;absolute&amp;#039;;&lt;br /&gt;
      ul.style.minWidth = &amp;#039;100px&amp;#039;;&lt;br /&gt;
      ul.style.background = &amp;#039;white&amp;#039;;&lt;br /&gt;
      ul.style.listStyle = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.padding = &amp;#039;8px&amp;#039;;&lt;br /&gt;
      ul.style.boxShadow = &amp;#039;2px 2px 6px #ccc&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) {&lt;br /&gt;
        doc.body.appendChild(ul);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      google.maps.event.addDomListener(context_menu_element, &amp;#039;mouseout&amp;#039;, function(ev) {&lt;br /&gt;
        if (!ev.relatedTarget || !this.contains(ev.relatedTarget)) {&lt;br /&gt;
          window.setTimeout(function(){&lt;br /&gt;
            context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
          }, 400);&lt;br /&gt;
        }&lt;br /&gt;
      }, false);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Hide the current context menu&lt;br /&gt;
     */&lt;br /&gt;
    this.hideContextMenu = function() {&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (context_menu_element) {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var setupListener = function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
        if (e == undefined) {&lt;br /&gt;
          e = this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        options[name].apply(this, [e]);&lt;br /&gt;
&lt;br /&gt;
        self.hideContextMenu();&lt;br /&gt;
      });&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    //google.maps.event.addListener(this.map, &amp;#039;idle&amp;#039;, this.hideContextMenu);&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;zoom_changed&amp;#039;, this.hideContextMenu);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_doesnt_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_doesnt_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
      if (options.rightclick) {&lt;br /&gt;
        options.rightclick.apply(this, [e]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(window.context_menu[self.el.id][&amp;#039;map&amp;#039;] != undefined) {&lt;br /&gt;
        self.buildContextMenu(&amp;#039;map&amp;#039;, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Trigger a `resize` event, useful if you need to repaint the current map (for changes in the viewport or display / hide actions).&lt;br /&gt;
     */&lt;br /&gt;
    this.refresh = function() {&lt;br /&gt;
      google.maps.event.trigger(this.map, &amp;#039;resize&amp;#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the markers added in the map.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitZoom = function() {&lt;br /&gt;
      var latLngs = [],&lt;br /&gt;
          markers_length = this.markers.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; markers_length; i++) {&lt;br /&gt;
        if(typeof(this.markers[i].visible) === &amp;#039;boolean&amp;#039; &amp;amp;&amp;amp; this.markers[i].visible) {&lt;br /&gt;
          latLngs.push(this.markers[i].getPosition());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.fitLatLngBounds(latLngs);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the coordinates in the `latLngs` array.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {array} latLngs - Collection of `google.maps.LatLng` objects.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitLatLngBounds = function(latLngs) {&lt;br /&gt;
      var total = latLngs.length,&lt;br /&gt;
          bounds = new google.maps.LatLngBounds(),&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for(i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
        bounds.extend(latLngs[i]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.map.fitBounds(bounds);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Center the map using the `lat` and `lng` coordinates.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} lat - Latitude of the coordinate.&lt;br /&gt;
     * @param {number} lng - Longitude of the coordinate.&lt;br /&gt;
     * @param {function} [callback] - Callback that will be executed after the map is centered.&lt;br /&gt;
     */&lt;br /&gt;
    this.setCenter = function(lat, lng, callback) {&lt;br /&gt;
      this.map.panTo(new google.maps.LatLng(lat, lng));&lt;br /&gt;
&lt;br /&gt;
      if (callback) {&lt;br /&gt;
        callback();&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Return the HTML element container of the map.&lt;br /&gt;
     *&lt;br /&gt;
     * @returns {HTMLElement} the element container.&lt;br /&gt;
     */&lt;br /&gt;
    this.getElement = function() {&lt;br /&gt;
      return this.el;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Increase the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed in.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomIn = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() + value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Decrease the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed out.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomOut = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() - value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var native_methods = [],&lt;br /&gt;
        method;&lt;br /&gt;
&lt;br /&gt;
    for (method in this.map) {&lt;br /&gt;
      if (typeof(this.map[method]) == &amp;#039;function&amp;#039; &amp;amp;&amp;amp; !this[method]) {&lt;br /&gt;
        native_methods.push(method);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; native_methods.length; i++) {&lt;br /&gt;
      (function(gmaps, scope, method_name) {&lt;br /&gt;
        gmaps[method_name] = function(){&lt;br /&gt;
          return scope[method_name].apply(scope, arguments);&lt;br /&gt;
        };&lt;br /&gt;
      })(this, this.map, native_methods[i]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return GMaps;&lt;br /&gt;
})(this);&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createControl = function(options) {&lt;br /&gt;
  var control = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  control.style.cursor = &amp;#039;pointer&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.disableDefaultStyles !== true) {&lt;br /&gt;
    control.style.fontFamily = &amp;#039;Roboto, Arial, sans-serif&amp;#039;;&lt;br /&gt;
    control.style.fontSize = &amp;#039;11px&amp;#039;;&lt;br /&gt;
    control.style.boxShadow = &amp;#039;rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var option in options.style) {&lt;br /&gt;
    control.style[option] = options.style[option];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.id) {&lt;br /&gt;
    control.id = options.id;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.title) {&lt;br /&gt;
    control.title = options.title;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.classes) {&lt;br /&gt;
    control.className = options.classes;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.content) {&lt;br /&gt;
    if (typeof options.content === &amp;#039;string&amp;#039;) {&lt;br /&gt;
      control.innerHTML = options.content;&lt;br /&gt;
    }&lt;br /&gt;
    else if (options.content instanceof HTMLElement) {&lt;br /&gt;
      control.appendChild(options.content);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.position) {&lt;br /&gt;
    control.position = google.maps.ControlPosition[options.position.toUpperCase()];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev in options.events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addDomListener(object, name, function(){&lt;br /&gt;
        options.events[name].apply(this, [this]);&lt;br /&gt;
      });&lt;br /&gt;
    })(control, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  control.index = 1;&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Add a custom control to the map UI.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {object} options - The `options` object should contain:&lt;br /&gt;
 * * `style` (object): The keys and values of this object should be valid CSS properties and values.&lt;br /&gt;
 * * `id` (string): The HTML id for the custom control.&lt;br /&gt;
 * * `classes` (string): A string containing all the HTML classes for the custom control.&lt;br /&gt;
 * * `content` (string or HTML element): The content of the custom control.&lt;br /&gt;
 * * `position` (string): Any valid [`google.maps.ControlPosition`](https://developers.google.com/maps/documentation/javascript/controls#ControlPositioning) value, in lower or upper case.&lt;br /&gt;
 * * `events` (object): The keys of this object should be valid DOM events. The values should be functions.&lt;br /&gt;
 * * `disableDefaultStyles` (boolean): If false, removes the default styles for the controls like font (family and size), and box shadow.&lt;br /&gt;
 * @returns {HTMLElement}&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.addControl = function(options) {&lt;br /&gt;
  var control = this.createControl(options);&lt;br /&gt;
&lt;br /&gt;
  this.controls.push(control);&lt;br /&gt;
  this.map.controls[control.position].push(control);&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Remove a control from the map. `control` should be a control returned by `addControl()`.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {HTMLElement} control - One of the controls returned by `addControl()`.&lt;br /&gt;
 * @returns {HTMLElement} the removed control.&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.removeControl = function(control) {&lt;br /&gt;
  var position = null,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; this.controls.length; i++) {&lt;br /&gt;
    if (this.controls[i] == control) {&lt;br /&gt;
      position = this.controls[i].position;&lt;br /&gt;
      this.controls.splice(i, 1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (position) {&lt;br /&gt;
    for (i = 0; i &amp;lt; this.map.controls.length; i++) {&lt;br /&gt;
      var controlsForPosition = this.map.controls[control.position];&lt;br /&gt;
&lt;br /&gt;
      if (controlsForPosition.getAt(i) == control) {&lt;br /&gt;
        controlsForPosition.removeAt(i);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createMarker = function(options) {&lt;br /&gt;
  if (options.lat == undefined &amp;amp;&amp;amp; options.lng == undefined &amp;amp;&amp;amp; options.position == undefined) {&lt;br /&gt;
    throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      details = options.details,&lt;br /&gt;
      fences = options.fences,&lt;br /&gt;
      outside = options.outside,&lt;br /&gt;
      base_options = {&lt;br /&gt;
        position: new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        map: null&lt;br /&gt;
      },&lt;br /&gt;
      marker_options = extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  delete marker_options.lat;&lt;br /&gt;
  delete marker_options.lng;&lt;br /&gt;
  delete marker_options.fences;&lt;br /&gt;
  delete marker_options.outside;&lt;br /&gt;
&lt;br /&gt;
  var marker = new google.maps.Marker(marker_options);&lt;br /&gt;
&lt;br /&gt;
  marker.fences = fences;&lt;br /&gt;
&lt;br /&gt;
  if (options.infoWindow) {&lt;br /&gt;
    marker.infoWindow = new google.maps.InfoWindow(options.infoWindow);&lt;br /&gt;
&lt;br /&gt;
    var info_window_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;content_changed&amp;#039;, &amp;#039;domready&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; info_window_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        if (options.infoWindow[name]) {&lt;br /&gt;
          google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
            options.infoWindow[name].apply(this, [e]);&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      })(marker.infoWindow, info_window_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var marker_events = [&amp;#039;animation_changed&amp;#039;, &amp;#039;clickable_changed&amp;#039;, &amp;#039;cursor_changed&amp;#039;, &amp;#039;draggable_changed&amp;#039;, &amp;#039;flat_changed&amp;#039;, &amp;#039;icon_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;shadow_changed&amp;#039;, &amp;#039;shape_changed&amp;#039;, &amp;#039;title_changed&amp;#039;, &amp;#039;visible_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  var marker_events_with_mouse = [&amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;, &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this, [this]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(marker, marker_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events_with_mouse.length; ev++) {&lt;br /&gt;
    (function(map, object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(me){&lt;br /&gt;
          if(!me.pixel){&lt;br /&gt;
            me.pixel = map.getProjection().fromLatLngToPoint(me.latLng)&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          options[name].apply(this, [me]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(this.map, marker, marker_events_with_mouse[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
    this.details = details;&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      options.click.apply(this, [this]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      self.hideInfoWindows();&lt;br /&gt;
      marker.infoWindow.open(self.map, marker);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
    e.marker = this;&lt;br /&gt;
&lt;br /&gt;
    if (options.rightclick) {&lt;br /&gt;
      options.rightclick.apply(this, [e]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (window.context_menu[self.el.id][&amp;#039;marker&amp;#039;] != undefined) {&lt;br /&gt;
      self.buildContextMenu(&amp;#039;marker&amp;#039;, e);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    google.maps.event.addListener(marker, &amp;#039;dragend&amp;#039;, function() {&lt;br /&gt;
      self.checkMarkerGeofence(marker, function(m, f) {&lt;br /&gt;
        outside(m, f);&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarker = function(options) {&lt;br /&gt;
  var marker;&lt;br /&gt;
  if(options.hasOwnProperty(&amp;#039;gm_accessors_&amp;#039;)) {&lt;br /&gt;
    // Native google.maps.Marker object&lt;br /&gt;
    marker = options;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if ((options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) || options.position) {&lt;br /&gt;
      marker = this.createMarker(options);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  marker.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if(this.markerClusterer) {&lt;br /&gt;
    this.markerClusterer.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.markers.push(marker);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;marker_added&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarkers = function(array) {&lt;br /&gt;
  for (var i = 0, marker; marker=array[i]; i++) {&lt;br /&gt;
    this.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return this.markers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.hideInfoWindows = function() {&lt;br /&gt;
  for (var i = 0, marker; marker = this.markers[i]; i++){&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      marker.infoWindow.close();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarker = function(marker) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
    if (this.markers[i] === marker) {&lt;br /&gt;
      this.markers[i].setMap(null);&lt;br /&gt;
      this.markers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      if(this.markerClusterer) {&lt;br /&gt;
        this.markerClusterer.removeMarker(marker);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarkers = function (collection) {&lt;br /&gt;
  var new_markers = [];&lt;br /&gt;
&lt;br /&gt;
  if (typeof collection == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(this.markerClusterer &amp;amp;&amp;amp; this.markerClusterer.clearMarkers) {&lt;br /&gt;
      this.markerClusterer.clearMarkers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; collection.length; i++) {&lt;br /&gt;
      var index = this.markers.indexOf(collection[i]);&lt;br /&gt;
&lt;br /&gt;
      if (index &amp;gt; -1) {&lt;br /&gt;
        var marker = this.markers[index];&lt;br /&gt;
        marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
        if(this.markerClusterer) {&lt;br /&gt;
          this.markerClusterer.removeMarker(marker);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      if (marker.getMap() != null) {&lt;br /&gt;
        new_markers.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawOverlay = function(options) {&lt;br /&gt;
  var overlay = new google.maps.OverlayView(),&lt;br /&gt;
      auto_show = true;&lt;br /&gt;
&lt;br /&gt;
  overlay.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if (options.auto_show != null) {&lt;br /&gt;
    auto_show = options.auto_show;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  overlay.onAdd = function() {&lt;br /&gt;
    var el = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    el.style.borderStyle = &amp;quot;none&amp;quot;;&lt;br /&gt;
    el.style.borderWidth = &amp;quot;0px&amp;quot;;&lt;br /&gt;
    el.style.position = &amp;quot;absolute&amp;quot;;&lt;br /&gt;
    el.style.zIndex = 100;&lt;br /&gt;
    el.innerHTML = options.content;&lt;br /&gt;
&lt;br /&gt;
    overlay.el = el;&lt;br /&gt;
&lt;br /&gt;
    if (!options.layer) {&lt;br /&gt;
      options.layer = &amp;#039;overlayLayer&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var panes = this.getPanes(),&lt;br /&gt;
        overlayLayer = panes[options.layer],&lt;br /&gt;
        stop_overlay_events = [&amp;#039;contextmenu&amp;#039;, &amp;#039;DOMMouseScroll&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    overlayLayer.appendChild(el);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; stop_overlay_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        google.maps.event.addDomListener(object, name, function(e){&lt;br /&gt;
          if (navigator.userAgent.toLowerCase().indexOf(&amp;#039;msie&amp;#039;) != -1 &amp;amp;&amp;amp; document.all) {&lt;br /&gt;
            e.cancelBubble = true;&lt;br /&gt;
            e.returnValue = false;&lt;br /&gt;
          }&lt;br /&gt;
          else {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
      })(el, stop_overlay_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      panes.overlayMouseTarget.appendChild(overlay.el);&lt;br /&gt;
      google.maps.event.addDomListener(overlay.el, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
        options.click.apply(overlay, [overlay]);&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.trigger(this, &amp;#039;ready&amp;#039;);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.draw = function() {&lt;br /&gt;
    var projection = this.getProjection(),&lt;br /&gt;
        pixel = projection.fromLatLngToDivPixel(new google.maps.LatLng(options.lat, options.lng));&lt;br /&gt;
&lt;br /&gt;
    options.horizontalOffset = options.horizontalOffset || 0;&lt;br /&gt;
    options.verticalOffset = options.verticalOffset || 0;&lt;br /&gt;
&lt;br /&gt;
    var el = overlay.el,&lt;br /&gt;
        content = el.children[0],&lt;br /&gt;
        content_height = content.clientHeight,&lt;br /&gt;
        content_width = content.clientWidth;&lt;br /&gt;
&lt;br /&gt;
    switch (options.verticalAlign) {&lt;br /&gt;
      case &amp;#039;top&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - content_height + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;middle&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - (content_height / 2) + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;bottom&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (options.horizontalAlign) {&lt;br /&gt;
      case &amp;#039;left&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - content_width + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;center&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - (content_width / 2) + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;right&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    el.style.display = auto_show ? &amp;#039;block&amp;#039; : &amp;#039;none&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (!auto_show) {&lt;br /&gt;
      options.show.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.onRemove = function() {&lt;br /&gt;
    var el = overlay.el;&lt;br /&gt;
&lt;br /&gt;
    if (options.remove) {&lt;br /&gt;
      options.remove.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      overlay.el.parentNode.removeChild(overlay.el);&lt;br /&gt;
      overlay.el = null;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.overlays.push(overlay);&lt;br /&gt;
  return overlay;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlay = function(overlay) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.overlays.length; i++) {&lt;br /&gt;
    if (this.overlays[i] === overlay) {&lt;br /&gt;
      this.overlays[i].setMap(null);&lt;br /&gt;
      this.overlays.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlays = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.overlays[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.overlays = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolyline = function(options) {&lt;br /&gt;
  var path = [],&lt;br /&gt;
      points = options.path;&lt;br /&gt;
&lt;br /&gt;
  if (points.length) {&lt;br /&gt;
    if (points[0][0] === undefined) {&lt;br /&gt;
      path = points;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      for (var i = 0, latlng; latlng = points[i]; i++) {&lt;br /&gt;
        path.push(new google.maps.LatLng(latlng[0], latlng[1]));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    path: path,&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight,&lt;br /&gt;
    geodesic: options.geodesic,&lt;br /&gt;
    clickable: true,&lt;br /&gt;
    editable: false,&lt;br /&gt;
    visible: true&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;clickable&amp;quot;)) {&lt;br /&gt;
    polyline_options.clickable = options.clickable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;editable&amp;quot;)) {&lt;br /&gt;
    polyline_options.editable = options.editable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;zIndex&amp;quot;)) {&lt;br /&gt;
    polyline_options.zIndex = options.zIndex;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline = new google.maps.Polyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
  var polyline_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polyline_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polyline, polyline_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines.push(polyline);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polyline_added&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
  return polyline;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolyline = function(polyline) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polylines.length; i++) {&lt;br /&gt;
    if (this.polylines[i] === polyline) {&lt;br /&gt;
      this.polylines[i].setMap(null);&lt;br /&gt;
      this.polylines.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polyline_removed&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolylines = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polylines[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawCircle = function(options) {&lt;br /&gt;
  options =  extend_object({&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    center: new google.maps.LatLng(options.lat, options.lng)&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Circle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRectangle = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  var latLngBounds = new google.maps.LatLngBounds(&lt;br /&gt;
    new google.maps.LatLng(options.bounds[0][0], options.bounds[0][1]),&lt;br /&gt;
    new google.maps.LatLng(options.bounds[1][0], options.bounds[1][1])&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  options.bounds = latLngBounds;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Rectangle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolygon = function(options) {&lt;br /&gt;
  var useGeoJSON = false;&lt;br /&gt;
&lt;br /&gt;
  if(options.hasOwnProperty(&amp;quot;useGeoJSON&amp;quot;)) {&lt;br /&gt;
    useGeoJSON = options.useGeoJSON;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.useGeoJSON;&lt;br /&gt;
&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON == false) {&lt;br /&gt;
    options.paths = [options.paths.slice(0)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.paths.length &amp;gt; 0) {&lt;br /&gt;
    if (options.paths[0].length &amp;gt; 0) {&lt;br /&gt;
      options.paths = array_flat(array_map(options.paths, arrayToLatLng, useGeoJSON));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Polygon(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polygon_added&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygon = function(polygon) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polygons.length; i++) {&lt;br /&gt;
    if (this.polygons[i] === polygon) {&lt;br /&gt;
      this.polygons[i].setMap(null);&lt;br /&gt;
      this.polygons.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polygon_removed&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygons = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polygons[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromFusionTables = function(options) {&lt;br /&gt;
  var events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var fusion_tables_options = options,&lt;br /&gt;
      layer = new google.maps.FusionTablesLayer(fusion_tables_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromFusionTables = function(options) {&lt;br /&gt;
  var layer = this.getFromFusionTables(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromKML = function(options) {&lt;br /&gt;
  var url = options.url,&lt;br /&gt;
      events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.url;&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var kml_options = options,&lt;br /&gt;
      layer = new google.maps.KmlLayer(url, kml_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromKML = function(options) {&lt;br /&gt;
  var layer = this.getFromKML(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addLayer = function(layerName, options) {&lt;br /&gt;
  //var default_layers = [&amp;#039;weather&amp;#039;, &amp;#039;clouds&amp;#039;, &amp;#039;traffic&amp;#039;, &amp;#039;transit&amp;#039;, &amp;#039;bicycling&amp;#039;, &amp;#039;panoramio&amp;#039;, &amp;#039;places&amp;#039;];&lt;br /&gt;
  options = options || {};&lt;br /&gt;
  var layer;&lt;br /&gt;
&lt;br /&gt;
  switch(layerName) {&lt;br /&gt;
    case &amp;#039;weather&amp;#039;: this.singleLayers.weather = layer = new google.maps.weather.WeatherLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;clouds&amp;#039;: this.singleLayers.clouds = layer = new google.maps.weather.CloudLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;traffic&amp;#039;: this.singleLayers.traffic = layer = new google.maps.TrafficLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;: this.singleLayers.transit = layer = new google.maps.TransitLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;: this.singleLayers.bicycling = layer = new google.maps.BicyclingLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;panoramio&amp;#039;:&lt;br /&gt;
        this.singleLayers.panoramio = layer = new google.maps.panoramio.PanoramioLayer();&lt;br /&gt;
        layer.setTag(options.filter);&lt;br /&gt;
        delete options.filter;&lt;br /&gt;
&lt;br /&gt;
        //click event&lt;br /&gt;
        if (options.click) {&lt;br /&gt;
          google.maps.event.addListener(layer, &amp;#039;click&amp;#039;, function(event) {&lt;br /&gt;
            options.click(event);&lt;br /&gt;
            delete options.click;&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
      case &amp;#039;places&amp;#039;:&lt;br /&gt;
        this.singleLayers.places = layer = new google.maps.places.PlacesService(this.map);&lt;br /&gt;
&lt;br /&gt;
        //search, nearbySearch, radarSearch callback, Both are the same&lt;br /&gt;
        if (options.search || options.nearbySearch || options.radarSearch) {&lt;br /&gt;
          var placeSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            keyword : options.keyword || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            name : options.name || null,&lt;br /&gt;
            radius : options.radius || null,&lt;br /&gt;
            rankBy : options.rankBy || null,&lt;br /&gt;
            types : options.types || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          if (options.radarSearch) {&lt;br /&gt;
            layer.radarSearch(placeSearchRequest, options.radarSearch);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.search) {&lt;br /&gt;
            layer.search(placeSearchRequest, options.search);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.nearbySearch) {&lt;br /&gt;
            layer.nearbySearch(placeSearchRequest, options.nearbySearch);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //textSearch callback&lt;br /&gt;
        if (options.textSearch) {&lt;br /&gt;
          var textSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            query : options.query || null,&lt;br /&gt;
            radius : options.radius || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          layer.textSearch(textSearchRequest, options.textSearch);&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (layer !== undefined) {&lt;br /&gt;
    if (typeof layer.setOptions == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setOptions(options);&lt;br /&gt;
    }&lt;br /&gt;
    if (typeof layer.setMap == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setMap(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return layer;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeLayer = function(layer) {&lt;br /&gt;
  if (typeof(layer) == &amp;quot;string&amp;quot; &amp;amp;&amp;amp; this.singleLayers[layer] !== undefined) {&lt;br /&gt;
     this.singleLayers[layer].setMap(null);&lt;br /&gt;
&lt;br /&gt;
     delete this.singleLayers[layer];&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.layers.length; i++) {&lt;br /&gt;
      if (this.layers[i] === layer) {&lt;br /&gt;
        this.layers[i].setMap(null);&lt;br /&gt;
        this.layers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var travelMode, unitSystem;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getRoutes = function(options) {&lt;br /&gt;
  switch (options.travelMode) {&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.BICYCLING;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.TRANSIT;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;driving&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.DRIVING;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      travelMode = google.maps.TravelMode.WALKING;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.unitSystem === &amp;#039;imperial&amp;#039;) {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.IMPERIAL;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.METRIC;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var base_options = {&lt;br /&gt;
        avoidHighways: false,&lt;br /&gt;
        avoidTolls: false,&lt;br /&gt;
        optimizeWaypoints: false,&lt;br /&gt;
        waypoints: []&lt;br /&gt;
      },&lt;br /&gt;
      request_options =  extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]);&lt;br /&gt;
  request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]);&lt;br /&gt;
  request_options.travelMode = travelMode;&lt;br /&gt;
  request_options.unitSystem = unitSystem;&lt;br /&gt;
&lt;br /&gt;
  delete request_options.callback;&lt;br /&gt;
  delete request_options.error;&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      routes = [],&lt;br /&gt;
      service = new google.maps.DirectionsService();&lt;br /&gt;
&lt;br /&gt;
  service.route(request_options, function(result, status) {&lt;br /&gt;
    if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
      for (var r in result.routes) {&lt;br /&gt;
        if (result.routes.hasOwnProperty(r)) {&lt;br /&gt;
          routes.push(result.routes[r]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback(routes, result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      if (options.error) {&lt;br /&gt;
        options.error(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeRoutes = function() {&lt;br /&gt;
  this.routes.length = 0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getElevations = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    locations: [],&lt;br /&gt;
    path : false,&lt;br /&gt;
    samples : 256&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (options.locations.length &amp;gt; 0) {&lt;br /&gt;
    if (options.locations[0].length &amp;gt; 0) {&lt;br /&gt;
      options.locations = array_flat(array_map([options.locations], arrayToLatLng,  false));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
&lt;br /&gt;
  var service = new google.maps.ElevationService();&lt;br /&gt;
&lt;br /&gt;
  //location request&lt;br /&gt;
  if (!options.path) {&lt;br /&gt;
    delete options.path;&lt;br /&gt;
    delete options.samples;&lt;br /&gt;
&lt;br /&gt;
    service.getElevationForLocations(options, function(result, status) {&lt;br /&gt;
      if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  //path request&lt;br /&gt;
  } else {&lt;br /&gt;
    var pathRequest = {&lt;br /&gt;
      path : options.locations,&lt;br /&gt;
      samples : options.samples&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    service.getElevationAlongPath(pathRequest, function(result, status) {&lt;br /&gt;
     if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.renderRoute = function(options, renderOptions) {&lt;br /&gt;
  var self = this,&lt;br /&gt;
      panel = ((typeof renderOptions.panel === &amp;#039;string&amp;#039;) ? document.getElementById(renderOptions.panel.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;)) : renderOptions.panel),&lt;br /&gt;
      display;&lt;br /&gt;
&lt;br /&gt;
  renderOptions.panel = panel;&lt;br /&gt;
  renderOptions = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, renderOptions);&lt;br /&gt;
  display = new google.maps.DirectionsRenderer(renderOptions);&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes, response, status) {&lt;br /&gt;
      if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
        display.setDirections(response);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes) {&lt;br /&gt;
      if (routes.length &amp;gt; 0) {&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: routes[routes.length - 1].overview_path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
        if (options.callback) {&lt;br /&gt;
          options.callback(routes[routes.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.travelRoute = function(options) {&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      unitSystem: options.unitSystem,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawSteppedRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              var polyline_options = {&lt;br /&gt;
                path: step.path,&lt;br /&gt;
                strokeColor: options.strokeColor,&lt;br /&gt;
                strokeOpacity: options.strokeOpacity,&lt;br /&gt;
                strokeWeight: options.strokeWeight&lt;br /&gt;
              };&lt;br /&gt;
&lt;br /&gt;
              if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
                polyline_options.icons = options.icons;&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              self.drawPolyline(polyline_options);&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: step.path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route = function(options) {&lt;br /&gt;
  this.origin = options.origin;&lt;br /&gt;
  this.destination = options.destination;&lt;br /&gt;
  this.waypoints = options.waypoints;&lt;br /&gt;
&lt;br /&gt;
  this.map = options.map;&lt;br /&gt;
  this.route = options.route;&lt;br /&gt;
  this.step_count = 0;&lt;br /&gt;
  this.steps = this.route.legs[0].steps;&lt;br /&gt;
  this.steps_length = this.steps.length;&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    path: new google.maps.MVCArray(),&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polyline = this.map.drawPolyline(polyline_options).getPath();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.getRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.map.getRoutes({&lt;br /&gt;
    origin : this.origin,&lt;br /&gt;
    destination : this.destination,&lt;br /&gt;
    travelMode : options.travelMode,&lt;br /&gt;
    waypoints : this.waypoints || [],&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    callback : function() {&lt;br /&gt;
      self.route = e[0];&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback.call(self);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.back = function() {&lt;br /&gt;
  if (this.step_count &amp;gt; 0) {&lt;br /&gt;
    this.step_count--;&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.pop();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.forward = function() {&lt;br /&gt;
  if (this.step_count &amp;lt; this.steps_length) {&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.push(path[p]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    this.step_count++;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkGeofence = function(lat, lng, fence) {&lt;br /&gt;
  return fence.containsLatLng(new google.maps.LatLng(lat, lng));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkMarkerGeofence = function(marker, outside_callback) {&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    for (var i = 0, fence; fence = marker.fences[i]; i++) {&lt;br /&gt;
      var pos = marker.getPosition();&lt;br /&gt;
      if (!this.checkGeofence(pos.lat(), pos.lng(), fence)) {&lt;br /&gt;
        outside_callback(marker, fence);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.toImage = function(options) {&lt;br /&gt;
  var options = options || {},&lt;br /&gt;
      static_map_options = {};&lt;br /&gt;
&lt;br /&gt;
  static_map_options[&amp;#039;size&amp;#039;] = options[&amp;#039;size&amp;#039;] || [this.el.clientWidth, this.el.clientHeight];&lt;br /&gt;
  static_map_options[&amp;#039;lat&amp;#039;] = this.getCenter().lat();&lt;br /&gt;
  static_map_options[&amp;#039;lng&amp;#039;] = this.getCenter().lng();&lt;br /&gt;
&lt;br /&gt;
  if (this.markers.length &amp;gt; 0) {&lt;br /&gt;
    static_map_options[&amp;#039;markers&amp;#039;] = [];&lt;br /&gt;
    &lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      static_map_options[&amp;#039;markers&amp;#039;].push({&lt;br /&gt;
        lat: this.markers[i].getPosition().lat(),&lt;br /&gt;
        lng: this.markers[i].getPosition().lng()&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (this.polylines.length &amp;gt; 0) {&lt;br /&gt;
    var polyline = this.polylines[0];&lt;br /&gt;
    &lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;] = {};&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;path&amp;#039;] = google.maps.geometry.encoding.encodePath(polyline.getPath());&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeColor&amp;#039;] = polyline.strokeColor&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeOpacity&amp;#039;] = polyline.strokeOpacity&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeWeight&amp;#039;] = polyline.strokeWeight&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return GMaps.staticMapURL(static_map_options);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.staticMapURL = function(options){&lt;br /&gt;
  var parameters = [],&lt;br /&gt;
      data,&lt;br /&gt;
      static_root = (location.protocol === &amp;#039;file:&amp;#039; ? &amp;#039;http:&amp;#039; : location.protocol ) + &amp;#039;//maps.googleapis.com/maps/api/staticmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.url) {&lt;br /&gt;
    static_root = options.url;&lt;br /&gt;
    delete options.url;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  static_root += &amp;#039;?&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  var markers = options.markers;&lt;br /&gt;
  &lt;br /&gt;
  delete options.markers;&lt;br /&gt;
&lt;br /&gt;
  if (!markers &amp;amp;&amp;amp; options.marker) {&lt;br /&gt;
    markers = [options.marker];&lt;br /&gt;
    delete options.marker;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var styles = options.styles;&lt;br /&gt;
&lt;br /&gt;
  delete options.styles;&lt;br /&gt;
&lt;br /&gt;
  var polyline = options.polyline;&lt;br /&gt;
  delete options.polyline;&lt;br /&gt;
&lt;br /&gt;
  /** Map options **/&lt;br /&gt;
  if (options.center) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.center);&lt;br /&gt;
    delete options.center;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.address) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.address);&lt;br /&gt;
    delete options.address;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.lat) {&lt;br /&gt;
    parameters.push([&amp;#039;center=&amp;#039;, options.lat, &amp;#039;,&amp;#039;, options.lng].join(&amp;#039;&amp;#039;));&lt;br /&gt;
    delete options.lat;&lt;br /&gt;
    delete options.lng;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.visible) {&lt;br /&gt;
    var visible = encodeURI(options.visible.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
    parameters.push(&amp;#039;visible=&amp;#039; + visible);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var size = options.size;&lt;br /&gt;
  if (size) {&lt;br /&gt;
    if (size.join) {&lt;br /&gt;
      size = size.join(&amp;#039;x&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    delete options.size;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    size = &amp;#039;630x300&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  parameters.push(&amp;#039;size=&amp;#039; + size);&lt;br /&gt;
&lt;br /&gt;
  if (!options.zoom &amp;amp;&amp;amp; options.zoom !== false) {&lt;br /&gt;
    options.zoom = 15;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var sensor = options.hasOwnProperty(&amp;#039;sensor&amp;#039;) ? !!options.sensor : true;&lt;br /&gt;
  delete options.sensor;&lt;br /&gt;
  parameters.push(&amp;#039;sensor=&amp;#039; + sensor);&lt;br /&gt;
&lt;br /&gt;
  for (var param in options) {&lt;br /&gt;
    if (options.hasOwnProperty(param)) {&lt;br /&gt;
      parameters.push(param + &amp;#039;=&amp;#039; + options[param]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Markers **/&lt;br /&gt;
  if (markers) {&lt;br /&gt;
    var marker, loc;&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; data = markers[i]; i++) {&lt;br /&gt;
      marker = [];&lt;br /&gt;
&lt;br /&gt;
      if (data.size &amp;amp;&amp;amp; data.size !== &amp;#039;normal&amp;#039;) {&lt;br /&gt;
        marker.push(&amp;#039;size:&amp;#039; + data.size);&lt;br /&gt;
        delete data.size;&lt;br /&gt;
      }&lt;br /&gt;
      else if (data.icon) {&lt;br /&gt;
        marker.push(&amp;#039;icon:&amp;#039; + encodeURI(data.icon));&lt;br /&gt;
        delete data.icon;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.color) {&lt;br /&gt;
        marker.push(&amp;#039;color:&amp;#039; + data.color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;));&lt;br /&gt;
        delete data.color;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.label) {&lt;br /&gt;
        marker.push(&amp;#039;label:&amp;#039; + data.label[0].toUpperCase());&lt;br /&gt;
        delete data.label;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      loc = (data.address ? data.address : data.lat + &amp;#039;,&amp;#039; + data.lng);&lt;br /&gt;
      delete data.address;&lt;br /&gt;
      delete data.lat;&lt;br /&gt;
      delete data.lng;&lt;br /&gt;
&lt;br /&gt;
      for(var param in data){&lt;br /&gt;
        if (data.hasOwnProperty(param)) {&lt;br /&gt;
          marker.push(param + &amp;#039;:&amp;#039; + data[param]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (marker.length || i === 0) {&lt;br /&gt;
        marker.push(loc);&lt;br /&gt;
        marker = marker.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
        parameters.push(&amp;#039;markers=&amp;#039; + encodeURI(marker));&lt;br /&gt;
      }&lt;br /&gt;
      // New marker without styles&lt;br /&gt;
      else {&lt;br /&gt;
        marker = parameters.pop() + encodeURI(&amp;#039;|&amp;#039; + loc);&lt;br /&gt;
        parameters.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Map Styles **/&lt;br /&gt;
  if (styles) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; styles.length; i++) {&lt;br /&gt;
      var styleRule = [];&lt;br /&gt;
      if (styles[i].featureType){&lt;br /&gt;
        styleRule.push(&amp;#039;feature:&amp;#039; + styles[i].featureType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (styles[i].elementType) {&lt;br /&gt;
        styleRule.push(&amp;#039;element:&amp;#039; + styles[i].elementType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      for (var j = 0; j &amp;lt; styles[i].stylers.length; j++) {&lt;br /&gt;
        for (var p in styles[i].stylers[j]) {&lt;br /&gt;
          var ruleArg = styles[i].stylers[j][p];&lt;br /&gt;
          if (p == &amp;#039;hue&amp;#039; || p == &amp;#039;color&amp;#039;) {&lt;br /&gt;
            ruleArg = &amp;#039;0x&amp;#039; + ruleArg.substring(1);&lt;br /&gt;
          }&lt;br /&gt;
          styleRule.push(p + &amp;#039;:&amp;#039; + ruleArg);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var rule = styleRule.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
      if (rule != &amp;#039;&amp;#039;) {&lt;br /&gt;
        parameters.push(&amp;#039;style=&amp;#039; + rule);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Polylines **/&lt;br /&gt;
  function parseColor(color, opacity) {&lt;br /&gt;
    if (color[0] === &amp;#039;#&amp;#039;){&lt;br /&gt;
      color = color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (opacity) {&lt;br /&gt;
        opacity = parseFloat(opacity);&lt;br /&gt;
        opacity = Math.min(1, Math.max(opacity, 0));&lt;br /&gt;
        if (opacity === 0) {&lt;br /&gt;
          return &amp;#039;0x00000000&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        opacity = (opacity * 255).toString(16);&lt;br /&gt;
        if (opacity.length === 1) {&lt;br /&gt;
          opacity += opacity;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        color = color.slice(0,8) + opacity;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return color;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (polyline) {&lt;br /&gt;
    data = polyline;&lt;br /&gt;
    polyline = [];&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeWeight) {&lt;br /&gt;
      polyline.push(&amp;#039;weight:&amp;#039; + parseInt(data.strokeWeight, 10));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeColor) {&lt;br /&gt;
      var color = parseColor(data.strokeColor, data.strokeOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;color:&amp;#039; + color);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.fillColor) {&lt;br /&gt;
      var fillcolor = parseColor(data.fillColor, data.fillOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;fillcolor:&amp;#039; + fillcolor);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var path = data.path;&lt;br /&gt;
    if (path.join) {&lt;br /&gt;
      for (var j=0, pos; pos=path[j]; j++) {&lt;br /&gt;
        polyline.push(pos.join(&amp;#039;,&amp;#039;));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      polyline.push(&amp;#039;enc:&amp;#039; + path);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    polyline = polyline.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
    parameters.push(&amp;#039;path=&amp;#039; + encodeURI(polyline));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Retina support **/&lt;br /&gt;
  var dpi = window.devicePixelRatio || 1;&lt;br /&gt;
  parameters.push(&amp;#039;scale=&amp;#039; + dpi);&lt;br /&gt;
&lt;br /&gt;
  parameters = parameters.join(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
  return static_root + parameters;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMapType = function(mapTypeId, options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTileUrl&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTileUrl&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    options.tileSize = options.tileSize || new google.maps.Size(256, 256);&lt;br /&gt;
&lt;br /&gt;
    var mapType = new google.maps.ImageMapType(options);&lt;br /&gt;
&lt;br /&gt;
    this.map.mapTypes.set(mapTypeId, mapType);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTileUrl&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addOverlayMapType = function(options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTile&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTile&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    var overlayMapTypeIndex = options.index;&lt;br /&gt;
&lt;br /&gt;
    delete options.index;&lt;br /&gt;
&lt;br /&gt;
    this.map.overlayMapTypes.insertAt(overlayMapTypeIndex, options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTile&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlayMapType = function(overlayMapTypeIndex) {&lt;br /&gt;
  this.map.overlayMapTypes.removeAt(overlayMapTypeIndex);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addStyle = function(options) {&lt;br /&gt;
  var styledMapType = new google.maps.StyledMapType(options.styles, { name: options.styledMapName });&lt;br /&gt;
&lt;br /&gt;
  this.map.mapTypes.set(options.mapTypeId, styledMapType);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.setStyle = function(mapTypeId) {&lt;br /&gt;
  this.map.setMapTypeId(mapTypeId);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createPanorama = function(streetview_options) {&lt;br /&gt;
  if (!streetview_options.hasOwnProperty(&amp;#039;lat&amp;#039;) || !streetview_options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    streetview_options.lat = this.getCenter().lat();&lt;br /&gt;
    streetview_options.lng = this.getCenter().lng();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.panorama = GMaps.createPanorama(streetview_options);&lt;br /&gt;
&lt;br /&gt;
  this.map.setStreetView(this.panorama);&lt;br /&gt;
&lt;br /&gt;
  return this.panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.createPanorama = function(options) {&lt;br /&gt;
  var el = getElementById(options.el, options.context);&lt;br /&gt;
&lt;br /&gt;
  options.position = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
&lt;br /&gt;
  delete options.el;&lt;br /&gt;
  delete options.context;&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var streetview_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;links_changed&amp;#039;, &amp;#039;pano_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;pov_changed&amp;#039;, &amp;#039;resize&amp;#039;, &amp;#039;visible_changed&amp;#039;],&lt;br /&gt;
      streetview_options = extend_object({visible : true}, options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    delete streetview_options[streetview_events[i]];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var panorama = new google.maps.StreetViewPanorama(el, streetview_options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(panorama, streetview_events[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.on = function(event_name, handler) {&lt;br /&gt;
  return GMaps.on(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.off = function(event_name) {&lt;br /&gt;
  GMaps.off(event_name, this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.once = function(event_name, handler) {&lt;br /&gt;
  return GMaps.once(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.custom_events = [&amp;#039;marker_added&amp;#039;, &amp;#039;marker_removed&amp;#039;, &amp;#039;polyline_added&amp;#039;, &amp;#039;polyline_removed&amp;#039;, &amp;#039;polygon_added&amp;#039;, &amp;#039;polygon_removed&amp;#039;, &amp;#039;geolocated&amp;#039;, &amp;#039;geolocation_failed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
GMaps.on = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    return google.maps.event.addListener(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    var registered_event = {&lt;br /&gt;
      handler : handler,&lt;br /&gt;
      eventName : event_name&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    object.registered_events[event_name] = object.registered_events[event_name] || [];&lt;br /&gt;
    object.registered_events[event_name].push(registered_event);&lt;br /&gt;
&lt;br /&gt;
    return registered_event;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.off = function(event_name, object) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    google.maps.event.clearListeners(object, event_name);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    object.registered_events[event_name] = [];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.once = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map;&lt;br /&gt;
    return google.maps.event.addListenerOnce(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.fire = function(event_name, object, scope) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    google.maps.event.trigger(object, event_name, Array.prototype.slice.apply(arguments).slice(2));&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if(event_name in scope.registered_events) {&lt;br /&gt;
      var firing_events = scope.registered_events[event_name];&lt;br /&gt;
&lt;br /&gt;
      for(var i = 0; i &amp;lt; firing_events.length; i++) {&lt;br /&gt;
        (function(handler, scope, object) {&lt;br /&gt;
          handler.apply(scope, [object]);&lt;br /&gt;
        })(firing_events[i][&amp;#039;handler&amp;#039;], scope, object);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geolocate = function(options) {&lt;br /&gt;
  var complete_callback = options.always || options.complete;&lt;br /&gt;
&lt;br /&gt;
  if (navigator.geolocation) {&lt;br /&gt;
    navigator.geolocation.getCurrentPosition(function(position) {&lt;br /&gt;
      options.success(position);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, function(error) {&lt;br /&gt;
      options.error(error);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, options.options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    options.not_supported();&lt;br /&gt;
&lt;br /&gt;
    if (complete_callback) {&lt;br /&gt;
      complete_callback();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geocode = function(options) {&lt;br /&gt;
  this.geocoder = new google.maps.Geocoder();&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  if (options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    options.latLng = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
  &lt;br /&gt;
  this.geocoder.geocode(options, function(results, status) {&lt;br /&gt;
    callback(results, status);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
if (typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps) {&lt;br /&gt;
  //==========================&lt;br /&gt;
  // Polygon containsLatLng&lt;br /&gt;
  // https://github.com/tparkin/Google-Maps-Point-in-Polygon&lt;br /&gt;
  // Poygon getBounds extension - google-maps-extensions&lt;br /&gt;
  // http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js&lt;br /&gt;
  if (!google.maps.Polygon.prototype.getBounds) {&lt;br /&gt;
    google.maps.Polygon.prototype.getBounds = function(latLng) {&lt;br /&gt;
      var bounds = new google.maps.LatLngBounds();&lt;br /&gt;
      var paths = this.getPaths();&lt;br /&gt;
      var path;&lt;br /&gt;
&lt;br /&gt;
      for (var p = 0; p &amp;lt; paths.getLength(); p++) {&lt;br /&gt;
        path = paths.getAt(p);&lt;br /&gt;
        for (var i = 0; i &amp;lt; path.getLength(); i++) {&lt;br /&gt;
          bounds.extend(path.getAt(i));&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return bounds;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Polygon.prototype.containsLatLng) {&lt;br /&gt;
    // Polygon containsLatLng - method to determine if a latLng is within a polygon&lt;br /&gt;
    google.maps.Polygon.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      // Exclude points outside of bounds as there is no way they are in the poly&lt;br /&gt;
      var bounds = this.getBounds();&lt;br /&gt;
&lt;br /&gt;
      if (bounds !== null &amp;amp;&amp;amp; !bounds.contains(latLng)) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Raycast point in polygon method&lt;br /&gt;
      var inPoly = false;&lt;br /&gt;
&lt;br /&gt;
      var numPaths = this.getPaths().getLength();&lt;br /&gt;
      for (var p = 0; p &amp;lt; numPaths; p++) {&lt;br /&gt;
        var path = this.getPaths().getAt(p);&lt;br /&gt;
        var numPoints = path.getLength();&lt;br /&gt;
        var j = numPoints - 1;&lt;br /&gt;
&lt;br /&gt;
        for (var i = 0; i &amp;lt; numPoints; i++) {&lt;br /&gt;
          var vertex1 = path.getAt(i);&lt;br /&gt;
          var vertex2 = path.getAt(j);&lt;br /&gt;
&lt;br /&gt;
          if (vertex1.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex2.lng() &amp;gt;= latLng.lng() || vertex2.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex1.lng() &amp;gt;= latLng.lng()) {&lt;br /&gt;
            if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) &amp;lt; latLng.lat()) {&lt;br /&gt;
              inPoly = !inPoly;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          j = i;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return inPoly;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Circle.prototype.containsLatLng) {&lt;br /&gt;
    google.maps.Circle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      if (google.maps.geometry) {&lt;br /&gt;
        return google.maps.geometry.spherical.computeDistanceBetween(this.getCenter(), latLng) &amp;lt;= this.getRadius();&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.Rectangle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.getBounds().contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.setFences = function(fences) {&lt;br /&gt;
    this.fences = fences;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.addFence = function(fence) {&lt;br /&gt;
    this.fences.push(fence);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.getId = function() {&lt;br /&gt;
    return this[&amp;#039;__gm_id&amp;#039;];&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==========================&lt;br /&gt;
// Array indexOf&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf&lt;br /&gt;
if (!Array.prototype.indexOf) {&lt;br /&gt;
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {&lt;br /&gt;
      &amp;quot;use strict&amp;quot;;&lt;br /&gt;
      if (this == null) {&lt;br /&gt;
          throw new TypeError();&lt;br /&gt;
      }&lt;br /&gt;
      var t = Object(this);&lt;br /&gt;
      var len = t.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
      if (len === 0) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var n = 0;&lt;br /&gt;
      if (arguments.length &amp;gt; 1) {&lt;br /&gt;
          n = Number(arguments[1]);&lt;br /&gt;
          if (n != n) { // shortcut for verifying if it&amp;#039;s NaN&lt;br /&gt;
              n = 0;&lt;br /&gt;
          } else if (n != 0 &amp;amp;&amp;amp; n != Infinity &amp;amp;&amp;amp; n != -Infinity) {&lt;br /&gt;
              n = (n &amp;gt; 0 || -1) * Math.floor(Math.abs(n));&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      if (n &amp;gt;= len) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var k = n &amp;gt;= 0 ? n : Math.max(len - Math.abs(n), 0);&lt;br /&gt;
      for (; k &amp;lt; len; k++) {&lt;br /&gt;
          if (k in t &amp;amp;&amp;amp; t[k] === searchElement) {&lt;br /&gt;
              return k;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return GMaps;&lt;br /&gt;
}));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
approve.js&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
howlerjs.com - Cross Plattform Audio&lt;br /&gt;
&lt;br /&gt;
== Browser Fixing ==&lt;br /&gt;
[[JavaScript - iOS Orientation Change Fix]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=SSL&amp;diff=22917</id>
		<title>SSL</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=SSL&amp;diff=22917"/>
		<updated>2018-03-27T10:05:34Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== SSH / SSL ==&lt;br /&gt;
Verschlüsselte Übertragung von Daten im Internet.&lt;br /&gt;
Es gibt verschiedene Zertifizierungsstellen. Ein Zertifikat bezieht sich immer auf eine Domain. Kosten zwischen 50 und 100 Euro im Jahr.&lt;br /&gt;
Nachtrag 4/2016 - es gibt eine Initiative von Mozilla, mit der man sich kostenlose Zertifikate erstellen lassen kann.&lt;br /&gt;
&lt;br /&gt;
Mehrere Domains lassen sich über einen ssl-proxy nutzen. Man trägt die Domains im Proxy ein und kann z.B. so verschlüsselt auf die Daten zugreifen:&lt;br /&gt;
&lt;br /&gt;
 https://ssl-account.com/meineDomain.de/&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ssl-proxy bei all-inkl&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== SSH Zugang bei all-inkl Server ==&lt;br /&gt;
Obsolet - nicht mehr Notwendig mit neuen Tools&lt;br /&gt;
Mit eingeschränktem Befehlssatz. Aktivierung &amp;#039;&amp;#039;&amp;#039;im Hauptaccount&amp;#039;&amp;#039;&amp;#039; unter &amp;#039;&amp;#039;&amp;#039;Tools &amp;gt; SSH Zugänge&amp;#039;&amp;#039;&amp;#039;. Passwort entspricht dem Passwort des FTP Hauptaccounts.&lt;br /&gt;
&lt;br /&gt;
http://all-inkl.com/wichtig/anleitungen/kas/ssh/dateiverwaltung/aktivierung-von-ssh_395.html&lt;br /&gt;
&lt;br /&gt;
===Freies echtes SSL Zertifikat bei all-inkl ===&lt;br /&gt;
Im KAS bei der Domainverwaltung&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Let&amp;#039;s Encrypt&amp;#039;&amp;#039;&amp;#039; -&amp;gt; per Knopfdruck&lt;br /&gt;
&lt;br /&gt;
Sie können sich mit Hilfe des &amp;#039;&amp;#039;&amp;#039;CSR Generators&amp;#039;&amp;#039;&amp;#039; in unserem Backend selbst ein Zertifikat erzeugen lassen (oder wir erledigen dies für Sie). Im Anschluss können Sie sich dieses Zertifikat von einer beliebigen Zertifizierungsstelle unterschreiben lassen Bei der Generierung des CSR müssen die Zertifikatsdaten mit den WHOIS Daten der Domain übereinstimmen! Hier müssen Sie auch die Gültigkeitsdauer etc. eingeben. &lt;br /&gt;
&lt;br /&gt;
Der zweite Weg entspricht der bisherigen Vorgehensweise bei Ihren Domains und ist meines Erachtens etwas effizienter:&lt;br /&gt;
Wenn Sie das Handling selbst in der Hand haben möchten können Sie das &amp;#039;&amp;#039;&amp;#039;Zertifikat komplett selbst erstellen&amp;#039;&amp;#039;&amp;#039; und das neue Zertifikat,  zusammen mit dem neuen CA-Chain und private key entweder über unser Backend Tool &amp;#039;&amp;#039;&amp;#039;direkt einspielen&amp;#039;&amp;#039;&amp;#039;, oder über einen sicheren Kanal z.B. in unsere private Cloud (Ich stelle einen Zugang zur Verfügung) oder ihre eigene hochladen, wir spielen es dann ein.&lt;br /&gt;
&lt;br /&gt;
https://klein-gedruckt.de/2015/01/echtes-ssl-bei-all-inkl-aktivieren/&lt;br /&gt;
&lt;br /&gt;
== Eigene SSH Schlüssel erzeugen ==&lt;br /&gt;
Um auf manche Server per Terminal und SSH zuzugreifen muß man bei manchen Providern ein Schlüsselpaar generieren und den öffentlichen Schlüssel auf den Server laden.&lt;br /&gt;
&lt;br /&gt;
1. SSH Key generieren&lt;br /&gt;
&lt;br /&gt;
Terminal-Programm starten.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; ssh-keygen -t rsa -C &amp;quot;benutzer@domain.de&amp;quot;&lt;br /&gt;
 Generating public/private rsa key pair.&lt;br /&gt;
 Enter file in which to save the key (/Users/benutzer/.ssh/id_rsa):&lt;br /&gt;
 Enter passphrase (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again: &lt;br /&gt;
 Your identification has been saved in /Users/benutzer/.ssh/id_rsa.&lt;br /&gt;
 Your public key has been saved in /Users/benutzer/.ssh/id_rsa.pub.&lt;br /&gt;
 The key fingerprint is:&lt;br /&gt;
 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx benutzer@domain.de&lt;br /&gt;
 The key&amp;#039;s randomart image is:&lt;br /&gt;
 [Hier nicht wiedergegeben]&lt;br /&gt;
&lt;br /&gt;
 ssh_keygen schreibt die beiden Dateien mit den korrekten Rechten:&lt;br /&gt;
&lt;br /&gt;
 ~/.ssh/id_rsa 600&lt;br /&gt;
 ~/.ssh/id_rsa.pub 644&lt;br /&gt;
&lt;br /&gt;
2. Public Key hochladen&lt;br /&gt;
&lt;br /&gt;
Starte dein FTP-Programm (ich benutze Transfer) und verbinde zu deinem Server auf serverdomain.org mit dem FTP-Hauptbenutzer. Du kannst auch SFTP oder FTP mit TLS/SSL nutzen.&lt;br /&gt;
&lt;br /&gt;
Lade den generierten öffentlichen Schlüssel ~/.ssh/id_rsa.pub nach /.ssh/id_rsa.pub hoch. Achtung: NICHT ins /home Verzeichnis! Anschließend die Datei in /.ssh/authorized_keys2 umbenennen. Die Rechte 644 sollte die Datei immer noch haben.&lt;br /&gt;
&lt;br /&gt;
3. Es gibt keinen dritten Schritt&lt;br /&gt;
&lt;br /&gt;
Schon sollte es klappen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; ssh benutzer@domain.de&lt;br /&gt;
 Linux xb7.serverdomain.org 2.6.32-5-amd64 #1 SMP Thu Mar 22 17:26:33 UTC 2012 x86_64&lt;br /&gt;
 &lt;br /&gt;
 The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
 the exact distribution terms for each program are described in the&lt;br /&gt;
 individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
 &lt;br /&gt;
 Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
 permitted by applicable law.&lt;br /&gt;
 Last login: Thu May 23 12:50:38 2013 from [deine reverse-ip]&lt;br /&gt;
 benutzer@server:~$&lt;br /&gt;
&lt;br /&gt;
Die Tilde ~ vor dem Prompt zeigt dir, daß du im /home Verzeichnis bist.&lt;br /&gt;
&lt;br /&gt;
Falls ihr noch Probleme mit der Materie habt, schreibt bitte in diesen Thread damit die anderen auch was davon haben.&lt;br /&gt;
&lt;br /&gt;
Timm&lt;br /&gt;
&lt;br /&gt;
=== Variante mit rsa type und bittiefe ===&lt;br /&gt;
https://www.veit-schiele.de/dienstleistungen/hosting/dokumentation/ssh&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22916</id>
		<title>Premiere - Shortcuts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22916"/>
		<updated>2018-03-25T21:17:51Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
In- und Outpoint setzen (I, O) &lt;br /&gt;
Clip Importieren (.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TIMELINE&lt;br /&gt;
Zoom (Alt+Mausrad)&lt;br /&gt;
Ripple Werkzeug - Schnittkante verschieben (Clip bleibt an der gleichen Zeit) (B)&lt;br /&gt;
Slip (Clip bleibt an der gleichen Position, Inhalt wird verschoben) (Y)&lt;br /&gt;
Verschieben nach rechts - Werkzeug (V)&lt;br /&gt;
Rasierklinge (C)&lt;br /&gt;
Clip bis Abspielknopf erweitern (E)&lt;br /&gt;
Links trimmen (Q)&lt;br /&gt;
Rechts trimmen (W)&lt;br /&gt;
+- 1 Frame verschieben ( Alt + , / Alt + . ) &lt;br /&gt;
+- 5 Frame verschieben ( Shift + Alt + , / Shift + Alt + . ) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblendungen (ctrl-g)&lt;br /&gt;
Quellmonitor und Timeline synchron (f)&lt;br /&gt;
&lt;br /&gt;
Media Browser (Shift + 9)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22915</id>
		<title>Premiere - Shortcuts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22915"/>
		<updated>2018-03-25T20:16:45Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
In- und Outpoint setzen (I, O) &lt;br /&gt;
Clip Importieren (.)&lt;br /&gt;
Zoom (Alt+Mausrad)&lt;br /&gt;
&lt;br /&gt;
TIMELINE&lt;br /&gt;
Ripple Werkzeug - Schnittkante verschieben (Clip bleibt an der gleichen Zeit) (B)&lt;br /&gt;
Slip (Clip bleibt an der gleichen Position, Inhalt wird verschoben) (Y)&lt;br /&gt;
Verschieben nach rechts - Werkzeug (V)&lt;br /&gt;
Rasierklinge (C)&lt;br /&gt;
Clip bis Abspielknopf erweitern (E)&lt;br /&gt;
Links trimmen (Q)&lt;br /&gt;
Rechts trimmen (W)&lt;br /&gt;
+- 1 Frame verschieben ( Alt + , / Alt + . ) &lt;br /&gt;
+- 5 Frame verschieben ( Shift + Alt + , / Shift + Alt + . ) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblendungen (ctrl-g)&lt;br /&gt;
Quellmonitor und Timeline synchron (f)&lt;br /&gt;
&lt;br /&gt;
Media Browser (Shift + 9)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22914</id>
		<title>Premiere - Shortcuts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22914"/>
		<updated>2018-03-25T20:03:32Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
In- und Outpoint setzen (I, O) &lt;br /&gt;
Clip Importieren (.)&lt;br /&gt;
Zoom (Alt+Mausrad)&lt;br /&gt;
&lt;br /&gt;
TIMELINE&lt;br /&gt;
Ripple Werkzeug - Schnittkante verschieben (Clip bleibt an der gleichen Zeit) (B)&lt;br /&gt;
Slip (Clip bleibt an der gleichen Position, Inhalt wird verschoben) (Y)&lt;br /&gt;
Verschieben nach rechts - Werkzeug (V)&lt;br /&gt;
Rasierklinge (C)&lt;br /&gt;
Clip bis Abspielknopf erweitern (E)&lt;br /&gt;
Links trimmen (Q)&lt;br /&gt;
Rechts trimmen (W)&lt;br /&gt;
+- 1 Frame verschieben ( Alt + , / Alt + . ) &lt;br /&gt;
+- 5 Frame verschieben ( Shift + , / Shift + . ) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblendungen (ctrl-g)&lt;br /&gt;
Quellmonitor und Timeline synchron (f)&lt;br /&gt;
&lt;br /&gt;
Media Browser (Shift + 9)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22913</id>
		<title>Premiere - Shortcuts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22913"/>
		<updated>2018-03-25T20:03:01Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
In- und Outpoint setzen (I, O) &lt;br /&gt;
Clip Importieren (.)&lt;br /&gt;
Zoom (Alt+Mausrad)&lt;br /&gt;
&lt;br /&gt;
TIMELINE&lt;br /&gt;
Ripple Werkzeug - Schnittkante verschieben (Clip bleibt an der gleichen Zeit) (B)&lt;br /&gt;
Slip (Clip bleibt an der gleichen Position, Inhalt wird verschoben) (Y)&lt;br /&gt;
Verschieben nach rechts - Werkzeug (V)&lt;br /&gt;
Rasierklinge (C)&lt;br /&gt;
Clip bis Abspielknopf erweitern (E)&lt;br /&gt;
Links trimmen (Q)&lt;br /&gt;
Rechts trimmen (W)&lt;br /&gt;
+- 1 Frame verschieben ( Alt + , / Alt + . ) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblendungen (ctrl-g)&lt;br /&gt;
Quellmonitor und Timeline synchron (f)&lt;br /&gt;
&lt;br /&gt;
Media Browser (Shift + 9)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22912</id>
		<title>Premiere - Shortcuts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22912"/>
		<updated>2018-03-25T11:51:47Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
In- und Outpoint setzen (I, O) &lt;br /&gt;
Clip Importieren (.)&lt;br /&gt;
Zoom (Alt+Mausrad)&lt;br /&gt;
&lt;br /&gt;
Ripple Werkzeug - Schnittkante verschieben (Clip bleibt an der gleichen Zeit) (B)&lt;br /&gt;
Slip (Clip bleibt an der gleichen Position, Inhalt wird verschoben) (Y)&lt;br /&gt;
Verschieben nach rechts - Werkzeug (V)&lt;br /&gt;
Rasierklinge (C)&lt;br /&gt;
Clip bis Abspielknopf erweitern (E)&lt;br /&gt;
Links trimmen (Q)&lt;br /&gt;
Rechts trimmen (W)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblendungen (ctrl-g)&lt;br /&gt;
Quellmonitor und Timeline synchron (f)&lt;br /&gt;
&lt;br /&gt;
Media Browser (Shift + 9)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22911</id>
		<title>Premiere - Shortcuts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Premiere_-_Shortcuts&amp;diff=22911"/>
		<updated>2018-03-25T11:51:22Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „In- und Outpoint setzen (I, O)  Clip Importieren (.) Zoom (Alt+Mausrad)  Ripple Werkzeug - Schnittkante verschieben (Clip bleibt an der gleichen Zeit) (B) Slip…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In- und Outpoint setzen (I, O) &lt;br /&gt;
Clip Importieren (.)&lt;br /&gt;
Zoom (Alt+Mausrad)&lt;br /&gt;
&lt;br /&gt;
Ripple Werkzeug - Schnittkante verschieben (Clip bleibt an der gleichen Zeit) (B)&lt;br /&gt;
Slip (Clip bleibt an der gleichen Position, Inhalt wird verschoben) (Y)&lt;br /&gt;
Verschieben nach rechts - Werkzeug (V)&lt;br /&gt;
Rasierklinge (C)&lt;br /&gt;
Clip bis Abspielknopf erweitern (E)&lt;br /&gt;
Links trimmen (Q)&lt;br /&gt;
Rechts trimmen (W)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblendungen (ctrl-g)&lt;br /&gt;
Quellmonitor und Timeline synchron (f)&lt;br /&gt;
&lt;br /&gt;
Media Browser (Shift + 9)&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Adobe_Premiere&amp;diff=22910</id>
		<title>Adobe Premiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Adobe_Premiere&amp;diff=22910"/>
		<updated>2018-03-25T11:38:06Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Siehe auch&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Premiere - Shortcuts]]&lt;br /&gt;
&lt;br /&gt;
[[Filme und Videos]]&lt;br /&gt;
&lt;br /&gt;
== Multicam ==&lt;br /&gt;
Überblick&lt;br /&gt;
* Clips Synchronisieren&lt;br /&gt;
* Nested Sequence -&amp;gt; Multicam&lt;br /&gt;
* Grobschnitt mit Multicam Tool&lt;br /&gt;
* Feinustage mit Roll Edit&lt;br /&gt;
=== Vorbereitung Clips Synchronisieren===&lt;br /&gt;
&lt;br /&gt;
Möglichkeit 1&lt;br /&gt;
* In allen Sequenzen Marker an markanter Audiostelle setzen (Key: M)&lt;br /&gt;
* Sequenzen einfügen&lt;br /&gt;
* Spuren Synchronisieren mit Synchronize und Marker oder über Snap Funktion&lt;br /&gt;
Möglichkeit 2 (Gut wenn Klappe oder Soundsignal am Anfang)&lt;br /&gt;
* Inpoint setzen (I)&lt;br /&gt;
* Clips einfügen (Overdub ab dem zweiten)&lt;br /&gt;
&lt;br /&gt;
Für Musikclips&lt;br /&gt;
* Soundspur wie Videoclips einfügen&lt;br /&gt;
* Restliche Audiospuren können evtl. entfernt werden (unlinken oder mit Alt+Click markieren)&lt;br /&gt;
&lt;br /&gt;
=== Multicam Sequenz anlegen ===&lt;br /&gt;
* Neue Sequenz mit gleichen Einstellungen anlegen und z.B &amp;quot;Multicam 1&amp;quot; benennen&lt;br /&gt;
* Die Sequenz mit den Videovarianten in diese einfügen&lt;br /&gt;
* Rechtsklick auf eingefügte Sequenz und Multicam &amp;gt; Enable&lt;br /&gt;
* Window &amp;gt; Multicam&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_und_PayPal_Express_(ProcessWire)&amp;diff=22909</id>
		<title>Padloper und PayPal Express (ProcessWire)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_und_PayPal_Express_(ProcessWire)&amp;diff=22909"/>
		<updated>2018-03-16T12:08:31Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ryans PaymentPaypalExpress Modul nutzt das Braintree SDK von PayPal und läßt sich als Padloper Zahlungsmodul integrieren.&lt;br /&gt;
==Links==&lt;br /&gt;
* https://developer.paypal.com/docs/accept-payments/express-checkout/ec-braintree-sdk/get-started/&lt;br /&gt;
* Ryans Modul https://github.com/rdunk/PaymentPaypalExpress&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Mit [[Composer Dependency Manager]] (ist einfacher, da auch die passende braintree sdk mit heruntergeladen wird. Nur das git repository runterladen und reinkopieren reicht nicht.&lt;br /&gt;
Im Root-Verzeichnis von Processwire: &lt;br /&gt;
 composer require rdunk/payment-paypal-express&lt;br /&gt;
&lt;br /&gt;
* Refresh the module list.&lt;br /&gt;
* PaymentPayPalExpress Modul installieren.&lt;br /&gt;
* Edit Module options and add the relevant data including API keys.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_und_PayPal_Express_(ProcessWire)&amp;diff=22908</id>
		<title>Padloper und PayPal Express (ProcessWire)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_und_PayPal_Express_(ProcessWire)&amp;diff=22908"/>
		<updated>2018-03-16T12:08:02Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „Ryans PaymentPaypalExpress Modul nutzt das Braintree SDK von PayPal und läßt sich als Padloper Zahlungsmodul integrieren. ==Links== * https://developer.paypa…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ryans PaymentPaypalExpress Modul nutzt das Braintree SDK von PayPal und läßt sich als Padloper Zahlungsmodul integrieren.&lt;br /&gt;
==Links==&lt;br /&gt;
* https://developer.paypal.com/docs/accept-payments/express-checkout/ec-braintree-sdk/get-started/&lt;br /&gt;
* Ryans Modul https://github.com/rdunk/PaymentPaypalExpress&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Mit [[composer]] (ist einfacher, da auch die passende braintree sdk mit heruntergeladen wird. Nur das git repository runterladen und reinkopieren reicht nicht.&lt;br /&gt;
Im Root-Verzeichnis von Processwire: &lt;br /&gt;
 composer require rdunk/payment-paypal-express&lt;br /&gt;
&lt;br /&gt;
* Refresh the module list.&lt;br /&gt;
* PaymentPayPalExpress Modul installieren.&lt;br /&gt;
* Edit Module options and add the relevant data including API keys.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22907</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22907"/>
		<updated>2018-03-16T11:23:28Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
* [[:File:PaymentInvoice-master.zip]] Invoice Modul&lt;br /&gt;
* [[:File:PaymentModule-master.zip]] Payment Modul&lt;br /&gt;
* [[:File:padloper3-1.zip]] Padloper Modul&lt;br /&gt;
* [[:File:padloper-1_1_2.zip]] Padloper Modul (alte Version)&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
* Upload PaymentModule into &amp;#039;&amp;#039;/site/modules/PaymentModule&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Upload PaymentInvoice into &amp;#039;&amp;#039;/site/modules/PaymentInvoice&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Install core module &amp;quot;&amp;#039;&amp;#039;&amp;#039;ProFields: Page Table&amp;#039;&amp;#039;&amp;#039;&amp;quot; if not already installed&lt;br /&gt;
* Upload Padloper into &amp;#039;&amp;#039;/site/modules/Padloper/&amp;#039;&amp;#039; and install PadLoper modules through ProcessWire admin (please note that there is separate distro for PW 3.0)&lt;br /&gt;
Auf die Rechte achten wenn was nicht gefunden wird. Im Payment Module kann bei Choose active payment modules noch nichts ausgewählt werden solange nicht die erforderlichen anderen Module installiert sind. Kann man aber auch im Nachgang machen. Eventuell in anderer Reichenfolge installieren ( Todo -&amp;gt; Test)&lt;br /&gt;
=== Shopping Cart Setup ===&lt;br /&gt;
&lt;br /&gt;
There are very little configuration when using Padloper. PadCart is responsible for most common store and products settings, like currency and stock management.&lt;br /&gt;
&lt;br /&gt;
* Go to &amp;#039;&amp;#039;&amp;#039;Modules =&amp;gt; PadCart =&amp;gt; Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Choose &amp;#039;&amp;#039;&amp;#039;pad_price&amp;#039;&amp;#039;&amp;#039; as Price Field&lt;br /&gt;
* Since we don&amp;#039;t manage any stock, check the &amp;quot;Allow negative stock&amp;quot;.&lt;br /&gt;
* Choose &amp;quot;basic-page&amp;quot; template as Product template&lt;br /&gt;
* Feel free to fill other fields too if you want.&lt;br /&gt;
* Go to Modules =&amp;gt; PaymentModule =&amp;gt; Settings and setup Invoice as an active payment module&lt;br /&gt;
&lt;br /&gt;
=== Einzelprodukt Template ===&lt;br /&gt;
Wir erstellen ein Template für ein einzelnes Produkt. Es kann jedes Template genutzt werden. Voraussetzung ist lediglich ein float oder integer field, welches Padloper für den Preis nutzen kann.&lt;br /&gt;
&lt;br /&gt;
* Füge das Feld pad_price zum Template hinzu (Das Feld muß ein float oder decimal type sein, kann aber auch andere Namen haben (s.o.))&lt;br /&gt;
* Lege ein paar Produktseiten an und gib Preise in das Feld ein.&lt;br /&gt;
* Füge einen Add to Cart Button in deinem Template ein:&lt;br /&gt;
&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();​&lt;br /&gt;
NOTE: If you are NOT using delayed output in your template files, then the required code is:&lt;br /&gt;
 echo $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte ma einen &amp;quot;Add cart&amp;quot; button in den Seiten sehen. Im Moment sieht man nur in der URL, dass ein Produkt hinzugefügt wurde:&lt;br /&gt;
 www.yourstore.com/about/?addedProduct=1001 (where 1001 is your product&amp;#039;s page id)&lt;br /&gt;
 Man kann diese Info nutzen um eine &amp;quot;product added to the cart&amp;quot; Message auszugeben&lt;br /&gt;
        &lt;br /&gt;
Wenn man das Formular per AJAX ausgibt bekommt man die selben Parameter per JSON&lt;br /&gt;
&lt;br /&gt;
=== Warenkorb Template ===&lt;br /&gt;
* Lege eine Seite für den Warenkorb an der Warenkorb wird mit folgendem Code ausgegeben.&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;editCart();&lt;br /&gt;
Es stehen sofort Möglichkeiten zum Bearbeiten zur Verfügung&lt;br /&gt;
&lt;br /&gt;
=== Checkout Template ===&lt;br /&gt;
Der Einfachheit halber hier nur Rechnung.&lt;br /&gt;
&lt;br /&gt;
* Shipping Fixed Modul installieren und Konfiguration ausfüllen&lt;br /&gt;
* Neues Template für den Checkout erstellen z.B. checkout.php&lt;br /&gt;
* Im Template müssen url Segments erlaubt sein&lt;br /&gt;
* Checkout Code hinterlegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$checkout = $modules-&amp;gt;get(&amp;quot;PadOnePageCheckout&amp;quot;);&lt;br /&gt;
// $checkout = $modules-&amp;gt;get(&amp;quot;PadCheckout&amp;quot;); // This is the old one, use above for most streamlined checkout&lt;br /&gt;
$checkout-&amp;gt;setShippingModule(&amp;quot;ShippingFixed&amp;quot;); // This means that all orders will use this specific shipping module&lt;br /&gt;
$content = $checkout-&amp;gt;render(); // Again, just echo this if you are not using delayed output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Seite mit diesem Template anlegen.&lt;br /&gt;
&lt;br /&gt;
Nach dem Einkauf, kann man die Bestellungen unter&lt;br /&gt;
 Admin &amp;gt; Setup =&amp;gt; Padloper Orders ansehen oder bearbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Confirmation Template ===&lt;br /&gt;
&lt;br /&gt;
=== Customizing ===&lt;br /&gt;
Die meisten Teile von Padloper lassen sich durch eigene Templates modifizieren. Man kopiert sich die benötigten Templates von &lt;br /&gt;
 site/modules/Padloper/templates/ *&lt;br /&gt;
nach &lt;br /&gt;
 site/templates/padloper/*&lt;br /&gt;
und kann sie dort bearbeiten. Die Kopien in diesem Verzeichnis haben beim rendern Vorrang.&lt;br /&gt;
&lt;br /&gt;
=== Kundeninformationen einstellen ===&lt;br /&gt;
Go into&lt;br /&gt;
 templates =&amp;gt; padorder. &lt;br /&gt;
Now all the fields that are inside pad_customer and pad_customer_END are fields that we are asking from customer. You can move and edit those things freely by clicking their name in the list. Feel free to add some totally custom fields into the mix also and removing the things you don&amp;#039;t need. But please, do keep the email address, so that your store can send emails to your customers about the order process. Please note that if you use some of the more exotic fieldtypes, you might need their css&amp;amp;js files in your checkout template.&lt;br /&gt;
&lt;br /&gt;
== Lokalisierung ==&lt;br /&gt;
Über das Language Modul kann automatisch ein Index angelegt werden. Wenn man alles übersetzt hat, kann man die Übersetzung exportieren.&lt;br /&gt;
&lt;br /&gt;
== Zahlungsmethoden ==&lt;br /&gt;
=== Paypal ===&lt;br /&gt;
[[Padloper und PayPal Express (ProcessWire)]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22906</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22906"/>
		<updated>2018-03-15T20:29:42Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Checkout Template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
* [[:File:PaymentInvoice-master.zip]] Invoice Modul&lt;br /&gt;
* [[:File:PaymentModule-master.zip]] Payment Modul&lt;br /&gt;
* [[:File:padloper3-1.zip]] Padloper Modul&lt;br /&gt;
* [[:File:padloper-1_1_2.zip]] Padloper Modul (alte Version)&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
* Upload PaymentModule into &amp;#039;&amp;#039;/site/modules/PaymentModule&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Upload PaymentInvoice into &amp;#039;&amp;#039;/site/modules/PaymentInvoice&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Install core module &amp;quot;&amp;#039;&amp;#039;&amp;#039;ProFields: Page Table&amp;#039;&amp;#039;&amp;#039;&amp;quot; if not already installed&lt;br /&gt;
* Upload Padloper into &amp;#039;&amp;#039;/site/modules/Padloper/&amp;#039;&amp;#039; and install PadLoper modules through ProcessWire admin (please note that there is separate distro for PW 3.0)&lt;br /&gt;
Auf die Rechte achten wenn was nicht gefunden wird. Im Payment Module kann bei Choose active payment modules noch nichts ausgewählt werden solange nicht die erforderlichen anderen Module installiert sind. Kann man aber auch im Nachgang machen. Eventuell in anderer Reichenfolge installieren ( Todo -&amp;gt; Test)&lt;br /&gt;
=== Shopping Cart Setup ===&lt;br /&gt;
&lt;br /&gt;
There are very little configuration when using Padloper. PadCart is responsible for most common store and products settings, like currency and stock management.&lt;br /&gt;
&lt;br /&gt;
* Go to &amp;#039;&amp;#039;&amp;#039;Modules =&amp;gt; PadCart =&amp;gt; Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Choose &amp;#039;&amp;#039;&amp;#039;pad_price&amp;#039;&amp;#039;&amp;#039; as Price Field&lt;br /&gt;
* Since we don&amp;#039;t manage any stock, check the &amp;quot;Allow negative stock&amp;quot;.&lt;br /&gt;
* Choose &amp;quot;basic-page&amp;quot; template as Product template&lt;br /&gt;
* Feel free to fill other fields too if you want.&lt;br /&gt;
* Go to Modules =&amp;gt; PaymentModule =&amp;gt; Settings and setup Invoice as an active payment module&lt;br /&gt;
&lt;br /&gt;
=== Einzelprodukt Template ===&lt;br /&gt;
Wir erstellen ein Template für ein einzelnes Produkt. Es kann jedes Template genutzt werden. Voraussetzung ist lediglich ein float oder integer field, welches Padloper für den Preis nutzen kann.&lt;br /&gt;
&lt;br /&gt;
* Füge das Feld pad_price zum Template hinzu (Das Feld muß ein float oder decimal type sein, kann aber auch andere Namen haben (s.o.))&lt;br /&gt;
* Lege ein paar Produktseiten an und gib Preise in das Feld ein.&lt;br /&gt;
* Füge einen Add to Cart Button in deinem Template ein:&lt;br /&gt;
&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();​&lt;br /&gt;
NOTE: If you are NOT using delayed output in your template files, then the required code is:&lt;br /&gt;
 echo $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte ma einen &amp;quot;Add cart&amp;quot; button in den Seiten sehen. Im Moment sieht man nur in der URL, dass ein Produkt hinzugefügt wurde:&lt;br /&gt;
 www.yourstore.com/about/?addedProduct=1001 (where 1001 is your product&amp;#039;s page id)&lt;br /&gt;
 Man kann diese Info nutzen um eine &amp;quot;product added to the cart&amp;quot; Message auszugeben&lt;br /&gt;
        &lt;br /&gt;
Wenn man das Formular per AJAX ausgibt bekommt man die selben Parameter per JSON&lt;br /&gt;
&lt;br /&gt;
=== Warenkorb Template ===&lt;br /&gt;
* Lege eine Seite für den Warenkorb an der Warenkorb wird mit folgendem Code ausgegeben.&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;editCart();&lt;br /&gt;
Es stehen sofort Möglichkeiten zum Bearbeiten zur Verfügung&lt;br /&gt;
&lt;br /&gt;
=== Checkout Template ===&lt;br /&gt;
Der Einfachheit halber hier nur Rechnung.&lt;br /&gt;
&lt;br /&gt;
* Shipping Fixed Modul installieren und Konfiguration ausfüllen&lt;br /&gt;
* Neues Template für den Checkout erstellen z.B. checkout.php&lt;br /&gt;
* Im Template müssen url Segments erlaubt sein&lt;br /&gt;
* Checkout Code hinterlegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$checkout = $modules-&amp;gt;get(&amp;quot;PadOnePageCheckout&amp;quot;);&lt;br /&gt;
// $checkout = $modules-&amp;gt;get(&amp;quot;PadCheckout&amp;quot;); // This is the old one, use above for most streamlined checkout&lt;br /&gt;
$checkout-&amp;gt;setShippingModule(&amp;quot;ShippingFixed&amp;quot;); // This means that all orders will use this specific shipping module&lt;br /&gt;
$content = $checkout-&amp;gt;render(); // Again, just echo this if you are not using delayed output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Seite mit diesem Template anlegen.&lt;br /&gt;
&lt;br /&gt;
Nach dem Einkauf, kann man die Bestellungen unter&lt;br /&gt;
 Admin &amp;gt; Setup =&amp;gt; Padloper Orders ansehen oder bearbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Confirmation Template ===&lt;br /&gt;
&lt;br /&gt;
=== Customizing ===&lt;br /&gt;
Die meisten Teile von Padloper lassen sich durch eigene Templates modifizieren. Man kopiert sich die benötigten Templates von &lt;br /&gt;
 site/modules/Padloper/templates/ *&lt;br /&gt;
nach &lt;br /&gt;
 site/templates/padloper/*&lt;br /&gt;
und kann sie dort bearbeiten. Die Kopien in diesem Verzeichnis haben beim rendern Vorrang.&lt;br /&gt;
&lt;br /&gt;
=== Kundeninformationen einstellen ===&lt;br /&gt;
Go into&lt;br /&gt;
 templates =&amp;gt; padorder. &lt;br /&gt;
Now all the fields that are inside pad_customer and pad_customer_END are fields that we are asking from customer. You can move and edit those things freely by clicking their name in the list. Feel free to add some totally custom fields into the mix also and removing the things you don&amp;#039;t need. But please, do keep the email address, so that your store can send emails to your customers about the order process. Please note that if you use some of the more exotic fieldtypes, you might need their css&amp;amp;js files in your checkout template.&lt;br /&gt;
&lt;br /&gt;
== Lokalisierung ==&lt;br /&gt;
Über das Language Modul kann automatisch ein Index angelegt werden. Wenn man alles übersetzt hat, kann man die Übersetzung exportieren.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22905</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22905"/>
		<updated>2018-03-15T20:29:08Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Lokalisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
* [[:File:PaymentInvoice-master.zip]] Invoice Modul&lt;br /&gt;
* [[:File:PaymentModule-master.zip]] Payment Modul&lt;br /&gt;
* [[:File:padloper3-1.zip]] Padloper Modul&lt;br /&gt;
* [[:File:padloper-1_1_2.zip]] Padloper Modul (alte Version)&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
* Upload PaymentModule into &amp;#039;&amp;#039;/site/modules/PaymentModule&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Upload PaymentInvoice into &amp;#039;&amp;#039;/site/modules/PaymentInvoice&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Install core module &amp;quot;&amp;#039;&amp;#039;&amp;#039;ProFields: Page Table&amp;#039;&amp;#039;&amp;#039;&amp;quot; if not already installed&lt;br /&gt;
* Upload Padloper into &amp;#039;&amp;#039;/site/modules/Padloper/&amp;#039;&amp;#039; and install PadLoper modules through ProcessWire admin (please note that there is separate distro for PW 3.0)&lt;br /&gt;
Auf die Rechte achten wenn was nicht gefunden wird. Im Payment Module kann bei Choose active payment modules noch nichts ausgewählt werden solange nicht die erforderlichen anderen Module installiert sind. Kann man aber auch im Nachgang machen. Eventuell in anderer Reichenfolge installieren ( Todo -&amp;gt; Test)&lt;br /&gt;
=== Shopping Cart Setup ===&lt;br /&gt;
&lt;br /&gt;
There are very little configuration when using Padloper. PadCart is responsible for most common store and products settings, like currency and stock management.&lt;br /&gt;
&lt;br /&gt;
* Go to &amp;#039;&amp;#039;&amp;#039;Modules =&amp;gt; PadCart =&amp;gt; Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Choose &amp;#039;&amp;#039;&amp;#039;pad_price&amp;#039;&amp;#039;&amp;#039; as Price Field&lt;br /&gt;
* Since we don&amp;#039;t manage any stock, check the &amp;quot;Allow negative stock&amp;quot;.&lt;br /&gt;
* Choose &amp;quot;basic-page&amp;quot; template as Product template&lt;br /&gt;
* Feel free to fill other fields too if you want.&lt;br /&gt;
* Go to Modules =&amp;gt; PaymentModule =&amp;gt; Settings and setup Invoice as an active payment module&lt;br /&gt;
&lt;br /&gt;
=== Einzelprodukt Template ===&lt;br /&gt;
Wir erstellen ein Template für ein einzelnes Produkt. Es kann jedes Template genutzt werden. Voraussetzung ist lediglich ein float oder integer field, welches Padloper für den Preis nutzen kann.&lt;br /&gt;
&lt;br /&gt;
* Füge das Feld pad_price zum Template hinzu (Das Feld muß ein float oder decimal type sein, kann aber auch andere Namen haben (s.o.))&lt;br /&gt;
* Lege ein paar Produktseiten an und gib Preise in das Feld ein.&lt;br /&gt;
* Füge einen Add to Cart Button in deinem Template ein:&lt;br /&gt;
&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();​&lt;br /&gt;
NOTE: If you are NOT using delayed output in your template files, then the required code is:&lt;br /&gt;
 echo $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte ma einen &amp;quot;Add cart&amp;quot; button in den Seiten sehen. Im Moment sieht man nur in der URL, dass ein Produkt hinzugefügt wurde:&lt;br /&gt;
 www.yourstore.com/about/?addedProduct=1001 (where 1001 is your product&amp;#039;s page id)&lt;br /&gt;
 Man kann diese Info nutzen um eine &amp;quot;product added to the cart&amp;quot; Message auszugeben&lt;br /&gt;
        &lt;br /&gt;
Wenn man das Formular per AJAX ausgibt bekommt man die selben Parameter per JSON&lt;br /&gt;
&lt;br /&gt;
=== Warenkorb Template ===&lt;br /&gt;
* Lege eine Seite für den Warenkorb an der Warenkorb wird mit folgendem Code ausgegeben.&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;editCart();&lt;br /&gt;
Es stehen sofort Möglichkeiten zum Bearbeiten zur Verfügung&lt;br /&gt;
&lt;br /&gt;
=== Checkout Template ===&lt;br /&gt;
Der Einfachheit halber hier nur Rechnung.&lt;br /&gt;
&lt;br /&gt;
* Shipping Fixed Modul installieren und Konfiguration ausfüllen&lt;br /&gt;
* Neues Template für den Checkout erstellen z.B. checkout.php&lt;br /&gt;
* Im Template müssen url Segments erlaubt sein&lt;br /&gt;
* Checkout Code hinterlegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$checkout = $modules-&amp;gt;get(&amp;quot;PadOnePageCheckout&amp;quot;);&lt;br /&gt;
// $checkout = $modules-&amp;gt;get(&amp;quot;PadCheckout&amp;quot;); // This is the old one, use above for most streamlined checkout&lt;br /&gt;
$checkout-&amp;gt;setShippingModule(&amp;quot;ShippingFixed&amp;quot;); // This means that all orders will use this specific shipping module&lt;br /&gt;
$content = $checkout-&amp;gt;render(); // Again, just echo this if you are not using delayed output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Seite mit diesem Template anlegen.&lt;br /&gt;
&lt;br /&gt;
Nach dem Einkauf, kann man die Bestellungen unter&lt;br /&gt;
 Admin &amp;gt; Setup =&amp;gt; Padloper Orders ansehen oder bearbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Customizing ===&lt;br /&gt;
Die meisten Teile von Padloper lassen sich durch eigene Templates modifizieren. Man kopiert sich die benötigten Templates von &lt;br /&gt;
 site/modules/Padloper/templates/ *&lt;br /&gt;
nach &lt;br /&gt;
 site/templates/padloper/*&lt;br /&gt;
und kann sie dort bearbeiten. Die Kopien in diesem Verzeichnis haben beim rendern Vorrang.&lt;br /&gt;
&lt;br /&gt;
=== Kundeninformationen einstellen ===&lt;br /&gt;
Go into&lt;br /&gt;
 templates =&amp;gt; padorder. &lt;br /&gt;
Now all the fields that are inside pad_customer and pad_customer_END are fields that we are asking from customer. You can move and edit those things freely by clicking their name in the list. Feel free to add some totally custom fields into the mix also and removing the things you don&amp;#039;t need. But please, do keep the email address, so that your store can send emails to your customers about the order process. Please note that if you use some of the more exotic fieldtypes, you might need their css&amp;amp;js files in your checkout template.&lt;br /&gt;
&lt;br /&gt;
== Lokalisierung ==&lt;br /&gt;
Über das Language Modul kann automatisch ein Index angelegt werden. Wenn man alles übersetzt hat, kann man die Übersetzung exportieren.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22904</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22904"/>
		<updated>2018-03-15T20:17:53Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
* [[:File:PaymentInvoice-master.zip]] Invoice Modul&lt;br /&gt;
* [[:File:PaymentModule-master.zip]] Payment Modul&lt;br /&gt;
* [[:File:padloper3-1.zip]] Padloper Modul&lt;br /&gt;
* [[:File:padloper-1_1_2.zip]] Padloper Modul (alte Version)&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
* Upload PaymentModule into &amp;#039;&amp;#039;/site/modules/PaymentModule&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Upload PaymentInvoice into &amp;#039;&amp;#039;/site/modules/PaymentInvoice&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Install core module &amp;quot;&amp;#039;&amp;#039;&amp;#039;ProFields: Page Table&amp;#039;&amp;#039;&amp;#039;&amp;quot; if not already installed&lt;br /&gt;
* Upload Padloper into &amp;#039;&amp;#039;/site/modules/Padloper/&amp;#039;&amp;#039; and install PadLoper modules through ProcessWire admin (please note that there is separate distro for PW 3.0)&lt;br /&gt;
Auf die Rechte achten wenn was nicht gefunden wird. Im Payment Module kann bei Choose active payment modules noch nichts ausgewählt werden solange nicht die erforderlichen anderen Module installiert sind. Kann man aber auch im Nachgang machen. Eventuell in anderer Reichenfolge installieren ( Todo -&amp;gt; Test)&lt;br /&gt;
=== Shopping Cart Setup ===&lt;br /&gt;
&lt;br /&gt;
There are very little configuration when using Padloper. PadCart is responsible for most common store and products settings, like currency and stock management.&lt;br /&gt;
&lt;br /&gt;
* Go to &amp;#039;&amp;#039;&amp;#039;Modules =&amp;gt; PadCart =&amp;gt; Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Choose &amp;#039;&amp;#039;&amp;#039;pad_price&amp;#039;&amp;#039;&amp;#039; as Price Field&lt;br /&gt;
* Since we don&amp;#039;t manage any stock, check the &amp;quot;Allow negative stock&amp;quot;.&lt;br /&gt;
* Choose &amp;quot;basic-page&amp;quot; template as Product template&lt;br /&gt;
* Feel free to fill other fields too if you want.&lt;br /&gt;
* Go to Modules =&amp;gt; PaymentModule =&amp;gt; Settings and setup Invoice as an active payment module&lt;br /&gt;
&lt;br /&gt;
=== Einzelprodukt Template ===&lt;br /&gt;
Wir erstellen ein Template für ein einzelnes Produkt. Es kann jedes Template genutzt werden. Voraussetzung ist lediglich ein float oder integer field, welches Padloper für den Preis nutzen kann.&lt;br /&gt;
&lt;br /&gt;
* Füge das Feld pad_price zum Template hinzu (Das Feld muß ein float oder decimal type sein, kann aber auch andere Namen haben (s.o.))&lt;br /&gt;
* Lege ein paar Produktseiten an und gib Preise in das Feld ein.&lt;br /&gt;
* Füge einen Add to Cart Button in deinem Template ein:&lt;br /&gt;
&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();​&lt;br /&gt;
NOTE: If you are NOT using delayed output in your template files, then the required code is:&lt;br /&gt;
 echo $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte ma einen &amp;quot;Add cart&amp;quot; button in den Seiten sehen. Im Moment sieht man nur in der URL, dass ein Produkt hinzugefügt wurde:&lt;br /&gt;
 www.yourstore.com/about/?addedProduct=1001 (where 1001 is your product&amp;#039;s page id)&lt;br /&gt;
 Man kann diese Info nutzen um eine &amp;quot;product added to the cart&amp;quot; Message auszugeben&lt;br /&gt;
        &lt;br /&gt;
Wenn man das Formular per AJAX ausgibt bekommt man die selben Parameter per JSON&lt;br /&gt;
&lt;br /&gt;
=== Warenkorb Template ===&lt;br /&gt;
* Lege eine Seite für den Warenkorb an der Warenkorb wird mit folgendem Code ausgegeben.&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;editCart();&lt;br /&gt;
Es stehen sofort Möglichkeiten zum Bearbeiten zur Verfügung&lt;br /&gt;
&lt;br /&gt;
=== Checkout Template ===&lt;br /&gt;
Der Einfachheit halber hier nur Rechnung.&lt;br /&gt;
&lt;br /&gt;
* Shipping Fixed Modul installieren und Konfiguration ausfüllen&lt;br /&gt;
* Neues Template für den Checkout erstellen z.B. checkout.php&lt;br /&gt;
* Im Template müssen url Segments erlaubt sein&lt;br /&gt;
* Checkout Code hinterlegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$checkout = $modules-&amp;gt;get(&amp;quot;PadOnePageCheckout&amp;quot;);&lt;br /&gt;
// $checkout = $modules-&amp;gt;get(&amp;quot;PadCheckout&amp;quot;); // This is the old one, use above for most streamlined checkout&lt;br /&gt;
$checkout-&amp;gt;setShippingModule(&amp;quot;ShippingFixed&amp;quot;); // This means that all orders will use this specific shipping module&lt;br /&gt;
$content = $checkout-&amp;gt;render(); // Again, just echo this if you are not using delayed output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Seite mit diesem Template anlegen.&lt;br /&gt;
&lt;br /&gt;
Nach dem Einkauf, kann man die Bestellungen unter&lt;br /&gt;
 Admin &amp;gt; Setup =&amp;gt; Padloper Orders ansehen oder bearbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Customizing ===&lt;br /&gt;
Die meisten Teile von Padloper lassen sich durch eigene Templates modifizieren. Man kopiert sich die benötigten Templates von &lt;br /&gt;
 site/modules/Padloper/templates/ *&lt;br /&gt;
nach &lt;br /&gt;
 site/templates/padloper/*&lt;br /&gt;
und kann sie dort bearbeiten. Die Kopien in diesem Verzeichnis haben beim rendern Vorrang.&lt;br /&gt;
&lt;br /&gt;
=== Kundeninformationen einstellen ===&lt;br /&gt;
Go into&lt;br /&gt;
 templates =&amp;gt; padorder. &lt;br /&gt;
Now all the fields that are inside pad_customer and pad_customer_END are fields that we are asking from customer. You can move and edit those things freely by clicking their name in the list. Feel free to add some totally custom fields into the mix also and removing the things you don&amp;#039;t need. But please, do keep the email address, so that your store can send emails to your customers about the order process. Please note that if you use some of the more exotic fieldtypes, you might need their css&amp;amp;js files in your checkout template.&lt;br /&gt;
&lt;br /&gt;
== Lokalisierung ==&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22903</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22903"/>
		<updated>2018-03-15T20:14:12Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Checkout Process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
* [[:File:PaymentInvoice-master.zip]] Invoice Modul&lt;br /&gt;
* [[:File:PaymentModule-master.zip]] Payment Modul&lt;br /&gt;
* [[:File:padloper3-1.zip]] Padloper Modul&lt;br /&gt;
* [[:File:padloper-1_1_2.zip]] Padloper Modul (alte Version)&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
* Upload PaymentModule into &amp;#039;&amp;#039;/site/modules/PaymentModule&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Upload PaymentInvoice into &amp;#039;&amp;#039;/site/modules/PaymentInvoice&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Install core module &amp;quot;&amp;#039;&amp;#039;&amp;#039;ProFields: Page Table&amp;#039;&amp;#039;&amp;#039;&amp;quot; if not already installed&lt;br /&gt;
* Upload Padloper into &amp;#039;&amp;#039;/site/modules/Padloper/&amp;#039;&amp;#039; and install PadLoper modules through ProcessWire admin (please note that there is separate distro for PW 3.0)&lt;br /&gt;
Auf die Rechte achten wenn was nicht gefunden wird. Im Payment Module kann bei Choose active payment modules noch nichts ausgewählt werden solange nicht die erforderlichen anderen Module installiert sind. Kann man aber auch im Nachgang machen. Eventuell in anderer Reichenfolge installieren ( Todo -&amp;gt; Test)&lt;br /&gt;
=== Shopping Cart Setup ===&lt;br /&gt;
&lt;br /&gt;
There are very little configuration when using Padloper. PadCart is responsible for most common store and products settings, like currency and stock management.&lt;br /&gt;
&lt;br /&gt;
* Go to &amp;#039;&amp;#039;&amp;#039;Modules =&amp;gt; PadCart =&amp;gt; Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Choose &amp;#039;&amp;#039;&amp;#039;pad_price&amp;#039;&amp;#039;&amp;#039; as Price Field&lt;br /&gt;
* Since we don&amp;#039;t manage any stock, check the &amp;quot;Allow negative stock&amp;quot;.&lt;br /&gt;
* Choose &amp;quot;basic-page&amp;quot; template as Product template&lt;br /&gt;
* Feel free to fill other fields too if you want.&lt;br /&gt;
* Go to Modules =&amp;gt; PaymentModule =&amp;gt; Settings and setup Invoice as an active payment module&lt;br /&gt;
&lt;br /&gt;
=== Einzelprodukt Template ===&lt;br /&gt;
Wir erstellen ein Template für ein einzelnes Produkt. Es kann jedes Template genutzt werden. Voraussetzung ist lediglich ein float oder integer field, welches Padloper für den Preis nutzen kann.&lt;br /&gt;
&lt;br /&gt;
* Füge das Feld pad_price zum Template hinzu (Das Feld muß ein float oder decimal type sein, kann aber auch andere Namen haben (s.o.))&lt;br /&gt;
* Lege ein paar Produktseiten an und gib Preise in das Feld ein.&lt;br /&gt;
* Füge einen Add to Cart Button in deinem Template ein:&lt;br /&gt;
&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();​&lt;br /&gt;
NOTE: If you are NOT using delayed output in your template files, then the required code is:&lt;br /&gt;
 echo $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte ma einen &amp;quot;Add cart&amp;quot; button in den Seiten sehen. Im Moment sieht man nur in der URL, dass ein Produkt hinzugefügt wurde:&lt;br /&gt;
 www.yourstore.com/about/?addedProduct=1001 (where 1001 is your product&amp;#039;s page id)&lt;br /&gt;
 Man kann diese Info nutzen um eine &amp;quot;product added to the cart&amp;quot; Message auszugeben&lt;br /&gt;
        &lt;br /&gt;
Wenn man das Formular per AJAX ausgibt bekommt man die selben Parameter per JSON&lt;br /&gt;
&lt;br /&gt;
=== Warenkorb Template ===&lt;br /&gt;
* Lege eine Seite für den Warenkorb an der Warenkorb wird mit folgendem Code ausgegeben.&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;editCart();&lt;br /&gt;
Es stehen sofort Möglichkeiten zum Bearbeiten zur Verfügung&lt;br /&gt;
&lt;br /&gt;
=== Checkout Template ===&lt;br /&gt;
Der Einfachheit halber hier nur Rechnung.&lt;br /&gt;
&lt;br /&gt;
* Shipping Fixed Modul installieren und Konfiguration ausfüllen&lt;br /&gt;
* Neues Template für den Checkout erstellen z.B. checkout.php&lt;br /&gt;
* Im Template müssen url Segments erlaubt sein&lt;br /&gt;
* Checkout Code hinterlegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$checkout = $modules-&amp;gt;get(&amp;quot;PadOnePageCheckout&amp;quot;);&lt;br /&gt;
// $checkout = $modules-&amp;gt;get(&amp;quot;PadCheckout&amp;quot;); // This is the old one, use above for most streamlined checkout&lt;br /&gt;
$checkout-&amp;gt;setShippingModule(&amp;quot;ShippingFixed&amp;quot;); // This means that all orders will use this specific shipping module&lt;br /&gt;
$content = $checkout-&amp;gt;render(); // Again, just echo this if you are not using delayed output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Seite mit diesem Template anlegen.&lt;br /&gt;
&lt;br /&gt;
Nach dem Einkauf, kann man die Bestellungen unter&lt;br /&gt;
 Admin &amp;gt; Setup =&amp;gt; Padloper Orders ansehen oder bearbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Customizing ===&lt;br /&gt;
Die meisten Teile von Padloper lassen sich durch eigene Templates modifizieren. Man kopiert sich die benötigten Templates von &lt;br /&gt;
 site/modules/Padloper/templates/ *&lt;br /&gt;
nach &lt;br /&gt;
 site/templates/padloper/*&lt;br /&gt;
und kann sie dort bearbeiten. Die Kopien in diesem Verzeichnis haben beim rendern Vorrang.&lt;br /&gt;
&lt;br /&gt;
=== Kundeninformationen einstellen ===&lt;br /&gt;
Go into&lt;br /&gt;
 templates =&amp;gt; padorder. &lt;br /&gt;
Now all the fields that are inside pad_customer and pad_customer_END are fields that we are asking from customer. You can move and edit those things freely by clicking their name in the list. Feel free to add some totally custom fields into the mix also and removing the things you don&amp;#039;t need. But please, do keep the email address, so that your store can send emails to your customers about the order process. Please note that if you use some of the more exotic fieldtypes, you might need their css&amp;amp;js files in your checkout template.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22902</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22902"/>
		<updated>2018-03-15T20:01:28Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Kurzanleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
* [[:File:PaymentInvoice-master.zip]] Invoice Modul&lt;br /&gt;
* [[:File:PaymentModule-master.zip]] Payment Modul&lt;br /&gt;
* [[:File:padloper3-1.zip]] Padloper Modul&lt;br /&gt;
* [[:File:padloper-1_1_2.zip]] Padloper Modul (alte Version)&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
* Upload PaymentModule into &amp;#039;&amp;#039;/site/modules/PaymentModule&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Upload PaymentInvoice into &amp;#039;&amp;#039;/site/modules/PaymentInvoice&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Install core module &amp;quot;&amp;#039;&amp;#039;&amp;#039;ProFields: Page Table&amp;#039;&amp;#039;&amp;#039;&amp;quot; if not already installed&lt;br /&gt;
* Upload Padloper into &amp;#039;&amp;#039;/site/modules/Padloper/&amp;#039;&amp;#039; and install PadLoper modules through ProcessWire admin (please note that there is separate distro for PW 3.0)&lt;br /&gt;
Auf die Rechte achten wenn was nicht gefunden wird. Im Payment Module kann bei Choose active payment modules noch nichts ausgewählt werden solange nicht die erforderlichen anderen Module installiert sind. Kann man aber auch im Nachgang machen. Eventuell in anderer Reichenfolge installieren ( Todo -&amp;gt; Test)&lt;br /&gt;
=== Shopping Cart Setup ===&lt;br /&gt;
&lt;br /&gt;
There are very little configuration when using Padloper. PadCart is responsible for most common store and products settings, like currency and stock management.&lt;br /&gt;
&lt;br /&gt;
* Go to &amp;#039;&amp;#039;&amp;#039;Modules =&amp;gt; PadCart =&amp;gt; Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Choose &amp;#039;&amp;#039;&amp;#039;pad_price&amp;#039;&amp;#039;&amp;#039; as Price Field&lt;br /&gt;
* Since we don&amp;#039;t manage any stock, check the &amp;quot;Allow negative stock&amp;quot;.&lt;br /&gt;
* Choose &amp;quot;basic-page&amp;quot; template as Product template&lt;br /&gt;
* Feel free to fill other fields too if you want.&lt;br /&gt;
* Go to Modules =&amp;gt; PaymentModule =&amp;gt; Settings and setup Invoice as an active payment module&lt;br /&gt;
&lt;br /&gt;
=== Einzelprodukt Template ===&lt;br /&gt;
Wir erstellen ein Template für ein einzelnes Produkt. Es kann jedes Template genutzt werden. Voraussetzung ist lediglich ein float oder integer field, welches Padloper für den Preis nutzen kann.&lt;br /&gt;
&lt;br /&gt;
* Füge das Feld pad_price zum Template hinzu (Das Feld muß ein float oder decimal type sein, kann aber auch andere Namen haben (s.o.))&lt;br /&gt;
* Lege ein paar Produktseiten an und gib Preise in das Feld ein.&lt;br /&gt;
* Füge einen Add to Cart Button in deinem Template ein:&lt;br /&gt;
&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();​&lt;br /&gt;
NOTE: If you are NOT using delayed output in your template files, then the required code is:&lt;br /&gt;
 echo $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte ma einen &amp;quot;Add cart&amp;quot; button in den Seiten sehen. Im Moment sieht man nur in der URL, dass ein Produkt hinzugefügt wurde:&lt;br /&gt;
 www.yourstore.com/about/?addedProduct=1001 (where 1001 is your product&amp;#039;s page id)&lt;br /&gt;
 Man kann diese Info nutzen um eine &amp;quot;product added to the cart&amp;quot; Message auszugeben&lt;br /&gt;
        &lt;br /&gt;
Wenn man das Formular per AJAX ausgibt bekommt man die selben Parameter per JSON&lt;br /&gt;
&lt;br /&gt;
=== Warenkorb Template ===&lt;br /&gt;
* Lege eine Seite für den Warenkorb an der Warenkorb wird mit folgendem Code ausgegeben.&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;editCart();&lt;br /&gt;
Es stehen sofort Möglichkeiten zum Bearbeiten zur Verfügung&lt;br /&gt;
&lt;br /&gt;
=== Checkout Template ===&lt;br /&gt;
Der Einfachheit halber hier nur Rechnung.&lt;br /&gt;
&lt;br /&gt;
* Shipping Fixed Modul installieren und Konfiguration ausfüllen&lt;br /&gt;
* Neues Template für den Checkout erstellen z.B. checkout.php&lt;br /&gt;
* Im Template müssen url Segments erlaubt sein&lt;br /&gt;
* Checkout Code hinterlegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$checkout = $modules-&amp;gt;get(&amp;quot;PadOnePageCheckout&amp;quot;);&lt;br /&gt;
// $checkout = $modules-&amp;gt;get(&amp;quot;PadCheckout&amp;quot;); // This is the old one, use above for most streamlined checkout&lt;br /&gt;
$checkout-&amp;gt;setShippingModule(&amp;quot;ShippingFixed&amp;quot;); // This means that all orders will use this specific shipping module&lt;br /&gt;
$content = $checkout-&amp;gt;render(); // Again, just echo this if you are not using delayed output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Seite mit diesem Template anlegen.&lt;br /&gt;
&lt;br /&gt;
Nach dem Einkauf, kann man die Bestellungen unter&lt;br /&gt;
 Admin &amp;gt; Setup =&amp;gt; Padloper Orders ansehen oder bearbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Checkout Process ===&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22901</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22901"/>
		<updated>2018-03-15T19:29:59Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Product Template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
* [[:File:PaymentInvoice-master.zip]] Invoice Modul&lt;br /&gt;
* [[:File:PaymentModule-master.zip]] Payment Modul&lt;br /&gt;
* [[:File:padloper3-1.zip]] Padloper Modul&lt;br /&gt;
* [[:File:padloper-1_1_2.zip]] Padloper Modul (alte Version)&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
* Upload PaymentModule into &amp;#039;&amp;#039;/site/modules/PaymentModule&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Upload PaymentInvoice into &amp;#039;&amp;#039;/site/modules/PaymentInvoice&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Install core module &amp;quot;&amp;#039;&amp;#039;&amp;#039;ProFields: Page Table&amp;#039;&amp;#039;&amp;#039;&amp;quot; if not already installed&lt;br /&gt;
* Upload Padloper into &amp;#039;&amp;#039;/site/modules/Padloper/&amp;#039;&amp;#039; and install PadLoper modules through ProcessWire admin (please note that there is separate distro for PW 3.0)&lt;br /&gt;
Auf die Rechte achten wenn was nicht gefunden wird. Im Payment Module kann bei Choose active payment modules noch nichts ausgewählt werden solange nicht die erforderlichen anderen Module installiert sind. Kann man aber auch im Nachgang machen. Eventuell in anderer Reichenfolge installieren ( Todo -&amp;gt; Test)&lt;br /&gt;
=== Shopping Cart Setup ===&lt;br /&gt;
&lt;br /&gt;
There are very little configuration when using Padloper. PadCart is responsible for most common store and products settings, like currency and stock management.&lt;br /&gt;
&lt;br /&gt;
* Go to &amp;#039;&amp;#039;&amp;#039;Modules =&amp;gt; PadCart =&amp;gt; Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Choose &amp;#039;&amp;#039;&amp;#039;pad_price&amp;#039;&amp;#039;&amp;#039; as Price Field&lt;br /&gt;
* Since we don&amp;#039;t manage any stock, check the &amp;quot;Allow negative stock&amp;quot;.&lt;br /&gt;
* Choose &amp;quot;basic-page&amp;quot; template as Product template&lt;br /&gt;
* Feel free to fill other fields too if you want.&lt;br /&gt;
* Go to Modules =&amp;gt; PaymentModule =&amp;gt; Settings and setup Invoice as an active payment module&lt;br /&gt;
=== Product Template ===&lt;br /&gt;
Wir erstellen ein Template für ein einzelnes Produkt. Es kann jedes Template genutzt werden. Voraussetzung ist lediglich ein float oder integer field, welches Padloper für den Preis nutzen kann.&lt;br /&gt;
&lt;br /&gt;
* Füge das Feld pad_price zum Template hinzu (Das Feld muß ein float oder decimal type sein, kann aber auch andere Namen haben (s.o.))&lt;br /&gt;
* Lege ein paar Produktseiten an und gib Preise in das Feld ein.&lt;br /&gt;
* Füge einen Add to Cart Button in deinem Template ein:&lt;br /&gt;
&lt;br /&gt;
 $content .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();​&lt;br /&gt;
NOTE: If you are NOT using delayed output in your template files, then the required code is:&lt;br /&gt;
 echo $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte ma einen &amp;quot;Add cart&amp;quot; button in den Seiten sehen. Im Moment sieht man nur in der URL, dass ein Produkt hinzugefügt wurde:&lt;br /&gt;
 www.yourstore.com/about/?addedProduct=1001 (where 1001 is your product&amp;#039;s page id)&lt;br /&gt;
 Man kann diese Info nutzen um eine &amp;quot;product added to the cart&amp;quot; Message auszugeben&lt;br /&gt;
        &lt;br /&gt;
Wenn man das Formular per AJAX ausgibt bekommt man die selben Parameter per JSON&lt;br /&gt;
&lt;br /&gt;
=== Edit Cart Template ===&lt;br /&gt;
&lt;br /&gt;
=== Checkout Process ===&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22900</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22900"/>
		<updated>2018-03-15T19:14:48Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Kurzanleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
* [[:File:PaymentInvoice-master.zip]] Invoice Modul&lt;br /&gt;
* [[:File:PaymentModule-master.zip]] Payment Modul&lt;br /&gt;
* [[:File:padloper3-1.zip]] Padloper Modul&lt;br /&gt;
* [[:File:padloper-1_1_2.zip]] Padloper Modul (alte Version)&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
* Upload PaymentModule into &amp;#039;&amp;#039;/site/modules/PaymentModule&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Upload PaymentInvoice into &amp;#039;&amp;#039;/site/modules/PaymentInvoice&amp;#039;&amp;#039; and install it through ProcessWire admin&lt;br /&gt;
* Install core module &amp;quot;&amp;#039;&amp;#039;&amp;#039;ProFields: Page Table&amp;#039;&amp;#039;&amp;#039;&amp;quot; if not already installed&lt;br /&gt;
* Upload Padloper into &amp;#039;&amp;#039;/site/modules/Padloper/&amp;#039;&amp;#039; and install PadLoper modules through ProcessWire admin (please note that there is separate distro for PW 3.0)&lt;br /&gt;
Auf die Rechte achten wenn was nicht gefunden wird. Im Payment Module kann bei Choose active payment modules noch nichts ausgewählt werden solange nicht die erforderlichen anderen Module installiert sind. Kann man aber auch im Nachgang machen. Eventuell in anderer Reichenfolge installieren ( Todo -&amp;gt; Test)&lt;br /&gt;
=== Shopping Cart Setup ===&lt;br /&gt;
&lt;br /&gt;
There are very little configuration when using Padloper. PadCart is responsible for most common store and products settings, like currency and stock management.&lt;br /&gt;
&lt;br /&gt;
* Go to &amp;#039;&amp;#039;&amp;#039;Modules =&amp;gt; PadCart =&amp;gt; Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Choose &amp;#039;&amp;#039;&amp;#039;pad_price&amp;#039;&amp;#039;&amp;#039; as Price Field&lt;br /&gt;
* Since we don&amp;#039;t manage any stock, check the &amp;quot;Allow negative stock&amp;quot;.&lt;br /&gt;
* Choose &amp;quot;basic-page&amp;quot; template as Product template&lt;br /&gt;
* Feel free to fill other fields too if you want.&lt;br /&gt;
* Go to Modules =&amp;gt; PaymentModule =&amp;gt; Settings and setup Invoice as an active payment module&lt;br /&gt;
=== Product Template ===&lt;br /&gt;
3. Setting up your product template&lt;br /&gt;
&lt;br /&gt;
Any template you have in your ProcessWire installation can be product in your store. This way the store frontend and product management is 100% in your hands - you can build it just like you build all other PW websites. All Padloper requires is that you have at least one float or integer field in that template, that Padloper can use for price.&lt;br /&gt;
&lt;br /&gt;
    Go to templates =&amp;gt; basic-page and add pad_price&lt;br /&gt;
        Please note: just to keep this tutorial short, we are using the pad_price as our price field. After completing this tutorial, I recommend you to create own price field (instead of pad_price) using FieldtypeFloat or FieldtypeDecimal.&lt;br /&gt;
    Edit few of your pages with basic-page templates and add some value into your price field&lt;br /&gt;
    Edit /site/templates/basic-page.php and add this as the last line of your file:&lt;br /&gt;
&lt;br /&gt;
$sidebar .= $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();​&lt;br /&gt;
&lt;br /&gt;
NOTE: If you are NOT using delayed output in your template files, then the required code is:&lt;br /&gt;
&lt;br /&gt;
echo $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;addToCart();&lt;br /&gt;
&lt;br /&gt;
    Now you should see &amp;quot;Add cart&amp;quot; button in your pages when you visit those. Click few times to add products into your cart. Only indicator about having products in your cart at this point is looking at the browser&amp;#039;s address bar and seeing something like this there: www.yourstore.com/about/?addedProduct=1001 (where 1001 is your product&amp;#039;s page id)&lt;br /&gt;
        You can use that information to echo &amp;quot;product added to the cart&amp;quot;&lt;br /&gt;
        If you post the form using ajax, you get same params returned as JSON object&lt;br /&gt;
&lt;br /&gt;
=== Edit Cart Template ===&lt;br /&gt;
&lt;br /&gt;
=== Checkout Process ===&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22888</id>
		<title>Padloper (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Padloper_(ProcessWire_Modul)&amp;diff=22888"/>
		<updated>2018-03-15T16:00:05Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.  == Installation ==“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Padloper ist ein ProcessWire Pro Modul ( kostenpflichtig ) für die Umsetzung von eCommerce.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PayPal_App_erstellen&amp;diff=22887</id>
		<title>PayPal App erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PayPal_App_erstellen&amp;diff=22887"/>
		<updated>2018-03-15T15:58:52Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „== Einführung == PayPal bietet verschiedene Möglichkeiten eigene PayPal Zahlungsmöglichkeiten auf deiner Website zu realisieren.  Inzwischen läuft Zugriff…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
PayPal bietet verschiedene Möglichkeiten eigene PayPal Zahlungsmöglichkeiten auf deiner Website zu realisieren. &lt;br /&gt;
Inzwischen läuft Zugriff über APIs über einen ausgelagerten Service (Braintree)&lt;br /&gt;
* Express Checkout -&amp;gt; Paypal Button. Die einfachste Lösung für ein paar Produkte.&lt;br /&gt;
* Braintree Direct (End-to-end payment solution via web oder app). API Steuerung&lt;br /&gt;
** Eigenes Branding&lt;br /&gt;
** Control Panel mit reporting Funktionen&lt;br /&gt;
** Zusätzliche Sicherheitstools (Fraud Prodection, Option für 3D Secure)&lt;br /&gt;
** Eventbasierte Hooks Möglich&lt;br /&gt;
* Invoicing (Rechnungstellung)&lt;br /&gt;
* Marketplaces (für Commerce Plattformen)&lt;br /&gt;
* Payout (Geld an viele auszahlen)&lt;br /&gt;
&lt;br /&gt;
== Braintree Direct Zahlung realisieren ==&lt;br /&gt;
=== Einfaches Beispiel über die Braintree Sandbox ===&lt;br /&gt;
* Paypal Account einrichten&lt;br /&gt;
* auf developer.paypal.com Braintree wählen, dort findet man einen Link um sich einen Braintree Account zuzulegen. sandbox.braintreegateway.com/&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Paypal&amp;diff=22886</id>
		<title>Paypal</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Paypal&amp;diff=22886"/>
		<updated>2018-03-15T14:03:34Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Verkaufsmöglichkeiten ==&lt;br /&gt;
=== Einzelbutton ===&lt;br /&gt;
https://www.paypal.com/de/cgi-bin/webscr?cmd=_singleitem-intro-outside&lt;br /&gt;
&lt;br /&gt;
=== PayPal API ===&lt;br /&gt;
[[PayPal App erstellen]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Sassify_(ProcessWire_Modul)&amp;diff=22885</id>
		<title>Sassify (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Sassify_(ProcessWire_Modul)&amp;diff=22885"/>
		<updated>2018-03-12T18:13:55Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispiel zum Einrichten&lt;br /&gt;
&lt;br /&gt;
CSS Folder Path&lt;br /&gt;
 /Users/stephanschlegel/www/04-CMS/ProcessWire/03-Sites/Materialize-01/site/templates/vendors/materialize/css/&lt;br /&gt;
&lt;br /&gt;
CSS Folder URL&lt;br /&gt;
 http://localhost/www/04-CMS/ProcessWire/03-Sites/Materialize-01/site/templates/vendors/materialize/css/&lt;br /&gt;
&lt;br /&gt;
Compiled CSS File Name&lt;br /&gt;
 materialize.css&lt;br /&gt;
&lt;br /&gt;
SCSS Folder Path&lt;br /&gt;
 /Users/stephanschlegel/www/04-CMS/ProcessWire/03-Sites/Materialize-01/site/templates/vendors/materialize/sass/&lt;br /&gt;
&lt;br /&gt;
SCSS Entry File Name&lt;br /&gt;
 materialize.scss&lt;br /&gt;
Achtung manchmal kann Sassify sein eigenes File nicht überschreiben. Daher vorm neu Erstellen einfach das alte Zielfile löschen.&lt;br /&gt;
Es gibt keine Fehlermeldung in diesem Fall. Wenn er das File erzeugt dauert es allerdings etwas, daher ist es verdächtig wenn es zu schnell geht.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Sassify_(ProcessWire_Modul)&amp;diff=22884</id>
		<title>Sassify (ProcessWire Modul)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Sassify_(ProcessWire_Modul)&amp;diff=22884"/>
		<updated>2018-03-12T18:13:41Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „Beispiel zum Einrichten  CSS Folder Path  /Users/stephanschlegel/www/04-CMS/ProcessWire/03-Sites/Materialize-01/site/templates/vendors/materialize/css/  CSS Fo…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispiel zum Einrichten&lt;br /&gt;
&lt;br /&gt;
CSS Folder Path&lt;br /&gt;
 /Users/stephanschlegel/www/04-CMS/ProcessWire/03-Sites/Materialize-01/site/templates/vendors/materialize/css/&lt;br /&gt;
&lt;br /&gt;
CSS Folder URL&lt;br /&gt;
 http://localhost/www/04-CMS/ProcessWire/03-Sites/Materialize-01/site/templates/vendors/materialize/css/&lt;br /&gt;
&lt;br /&gt;
Compiled CSS F�ile Name&lt;br /&gt;
 materialize.css&lt;br /&gt;
&lt;br /&gt;
SCSS Folder Path&lt;br /&gt;
 /Users/stephanschlegel/www/04-CMS/ProcessWire/03-Sites/Materialize-01/site/templates/vendors/materialize/sass/&lt;br /&gt;
&lt;br /&gt;
SCSS Entry File Name&lt;br /&gt;
 materialize.scss&lt;br /&gt;
Achtung manchmal kann Sassify sein eigenes File nicht überschreiben. Daher vorm neu Erstellen einfach das alte Zielfile löschen.&lt;br /&gt;
Es gibt keine Fehlermeldung in diesem Fall. Wenn er das File erzeugt dauert es allerdings etwas, daher ist es verdächtig wenn es zu schnell geht.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Launchpad_Remote_Scripts&amp;diff=22883</id>
		<title>Launchpad Remote Scripts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Launchpad_Remote_Scripts&amp;diff=22883"/>
		<updated>2018-03-11T16:17:34Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Ableton Live]]&lt;br /&gt;
== Launchpad 95 Einleitung ==&lt;br /&gt;
Super nützliches Tool mit Drum Step Sequencer mode to edit midi clips, a medodic step sequencer, and Device Controller mode to edit any parameter of any instrument, effect or device on any track of your arrangement, and finally an Instrument Mode providing a tighter integration with Live. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fügt 2 weitere Modi zum User 1 Button hinzu.&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
1. - hellblau  &amp;#039;&amp;#039;&amp;#039;Instrument Controller&amp;#039;&amp;#039;&amp;#039; (entweder Drumrack Layout oder Notenlayout je nachdem was man für ein Instrument gewählt hat. Außerdem kann man verschiedene Skalen, Rootnotes, etc. wählen und die Aufnahme steuern.&lt;br /&gt;
&lt;br /&gt;
2. violett &amp;#039;&amp;#039;&amp;#039;Device Controller&amp;#039;&amp;#039;&amp;#039; Hier kann man auf Parameter der aktuellen Geräte zugreifen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Fügt zwei Sequenzer zum User 2 Button hinzu &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
1. Step Sequenzer (mit zwei Untermodi: Normal und Combined)&lt;br /&gt;
&lt;br /&gt;
2. Melodic Sequencer&lt;br /&gt;
&lt;br /&gt;
Wird ausgepackt und in den Midi Remote Script Ordner von Ableton gepackt. Im Prinzip handelt es sich um eine Reihe Python Scripts. Danach kann es in den Midi Settings ausgewählt werden.&lt;br /&gt;
* http://motscousus.com/stuff/2011-07_Novation_Launchpad_Ableton_Live_Scripts/&lt;br /&gt;
* [[:File:Launchpad95.zip]]&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
[[File:Launchpad95-Install.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Instrument Mode  ==&lt;br /&gt;
Normalerweise kann man im Usermode Noten für Drums oder Instrumente eingeben. Wenn man den Midi Ausgang wieder auf das Launchpad legt auch mit visuellem Feedback.&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad95-Instrument.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Device Controller ===&lt;br /&gt;
[[File:Launchpad95-Device-Controller.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
== Sequenzer (User Mode 2) ==&lt;br /&gt;
Der User Mode 2 Button wechselt zwischen dem Drum Step Sequenzer und dem Melodischen Sequenzer.&lt;br /&gt;
&lt;br /&gt;
=== Drum Step Sequenzer ===&lt;br /&gt;
* Normal:  &lt;br /&gt;
[[File:Launchpad95-Drum-Step-Sequenzer.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Melodic Step Sequenzer ===&lt;br /&gt;
[[File:Launchpad95-Melodic-Step-Sequenzer.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Other Modes ===&lt;br /&gt;
[[File:Launchpad95-Other-Modes.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
== Launchpad Pro95 ==&lt;br /&gt;
Wie Launchpad 95 aber für das Pro.&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad Pro95.zip]]&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad Pro95.png]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Launchpad_Remote_Scripts&amp;diff=22882</id>
		<title>Launchpad Remote Scripts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Launchpad_Remote_Scripts&amp;diff=22882"/>
		<updated>2018-03-11T16:05:15Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Drum Step Sequenzer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Ableton Live]]&lt;br /&gt;
== Launchpad 95 ==&lt;br /&gt;
Super nützliches Tool mit Drum Step Sequencer mode to edit midi clips, a medodic step sequencer, and Device Controller mode to edit any parameter of any instrument, effect or device on any track of your arrangement, and finally an Instrument Mode providing a tighter integration with Live. &lt;br /&gt;
&lt;br /&gt;
Wird ausgepackt und in den Midi Remote Script Ordner von Ableton gepackt. Im Prinzip handelt es sich um eine Reihe Python Scripts. Danach kann es in den Midi Settings ausgewählt werden.&lt;br /&gt;
* http://motscousus.com/stuff/2011-07_Novation_Launchpad_Ableton_Live_Scripts/&lt;br /&gt;
* [[:File:Launchpad95.zip]]&lt;br /&gt;
=== Install ===&lt;br /&gt;
[[File:Launchpad95-Install.png|800px]]&lt;br /&gt;
=== Instrument Mode ===&lt;br /&gt;
Normalerweise kann man im Usermode Noten für Drums oder Instrumente eingeben. Wenn man den Midi Ausgang wieder auf das Launchpad legt auch mit visuellem Feedback.&lt;br /&gt;
&lt;br /&gt;
Fügt 2 weitere Modi zum User 1 Button hinzu. &lt;br /&gt;
&lt;br /&gt;
1. - hellblau  &amp;#039;&amp;#039;&amp;#039;Instrumenten Modus&amp;#039;&amp;#039;&amp;#039; (entweder Drumrack Layout oder Notenlayout je nachdem was man für ein Instrument gewählt hat. Außerdem kann man verschiedene Skalen wählen.&lt;br /&gt;
&lt;br /&gt;
2. violett &amp;#039;&amp;#039;&amp;#039;Device Mode&amp;#039;&amp;#039;&amp;#039; Hier kann man auf Parameter der aktuellen Geräte zugreifen.&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad95-Instrument.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
== Sequenzer (User Mode 2) ==&lt;br /&gt;
Der User Mode 2 Button wechselt zwischen dem Drum Step Sequenzer und dem Melodischen Sequenzer.&lt;br /&gt;
&lt;br /&gt;
=== Drum Step Sequenzer ===&lt;br /&gt;
[[File:Launchpad95-Drum-Step-Sequenzer.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Melodic Step Sequenzer ===&lt;br /&gt;
[[File:Launchpad95-Melodic-Step-Sequenzer.jpg|800px]]&lt;br /&gt;
=== Device Controller ===&lt;br /&gt;
[[File:Launchpad95-Device-Controller.jpg|800px]]&lt;br /&gt;
=== Other Modes ===&lt;br /&gt;
[[File:Launchpad95-Other-Modes.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
== Launchpad Pro95 ==&lt;br /&gt;
Wie Launchpad 95 aber für das Pro.&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad Pro95.zip]]&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad Pro95.png]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Launchpad_Remote_Scripts&amp;diff=22881</id>
		<title>Launchpad Remote Scripts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Launchpad_Remote_Scripts&amp;diff=22881"/>
		<updated>2018-03-11T16:02:49Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Instrument Mode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Ableton Live]]&lt;br /&gt;
== Launchpad 95 ==&lt;br /&gt;
Super nützliches Tool mit Drum Step Sequencer mode to edit midi clips, a medodic step sequencer, and Device Controller mode to edit any parameter of any instrument, effect or device on any track of your arrangement, and finally an Instrument Mode providing a tighter integration with Live. &lt;br /&gt;
&lt;br /&gt;
Wird ausgepackt und in den Midi Remote Script Ordner von Ableton gepackt. Im Prinzip handelt es sich um eine Reihe Python Scripts. Danach kann es in den Midi Settings ausgewählt werden.&lt;br /&gt;
* http://motscousus.com/stuff/2011-07_Novation_Launchpad_Ableton_Live_Scripts/&lt;br /&gt;
* [[:File:Launchpad95.zip]]&lt;br /&gt;
=== Install ===&lt;br /&gt;
[[File:Launchpad95-Install.png|800px]]&lt;br /&gt;
=== Instrument Mode ===&lt;br /&gt;
Normalerweise kann man im Usermode Noten für Drums oder Instrumente eingeben. Wenn man den Midi Ausgang wieder auf das Launchpad legt auch mit visuellem Feedback.&lt;br /&gt;
&lt;br /&gt;
Fügt 2 weitere Modi zum User 1 Button hinzu. &lt;br /&gt;
&lt;br /&gt;
1. - hellblau  &amp;#039;&amp;#039;&amp;#039;Instrumenten Modus&amp;#039;&amp;#039;&amp;#039; (entweder Drumrack Layout oder Notenlayout je nachdem was man für ein Instrument gewählt hat. Außerdem kann man verschiedene Skalen wählen.&lt;br /&gt;
&lt;br /&gt;
2. violett &amp;#039;&amp;#039;&amp;#039;Device Mode&amp;#039;&amp;#039;&amp;#039; Hier kann man auf Parameter der aktuellen Geräte zugreifen.&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad95-Instrument.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Drum Step Sequenzer ===&lt;br /&gt;
[[File:Launchpad95-Drum-Step-Sequenzer.jpg|800px]]&lt;br /&gt;
=== Melodic Step Sequenzer ===&lt;br /&gt;
[[File:Launchpad95-Melodic-Step-Sequenzer.jpg|800px]]&lt;br /&gt;
=== Device Controller ===&lt;br /&gt;
[[File:Launchpad95-Device-Controller.jpg|800px]]&lt;br /&gt;
=== Other Modes ===&lt;br /&gt;
[[File:Launchpad95-Other-Modes.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
== Launchpad Pro95 ==&lt;br /&gt;
Wie Launchpad 95 aber für das Pro.&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad Pro95.zip]]&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad Pro95.png]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=CSS_-_Selectors_/_Selektoren&amp;diff=22880</id>
		<title>CSS - Selectors / Selektoren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=CSS_-_Selectors_/_Selektoren&amp;diff=22880"/>
		<updated>2018-03-07T10:55:20Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Gute Übersicht mit Bildern: https://www.mediaevent.de/css/css-selektor-kontextselektor.html&lt;br /&gt;
== Arten von Selektoren ==&lt;br /&gt;
=== Nachfahre / Descendant Selector ===&lt;br /&gt;
Inneres Element muß aber nicht direkt folgen&lt;br /&gt;
 div p&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
div&lt;br /&gt;
--span&lt;br /&gt;
----p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kind / Child Selector ===&lt;br /&gt;
Inneres Element muß direktes Kind sein, also kein Enkel. Muß aber nicht direkt im Code folgen.&lt;br /&gt;
 div&amp;gt;table&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
div&lt;br /&gt;
--p&lt;br /&gt;
--table&lt;br /&gt;
aber nicht&lt;br /&gt;
div&lt;br /&gt;
--span&lt;br /&gt;
----table&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nachbar / Adjacent Selector ===&lt;br /&gt;
Muß direkt folgen&lt;br /&gt;
&lt;br /&gt;
 h5+p&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
h5&lt;br /&gt;
p&lt;br /&gt;
aber nicht&lt;br /&gt;
h5&lt;br /&gt;
span&lt;br /&gt;
p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Indirekter Nachbar ===&lt;br /&gt;
Alle folgenden&lt;br /&gt;
 h5~p&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
h5&lt;br /&gt;
p&lt;br /&gt;
ul&lt;br /&gt;
p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CSS3 Pseudo Selektoren ==&lt;br /&gt;
https://www.mediaevent.de/css/css3-selektor-pseudo.html&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=CSS_-_Selectors_/_Selektoren&amp;diff=22879</id>
		<title>CSS - Selectors / Selektoren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=CSS_-_Selectors_/_Selektoren&amp;diff=22879"/>
		<updated>2018-03-07T10:50:39Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „ == Arten von Selektoren == === Nachfahre / Descendant Selector === Inneres Element muß aber nicht direkt folgen  div p &amp;lt;pre&amp;gt; div --span ----p &amp;lt;/pre&amp;gt;  === Kin…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Arten von Selektoren ==&lt;br /&gt;
=== Nachfahre / Descendant Selector ===&lt;br /&gt;
Inneres Element muß aber nicht direkt folgen&lt;br /&gt;
 div p&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
div&lt;br /&gt;
--span&lt;br /&gt;
----p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kind / Child Selector ===&lt;br /&gt;
Inneres Element muß direktes Kind sein, also kein Enkel. Muß aber nicht direkt im Code folgen.&lt;br /&gt;
 div&amp;gt;table&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
div&lt;br /&gt;
--p&lt;br /&gt;
--table&lt;br /&gt;
aber nicht&lt;br /&gt;
div&lt;br /&gt;
--span&lt;br /&gt;
----table&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nachbar / Adjacent Selector ===&lt;br /&gt;
Muß direkt folgen&lt;br /&gt;
&lt;br /&gt;
 h5+p&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
h5&lt;br /&gt;
p&lt;br /&gt;
aber nicht&lt;br /&gt;
h5&lt;br /&gt;
span&lt;br /&gt;
p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Indirekter Nachbar ===&lt;br /&gt;
Alle folgenden&lt;br /&gt;
 h5-p&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
h5&lt;br /&gt;
p&lt;br /&gt;
p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Match_Height&amp;diff=22878</id>
		<title>JavaScript - Match Height</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Match_Height&amp;diff=22878"/>
		<updated>2018-03-06T17:48:43Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Doku */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
[[jQuery - Equalize Plugin]] - wie MatchHeight aber kann auch mehrere Zeilen in responsiven Layouts handeln, indem es checkt ob die Spalten auf der gleichen Höhe beginnen.&lt;br /&gt;
== jQuery - MatchHeight ==&lt;br /&gt;
https://github.com/liabru/jquery-match-height&lt;br /&gt;
&lt;br /&gt;
Etwas ausgereifter als Equal Heights aber auch etwas größer. Allerdings sehr zuverlässig.&lt;br /&gt;
=== Source ===&lt;br /&gt;
jquery.matchHeight-min.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
* jquery-match-height 0.7.2 by @liabru&lt;br /&gt;
* http://brm.io/jquery-match-height/&lt;br /&gt;
* License MIT&lt;br /&gt;
*/&lt;br /&gt;
!function(t){&amp;quot;use strict&amp;quot;;&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],t):&amp;quot;undefined&amp;quot;!=typeof module&amp;amp;&amp;amp;module.exports?module.exports=t(require(&amp;quot;jquery&amp;quot;)):t(jQuery)}(function(t){var e=-1,o=-1,n=function(t){return parseFloat(t)||0},a=function(e){var o=1,a=t(e),i=null,r=[];return a.each(function(){var e=t(this),a=e.offset().top-n(e.css(&amp;quot;margin-top&amp;quot;)),s=r.length&amp;gt;0?r[r.length-1]:null;null===s?r.push(e):Math.floor(Math.abs(i-a))&amp;lt;=o?r[r.length-1]=s.add(e):r.push(e),i=a}),r},i=function(e){var o={&lt;br /&gt;
byRow:!0,property:&amp;quot;height&amp;quot;,target:null,remove:!1};return&amp;quot;object&amp;quot;==typeof e?t.extend(o,e):(&amp;quot;boolean&amp;quot;==typeof e?o.byRow=e:&amp;quot;remove&amp;quot;===e&amp;amp;&amp;amp;(o.remove=!0),o)},r=t.fn.matchHeight=function(e){var o=i(e);if(o.remove){var n=this;return this.css(o.property,&amp;quot;&amp;quot;),t.each(r._groups,function(t,e){e.elements=e.elements.not(n)}),this}return this.length&amp;lt;=1&amp;amp;&amp;amp;!o.target?this:(r._groups.push({elements:this,options:o}),r._apply(this,o),this)};r.version=&amp;quot;0.7.2&amp;quot;,r._groups=[],r._throttle=80,r._maintainScroll=!1,r._beforeUpdate=null,&lt;br /&gt;
r._afterUpdate=null,r._rows=a,r._parse=n,r._parseOptions=i,r._apply=function(e,o){var s=i(o),h=t(e),l=[h],c=t(window).scrollTop(),p=t(&amp;quot;html&amp;quot;).outerHeight(!0),u=h.parents().filter(&amp;quot;:hidden&amp;quot;);return u.each(function(){var e=t(this);e.data(&amp;quot;style-cache&amp;quot;,e.attr(&amp;quot;style&amp;quot;))}),u.css(&amp;quot;display&amp;quot;,&amp;quot;block&amp;quot;),s.byRow&amp;amp;&amp;amp;!s.target&amp;amp;&amp;amp;(h.each(function(){var e=t(this),o=e.css(&amp;quot;display&amp;quot;);&amp;quot;inline-block&amp;quot;!==o&amp;amp;&amp;amp;&amp;quot;flex&amp;quot;!==o&amp;amp;&amp;amp;&amp;quot;inline-flex&amp;quot;!==o&amp;amp;&amp;amp;(o=&amp;quot;block&amp;quot;),e.data(&amp;quot;style-cache&amp;quot;,e.attr(&amp;quot;style&amp;quot;)),e.css({display:o,&amp;quot;padding-top&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
&amp;quot;padding-bottom&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;margin-top&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;margin-bottom&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;border-top-width&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;border-bottom-width&amp;quot;:&amp;quot;0&amp;quot;,height:&amp;quot;100px&amp;quot;,overflow:&amp;quot;hidden&amp;quot;})}),l=a(h),h.each(function(){var e=t(this);e.attr(&amp;quot;style&amp;quot;,e.data(&amp;quot;style-cache&amp;quot;)||&amp;quot;&amp;quot;)})),t.each(l,function(e,o){var a=t(o),i=0;if(s.target)i=s.target.outerHeight(!1);else{if(s.byRow&amp;amp;&amp;amp;a.length&amp;lt;=1)return void a.css(s.property,&amp;quot;&amp;quot;);a.each(function(){var e=t(this),o=e.attr(&amp;quot;style&amp;quot;),n=e.css(&amp;quot;display&amp;quot;);&amp;quot;inline-block&amp;quot;!==n&amp;amp;&amp;amp;&amp;quot;flex&amp;quot;!==n&amp;amp;&amp;amp;&amp;quot;inline-flex&amp;quot;!==n&amp;amp;&amp;amp;(n=&amp;quot;block&amp;quot;);var a={&lt;br /&gt;
display:n};a[s.property]=&amp;quot;&amp;quot;,e.css(a),e.outerHeight(!1)&amp;gt;i&amp;amp;&amp;amp;(i=e.outerHeight(!1)),o?e.attr(&amp;quot;style&amp;quot;,o):e.css(&amp;quot;display&amp;quot;,&amp;quot;&amp;quot;)})}a.each(function(){var e=t(this),o=0;s.target&amp;amp;&amp;amp;e.is(s.target)||(&amp;quot;border-box&amp;quot;!==e.css(&amp;quot;box-sizing&amp;quot;)&amp;amp;&amp;amp;(o+=n(e.css(&amp;quot;border-top-width&amp;quot;))+n(e.css(&amp;quot;border-bottom-width&amp;quot;)),o+=n(e.css(&amp;quot;padding-top&amp;quot;))+n(e.css(&amp;quot;padding-bottom&amp;quot;))),e.css(s.property,i-o+&amp;quot;px&amp;quot;))})}),u.each(function(){var e=t(this);e.attr(&amp;quot;style&amp;quot;,e.data(&amp;quot;style-cache&amp;quot;)||null)}),r._maintainScroll&amp;amp;&amp;amp;t(window).scrollTop(c/p*t(&amp;quot;html&amp;quot;).outerHeight(!0)),&lt;br /&gt;
this},r._applyDataApi=function(){var e={};t(&amp;quot;[data-match-height], [data-mh]&amp;quot;).each(function(){var o=t(this),n=o.attr(&amp;quot;data-mh&amp;quot;)||o.attr(&amp;quot;data-match-height&amp;quot;);n in e?e[n]=e[n].add(o):e[n]=o}),t.each(e,function(){this.matchHeight(!0)})};var s=function(e){r._beforeUpdate&amp;amp;&amp;amp;r._beforeUpdate(e,r._groups),t.each(r._groups,function(){r._apply(this.elements,this.options)}),r._afterUpdate&amp;amp;&amp;amp;r._afterUpdate(e,r._groups)};r._update=function(n,a){if(a&amp;amp;&amp;amp;&amp;quot;resize&amp;quot;===a.type){var i=t(window).width();if(i===e)return;e=i;&lt;br /&gt;
}n?o===-1&amp;amp;&amp;amp;(o=setTimeout(function(){s(a),o=-1},r._throttle)):s(a)},t(r._applyDataApi);var h=t.fn.on?&amp;quot;on&amp;quot;:&amp;quot;bind&amp;quot;;t(window)[h](&amp;quot;load&amp;quot;,function(t){r._update(!1,t)}),t(window)[h](&amp;quot;resize orientationchange&amp;quot;,function(t){r._update(!0,t)})});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;jquery.matchHeight.js&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* jquery-match-height master by @liabru&lt;br /&gt;
* http://brm.io/jquery-match-height/&lt;br /&gt;
* License: MIT&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
;(function(factory) { // eslint-disable-line no-extra-semi&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
    if (typeof define === &amp;#039;function&amp;#039; &amp;amp;&amp;amp; define.amd) {&lt;br /&gt;
        // AMD&lt;br /&gt;
        define([&amp;#039;jquery&amp;#039;], factory);&lt;br /&gt;
    } else if (typeof module !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; module.exports) {&lt;br /&gt;
        // CommonJS&lt;br /&gt;
        module.exports = factory(require(&amp;#039;jquery&amp;#039;));&lt;br /&gt;
    } else {&lt;br /&gt;
        // Global&lt;br /&gt;
        factory(jQuery);&lt;br /&gt;
    }&lt;br /&gt;
})(function($) {&lt;br /&gt;
    /*&lt;br /&gt;
    *  internal&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    var _previousResizeWidth = -1,&lt;br /&gt;
        _updateTimeout = -1;&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  _parse&lt;br /&gt;
    *  value parse utility function&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    var _parse = function(value) {&lt;br /&gt;
        // parse value and convert NaN to 0&lt;br /&gt;
        return parseFloat(value) || 0;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  _rows&lt;br /&gt;
    *  utility function returns array of jQuery selections representing each row&lt;br /&gt;
    *  (as displayed after float wrapping applied by browser)&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    var _rows = function(elements) {&lt;br /&gt;
        var tolerance = 1,&lt;br /&gt;
            $elements = $(elements),&lt;br /&gt;
            lastTop = null,&lt;br /&gt;
            rows = [];&lt;br /&gt;
&lt;br /&gt;
        // group elements by their top position&lt;br /&gt;
        $elements.each(function(){&lt;br /&gt;
            var $that = $(this),&lt;br /&gt;
                top = $that.offset().top - _parse($that.css(&amp;#039;margin-top&amp;#039;)),&lt;br /&gt;
                lastRow = rows.length &amp;gt; 0 ? rows[rows.length - 1] : null;&lt;br /&gt;
&lt;br /&gt;
            if (lastRow === null) {&lt;br /&gt;
                // first item on the row, so just push it&lt;br /&gt;
                rows.push($that);&lt;br /&gt;
            } else {&lt;br /&gt;
                // if the row top is the same, add to the row group&lt;br /&gt;
                if (Math.floor(Math.abs(lastTop - top)) &amp;lt;= tolerance) {&lt;br /&gt;
                    rows[rows.length - 1] = lastRow.add($that);&lt;br /&gt;
                } else {&lt;br /&gt;
                    // otherwise start a new row group&lt;br /&gt;
                    rows.push($that);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // keep track of the last row top&lt;br /&gt;
            lastTop = top;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return rows;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  _parseOptions&lt;br /&gt;
    *  handle plugin options&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    var _parseOptions = function(options) {&lt;br /&gt;
        var opts = {&lt;br /&gt;
            byRow: true,&lt;br /&gt;
            property: &amp;#039;height&amp;#039;,&lt;br /&gt;
            target: null,&lt;br /&gt;
            remove: false&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (typeof options === &amp;#039;object&amp;#039;) {&lt;br /&gt;
            return $.extend(opts, options);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (typeof options === &amp;#039;boolean&amp;#039;) {&lt;br /&gt;
            opts.byRow = options;&lt;br /&gt;
        } else if (options === &amp;#039;remove&amp;#039;) {&lt;br /&gt;
            opts.remove = true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return opts;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  matchHeight&lt;br /&gt;
    *  plugin definition&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    var matchHeight = $.fn.matchHeight = function(options) {&lt;br /&gt;
        var opts = _parseOptions(options);&lt;br /&gt;
&lt;br /&gt;
        // handle remove&lt;br /&gt;
        if (opts.remove) {&lt;br /&gt;
            var that = this;&lt;br /&gt;
&lt;br /&gt;
            // remove fixed height from all selected elements&lt;br /&gt;
            this.css(opts.property, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
            // remove selected elements from all groups&lt;br /&gt;
            $.each(matchHeight._groups, function(key, group) {&lt;br /&gt;
                group.elements = group.elements.not(that);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            // TODO: cleanup empty groups&lt;br /&gt;
&lt;br /&gt;
            return this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (this.length &amp;lt;= 1 &amp;amp;&amp;amp; !opts.target) {&lt;br /&gt;
            return this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // keep track of this group so we can re-apply later on load and resize events&lt;br /&gt;
        matchHeight._groups.push({&lt;br /&gt;
            elements: this,&lt;br /&gt;
            options: opts&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // match each element&amp;#039;s height to the tallest element in the selection&lt;br /&gt;
        matchHeight._apply(this, opts);&lt;br /&gt;
&lt;br /&gt;
        return this;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  plugin global options&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    matchHeight.version = &amp;#039;master&amp;#039;;&lt;br /&gt;
    matchHeight._groups = [];&lt;br /&gt;
    matchHeight._throttle = 80;&lt;br /&gt;
    matchHeight._maintainScroll = false;&lt;br /&gt;
    matchHeight._beforeUpdate = null;&lt;br /&gt;
    matchHeight._afterUpdate = null;&lt;br /&gt;
    matchHeight._rows = _rows;&lt;br /&gt;
    matchHeight._parse = _parse;&lt;br /&gt;
    matchHeight._parseOptions = _parseOptions;&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  matchHeight._apply&lt;br /&gt;
    *  apply matchHeight to given elements&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    matchHeight._apply = function(elements, options) {&lt;br /&gt;
        var opts = _parseOptions(options),&lt;br /&gt;
            $elements = $(elements),&lt;br /&gt;
            rows = [$elements];&lt;br /&gt;
&lt;br /&gt;
        // take note of scroll position&lt;br /&gt;
        var scrollTop = $(window).scrollTop(),&lt;br /&gt;
            htmlHeight = $(&amp;#039;html&amp;#039;).outerHeight(true);&lt;br /&gt;
&lt;br /&gt;
        // get hidden parents&lt;br /&gt;
        var $hiddenParents = $elements.parents().filter(&amp;#039;:hidden&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        // cache the original inline style&lt;br /&gt;
        $hiddenParents.each(function() {&lt;br /&gt;
            var $that = $(this);&lt;br /&gt;
            $that.data(&amp;#039;style-cache&amp;#039;, $that.attr(&amp;#039;style&amp;#039;));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // temporarily must force hidden parents visible&lt;br /&gt;
        $hiddenParents.css(&amp;#039;display&amp;#039;, &amp;#039;block&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        // get rows if using byRow, otherwise assume one row&lt;br /&gt;
        if (opts.byRow &amp;amp;&amp;amp; !opts.target) {&lt;br /&gt;
&lt;br /&gt;
            // must first force an arbitrary equal height so floating elements break evenly&lt;br /&gt;
            $elements.each(function() {&lt;br /&gt;
                var $that = $(this),&lt;br /&gt;
                    display = $that.css(&amp;#039;display&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
                // temporarily force a usable display value&lt;br /&gt;
                if (display !== &amp;#039;inline-block&amp;#039; &amp;amp;&amp;amp; display !== &amp;#039;flex&amp;#039; &amp;amp;&amp;amp; display !== &amp;#039;inline-flex&amp;#039;) {&lt;br /&gt;
                    display = &amp;#039;block&amp;#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // cache the original inline style&lt;br /&gt;
                $that.data(&amp;#039;style-cache&amp;#039;, $that.attr(&amp;#039;style&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
                $that.css({&lt;br /&gt;
                    &amp;#039;display&amp;#039;: display,&lt;br /&gt;
                    &amp;#039;padding-top&amp;#039;: &amp;#039;0&amp;#039;,&lt;br /&gt;
                    &amp;#039;padding-bottom&amp;#039;: &amp;#039;0&amp;#039;,&lt;br /&gt;
                    &amp;#039;margin-top&amp;#039;: &amp;#039;0&amp;#039;,&lt;br /&gt;
                    &amp;#039;margin-bottom&amp;#039;: &amp;#039;0&amp;#039;,&lt;br /&gt;
                    &amp;#039;border-top-width&amp;#039;: &amp;#039;0&amp;#039;,&lt;br /&gt;
                    &amp;#039;border-bottom-width&amp;#039;: &amp;#039;0&amp;#039;,&lt;br /&gt;
                    &amp;#039;height&amp;#039;: &amp;#039;100px&amp;#039;,&lt;br /&gt;
                    &amp;#039;overflow&amp;#039;: &amp;#039;hidden&amp;#039;&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            // get the array of rows (based on element top position)&lt;br /&gt;
            rows = _rows($elements);&lt;br /&gt;
&lt;br /&gt;
            // revert original inline styles&lt;br /&gt;
            $elements.each(function() {&lt;br /&gt;
                var $that = $(this);&lt;br /&gt;
                $that.attr(&amp;#039;style&amp;#039;, $that.data(&amp;#039;style-cache&amp;#039;) || &amp;#039;&amp;#039;);&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $.each(rows, function(key, row) {&lt;br /&gt;
            var $row = $(row),&lt;br /&gt;
                targetHeight = 0;&lt;br /&gt;
&lt;br /&gt;
            if (!opts.target) {&lt;br /&gt;
                // skip apply to rows with only one item&lt;br /&gt;
                if (opts.byRow &amp;amp;&amp;amp; $row.length &amp;lt;= 1) {&lt;br /&gt;
                    $row.css(opts.property, &amp;#039;&amp;#039;);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // iterate the row and find the max height&lt;br /&gt;
                $row.each(function(){&lt;br /&gt;
                    var $that = $(this),&lt;br /&gt;
                        style = $that.attr(&amp;#039;style&amp;#039;),&lt;br /&gt;
                        display = $that.css(&amp;#039;display&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
                    // temporarily force a usable display value&lt;br /&gt;
                    if (display !== &amp;#039;inline-block&amp;#039; &amp;amp;&amp;amp; display !== &amp;#039;flex&amp;#039; &amp;amp;&amp;amp; display !== &amp;#039;inline-flex&amp;#039;) {&lt;br /&gt;
                        display = &amp;#039;block&amp;#039;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // ensure we get the correct actual height (and not a previously set height value)&lt;br /&gt;
                    var css = { &amp;#039;display&amp;#039;: display };&lt;br /&gt;
                    css[opts.property] = &amp;#039;&amp;#039;;&lt;br /&gt;
                    $that.css(css);&lt;br /&gt;
&lt;br /&gt;
                    // find the max height (including padding, but not margin)&lt;br /&gt;
                    if ($that.outerHeight(false) &amp;gt; targetHeight) {&lt;br /&gt;
                        targetHeight = $that.outerHeight(false);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // revert styles&lt;br /&gt;
                    if (style) {&lt;br /&gt;
                        $that.attr(&amp;#039;style&amp;#039;, style);&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $that.css(&amp;#039;display&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            } else {&lt;br /&gt;
                // if target set, use the height of the target element&lt;br /&gt;
                targetHeight = opts.target.outerHeight(false);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // iterate the row and apply the height to all elements&lt;br /&gt;
            $row.each(function(){&lt;br /&gt;
                var $that = $(this),&lt;br /&gt;
                    verticalPadding = 0;&lt;br /&gt;
&lt;br /&gt;
                // don&amp;#039;t apply to a target&lt;br /&gt;
                if (opts.target &amp;amp;&amp;amp; $that.is(opts.target)) {&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // handle padding and border correctly (required when not using border-box)&lt;br /&gt;
                if ($that.css(&amp;#039;box-sizing&amp;#039;) !== &amp;#039;border-box&amp;#039;) {&lt;br /&gt;
                    verticalPadding += _parse($that.css(&amp;#039;border-top-width&amp;#039;)) + _parse($that.css(&amp;#039;border-bottom-width&amp;#039;));&lt;br /&gt;
                    verticalPadding += _parse($that.css(&amp;#039;padding-top&amp;#039;)) + _parse($that.css(&amp;#039;padding-bottom&amp;#039;));&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // set the height (accounting for padding and border)&lt;br /&gt;
                $that.css(opts.property, (targetHeight - verticalPadding) + &amp;#039;px&amp;#039;);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // revert hidden parents&lt;br /&gt;
        $hiddenParents.each(function() {&lt;br /&gt;
            var $that = $(this);&lt;br /&gt;
            $that.attr(&amp;#039;style&amp;#039;, $that.data(&amp;#039;style-cache&amp;#039;) || null);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // restore scroll position if enabled&lt;br /&gt;
        if (matchHeight._maintainScroll) {&lt;br /&gt;
            $(window).scrollTop((scrollTop / htmlHeight) * $(&amp;#039;html&amp;#039;).outerHeight(true));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return this;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  matchHeight._applyDataApi&lt;br /&gt;
    *  applies matchHeight to all elements with a data-match-height attribute&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    matchHeight._applyDataApi = function() {&lt;br /&gt;
        var groups = {};&lt;br /&gt;
&lt;br /&gt;
        // generate groups by their groupId set by elements using data-match-height&lt;br /&gt;
        $(&amp;#039;[data-match-height], [data-mh]&amp;#039;).each(function() {&lt;br /&gt;
            var $this = $(this),&lt;br /&gt;
                groupId = $this.attr(&amp;#039;data-mh&amp;#039;) || $this.attr(&amp;#039;data-match-height&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
            if (groupId in groups) {&lt;br /&gt;
                groups[groupId] = groups[groupId].add($this);&lt;br /&gt;
            } else {&lt;br /&gt;
                groups[groupId] = $this;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // apply matchHeight to each group&lt;br /&gt;
        $.each(groups, function() {&lt;br /&gt;
            this.matchHeight(true);&lt;br /&gt;
        });&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  matchHeight._update&lt;br /&gt;
    *  updates matchHeight on all current groups with their correct options&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    var _update = function(event) {&lt;br /&gt;
        if (matchHeight._beforeUpdate) {&lt;br /&gt;
            matchHeight._beforeUpdate(event, matchHeight._groups);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $.each(matchHeight._groups, function() {&lt;br /&gt;
            matchHeight._apply(this.elements, this.options);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        if (matchHeight._afterUpdate) {&lt;br /&gt;
            matchHeight._afterUpdate(event, matchHeight._groups);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    matchHeight._update = function(throttle, event) {&lt;br /&gt;
        // prevent update if fired from a resize event&lt;br /&gt;
        // where the viewport width hasn&amp;#039;t actually changed&lt;br /&gt;
        // fixes an event looping bug in IE8&lt;br /&gt;
        if (event &amp;amp;&amp;amp; event.type === &amp;#039;resize&amp;#039;) {&lt;br /&gt;
            var windowWidth = $(window).width();&lt;br /&gt;
            if (windowWidth === _previousResizeWidth) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            _previousResizeWidth = windowWidth;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // throttle updates&lt;br /&gt;
        if (!throttle) {&lt;br /&gt;
            _update(event);&lt;br /&gt;
        } else if (_updateTimeout === -1) {&lt;br /&gt;
            _updateTimeout = setTimeout(function() {&lt;br /&gt;
                _update(event);&lt;br /&gt;
                _updateTimeout = -1;&lt;br /&gt;
            }, matchHeight._throttle);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    *  bind events&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    // apply on DOM ready event&lt;br /&gt;
    $(matchHeight._applyDataApi);&lt;br /&gt;
&lt;br /&gt;
    // use on or bind where supported&lt;br /&gt;
    var on = $.fn.on ? &amp;#039;on&amp;#039; : &amp;#039;bind&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    // update heights on load and resize events&lt;br /&gt;
    $(window)[on](&amp;#039;load&amp;#039;, function(event) {&lt;br /&gt;
        matchHeight._update(false, event);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // throttled update heights on resize events&lt;br /&gt;
    $(window)[on](&amp;#039;resize orientationchange&amp;#039;, function(event) {&lt;br /&gt;
        matchHeight._update(true, event);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Doku===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;jquery.matchHeight.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
You can also install using the package managers Bower and NPM.&lt;br /&gt;
&lt;br /&gt;
bower install matchheight&lt;br /&gt;
npm install jquery-match-height&lt;br /&gt;
Usage&lt;br /&gt;
&lt;br /&gt;
$(function() {&lt;br /&gt;
	$(&amp;#039;.item&amp;#039;).matchHeight(options);&lt;br /&gt;
});&lt;br /&gt;
Where options is an optional parameter.&lt;br /&gt;
See below for a description of the available options and defaults.&lt;br /&gt;
&lt;br /&gt;
The above example will set all selected elements with the class item to the height of the tallest.&lt;br /&gt;
If the items are on multiple rows, the items of each row will be set to the tallest of that row (see byRow option).&lt;br /&gt;
&lt;br /&gt;
Call this on the DOM ready event (the plugin will automatically update on window load).&lt;br /&gt;
See the included test.html for many working examples.&lt;br /&gt;
&lt;br /&gt;
Also see the Data API below for a simple, alternative inline usage.&lt;br /&gt;
&lt;br /&gt;
Options&lt;br /&gt;
&lt;br /&gt;
The default options are:&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    byRow: true,&lt;br /&gt;
    property: &amp;#039;height&amp;#039;,&lt;br /&gt;
    target: null,&lt;br /&gt;
    remove: false&lt;br /&gt;
}&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
byRow is true or false to enable row detection&lt;br /&gt;
property is the CSS property name to set (e.g. &amp;#039;height&amp;#039; or &amp;#039;min-height&amp;#039;)&lt;br /&gt;
target is an optional element to use instead of the element with maximum height&lt;br /&gt;
remove is true or false to remove previous bindings instead of applying new ones&lt;br /&gt;
Data API&lt;br /&gt;
&lt;br /&gt;
Use the data attribute data-mh=&amp;quot;group-name&amp;quot; where group-name is an arbitrary string to identify which elements should be considered as a group.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-mh=&amp;quot;my-group&amp;quot;&amp;gt;My text&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-mh=&amp;quot;my-group&amp;quot;&amp;gt;Some other text&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-mh=&amp;quot;my-other-group&amp;quot;&amp;gt;Even more text&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-mh=&amp;quot;my-other-group&amp;quot;&amp;gt;The last bit of text&amp;lt;/div&amp;gt;&lt;br /&gt;
All elements with the same group name will be set to the same height when the page is loaded, regardless of their position in the DOM, without any extra code required.&lt;br /&gt;
&lt;br /&gt;
Note that byRow will be enabled when using the data API, if you don&amp;#039;t want this (or require other options) then use the alternative method above.&lt;br /&gt;
&lt;br /&gt;
Advanced Usage&lt;br /&gt;
&lt;br /&gt;
There are some additional functions and properties you should know about:&lt;br /&gt;
&lt;br /&gt;
Manually trigger an update&lt;br /&gt;
&lt;br /&gt;
$.fn.matchHeight._update()&lt;br /&gt;
If you need to manually trigger an update of all currently set groups, for example if you&amp;#039;ve modified some content.&lt;br /&gt;
&lt;br /&gt;
Row detection&lt;br /&gt;
&lt;br /&gt;
You can toggle row detection by setting the byRow option, which defaults to true.&lt;br /&gt;
It&amp;#039;s also possible to use the row detection function at any time:&lt;br /&gt;
&lt;br /&gt;
$.fn.matchHeight._rows($(&amp;#039;.item&amp;#039;));&lt;br /&gt;
Which will return an array of element selections for each row, see this thread for more information and an example.&lt;br /&gt;
&lt;br /&gt;
Remove bindings&lt;br /&gt;
&lt;br /&gt;
$(&amp;#039;.item&amp;#039;).matchHeight({ remove: true });&lt;br /&gt;
This will remove all bindings for the selected elements, from all groups.&lt;br /&gt;
&lt;br /&gt;
Custom target element&lt;br /&gt;
&lt;br /&gt;
$(function() {&lt;br /&gt;
	$(&amp;#039;.item&amp;#039;).matchHeight({&lt;br /&gt;
        target: $(&amp;#039;.sidebar&amp;#039;)&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
Will set all selected elements to the height of the first item with class sidebar.&lt;br /&gt;
&lt;br /&gt;
Custom property&lt;br /&gt;
&lt;br /&gt;
$(&amp;#039;.item&amp;#039;).matchHeight({ property: &amp;#039;min-height&amp;#039; });&lt;br /&gt;
This will set the min-height property instead of the height property.&lt;br /&gt;
&lt;br /&gt;
Callback events&lt;br /&gt;
&lt;br /&gt;
Since matchHeight automatically handles updating the layout after certain window events, you can supply functions as global callbacks if you need to be notified:&lt;br /&gt;
&lt;br /&gt;
$.fn.matchHeight._beforeUpdate = function(event, groups) {&lt;br /&gt;
    // do something before any updates are applied&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$.fn.matchHeight._afterUpdate = function(event, groups) {&lt;br /&gt;
    // do something after all updates are applied&lt;br /&gt;
}&lt;br /&gt;
Where event a jQuery event object (e.g. load, resize, orientationchange) and groups is a reference to $.fn.matchHeight._groups (see below).&lt;br /&gt;
&lt;br /&gt;
Manually apply match height&lt;br /&gt;
&lt;br /&gt;
$.fn.matchHeight._apply(elements, options)&lt;br /&gt;
Use the apply function directly if you wish to avoid the automatic update functionality.&lt;br /&gt;
&lt;br /&gt;
Throttling resize updates&lt;br /&gt;
&lt;br /&gt;
$.fn.matchHeight._throttle = 80;&lt;br /&gt;
By default, the _update method is throttled to execute at a maximum rate of once every 80ms. Decreasing the above _throttle property will update your layout quicker, appearing smoother during resize, at the expense of performance. If you experience lagging or freezing during resize, you should increase the _throttle property.&lt;br /&gt;
&lt;br /&gt;
Maintain scroll position&lt;br /&gt;
&lt;br /&gt;
$.fn.matchHeight._maintainScroll = true;&lt;br /&gt;
Under certain conditions where the size of the page is dynamically changing, such as during resize or when adding new elements, browser bugs cause the page scroll position to change unexpectedly.&lt;br /&gt;
&lt;br /&gt;
If you are observing this behaviour, use the above line to automatically attempt to force scroll position to be maintained (approximately). This is a global setting and by default it is false.&lt;br /&gt;
&lt;br /&gt;
Accessing current group bindings&lt;br /&gt;
&lt;br /&gt;
$.fn.matchHeight._groups&lt;br /&gt;
The array that contains all element groups that have had matchHeight applied. Used internally for automatically updating on resize events, but you may modify this array if you need to manually access any groups (e.g. if you&amp;#039;re deleting elements).&lt;br /&gt;
&lt;br /&gt;
Tests&lt;br /&gt;
&lt;br /&gt;
Open test/page/test.html in your browser to run unit tests via the jasmine test runner.&lt;br /&gt;
&lt;br /&gt;
If you wish to contribute functionality to this project, you are encouraged to add new tests following the same conventions.&lt;br /&gt;
&lt;br /&gt;
Run gulp test to run unit tests on multiple browsers and multiple resolutions, automatically through selenium.&lt;br /&gt;
&lt;br /&gt;
Run gulp test:cloud to test on even more browsers via a cloud service (you will need to create a file called test/conf/private.conf.js with your cloud credentials that looks like this:&lt;br /&gt;
&lt;br /&gt;
exports.config = {&lt;br /&gt;
    user: &amp;#039;username&amp;#039;,&lt;br /&gt;
    key: &amp;#039;key&amp;#039;&lt;br /&gt;
};&lt;br /&gt;
Cloud browser testing for this project is provided by BrowserStack (which is free for open source).&lt;br /&gt;
&lt;br /&gt;
Known limitations&lt;br /&gt;
&lt;br /&gt;
CSS transitions and animations are not supported&lt;br /&gt;
&lt;br /&gt;
You should ensure that there are no transitions or other animations that will delay the height changes of the elements you are matching, including any transition: all rules. Otherwise the plugin will produce unexpected results, as animations can&amp;#039;t be accounted for.&lt;br /&gt;
&lt;br /&gt;
Delayed webfonts may cause incorrect height&lt;br /&gt;
&lt;br /&gt;
Some browsers do not wait for webfonts to load before firing the window load event, so if the font loads too slowly the plugin may produce unexpected results.&lt;br /&gt;
&lt;br /&gt;
If this is a problem, you should call _update once your font has loaded by using something like the webfontloader script.&lt;br /&gt;
&lt;br /&gt;
Content changes require a manual update&lt;br /&gt;
&lt;br /&gt;
If you change the content inside an element that has had matchHeight applied, then you must manually call $.fn.matchHeight._update() afterwards. This will update of all currently set equal heights groups.&lt;br /&gt;
&lt;br /&gt;
Also note that previous matchHeight bindings do not apply to new elements, even if they match the selector used. In this case you must remove the old bindings and add new ones, see this comment.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Beispiel Baum und Garten ===&lt;br /&gt;
Etwas komplexer wegen der automatisierung im TYPO3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/***** Equal Height / Match Height******/&lt;br /&gt;
function equalCards(){&lt;br /&gt;
	// apply matchHeight to each card&lt;br /&gt;
	$(&amp;#039;.row:not(.row .row)&amp;#039;).each(function() {&lt;br /&gt;
		$(this).find(&amp;#039;.card.mh&amp;#039;).matchHeight({&lt;br /&gt;
			byRow: 1&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function equalCols(){&lt;br /&gt;
	// apply your matchHeight on DOM ready (they will be automatically re-applied on load or resize)&lt;br /&gt;
	// get settings&lt;br /&gt;
	var byRow = $(&amp;#039;body&amp;#039;).hasClass(&amp;#039;row&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	// apply matchHeight to each .eq in equal-height (only direct ancestor)&lt;br /&gt;
	$(&amp;#039;.equal-height&amp;#039;).each(function() {&lt;br /&gt;
		$(this).children(&amp;#039;.eq&amp;#039;).matchHeight({&lt;br /&gt;
			byRow: byRow&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
	// test property&lt;br /&gt;
	/*$(&amp;#039;.property-items .item&amp;#039;).matchHeight({&lt;br /&gt;
		property: &amp;#039;min-height&amp;#039;&lt;br /&gt;
	});*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
 /* matchHeight  */&lt;br /&gt;
	$(function() {&lt;br /&gt;
		$(&amp;#039;body&amp;#039;).animate(equalCards(),equalCols());&lt;br /&gt;
    //$(&amp;#039;body&amp;#039;).animate(equalCols());&lt;br /&gt;
  });&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== jQuery - Equal Heights ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* &lt;br /&gt;
 /* * @Copyright (c) 2013 James Stoddern - info@jamesstoddern.net  &lt;br /&gt;
 * web:jamesstoddern.net  &lt;br /&gt;
 *  &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person  &lt;br /&gt;
 * obtaining a copy of this software and associated documentation  &lt;br /&gt;
 * files (the &amp;quot;Software&amp;quot;), to deal in the Software without  &lt;br /&gt;
 * restriction, including without limitation the rights to use,  &lt;br /&gt;
 * copy, modify, merge, publish, distribute, sublicense, and/or sell  &lt;br /&gt;
 * copies of the Software, and to permit persons to whom the  &lt;br /&gt;
 * Software is furnished to do so, subject to the following  &lt;br /&gt;
 * conditions:  &lt;br /&gt;
 * The above copyright notice and this permission notice shall be  &lt;br /&gt;
 * included in all copies or substantial portions of the Software.  &lt;br /&gt;
 *  &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,  &lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  &lt;br /&gt;
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND  &lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT  &lt;br /&gt;
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,  &lt;br /&gt;
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING  &lt;br /&gt;
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR  &lt;br /&gt;
 * OTHER DEALINGS IN THE SOFTWARE.  &lt;br /&gt;
 *  &lt;br /&gt;
 * How to use it:  &lt;br /&gt;
 *  &lt;br /&gt;
 * If you have a series of floated columns, which you wish to make the same height, give them all the same  &lt;br /&gt;
 * class, and then run the plugin. It will determine the tallest div, and equalise the height of the rest  &lt;br /&gt;
 *  &lt;br /&gt;
 * $(&amp;#039;.selector&amp;#039;).equalHeights();  &lt;br /&gt;
 *  &lt;br /&gt;
 *  &lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
(function( $ ) {&lt;br /&gt;
    $.fn.equalHeights = function() {&lt;br /&gt;
        var tallestElement = 0;&lt;br /&gt;
        var startRow = 0;&lt;br /&gt;
        var elements = new Array();&lt;br /&gt;
        var $currentElement;&lt;br /&gt;
        var topPosition = 0;&lt;br /&gt;
 &lt;br /&gt;
        this.each(function() {&lt;br /&gt;
 &lt;br /&gt;
            $currentElement = $(this);&lt;br /&gt;
            topPostion = $currentElement.position().top;&lt;br /&gt;
 &lt;br /&gt;
            if (startRow != topPostion) {&lt;br /&gt;
                for (currentDiv = 0 ; currentDiv &amp;lt; elements.length ; currentDiv++) {&lt;br /&gt;
                    elements[currentDiv].height(tallestElement);&lt;br /&gt;
                }&lt;br /&gt;
 &lt;br /&gt;
                elements.length = 0;&lt;br /&gt;
                startRow = topPostion;&lt;br /&gt;
                tallestElement = $currentElement.height();&lt;br /&gt;
                elements.push($currentElement);&lt;br /&gt;
 &lt;br /&gt;
            } else {&lt;br /&gt;
                elements.push($currentElement);&lt;br /&gt;
                tallestElement = (tallestElement &amp;lt; $currentElement.height()) ? ($currentElement.height()) : (tallestElement);&lt;br /&gt;
 &lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            for (currentDiv = 0 ; currentDiv &amp;lt; elements.length ; currentDiv++) {&lt;br /&gt;
                elements[currentDiv].height(tallestElement);&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
        });&lt;br /&gt;
 &lt;br /&gt;
    };&lt;br /&gt;
}) ( jQuery );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Parallax_Effekt_selbst_gemacht&amp;diff=22877</id>
		<title>Parallax Effekt selbst gemacht</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Parallax_Effekt_selbst_gemacht&amp;diff=22877"/>
		<updated>2018-03-06T16:16:36Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* JavaScript */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenig Code, effektiv, jQuery&lt;br /&gt;
&lt;br /&gt;
https://www.taniarascia.com/parallax-scroll-effect/&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.parallax-container {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 500px;&lt;br /&gt;
}&lt;br /&gt;
.parallax {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  height: 200%;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
}&lt;br /&gt;
.content {&lt;br /&gt;
  background: #fff;&lt;br /&gt;
  height: 600px /* This height is only for &lt;br /&gt;
  demonstration purposes since I have no content. &lt;br /&gt;
  It&amp;#039;s not necessary for the code to work. */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.parallax-container&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* legt die Höhe fest&lt;br /&gt;
* position relativ ermöglicht Kontrolle über das absolut positionierte Kindelement.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.parallax&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Inner div enthält Background Image&lt;br /&gt;
* Absolut positioniert (siehe oben)&lt;br /&gt;
* Höhe kann variieren&lt;br /&gt;
* Breite muß definiert werden 100% since the element is now absolute. Finally, a &lt;br /&gt;
* negative z-index -&amp;gt; image remains contained to the height of parallax-container.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Content&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
All HTML layout elements have a transparent background by default. If you choose to use parallax, simply setting your background color on the body element won’t be enough anymore – you’ll have to place all of your non-parallax content inside of elements with a background color. I’m going to create a .content class that simply has a background color so that my content will always appear over the parallax image.&lt;br /&gt;
&lt;br /&gt;
== HTML ==&lt;br /&gt;
Putting it Together&lt;br /&gt;
*top and bottom empty section damit man scrollen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;section class=&amp;quot;content&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section class=&amp;quot;parallax-container&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;parallax&amp;quot; style=&amp;quot;background: url(image.jpg) center center / cover no-repeat;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section class=&amp;quot;content&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*On the .parallax div, I edit the style attribute and add a background image.&lt;br /&gt;
*The background image will be horizontally and vertically centered in the div, cover the entire div, and not repeat.&lt;br /&gt;
* Kommentar: Verbesserung wäre ein Schwerpunkt&lt;br /&gt;
&lt;br /&gt;
== JavaScript ==&lt;br /&gt;
* We’re going to &amp;#039;&amp;#039;&amp;#039;create a variable for the parallax class, and count all instances&amp;#039;&amp;#039;&amp;#039; using .length.&lt;br /&gt;
* Next, we’ll &amp;#039;&amp;#039;&amp;#039;create a scroll function&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Let the browser know that we’re going to do an animation with requestAnimationFrame.&lt;br /&gt;
* Create a for loop, capturing each parallax element in currentElement, and how much has been scrolled with scrolled.&lt;br /&gt;
* Finally, multiply how much has been scrolled with a negative pixel value, and apply that to the transform: translate3D of the CSS of the individual parallax element.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var parallaxElements = $(&amp;#039;.parallax&amp;#039;),&lt;br /&gt;
    parallaxQuantity = parallaxElements.length;&lt;br /&gt;
&lt;br /&gt;
$(window).on(&amp;#039;scroll&amp;#039;, function () {&lt;br /&gt;
  window.requestAnimationFrame(function () {&lt;br /&gt;
    for (var i = 0; i &amp;lt; parallaxQuantity; i++) {&lt;br /&gt;
      var currentElement = parallaxElements.eq(i);&lt;br /&gt;
      var scrolled = $(window).scrollTop();&lt;br /&gt;
      currentElement.css({&lt;br /&gt;
        &amp;#039;transform&amp;#039;: &amp;#039;translate3d(0,&amp;#039; + scrolled * -0.3 + &amp;#039;px, 0)&amp;#039;&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
I’m not a fan of including parallax on mobile, so I would &amp;#039;&amp;#039;&amp;#039;add an if statement on the jQuery and a @media query on the CSS to only allow parallax after a certain screen width&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Parallax_Effekt_selbst_gemacht&amp;diff=22876</id>
		<title>Parallax Effekt selbst gemacht</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Parallax_Effekt_selbst_gemacht&amp;diff=22876"/>
		<updated>2018-03-06T16:15:39Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „Wenig Code, effektiv, jQuery  https://www.taniarascia.com/parallax-scroll-effect/  == CSS == &amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt; .parallax-container {   position: rel…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenig Code, effektiv, jQuery&lt;br /&gt;
&lt;br /&gt;
https://www.taniarascia.com/parallax-scroll-effect/&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.parallax-container {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 500px;&lt;br /&gt;
}&lt;br /&gt;
.parallax {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  height: 200%;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
}&lt;br /&gt;
.content {&lt;br /&gt;
  background: #fff;&lt;br /&gt;
  height: 600px /* This height is only for &lt;br /&gt;
  demonstration purposes since I have no content. &lt;br /&gt;
  It&amp;#039;s not necessary for the code to work. */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.parallax-container&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* legt die Höhe fest&lt;br /&gt;
* position relativ ermöglicht Kontrolle über das absolut positionierte Kindelement.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.parallax&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Inner div enthält Background Image&lt;br /&gt;
* Absolut positioniert (siehe oben)&lt;br /&gt;
* Höhe kann variieren&lt;br /&gt;
* Breite muß definiert werden 100% since the element is now absolute. Finally, a &lt;br /&gt;
* negative z-index -&amp;gt; image remains contained to the height of parallax-container.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Content&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
All HTML layout elements have a transparent background by default. If you choose to use parallax, simply setting your background color on the body element won’t be enough anymore – you’ll have to place all of your non-parallax content inside of elements with a background color. I’m going to create a .content class that simply has a background color so that my content will always appear over the parallax image.&lt;br /&gt;
&lt;br /&gt;
== HTML ==&lt;br /&gt;
Putting it Together&lt;br /&gt;
*top and bottom empty section damit man scrollen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;section class=&amp;quot;content&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section class=&amp;quot;parallax-container&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;parallax&amp;quot; style=&amp;quot;background: url(image.jpg) center center / cover no-repeat;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section class=&amp;quot;content&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*On the .parallax div, I edit the style attribute and add a background image.&lt;br /&gt;
*The background image will be horizontally and vertically centered in the div, cover the entire div, and not repeat.&lt;br /&gt;
* Kommentar: Verbesserung wäre ein Schwerpunkt&lt;br /&gt;
&lt;br /&gt;
== JavaScript ==&lt;br /&gt;
* We’re going to &amp;#039;&amp;#039;&amp;#039;create a variable for the parallax class, and count all instances&amp;#039;&amp;#039;&amp;#039; using .length.&lt;br /&gt;
* Next, we’ll &amp;#039;&amp;#039;&amp;#039;create a scroll function&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Let the browser know that we’re going to do an animation with requestAnimationFrame.&lt;br /&gt;
* Create a for loop, capturing each parallax element in currentElement, and how much has been scrolled with scrolled.&lt;br /&gt;
* Finally, multiply how much has been scrolled with a negative pixel value, and apply that to the transform: translate3D of the CSS of the individual parallax element.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var parallaxElements = $(&amp;#039;.parallax&amp;#039;),&lt;br /&gt;
    parallaxQuantity = parallaxElements.length;&lt;br /&gt;
&lt;br /&gt;
$(window).on(&amp;#039;scroll&amp;#039;, function () {&lt;br /&gt;
  window.requestAnimationFrame(function () {&lt;br /&gt;
    for (var i = 0; i &amp;lt; parallaxQuantity; i++) {&lt;br /&gt;
      var currentElement = parallaxElements.eq(i);&lt;br /&gt;
      var scrolled = $(window).scrollTop();&lt;br /&gt;
      currentElement.css({&lt;br /&gt;
        &amp;#039;transform&amp;#039;: &amp;#039;translate3d(0,&amp;#039; + scrolled * -0.3 + &amp;#039;px, 0)&amp;#039;&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
I’m not a fan of including parallax on mobile, so I would &amp;#039;&amp;#039;&amp;#039;add an if statement on the jQuery and a @media query on the CSS to only allow parallax after a certain screen width&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22875</id>
		<title>JavaScript - Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22875"/>
		<updated>2018-03-06T15:58:19Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Parallax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Libraries Skripte und Plugins für JavaScript, sortiert nach Kategorien&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.jqueryscript.net/&lt;br /&gt;
&lt;br /&gt;
== Images Loaded ==&lt;br /&gt;
Testen ob alle Bilder geladen sind, um dann weitere Funktionen auzuführen.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Images Loaded]]&lt;br /&gt;
== Events ==&lt;br /&gt;
=== Gesture Recognition ===&lt;br /&gt;
[[JavaScript - hammer.js Webapp Touch Gestures]]&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
=== CreateJS ===&lt;br /&gt;
Tools für Animation und Interaktion&lt;br /&gt;
&lt;br /&gt;
http://createjs.com&lt;br /&gt;
&lt;br /&gt;
=== jQuery Appear ===&lt;br /&gt;
[[jQuery Appear - Plugin]] - Events wenn Elemente im Viewport auftauchen / verschwinden&lt;br /&gt;
&lt;br /&gt;
=== jQuery Easing ===&lt;br /&gt;
Easing Kurven für Animationen [[jQuery Easing - Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Simple Text Rotator ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Simple Text Rotator&lt;br /&gt;
!function(e){var t={animation:&amp;quot;dissolve&amp;quot;,separator:&amp;quot;,&amp;quot;,speed:2e3};e.fn.textrotator=function(n){var r=e.extend({},t,n);return this.each(function(){var t=e(this);var n=[];e.each(t.text().split(r.separator),function(e,t){n.push(t)});t.text(n[0]);var i=function(){switch(r.animation){case&amp;quot;dissolve&amp;quot;:t.animate({textShadowBlur:20,opacity:0},500,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).animate({textShadowBlur:0,opacity:1},500)});break;case&amp;quot;flip&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,transform:&amp;quot; rotateY(-180deg)&amp;quot;});break;case&amp;quot;flipUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,transform:&amp;quot; rotateX(-180deg)&amp;quot;});break;case&amp;quot;flipCube&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,transform:&amp;quot; rotateY(180deg)&amp;quot;});break;case&amp;quot;flipCubeUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,transform:&amp;quot; rotateX(180deg)&amp;quot;});break;case&amp;quot;spin&amp;quot;:if(t.find(&amp;quot;.rotating&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.rotating&amp;quot;).html())}s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating spin&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().text(n[s+1]).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotate(0) scale(1)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,transform:&amp;quot;rotate(0) scale(1)&amp;quot;});break;case&amp;quot;fade&amp;quot;:t.fadeOut(r.speed,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).fadeIn(r.speed)});break}};setInterval(i,r.speed)})}}(window.jQuery)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wow Reveal Animations ===&lt;br /&gt;
Kostenpflichtig für kommerzielle Seiten. Developer Lizenz ca 99$. Enthalten z.B. bei angelajochum.de. Kann kostenlos geladen werden zum testen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthieua/WOW&lt;br /&gt;
&lt;br /&gt;
http://mynameismatthieu.com/WOW/index.html&lt;br /&gt;
&lt;br /&gt;
=== Flippy Text Effekt ===&lt;br /&gt;
https://github.com/yemM/flippy&lt;br /&gt;
&lt;br /&gt;
Verwendet in Hera Template&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
=== Pushy ===&lt;br /&gt;
Gutes Mobiles Off-Canvas Menu&lt;br /&gt;
&lt;br /&gt;
[[Pushy Menu]]&lt;br /&gt;
=== Meanmenu ===&lt;br /&gt;
Verwandelt ein Normales verschachteltes Menu in ein gut zu bediendendes Mobiles Menu.&lt;br /&gt;
&lt;br /&gt;
[[Meanmenu.js - jQuery Plugin]] (1.x,2.x)&lt;br /&gt;
&lt;br /&gt;
=== jQuery Mobile Menu ===&lt;br /&gt;
Mobiles Dropdownmenü aus ul Liste&lt;br /&gt;
&lt;br /&gt;
[[jQuery Mobile Menu - Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Parallax ==&lt;br /&gt;
=== Parallax selbst gemacht ===&lt;br /&gt;
[[Parallax Effekt selbst gemacht]]&lt;br /&gt;
&lt;br /&gt;
=== jquery-parallax (jQuery) ===&lt;br /&gt;
Einfach und effektiv.&lt;br /&gt;
&lt;br /&gt;
[[jquery-parallax]]&lt;br /&gt;
&lt;br /&gt;
=== Stellar.js ===&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/&lt;br /&gt;
&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/docs/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*! Stellar.js v0.6.2 | Copyright 2014, Mark Dalgleish | http://markdalgleish.com/projects/stellar.js | http://markdalgleish.mit-license.org */&lt;br /&gt;
!function(a,b,c,d){function e(b,c){this.element=b,this.options=a.extend({},g,c),this._defaults=g,this._name=f,this.init()}var f=&amp;quot;stellar&amp;quot;,g={scrollProperty:&amp;quot;scroll&amp;quot;,positionProperty:&amp;quot;position&amp;quot;,horizontalScrolling:!0,verticalScrolling:!0,horizontalOffset:0,verticalOffset:0,responsive:!1,parallaxBackgrounds:!0,parallaxElements:!0,hideDistantElements:!0,hideElement:function(a){a.hide()},showElement:function(a){a.show()}},h={scroll:{getLeft:function(a){return a.scrollLeft()},setLeft:function(a,b){a.scrollLeft(b)},getTop:function(a){return a.scrollTop()},setTop:function(a,b){a.scrollTop(b)}},position:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;top&amp;quot;),10)}},margin:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;margin-left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;margin-top&amp;quot;),10)}},transform:{getLeft:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[4],10):0},getTop:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[5],10):0}}},i={position:{setLeft:function(a,b){a.css(&amp;quot;left&amp;quot;,b)},setTop:function(a,b){a.css(&amp;quot;top&amp;quot;,b)}},transform:{setPosition:function(a,b,c,d,e){a[0].style[k]=&amp;quot;translate3d(&amp;quot;+(b-c)+&amp;quot;px, &amp;quot;+(d-e)+&amp;quot;px, 0)&amp;quot;}}},j=function(){var b,c=/^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/,d=a(&amp;quot;script&amp;quot;)[0].style,e=&amp;quot;&amp;quot;;for(b in d)if(c.test(b)){e=b.match(c)[0];break}return&amp;quot;WebkitOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Webkit&amp;quot;),&amp;quot;KhtmlOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Khtml&amp;quot;),function(a){return e+(e.length&amp;gt;0?a.charAt(0).toUpperCase()+a.slice(1):a)}}(),k=j(&amp;quot;transform&amp;quot;),l=a(&amp;quot;&amp;lt;div /&amp;gt;&amp;quot;,{style:&amp;quot;background:#fff&amp;quot;}).css(&amp;quot;background-position-x&amp;quot;)!==d,m=l?function(a,b,c){a.css({&amp;quot;background-position-x&amp;quot;:b,&amp;quot;background-position-y&amp;quot;:c})}:function(a,b,c){a.css(&amp;quot;background-position&amp;quot;,b+&amp;quot; &amp;quot;+c)},n=l?function(a){return[a.css(&amp;quot;background-position-x&amp;quot;),a.css(&amp;quot;background-position-y&amp;quot;)]}:function(a){return a.css(&amp;quot;background-position&amp;quot;).split(&amp;quot; &amp;quot;)},o=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a){setTimeout(a,1e3/60)};e.prototype={init:function(){this.options.name=f+&amp;quot;_&amp;quot;+Math.floor(1e9*Math.random()),this._defineElements(),this._defineGetters(),this._defineSetters(),this._handleWindowLoadAndResize(),this._detectViewport(),this.refresh({firstLoad:!0}),&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this._handleScrollEvent():this._startAnimationLoop()},_defineElements:function(){this.element===c.body&amp;amp;&amp;amp;(this.element=b),this.$scrollElement=a(this.element),this.$element=this.element===b?a(&amp;quot;body&amp;quot;):this.$scrollElement,this.$viewportElement=this.options.viewportElement!==d?a(this.options.viewportElement):this.$scrollElement[0]===b||&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this.$scrollElement:this.$scrollElement.parent()},_defineGetters:function(){var a=this,b=h[a.options.scrollProperty];this._getScrollLeft=function(){return b.getLeft(a.$scrollElement)},this._getScrollTop=function(){return b.getTop(a.$scrollElement)}},_defineSetters:function(){var b=this,c=h[b.options.scrollProperty],d=i[b.options.positionProperty],e=c.setLeft,f=c.setTop;this._setScrollLeft=&amp;quot;function&amp;quot;==typeof e?function(a){e(b.$scrollElement,a)}:a.noop,this._setScrollTop=&amp;quot;function&amp;quot;==typeof f?function(a){f(b.$scrollElement,a)}:a.noop,this._setPosition=d.setPosition||function(a,c,e,f,g){b.options.horizontalScrolling&amp;amp;&amp;amp;d.setLeft(a,c,e),b.options.verticalScrolling&amp;amp;&amp;amp;d.setTop(a,f,g)}},_handleWindowLoadAndResize:function(){var c=this,d=a(b);c.options.responsive&amp;amp;&amp;amp;d.bind(&amp;quot;load.&amp;quot;+this.name,function(){c.refresh()}),d.bind(&amp;quot;resize.&amp;quot;+this.name,function(){c._detectViewport(),c.options.responsive&amp;amp;&amp;amp;c.refresh()})},refresh:function(c){var d=this,e=d._getScrollLeft(),f=d._getScrollTop();c&amp;amp;&amp;amp;c.firstLoad||this._reset(),this._setScrollLeft(0),this._setScrollTop(0),this._setOffsets(),this._findParticles(),this._findBackgrounds(),c&amp;amp;&amp;amp;c.firstLoad&amp;amp;&amp;amp;/WebKit/.test(navigator.userAgent)&amp;amp;&amp;amp;a(b).load(function(){var a=d._getScrollLeft(),b=d._getScrollTop();d._setScrollLeft(a+1),d._setScrollTop(b+1),d._setScrollLeft(a),d._setScrollTop(b)}),this._setScrollLeft(e),this._setScrollTop(f)},_detectViewport:function(){var a=this.$viewportElement.offset(),b=null!==a&amp;amp;&amp;amp;a!==d;this.viewportWidth=this.$viewportElement.width(),this.viewportHeight=this.$viewportElement.height(),this.viewportOffsetTop=b?a.top:0,this.viewportOffsetLeft=b?a.left:0},_findParticles:function(){{var b=this;this._getScrollLeft(),this._getScrollTop()}if(this.particles!==d)for(var c=this.particles.length-1;c&amp;gt;=0;c--)this.particles[c].$element.data(&amp;quot;stellar-elementIsActive&amp;quot;,d);this.particles=[],this.options.parallaxElements&amp;amp;&amp;amp;this.$element.find(&amp;quot;[data-stellar-ratio]&amp;quot;).each(function(){var c,e,f,g,h,i,j,k,l,m=a(this),n=0,o=0,p=0,q=0;if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)){if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)!==this)return}else m.data(&amp;quot;stellar-elementIsActive&amp;quot;,this);b.options.showElement(m),m.data(&amp;quot;stellar-startingLeft&amp;quot;)?(m.css(&amp;quot;left&amp;quot;,m.data(&amp;quot;stellar-startingLeft&amp;quot;)),m.css(&amp;quot;top&amp;quot;,m.data(&amp;quot;stellar-startingTop&amp;quot;))):(m.data(&amp;quot;stellar-startingLeft&amp;quot;,m.css(&amp;quot;left&amp;quot;)),m.data(&amp;quot;stellar-startingTop&amp;quot;,m.css(&amp;quot;top&amp;quot;))),f=m.position().left,g=m.position().top,h=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-top&amp;quot;),10),k=m.offset().left-h,l=m.offset().top-i,m.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(n=p,o=q,j=b,!1):(p+=b.position().left,void(q+=b.position().top))}),c=m.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-horizontal-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-horizontal-offset&amp;quot;):b.horizontalOffset,e=m.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-vertical-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-vertical-offset&amp;quot;):b.verticalOffset,b.particles.push({$element:m,$offsetParent:j,isFixed:&amp;quot;fixed&amp;quot;===m.css(&amp;quot;position&amp;quot;),horizontalOffset:c,verticalOffset:e,startingPositionLeft:f,startingPositionTop:g,startingOffsetLeft:k,startingOffsetTop:l,parentOffsetLeft:n,parentOffsetTop:o,stellarRatio:m.data(&amp;quot;stellar-ratio&amp;quot;)!==d?m.data(&amp;quot;stellar-ratio&amp;quot;):1,width:m.outerWidth(!0),height:m.outerHeight(!0),isHidden:!1})})},_findBackgrounds:function(){var b,c=this,e=this._getScrollLeft(),f=this._getScrollTop();this.backgrounds=[],this.options.parallaxBackgrounds&amp;amp;&amp;amp;(b=this.$element.find(&amp;quot;[data-stellar-background-ratio]&amp;quot;),this.$element.data(&amp;quot;stellar-background-ratio&amp;quot;)&amp;amp;&amp;amp;(b=b.add(this.$element)),b.each(function(){var b,g,h,i,j,k,l,o=a(this),p=n(o),q=0,r=0,s=0,t=0;if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)){if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)!==this)return}else o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;,this);o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;)?m(o,o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;)):(o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,p[0]),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,p[1])),h=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-top&amp;quot;),10),j=o.offset().left-h-e,k=o.offset().top-i-f,o.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(q=s,r=t,l=b,!1):(s+=b.position().left,void(t+=b.position().top))}),b=o.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-horizontal-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-horizontal-offset&amp;quot;):c.horizontalOffset,g=o.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-vertical-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-vertical-offset&amp;quot;):c.verticalOffset,c.backgrounds.push({$element:o,$offsetParent:l,isFixed:&amp;quot;fixed&amp;quot;===o.css(&amp;quot;background-attachment&amp;quot;),horizontalOffset:b,verticalOffset:g,startingValueLeft:p[0],startingValueTop:p[1],startingBackgroundPositionLeft:isNaN(parseInt(p[0],10))?0:parseInt(p[0],10),startingBackgroundPositionTop:isNaN(parseInt(p[1],10))?0:parseInt(p[1],10),startingPositionLeft:o.position().left,startingPositionTop:o.position().top,startingOffsetLeft:j,startingOffsetTop:k,parentOffsetLeft:q,parentOffsetTop:r,stellarRatio:o.data(&amp;quot;stellar-background-ratio&amp;quot;)===d?1:o.data(&amp;quot;stellar-background-ratio&amp;quot;)})}))},_reset:function(){var a,b,c,d,e;for(e=this.particles.length-1;e&amp;gt;=0;e--)a=this.particles[e],b=a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;),c=a.$element.data(&amp;quot;stellar-startingTop&amp;quot;),this._setPosition(a.$element,b,b,c,c),this.options.showElement(a.$element),a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;,null).data(&amp;quot;stellar-elementIsActive&amp;quot;,null).data(&amp;quot;stellar-backgroundIsActive&amp;quot;,null);for(e=this.backgrounds.length-1;e&amp;gt;=0;e--)d=this.backgrounds[e],d.$element.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,null).data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,null),m(d.$element,d.startingValueLeft,d.startingValueTop)},destroy:function(){this._reset(),this.$scrollElement.unbind(&amp;quot;resize.&amp;quot;+this.name).unbind(&amp;quot;scroll.&amp;quot;+this.name),this._animationLoop=a.noop,a(b).unbind(&amp;quot;load.&amp;quot;+this.name).unbind(&amp;quot;resize.&amp;quot;+this.name)},_setOffsets:function(){var c=this,d=a(b);d.unbind(&amp;quot;resize.horizontal-&amp;quot;+this.name).unbind(&amp;quot;resize.vertical-&amp;quot;+this.name),&amp;quot;function&amp;quot;==typeof this.options.horizontalOffset?(this.horizontalOffset=this.options.horizontalOffset(),d.bind(&amp;quot;resize.horizontal-&amp;quot;+this.name,function(){c.horizontalOffset=c.options.horizontalOffset()})):this.horizontalOffset=this.options.horizontalOffset,&amp;quot;function&amp;quot;==typeof this.options.verticalOffset?(this.verticalOffset=this.options.verticalOffset(),d.bind(&amp;quot;resize.vertical-&amp;quot;+this.name,function(){c.verticalOffset=c.options.verticalOffset()})):this.verticalOffset=this.options.verticalOffset},_repositionElements:function(){var a,b,c,d,e,f,g,h,i,j,k=this._getScrollLeft(),l=this._getScrollTop(),n=!0,o=!0;if(this.currentScrollLeft!==k||this.currentScrollTop!==l||this.currentWidth!==this.viewportWidth||this.currentHeight!==this.viewportHeight){for(this.currentScrollLeft=k,this.currentScrollTop=l,this.currentWidth=this.viewportWidth,this.currentHeight=this.viewportHeight,j=this.particles.length-1;j&amp;gt;=0;j--)a=this.particles[j],b=a.isFixed?1:0,this.options.horizontalScrolling?(f=(k+a.horizontalOffset+this.viewportOffsetLeft+a.startingPositionLeft-a.startingOffsetLeft+a.parentOffsetLeft)*-(a.stellarRatio+b-1)+a.startingPositionLeft,h=f-a.startingPositionLeft+a.startingOffsetLeft):(f=a.startingPositionLeft,h=a.startingOffsetLeft),this.options.verticalScrolling?(g=(l+a.verticalOffset+this.viewportOffsetTop+a.startingPositionTop-a.startingOffsetTop+a.parentOffsetTop)*-(a.stellarRatio+b-1)+a.startingPositionTop,i=g-a.startingPositionTop+a.startingOffsetTop):(g=a.startingPositionTop,i=a.startingOffsetTop),this.options.hideDistantElements&amp;amp;&amp;amp;(o=!this.options.horizontalScrolling||h+a.width&amp;gt;(a.isFixed?0:k)&amp;amp;&amp;amp;h&amp;lt;(a.isFixed?0:k)+this.viewportWidth+this.viewportOffsetLeft,n=!this.options.verticalScrolling||i+a.height&amp;gt;(a.isFixed?0:l)&amp;amp;&amp;amp;i&amp;lt;(a.isFixed?0:l)+this.viewportHeight+this.viewportOffsetTop),o&amp;amp;&amp;amp;n?(a.isHidden&amp;amp;&amp;amp;(this.options.showElement(a.$element),a.isHidden=!1),this._setPosition(a.$element,f,a.startingPositionLeft,g,a.startingPositionTop)):a.isHidden||(this.options.hideElement(a.$element),a.isHidden=!0);for(j=this.backgrounds.length-1;j&amp;gt;=0;j--)c=this.backgrounds[j],b=c.isFixed?0:1,d=this.options.horizontalScrolling?(k+c.horizontalOffset-this.viewportOffsetLeft-c.startingOffsetLeft+c.parentOffsetLeft-c.startingBackgroundPositionLeft)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueLeft,e=this.options.verticalScrolling?(l+c.verticalOffset-this.viewportOffsetTop-c.startingOffsetTop+c.parentOffsetTop-c.startingBackgroundPositionTop)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueTop,m(c.$element,d,e)}},_handleScrollEvent:function(){var a=this,b=!1,c=function(){a._repositionElements(),b=!1},d=function(){b||(o(c),b=!0)};this.$scrollElement.bind(&amp;quot;scroll.&amp;quot;+this.name,d),d()},_startAnimationLoop:function(){var a=this;this._animationLoop=function(){o(a._animationLoop),a._repositionElements()},this._animationLoop()}},a.fn[f]=function(b){var c=arguments;return b===d||&amp;quot;object&amp;quot;==typeof b?this.each(function(){a.data(this,&amp;quot;plugin_&amp;quot;+f)||a.data(this,&amp;quot;plugin_&amp;quot;+f,new e(this,b))}):&amp;quot;string&amp;quot;==typeof b&amp;amp;&amp;amp;&amp;quot;_&amp;quot;!==b[0]&amp;amp;&amp;amp;&amp;quot;init&amp;quot;!==b?this.each(function(){var d=a.data(this,&amp;quot;plugin_&amp;quot;+f);d instanceof e&amp;amp;&amp;amp;&amp;quot;function&amp;quot;==typeof d[b]&amp;amp;&amp;amp;d[b].apply(d,Array.prototype.slice.call(c,1)),&amp;quot;destroy&amp;quot;===b&amp;amp;&amp;amp;a.data(this,&amp;quot;plugin_&amp;quot;+f,null)}):void 0},a[f]=function(){var c=a(b);return c.stellar.apply(c,Array.prototype.slice.call(arguments,0))},a[f].scrollProperty=h,a[f].positionProperty=i,b.Stellar=e}(jQuery,this,document);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scrolly ===&lt;br /&gt;
[[JQuery.Scrolly]]&lt;br /&gt;
&lt;br /&gt;
== Lightbox, Gallery &amp;amp; co ==&lt;br /&gt;
&lt;br /&gt;
=== Chocolat ===&lt;br /&gt;
Nette responsive Lightbox für Anfänger und Profis&lt;br /&gt;
&lt;br /&gt;
http://chocolat.insipi.de&lt;br /&gt;
&lt;br /&gt;
[[Chocolat Lightbox]]&lt;br /&gt;
&lt;br /&gt;
=== Lightbox ===&lt;br /&gt;
Der Klassiker: [[Lightbox jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Magnific Popup ===&lt;br /&gt;
Galt lange als DER Nachfolger der Lightbox [[Magnific Popup jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Isotope / Masonry ==&lt;br /&gt;
[[JavaScript - Masonry / Isotope]]&lt;br /&gt;
&lt;br /&gt;
== Charts / Counter ==&lt;br /&gt;
=== jQuery CountTo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// jQuery CountTo&lt;br /&gt;
!function(t){&amp;quot;use strict&amp;quot;;function e(t,e){return t.toFixed(e.decimals)}t.fn.countTo=function(e){return e=e||{},t(this).each(function(){function a(){s+=l,c++,n(s),&amp;quot;function&amp;quot;==typeof o.onUpdate&amp;amp;&amp;amp;o.onUpdate.call(i,s),c&amp;gt;=r&amp;amp;&amp;amp;(f.removeData(&amp;quot;countTo&amp;quot;),clearInterval(d.interval),s=o.to,&amp;quot;function&amp;quot;==typeof o.onComplete&amp;amp;&amp;amp;o.onComplete.call(i,s))}function n(t){var e=o.formatter.call(i,t,o);f.text(e)}var o=t.extend({},t.fn.countTo.defaults,{from:t(this).data(&amp;quot;from&amp;quot;),to:t(this).data(&amp;quot;to&amp;quot;),speed:t(this).data(&amp;quot;speed&amp;quot;),refreshInterval:t(this).data(&amp;quot;refresh-interval&amp;quot;),decimals:t(this).data(&amp;quot;decimals&amp;quot;)},e),r=Math.ceil(o.speed/o.refreshInterval),l=(o.to-o.from)/r,i=this,f=t(this),c=0,s=o.from,d=f.data(&amp;quot;countTo&amp;quot;)||{};f.data(&amp;quot;countTo&amp;quot;,d),d.interval&amp;amp;&amp;amp;clearInterval(d.interval),d.interval=setInterval(a,o.refreshInterval),n(s)})},t.fn.countTo.defaults={from:0,to:0,speed:1e3,refreshInterval:100,decimals:0,formatter:e,onUpdate:null,onComplete:null}}(jQuery);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Easy Pie Chart ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**!&lt;br /&gt;
 * easyPieChart&lt;br /&gt;
 * Lightweight plugin to render simple, animated and retina optimized pie charts&lt;br /&gt;
 *&lt;br /&gt;
 * @license &lt;br /&gt;
 * @author Robert Fleischmann &amp;lt;rendro87@gmail.com&amp;gt; (http://robert-fleischmann.de)&lt;br /&gt;
 * @version 2.1.6&lt;br /&gt;
 **/&lt;br /&gt;
!function(a,b){&amp;quot;object&amp;quot;==typeof exports?module.exports=b(require(&amp;quot;jquery&amp;quot;)):&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement(&amp;quot;canvas&amp;quot;);a.appendChild(d),&amp;quot;undefined&amp;quot;!=typeof G_vmlCanvasManager&amp;amp;&amp;amp;G_vmlCanvasManager.initElement(d);var e=d.getContext(&amp;quot;2d&amp;quot;);d.width=d.height=b.size;var f=1;window.devicePixelRatio&amp;gt;1&amp;amp;&amp;amp;(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,&amp;quot;px&amp;quot;].join(&amp;quot;&amp;quot;),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&amp;amp;&amp;amp;b.scaleLength&amp;amp;&amp;amp;(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0&amp;gt;=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d&amp;gt;0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&amp;amp;&amp;amp;i(),b.trackColor&amp;amp;&amp;amp;h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&amp;amp;&amp;amp;e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d=&amp;quot;function&amp;quot;==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f&amp;gt;=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:&amp;quot;#ef1e25&amp;quot;,trackColor:&amp;quot;#f9f9f9&amp;quot;,scaleColor:&amp;quot;#dfe0e0&amp;quot;,scaleLength:5,lineCap:&amp;quot;round&amp;quot;,lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1&amp;gt;b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if(&amp;quot;undefined&amp;quot;!=typeof b)d.renderer=b;else{if(&amp;quot;undefined&amp;quot;==typeof SVGRenderer)throw new Error(&amp;quot;Please load either the SVG- or the CanvasRenderer&amp;quot;);d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&amp;amp;&amp;amp;(e[b]=c&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof c[b]?c[b]:d[b],&amp;quot;function&amp;quot;==typeof e[b]&amp;amp;&amp;amp;(e[b]=e[b].bind(this)));e.easing=&amp;quot;string&amp;quot;==typeof e.easing&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof jQuery&amp;amp;&amp;amp;jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,&amp;quot;number&amp;quot;==typeof e.animate&amp;amp;&amp;amp;(e.animate={duration:e.animate,enabled:!0}),&amp;quot;boolean&amp;quot;!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&amp;amp;&amp;amp;a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&amp;amp;&amp;amp;a.getAttribute(&amp;quot;data-percent&amp;quot;)&amp;amp;&amp;amp;this.update(parseFloat(a.getAttribute(&amp;quot;data-percent&amp;quot;)))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,&amp;quot;easyPieChart&amp;quot;)||(d=a.extend({},b,a(this).data()),a.data(this,&amp;quot;easyPieChart&amp;quot;,new c(this,d)))})}});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Audio / Video / MediaPlayer ==&lt;br /&gt;
Siehe auch: [[JavaScript - HTML5 Audio]]&lt;br /&gt;
https://ourcodeworld.com/articles/read/148/top-7-best-html5-media-player-javascript-plugins&lt;br /&gt;
&lt;br /&gt;
* Plyr (HTML5, YouTube, Vimeo, accessible, lightweight, customisable, responsive, no dependencies) https://github.com/sampotts/plyr&lt;br /&gt;
* Video.js (Video, build new from ground in 2010, popular)&lt;br /&gt;
* Popcorn.js (HTML5 Event Framework for Filmmakers, Audio Video, Vimeo, YouTube, Soundcloud...)&lt;br /&gt;
* Afterglow ( HTML5 Elements, little Effort)&lt;br /&gt;
* MediaElement.js (Mimics HTML5, Flash Fallback, Accessible)&lt;br /&gt;
* jPlayer (Audio, Video, Skinnable, API&lt;br /&gt;
* Projekktor (OpenSource Video/Audio, Flashfallback different output devices)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FitVids ===&lt;br /&gt;
Embedding Videos from YouTube, Vimeo,...&lt;br /&gt;
&lt;br /&gt;
[[FitVids jQuery Plugin]] https://github.com/davatron5000/FitVids.js&lt;br /&gt;
&lt;br /&gt;
=== Vide - Video Backgrounds ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Vide - v0.5.1&lt;br /&gt;
 *  Easy as hell jQuery plugin for video backgrounds.&lt;br /&gt;
 *  http://vodkabears.github.io/vide/&lt;br /&gt;
 *&lt;br /&gt;
 *  Made by Ilya Makarov&lt;br /&gt;
 *  Under MIT License&lt;br /&gt;
 */&lt;br /&gt;
!function(a,b){&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(&amp;quot;object&amp;quot;==typeof exports?require(&amp;quot;jquery&amp;quot;):a.jQuery)}(this,function(a){&amp;quot;use strict&amp;quot;;function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,&amp;quot;:&amp;quot;).replace(/\s*,\s*/g,&amp;quot;,&amp;quot;).split(&amp;quot;,&amp;quot;),h=0,g=f.length;h&amp;lt;g&amp;amp;&amp;amp;(c=f[h],c.search(/^(http|https|ftp):\/\//)===-1&amp;amp;&amp;amp;c.search(&amp;quot;:&amp;quot;)!==-1);h++)b=c.indexOf(&amp;quot;:&amp;quot;),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=&amp;quot;true&amp;quot;===e||&amp;quot;false&amp;quot;!==e&amp;amp;&amp;amp;e),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=isNaN(e)?e:+e),i[d]=e;return null==d&amp;amp;&amp;amp;null==e?a:i}function c(a){a=&amp;quot;&amp;quot;+a;var b,c,d,e=a.split(/\s+/),f=&amp;quot;50%&amp;quot;,g=&amp;quot;50%&amp;quot;;for(d=0,b=e.length;d&amp;lt;b;d++)c=e[d],&amp;quot;left&amp;quot;===c?f=&amp;quot;0%&amp;quot;:&amp;quot;right&amp;quot;===c?f=&amp;quot;100%&amp;quot;:&amp;quot;top&amp;quot;===c?g=&amp;quot;0%&amp;quot;:&amp;quot;bottom&amp;quot;===c?g=&amp;quot;100%&amp;quot;:&amp;quot;center&amp;quot;===c?0===d?f=&amp;quot;50%&amp;quot;:g=&amp;quot;50%&amp;quot;:0===d?f=c:g=c;return{x:f,y:g}}function d(b,c){var d=function(){c(this.src)};a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.gif&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpeg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.png&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d)}function e(c,d,e){if(this.$element=a(c),&amp;quot;string&amp;quot;==typeof d&amp;amp;&amp;amp;(d=b(d)),e?&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=b(e)):e={},&amp;quot;string&amp;quot;==typeof d)d=d.replace(/\.\w*$/,&amp;quot;&amp;quot;);else if(&amp;quot;object&amp;quot;==typeof d)for(var f in d)d.hasOwnProperty(f)&amp;amp;&amp;amp;(d[f]=d[f].replace(/\.\w*$/,&amp;quot;&amp;quot;));this.settings=a.extend({},g,e),this.path=d;try{this.init()}catch(i){if(i.message!==h)throw i}}var f=&amp;quot;vide&amp;quot;,g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:&amp;quot;50% 50%&amp;quot;,posterType:&amp;quot;detect&amp;quot;,resizing:!0,bgColor:&amp;quot;transparent&amp;quot;,className:&amp;quot;&amp;quot;},h=&amp;quot;Not implemented&amp;quot;;e.prototype.init=function(){var b,e,f=this,g=f.path,i=g,j=&amp;quot;&amp;quot;,k=f.$element,l=f.settings,m=c(l.position),n=l.posterType;e=f.$wrapper=a(&amp;quot;&amp;lt;div&amp;gt;&amp;quot;).addClass(l.className).css({position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:0,left:0,bottom:0,right:0,overflow:&amp;quot;hidden&amp;quot;,&amp;quot;-webkit-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-moz-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-o-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-color&amp;quot;:l.bgColor,&amp;quot;background-repeat&amp;quot;:&amp;quot;no-repeat&amp;quot;,&amp;quot;background-position&amp;quot;:m.x+&amp;quot; &amp;quot;+m.y}),&amp;quot;object&amp;quot;==typeof g&amp;amp;&amp;amp;(g.poster?i=g.poster:g.mp4?i=g.mp4:g.webm?i=g.webm:g.ogv&amp;amp;&amp;amp;(i=g.ogv)),&amp;quot;detect&amp;quot;===n?d(i,function(a){e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+a+&amp;quot;)&amp;quot;)}):&amp;quot;none&amp;quot;!==n&amp;amp;&amp;amp;e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+i+&amp;quot;.&amp;quot;+n+&amp;quot;)&amp;quot;),&amp;quot;static&amp;quot;===k.css(&amp;quot;position&amp;quot;)&amp;amp;&amp;amp;k.css(&amp;quot;position&amp;quot;,&amp;quot;relative&amp;quot;),k.prepend(e),&amp;quot;object&amp;quot;==typeof g?(g.mp4&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.mp4+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;#039;),g.webm&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.webm+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;#039;),g.ogv&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.ogv+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;#039;),b=f.$video=a(&amp;quot;&amp;lt;video&amp;gt;&amp;quot;+j+&amp;quot;&amp;lt;/video&amp;gt;&amp;quot;)):b=f.$video=a(&amp;#039;&amp;lt;video&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;lt;/video&amp;gt;&amp;#039;);try{b.prop({autoplay:l.autoplay,loop:l.loop,volume:l.volume,muted:l.muted,defaultMuted:l.muted,playbackRate:l.playbackRate,defaultPlaybackRate:l.playbackRate})}catch(o){throw new Error(h)}b.css({margin:&amp;quot;auto&amp;quot;,position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:m.y,left:m.x,&amp;quot;-webkit-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-ms-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,transform:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,visibility:&amp;quot;hidden&amp;quot;,opacity:0}).one(&amp;quot;canplaythrough.vide&amp;quot;,function(){f.resize()}).one(&amp;quot;playing.vide&amp;quot;,function(){b.css({visibility:&amp;quot;visible&amp;quot;,opacity:1}),e.css(&amp;quot;background-image&amp;quot;,&amp;quot;none&amp;quot;)}),k.on(&amp;quot;resize.vide&amp;quot;,function(){l.resizing&amp;amp;&amp;amp;f.resize()}),e.append(b)},e.prototype.getVideoObject=function(){return this.$video[0]},e.prototype.resize=function(){if(this.$video){var a=this.$wrapper,b=this.$video,c=b[0],d=c.videoHeight,e=c.videoWidth,f=a.height(),g=a.width();g/e&amp;gt;f/d?b.css({width:g+2,height:&amp;quot;auto&amp;quot;}):b.css({width:&amp;quot;auto&amp;quot;,height:f+2})}},e.prototype.destroy=function(){delete a[f].lookup[this.index],this.$video&amp;amp;&amp;amp;this.$video.off(f),this.$element.off(f).removeData(f),this.$wrapper.remove()},a[f]={lookup:[]},a.fn[f]=function(b,c){var d;return this.each(function(){d=a.data(this,f),d&amp;amp;&amp;amp;d.destroy(),d=new e(this,b,c),d.index=a[f].lookup.push(d)-1,a.data(this,f,d)}),this},a(document).ready(function(){var b=a(window);b.on(&amp;quot;resize.vide&amp;quot;,function(){for(var b,c=a[f].lookup.length,d=0;d&amp;lt;c;d++)b=a[f].lookup[d],b&amp;amp;&amp;amp;b.settings.resizing&amp;amp;&amp;amp;b.resize()}),b.on(&amp;quot;unload.vide&amp;quot;,function(){return!1}),a(document).find(&amp;quot;[data-vide-bg]&amp;quot;).each(function(b,c){var d=a(c),e=d.data(&amp;quot;vide-options&amp;quot;),g=d.data(&amp;quot;vide-bg&amp;quot;);d[f](g,e)})})});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Siehe Extra Seite&lt;br /&gt;
&lt;br /&gt;
== Slider &amp;amp; Carousel ==&lt;br /&gt;
=== Slick Carousel &amp;amp; Slider ===&lt;br /&gt;
Der kann fast alles Slider. Gehört mit Owl Slider zu den vielseitigen.&lt;br /&gt;
&lt;br /&gt;
http://kenwheeler.github.io/slick/&lt;br /&gt;
&lt;br /&gt;
=== Owl Carousel===&lt;br /&gt;
[[Owl Carousel - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Revolution Slider ===&lt;br /&gt;
https://revolution.themepunch.com/examples-jquery/&lt;br /&gt;
&lt;br /&gt;
=== FlexSlider ===&lt;br /&gt;
[[FlexSlider - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Schlichter aber vielseitiger Slider mit schönem KenBurns Effekt und div. Übergängen. Erfordert etwas JS Kenntnisse wenn mehr angepasst werden soll.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Vegas Slider]]&lt;br /&gt;
&lt;br /&gt;
=== MultiScroll.js ===&lt;br /&gt;
http://alvarotrigo.com/multiScroll&lt;br /&gt;
&lt;br /&gt;
Gegenläufiger Scroller&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;jquery.multiscroll.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- This following line is needed in case of using the default easing option or when using another&lt;br /&gt;
 one rather than &amp;quot;linear&amp;quot; or &amp;quot;swing&amp;quot;. You can also add the full jQuery UI instead of this file if you prefer --&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;vendors/jquery.easings.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery.multiscroll.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;multiscroll&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-left&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-right&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Elemente manipulieren ==&lt;br /&gt;
=== Match Heights ===&lt;br /&gt;
Spalten in der Länge anpassen. Siehe auch Flex Grid in CSS3&lt;br /&gt;
&lt;br /&gt;
[[Equal Heights]]&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Match Height]]&lt;br /&gt;
&lt;br /&gt;
=== Fit Viewport ===&lt;br /&gt;
==== Viewport Height ====&lt;br /&gt;
Element an die Höhe des Viewports anpassen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  $(document).ready(function(){&lt;br /&gt;
      $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
          $(window).resize(function(){&lt;br /&gt;
              $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
      });&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scrolling ==&lt;br /&gt;
Hinweis die meisten Scroll To and ScrollTops lassen sich auch mit einfachen jquery Snippets realisieren. &lt;br /&gt;
=== Einfaches jQuery Scroll To Top ===&lt;br /&gt;
Mehr brauchts nicht :-) [[Scroll ToTop (jQuery)]]&lt;br /&gt;
&lt;br /&gt;
=== Perfect Scrollbar ===&lt;br /&gt;
[[Perfect Scrollbar]]&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler ScrollTo ===&lt;br /&gt;
https://github.com/flesler/jquery.scrollTo&lt;br /&gt;
&lt;br /&gt;
Lightweight, cross-browser and highly customizable animated scrolling with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler LocalScroll ===&lt;br /&gt;
https://github.com/flesler/jquery.localScroll&lt;br /&gt;
&lt;br /&gt;
Animated anchor navigation made easy with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Smooth Scroll ===&lt;br /&gt;
Oil for Scrolling - damit ruckelt es nicht so beim Scrollen mit dem Mausrad&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// SmoothScroll for websites v1.4.0 (Balazs Galambosi)&lt;br /&gt;
// http://www.smoothscroll.net/&lt;br /&gt;
//&lt;br /&gt;
// Licensed under the terms of the MIT license.&lt;br /&gt;
//&lt;br /&gt;
// You may use it in your theme if you credit me. &lt;br /&gt;
// It is also free to use on any individual website.&lt;br /&gt;
//&lt;br /&gt;
// Exception:&lt;br /&gt;
// The only restriction is to not publish any  &lt;br /&gt;
// extension for browsers or native application&lt;br /&gt;
// without getting a written permission first.&lt;br /&gt;
//&lt;br /&gt;
!function(){function e(){z.keyboardSupport&amp;amp;&amp;amp;m(&amp;quot;keydown&amp;quot;,a)}function t(){if(!A&amp;amp;&amp;amp;document.body){A=!0;var t=document.body,o=document.documentElement,n=window.innerHeight,r=t.scrollHeight;if(B=document.compatMode.indexOf(&amp;quot;CSS&amp;quot;)&amp;gt;=0?o:t,D=t,e(),top!=self)X=!0;else if(r&amp;gt;n&amp;amp;&amp;amp;(t.offsetHeight&amp;lt;=n||o.offsetHeight&amp;lt;=n)){var a=document.createElement(&amp;quot;div&amp;quot;);a.style.cssText=&amp;quot;position:absolute; z-index:-10000; top:0; left:0; right:0; height:&amp;quot;+B.scrollHeight+&amp;quot;px&amp;quot;,document.body.appendChild(a);var i;T=function(){i||(i=setTimeout(function(){L||(a.style.height=&amp;quot;0&amp;quot;,a.style.height=B.scrollHeight+&amp;quot;px&amp;quot;,i=null)},500))},setTimeout(T,10),m(&amp;quot;resize&amp;quot;,T);var l={attributes:!0,childList:!0,characterData:!1};if(M=new V(T),M.observe(t,l),B.offsetHeight&amp;lt;=n){var c=document.createElement(&amp;quot;div&amp;quot;);c.style.clear=&amp;quot;both&amp;quot;,t.appendChild(c)}}z.fixedBackground||L||(t.style.backgroundAttachment=&amp;quot;scroll&amp;quot;,o.style.backgroundAttachment=&amp;quot;scroll&amp;quot;)}}function o(){M&amp;amp;&amp;amp;M.disconnect(),h(I,r),h(&amp;quot;mousedown&amp;quot;,i),h(&amp;quot;keydown&amp;quot;,a),h(&amp;quot;resize&amp;quot;,T),h(&amp;quot;load&amp;quot;,t)}function n(e,t,o){if(p(t,o),1!=z.accelerationMax){var n=Date.now(),r=n-R;if(r&amp;lt;z.accelerationDelta){var a=(1+50/r)/2;a&amp;gt;1&amp;amp;&amp;amp;(a=Math.min(a,z.accelerationMax),t*=a,o*=a)}R=Date.now()}if(q.push({x:t,y:o,lastX:0&amp;gt;t?.99:-.99,lastY:0&amp;gt;o?.99:-.99,start:Date.now()}),!P){var i=e===document.body,l=function(n){for(var r=Date.now(),a=0,c=0,u=0;u&amp;lt;q.length;u++){var d=q[u],s=r-d.start,f=s&amp;gt;=z.animationTime,m=f?1:s/z.animationTime;z.pulseAlgorithm&amp;amp;&amp;amp;(m=x(m));var h=d.x*m-d.lastX&amp;gt;&amp;gt;0,w=d.y*m-d.lastY&amp;gt;&amp;gt;0;a+=h,c+=w,d.lastX+=h,d.lastY+=w,f&amp;amp;&amp;amp;(q.splice(u,1),u--)}i?window.scrollBy(a,c):(a&amp;amp;&amp;amp;(e.scrollLeft+=a),c&amp;amp;&amp;amp;(e.scrollTop+=c)),t||o||(q=[]),q.length?_(l,e,1e3/z.frameRate+1):P=!1};_(l,e,0),P=!0}}function r(e){A||t();var o=e.target,r=u(o);if(!r||e.defaultPrevented||e.ctrlKey)return!0;if(w(D,&amp;quot;embed&amp;quot;)||w(o,&amp;quot;embed&amp;quot;)&amp;amp;&amp;amp;/\.pdf/i.test(o.src)||w(D,&amp;quot;object&amp;quot;))return!0;var a=-e.wheelDeltaX||e.deltaX||0,i=-e.wheelDeltaY||e.deltaY||0;return K&amp;amp;&amp;amp;(e.wheelDeltaX&amp;amp;&amp;amp;b(e.wheelDeltaX,120)&amp;amp;&amp;amp;(a=-120*(e.wheelDeltaX/Math.abs(e.wheelDeltaX))),e.wheelDeltaY&amp;amp;&amp;amp;b(e.wheelDeltaY,120)&amp;amp;&amp;amp;(i=-120*(e.wheelDeltaY/Math.abs(e.wheelDeltaY)))),a||i||(i=-e.wheelDelta||0),1===e.deltaMode&amp;amp;&amp;amp;(a*=40,i*=40),!z.touchpadSupport&amp;amp;&amp;amp;v(i)?!0:(Math.abs(a)&amp;gt;1.2&amp;amp;&amp;amp;(a*=z.stepSize/120),Math.abs(i)&amp;gt;1.2&amp;amp;&amp;amp;(i*=z.stepSize/120),n(r,a,i),e.preventDefault(),void l())}function a(e){var t=e.target,o=e.ctrlKey||e.altKey||e.metaKey||e.shiftKey&amp;amp;&amp;amp;e.keyCode!==N.spacebar;document.contains(D)||(D=document.activeElement);var r=/^(textarea|select|embed|object)$/i,a=/^(button|submit|radio|checkbox|file|color|image)$/i;if(r.test(t.nodeName)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;!a.test(t.type)||w(D,&amp;quot;video&amp;quot;)||y(e)||t.isContentEditable||e.defaultPrevented||o)return!0;if((w(t,&amp;quot;button&amp;quot;)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;a.test(t.type))&amp;amp;&amp;amp;e.keyCode===N.spacebar)return!0;var i,c=0,d=0,s=u(D),f=s.clientHeight;switch(s==document.body&amp;amp;&amp;amp;(f=window.innerHeight),e.keyCode){case N.up:d=-z.arrowScroll;break;case N.down:d=z.arrowScroll;break;case N.spacebar:i=e.shiftKey?1:-1,d=-i*f*.9;break;case N.pageup:d=.9*-f;break;case N.pagedown:d=.9*f;break;case N.home:d=-s.scrollTop;break;case N.end:var m=s.scrollHeight-s.scrollTop-f;d=m&amp;gt;0?m+10:0;break;case N.left:c=-z.arrowScroll;break;case N.right:c=z.arrowScroll;break;default:return!0}n(s,c,d),e.preventDefault(),l()}function i(e){D=e.target}function l(){clearTimeout(E),E=setInterval(function(){F={}},1e3)}function c(e,t){for(var o=e.length;o--;)F[j(e[o])]=t;return t}function u(e){var t=[],o=document.body,n=B.scrollHeight;do{var r=F[j(e)];if(r)return c(t,r);if(t.push(e),n===e.scrollHeight){var a=s(B)&amp;amp;&amp;amp;s(o),i=a||f(B);if(X&amp;amp;&amp;amp;d(B)||!X&amp;amp;&amp;amp;i)return c(t,$())}else if(d(e)&amp;amp;&amp;amp;f(e))return c(t,e)}while(e=e.parentElement)}function d(e){return e.clientHeight+10&amp;lt;e.scrollHeight}function s(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;hidden&amp;quot;!==t}function f(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;scroll&amp;quot;===t||&amp;quot;auto&amp;quot;===t}function m(e,t){window.addEventListener(e,t,!1)}function h(e,t){window.removeEventListener(e,t,!1)}function w(e,t){return(e.nodeName||&amp;quot;&amp;quot;).toLowerCase()===t.toLowerCase()}function p(e,t){e=e&amp;gt;0?1:-1,t=t&amp;gt;0?1:-1,(Y.x!==e||Y.y!==t)&amp;amp;&amp;amp;(Y.x=e,Y.y=t,q=[],R=0)}function v(e){return e?(O.length||(O=[e,e,e]),e=Math.abs(e),O.push(e),O.shift(),clearTimeout(H),H=setTimeout(function(){window.localStorage&amp;amp;&amp;amp;(localStorage.SS_deltaBuffer=O.join(&amp;quot;,&amp;quot;))},1e3),!g(120)&amp;amp;&amp;amp;!g(100)):void 0}function b(e,t){return Math.floor(e/t)==e/t}function g(e){return b(O[0],e)&amp;amp;&amp;amp;b(O[1],e)&amp;amp;&amp;amp;b(O[2],e)}function y(e){var t=e.target,o=!1;if(-1!=document.URL.indexOf(&amp;quot;www.youtube.com/watch&amp;quot;))do if(o=t.classList&amp;amp;&amp;amp;t.classList.contains(&amp;quot;html5-video-controls&amp;quot;))break;while(t=t.parentNode);return o}function S(e){var t,o,n;return e*=z.pulseScale,1&amp;gt;e?t=e-(1-Math.exp(-e)):(o=Math.exp(-1),e-=1,n=1-Math.exp(-e),t=o+n*(1-o)),t*z.pulseNormalize}function x(e){return e&amp;gt;=1?1:0&amp;gt;=e?0:(1==z.pulseNormalize&amp;amp;&amp;amp;(z.pulseNormalize/=S(1)),S(e))}function k(e){for(var t in e)C.hasOwnProperty(t)&amp;amp;&amp;amp;(z[t]=e[t])}var D,M,T,E,H,C={frameRate:150,animationTime:400,stepSize:100,pulseAlgorithm:!0,pulseScale:4,pulseNormalize:1,accelerationDelta:50,accelerationMax:3,keyboardSupport:!0,arrowScroll:50,touchpadSupport:!1,fixedBackground:!0,excluded:&amp;quot;&amp;quot;},z=C,L=!1,X=!1,Y={x:0,y:0},A=!1,B=document.documentElement,O=[],K=/^Mac/.test(navigator.platform),N={left:37,up:38,right:39,down:40,spacebar:32,pageup:33,pagedown:34,end:35,home:36},q=[],P=!1,R=Date.now(),j=function(){var e=0;return function(t){return t.uniqueID||(t.uniqueID=e++)}}(),F={};window.localStorage&amp;amp;&amp;amp;localStorage.SS_deltaBuffer&amp;amp;&amp;amp;(O=localStorage.SS_deltaBuffer.split(&amp;quot;,&amp;quot;));var I,_=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e,t,o){window.setTimeout(e,o||1e3/60)}}(),V=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,$=function(){var e;return function(){if(!e){var t=document.createElement(&amp;quot;div&amp;quot;);t.style.cssText=&amp;quot;height:10000px;width:1px;&amp;quot;,document.body.appendChild(t);var o=document.body.scrollTop;document.documentElement.scrollTop;window.scrollBy(0,1),e=document.body.scrollTop!=o?document.body:document.documentElement,window.scrollBy(0,-1),document.body.removeChild(t)}return e}}(),U=window.navigator.userAgent,W=/Edge/.test(U),G=/chrome/i.test(U)&amp;amp;&amp;amp;!W,J=/safari/i.test(U)&amp;amp;&amp;amp;!W,Q=/mobile/i.test(U),Z=(G||J)&amp;amp;&amp;amp;!Q;&amp;quot;onwheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)?I=&amp;quot;wheel&amp;quot;:&amp;quot;onmousewheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)&amp;amp;&amp;amp;(I=&amp;quot;mousewheel&amp;quot;),I&amp;amp;&amp;amp;Z&amp;amp;&amp;amp;(m(I,r),m(&amp;quot;mousedown&amp;quot;,i),m(&amp;quot;load&amp;quot;,t)),k.destroy=o,window.SmoothScrollOptions&amp;amp;&amp;amp;k(window.SmoothScrollOptions),&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define(function(){return k}):&amp;quot;object&amp;quot;==typeof exports?module.exports=k:window.SmoothScroll=k}();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Typography, Fonts, etc==&lt;br /&gt;
=== Letter.js ===&lt;br /&gt;
Zerpflückt Texte und wrappt Buchstaben / Wörter / Zeilen in durchnummerierte Klassen. Diese kann man dann cool Stylen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/davatron5000/Lettering.js&lt;br /&gt;
&lt;br /&gt;
=== Fittext ===&lt;br /&gt;
Responsive Textgrößen in Typographie-Spielereien für Überschriften etc.&lt;br /&gt;
&lt;br /&gt;
http://fittextjs.com/&lt;br /&gt;
&lt;br /&gt;
=== Prism.js ===&lt;br /&gt;
Syntaxhighlighter&lt;br /&gt;
&lt;br /&gt;
== Google Maps mit gmaps.js ==&lt;br /&gt;
https://hpneo.github.io/gmaps/&lt;br /&gt;
Einfache Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
new GMaps({&lt;br /&gt;
  div: &amp;#039;#map&amp;#039;,&lt;br /&gt;
  lat: -12.043333,&lt;br /&gt;
  lng: -77.028333&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Grey Style Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Google map	&lt;br /&gt;
/*global $:false */&lt;br /&gt;
    var map;&lt;br /&gt;
    $(document).ready(function(){&amp;quot;use strict&amp;quot;;&lt;br /&gt;
      map = new GMaps({&lt;br /&gt;
    disableDefaultUI: true,&lt;br /&gt;
    scrollwheel: false,&lt;br /&gt;
        el: &amp;#039;#map&amp;#039;,&lt;br /&gt;
        lat: 48.4912812,&lt;br /&gt;
        lng: 9.2175255&lt;br /&gt;
      });&lt;br /&gt;
      map.drawOverlay({&lt;br /&gt;
        lat: map.getCenter().lat(),&lt;br /&gt;
        lng: map.getCenter().lng(),&lt;br /&gt;
        layer: &amp;#039;overlayLayer&amp;#039;,&lt;br /&gt;
        content: &amp;#039;&amp;lt;div class=&amp;quot;overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
        verticalAlign: &amp;#039;center&amp;#039;,&lt;br /&gt;
        horizontalAlign: &amp;#039;center&amp;#039;&lt;br /&gt;
      });&lt;br /&gt;
        var styles = [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;visibility&amp;quot;: &amp;quot;on&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.9 },&lt;br /&gt;
      { &amp;quot;lightness&amp;quot;: 37 },&lt;br /&gt;
      { &amp;quot;gamma&amp;quot;: 0.62 },&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -93 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -1 },&lt;br /&gt;
      { &amp;quot;color&amp;quot;: &amp;quot;#ffffff&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.2 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;road&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -98 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;landscape&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -89 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;water&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#cfa144&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.4 },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -38 }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
];&lt;br /&gt;
        &lt;br /&gt;
        map.addStyle({&lt;br /&gt;
            styledMapName:&amp;quot;Styled Map&amp;quot;,&lt;br /&gt;
            styles: styles,&lt;br /&gt;
            mapTypeId: &amp;quot;map_style&amp;quot;  &lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        map.setStyle(&amp;quot;map_style&amp;quot;);	&lt;br /&gt;
		&lt;br /&gt;
    });			&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
(function(root, factory) {&lt;br /&gt;
  if(typeof exports === &amp;#039;object&amp;#039;) {&lt;br /&gt;
    module.exports = factory();&lt;br /&gt;
  }&lt;br /&gt;
  else if(typeof define === &amp;#039;function&amp;#039; &amp;amp;&amp;amp; define.amd) {&lt;br /&gt;
    define([&amp;#039;jquery&amp;#039;, &amp;#039;googlemaps!&amp;#039;], factory);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    root.GMaps = factory();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}(this, function() {&lt;br /&gt;
&lt;br /&gt;
/*!&lt;br /&gt;
 * GMaps.js v0.4.25&lt;br /&gt;
 * http://hpneo.github.com/gmaps/&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2017, Gustavo Leon&lt;br /&gt;
 * Released under the MIT License.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var extend_object = function(obj, new_obj) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === new_obj) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in new_obj) {&lt;br /&gt;
    if (new_obj[name] !== undefined) {&lt;br /&gt;
      obj[name] = new_obj[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var replace_object = function(obj, replace) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === replace) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in replace) {&lt;br /&gt;
    if (obj[name] != undefined) {&lt;br /&gt;
      obj[name] = replace[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_map = function(array, callback) {&lt;br /&gt;
  var original_callback_params = Array.prototype.slice.call(arguments, 2),&lt;br /&gt;
      array_return = [],&lt;br /&gt;
      array_length = array.length,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  if (Array.prototype.map &amp;amp;&amp;amp; array.map === Array.prototype.map) {&lt;br /&gt;
    array_return = Array.prototype.map.call(array, function(item) {&lt;br /&gt;
      var callback_params = original_callback_params.slice(0);&lt;br /&gt;
      callback_params.splice(0, 0, item);&lt;br /&gt;
&lt;br /&gt;
      return callback.apply(this, callback_params);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (i = 0; i &amp;lt; array_length; i++) {&lt;br /&gt;
      callback_params = original_callback_params;&lt;br /&gt;
      callback_params.splice(0, 0, array[i]);&lt;br /&gt;
      array_return.push(callback.apply(this, callback_params));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return array_return;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_flat = function(array) {&lt;br /&gt;
  var new_array = [],&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
    new_array = new_array.concat(array[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new_array;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var coordsToLatLngs = function(coords, useGeoJSON) {&lt;br /&gt;
  var first_coord = coords[0],&lt;br /&gt;
      second_coord = coords[1];&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON) {&lt;br /&gt;
    first_coord = coords[1];&lt;br /&gt;
    second_coord = coords[0];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new google.maps.LatLng(first_coord, second_coord);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var arrayToLatLng = function(coords, useGeoJSON) {&lt;br /&gt;
  var i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; coords.length; i++) {&lt;br /&gt;
    if (!(coords[i] instanceof google.maps.LatLng)) {&lt;br /&gt;
      if (coords[i].length &amp;gt; 0 &amp;amp;&amp;amp; typeof(coords[i][0]) === &amp;quot;object&amp;quot;) {&lt;br /&gt;
        coords[i] = arrayToLatLng(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        coords[i] = coordsToLatLngs(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return coords;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementsByClassName = function (class_name, context) {&lt;br /&gt;
    var element,&lt;br /&gt;
        _class = class_name.replace(&amp;#039;.&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    if (&amp;#039;jQuery&amp;#039; in this &amp;amp;&amp;amp; context) {&lt;br /&gt;
        element = $(&amp;quot;.&amp;quot; + _class, context)[0];&lt;br /&gt;
    } else {&lt;br /&gt;
        element = document.getElementsByClassName(_class)[0];&lt;br /&gt;
    }&lt;br /&gt;
    return element;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementById = function(id, context) {&lt;br /&gt;
  var element,&lt;br /&gt;
  id = id.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  if (&amp;#039;jQuery&amp;#039; in window &amp;amp;&amp;amp; context) {&lt;br /&gt;
    element = $(&amp;#039;#&amp;#039; + id, context)[0];&lt;br /&gt;
  } else {&lt;br /&gt;
    element = document.getElementById(id);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return element;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var findAbsolutePosition = function(obj)  {&lt;br /&gt;
  var curleft = 0,&lt;br /&gt;
      curtop = 0;&lt;br /&gt;
&lt;br /&gt;
  if (obj.getBoundingClientRect) {&lt;br /&gt;
      var rect = obj.getBoundingClientRect();&lt;br /&gt;
      var sx = -(window.scrollX ? window.scrollX : window.pageXOffset);&lt;br /&gt;
      var sy = -(window.scrollY ? window.scrollY : window.pageYOffset);&lt;br /&gt;
&lt;br /&gt;
      return [(rect.left - sx), (rect.top - sy)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (obj.offsetParent) {&lt;br /&gt;
    do {&lt;br /&gt;
      curleft += obj.offsetLeft;&lt;br /&gt;
      curtop += obj.offsetTop;&lt;br /&gt;
    } while (obj = obj.offsetParent);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return [curleft, curtop];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var GMaps = (function(global) {&lt;br /&gt;
  &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  var doc = document;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new GMaps instance, including a Google Maps map.&lt;br /&gt;
   * @class GMaps&lt;br /&gt;
   * @constructs&lt;br /&gt;
   * @param {object} options - `options` accepts all the [MapOptions](https://developers.google.com/maps/documentation/javascript/reference#MapOptions) and [events](https://developers.google.com/maps/documentation/javascript/reference#Map) listed in the Google Maps API. Also accepts:&lt;br /&gt;
   * * `lat` (number): Latitude of the map&amp;#039;s center&lt;br /&gt;
   * * `lng` (number): Longitude of the map&amp;#039;s center&lt;br /&gt;
   * * `el` (string or HTMLElement): container where the map will be rendered&lt;br /&gt;
   * * `markerClusterer` (function): A function to create a marker cluster. You can use MarkerClusterer or MarkerClustererPlus.&lt;br /&gt;
   */&lt;br /&gt;
  var GMaps = function(options) {&lt;br /&gt;
&lt;br /&gt;
    if (!(typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps)) {&lt;br /&gt;
      if (typeof window.console === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.console.error) {&lt;br /&gt;
        console.error(&amp;#039;Google Maps API is required. Please register the following JavaScript library https://maps.googleapis.com/maps/api/js.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return function() {};&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!this) return new GMaps(options);&lt;br /&gt;
&lt;br /&gt;
    options.zoom = options.zoom || 15;&lt;br /&gt;
    options.mapType = options.mapType || &amp;#039;roadmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var valueOrDefault = function(value, defaultValue) {&lt;br /&gt;
      return value === undefined ? defaultValue : value;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var self = this,&lt;br /&gt;
        i,&lt;br /&gt;
        events_that_hide_context_menu = [&lt;br /&gt;
          &amp;#039;bounds_changed&amp;#039;, &amp;#039;center_changed&amp;#039;, &amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;,&lt;br /&gt;
          &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;idle&amp;#039;, &amp;#039;maptypeid_changed&amp;#039;, &amp;#039;projection_changed&amp;#039;,&lt;br /&gt;
          &amp;#039;resize&amp;#039;, &amp;#039;tilesloaded&amp;#039;, &amp;#039;zoom_changed&amp;#039;&lt;br /&gt;
        ],&lt;br /&gt;
        events_that_doesnt_hide_context_menu = [&amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;],&lt;br /&gt;
        options_to_be_deleted = [&amp;#039;el&amp;#039;, &amp;#039;lat&amp;#039;, &amp;#039;lng&amp;#039;, &amp;#039;mapType&amp;#039;, &amp;#039;width&amp;#039;, &amp;#039;height&amp;#039;, &amp;#039;markerClusterer&amp;#039;, &amp;#039;enableNewStyle&amp;#039;],&lt;br /&gt;
        identifier = options.el || options.div,&lt;br /&gt;
        markerClustererFunction = options.markerClusterer,&lt;br /&gt;
        mapType = google.maps.MapTypeId[options.mapType.toUpperCase()],&lt;br /&gt;
        map_center = new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        zoomControl = valueOrDefault(options.zoomControl, true),&lt;br /&gt;
        zoomControlOpt = options.zoomControlOpt || {&lt;br /&gt;
          style: &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
          position: &amp;#039;TOP_LEFT&amp;#039;&lt;br /&gt;
        },&lt;br /&gt;
        zoomControlStyle = zoomControlOpt.style || &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
        zoomControlPosition = zoomControlOpt.position || &amp;#039;TOP_LEFT&amp;#039;,&lt;br /&gt;
        panControl = valueOrDefault(options.panControl, true),&lt;br /&gt;
        mapTypeControl = valueOrDefault(options.mapTypeControl, true),&lt;br /&gt;
        scaleControl = valueOrDefault(options.scaleControl, true),&lt;br /&gt;
        streetViewControl = valueOrDefault(options.streetViewControl, true),&lt;br /&gt;
        overviewMapControl = valueOrDefault(overviewMapControl, true),&lt;br /&gt;
        map_options = {},&lt;br /&gt;
        map_base_options = {&lt;br /&gt;
          zoom: this.zoom,&lt;br /&gt;
          center: map_center,&lt;br /&gt;
          mapTypeId: mapType&lt;br /&gt;
        },&lt;br /&gt;
        map_controls_options = {&lt;br /&gt;
          panControl: panControl,&lt;br /&gt;
          zoomControl: zoomControl,&lt;br /&gt;
          zoomControlOptions: {&lt;br /&gt;
            style: google.maps.ZoomControlStyle[zoomControlStyle],&lt;br /&gt;
            position: google.maps.ControlPosition[zoomControlPosition]&lt;br /&gt;
          },&lt;br /&gt;
          mapTypeControl: mapTypeControl,&lt;br /&gt;
          scaleControl: scaleControl,&lt;br /&gt;
          streetViewControl: streetViewControl,&lt;br /&gt;
          overviewMapControl: overviewMapControl&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
      if (typeof(options.el) === &amp;#039;string&amp;#039; || typeof(options.div) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
        if (identifier.indexOf(&amp;quot;#&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Container element&lt;br /&gt;
             *&lt;br /&gt;
             * @type {HTMLElement}&lt;br /&gt;
             */&lt;br /&gt;
            this.el = getElementById(identifier, options.context);&lt;br /&gt;
        } else {&lt;br /&gt;
            this.el = getElementsByClassName.apply(this, [identifier, options.context]);&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
          this.el = identifier;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if (typeof(this.el) === &amp;#039;undefined&amp;#039; || this.el === null) {&lt;br /&gt;
      throw &amp;#039;No element defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.context_menu = window.context_menu || {};&lt;br /&gt;
    window.context_menu[self.el.id] = {};&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of custom controls in the map UI&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.controls = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s overlays&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.overlays = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of KML/GeoRSS and FusionTable layers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.layers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of data layers (See {@link GMaps#addLayer})&lt;br /&gt;
     *&lt;br /&gt;
     * @type {object}&lt;br /&gt;
     */&lt;br /&gt;
    this.singleLayers = {};&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s markers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.markers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s lines&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polylines = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s routes requested by {@link GMaps#getRoutes}, {@link GMaps#renderRoute}, {@link GMaps#drawRoute}, {@link GMaps#travelRoute} or {@link GMaps#drawSteppedRoute}&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.routes = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s polygons&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polygons = [];&lt;br /&gt;
    this.infoWindow = null;&lt;br /&gt;
    this.overlay_el = null;&lt;br /&gt;
    /**&lt;br /&gt;
     * Current map&amp;#039;s zoom&lt;br /&gt;
     *&lt;br /&gt;
     * @type {number}&lt;br /&gt;
     */&lt;br /&gt;
    this.zoom = options.zoom;&lt;br /&gt;
    this.registered_events = {};&lt;br /&gt;
&lt;br /&gt;
    this.el.style.width = options.width || this.el.scrollWidth || this.el.offsetWidth;&lt;br /&gt;
    this.el.style.height = options.height || this.el.scrollHeight || this.el.offsetHeight;&lt;br /&gt;
&lt;br /&gt;
    google.maps.visualRefresh = options.enableNewStyle;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; options_to_be_deleted.length; i++) {&lt;br /&gt;
      delete options[options_to_be_deleted[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(options.disableDefaultUI != true) {&lt;br /&gt;
      map_base_options = extend_object(map_base_options, map_controls_options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    map_options = extend_object(map_base_options, options);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_doesnt_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_doesnt_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Google Maps map instance&lt;br /&gt;
     *&lt;br /&gt;
     * @type {google.maps.Map}&lt;br /&gt;
     */&lt;br /&gt;
    this.map = new google.maps.Map(this.el, map_options);&lt;br /&gt;
&lt;br /&gt;
    if (markerClustererFunction) {&lt;br /&gt;
      /**&lt;br /&gt;
       * Marker Clusterer instance&lt;br /&gt;
       *&lt;br /&gt;
       * @type {object}&lt;br /&gt;
       */&lt;br /&gt;
      this.markerClusterer = markerClustererFunction.apply(this, [this.map]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var buildContextMenuHTML = function(control, e) {&lt;br /&gt;
      var html = &amp;#039;&amp;#039;,&lt;br /&gt;
          options = window.context_menu[self.el.id][control];&lt;br /&gt;
&lt;br /&gt;
      for (var i in options){&lt;br /&gt;
        if (options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options[i];&lt;br /&gt;
&lt;br /&gt;
          html += &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a id=&amp;quot;&amp;#039; + control + &amp;#039;_&amp;#039; + i + &amp;#039;&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;&amp;#039; + option.title + &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) return;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.innerHTML = html;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_items = context_menu_element.getElementsByTagName(&amp;#039;a&amp;#039;),&lt;br /&gt;
          context_menu_items_count = context_menu_items.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; context_menu_items_count; i++) {&lt;br /&gt;
        var context_menu_item = context_menu_items[i];&lt;br /&gt;
&lt;br /&gt;
        var assign_menu_item_action = function(ev){&lt;br /&gt;
          ev.preventDefault();&lt;br /&gt;
&lt;br /&gt;
          options[this.id.replace(control + &amp;#039;_&amp;#039;, &amp;#039;&amp;#039;)].action.apply(self, [e]);&lt;br /&gt;
          self.hideContextMenu();&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        google.maps.event.clearListeners(context_menu_item, &amp;#039;click&amp;#039;);&lt;br /&gt;
        google.maps.event.addDomListenerOnce(context_menu_item, &amp;#039;click&amp;#039;, assign_menu_item_action, false);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var position = findAbsolutePosition.apply(this, [self.el]),&lt;br /&gt;
          left = position[0] + e.pixel.x - 15,&lt;br /&gt;
          top = position[1] + e.pixel.y- 15;&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.style.left = left + &amp;quot;px&amp;quot;;&lt;br /&gt;
      context_menu_element.style.top = top + &amp;quot;px&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      // context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this.buildContextMenu = function(control, e) {&lt;br /&gt;
      if (control === &amp;#039;marker&amp;#039;) {&lt;br /&gt;
        e.pixel = {};&lt;br /&gt;
&lt;br /&gt;
        var overlay = new google.maps.OverlayView();&lt;br /&gt;
        overlay.setMap(self.map);&lt;br /&gt;
&lt;br /&gt;
        overlay.draw = function() {&lt;br /&gt;
          var projection = overlay.getProjection(),&lt;br /&gt;
              position = e.marker.getPosition();&lt;br /&gt;
&lt;br /&gt;
          e.pixel = projection.fromLatLngToContainerPixel(position);&lt;br /&gt;
&lt;br /&gt;
          buildContextMenuHTML(control, e);&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        buildContextMenuHTML(control, e);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      setTimeout(function() {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
      }, 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Add a context menu for a map or a marker.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {object} options - The `options` object should contain:&lt;br /&gt;
     * * `control` (string): Kind of control the context menu will be attached. Can be &amp;quot;map&amp;quot; or &amp;quot;marker&amp;quot;.&lt;br /&gt;
     * * `options` (array): A collection of context menu items:&lt;br /&gt;
     *   * `title` (string): Item&amp;#039;s title shown in the context menu.&lt;br /&gt;
     *   * `name` (string): Item&amp;#039;s identifier.&lt;br /&gt;
     *   * `action` (function): Function triggered after selecting the context menu item.&lt;br /&gt;
     */&lt;br /&gt;
    this.setContextMenu = function(options) {&lt;br /&gt;
      window.context_menu[self.el.id][options.control] = {};&lt;br /&gt;
&lt;br /&gt;
      var i,&lt;br /&gt;
          ul = doc.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      for (i in options.options) {&lt;br /&gt;
        if (options.options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options.options[i];&lt;br /&gt;
&lt;br /&gt;
          window.context_menu[self.el.id][options.control][option.name] = {&lt;br /&gt;
            title: option.title,&lt;br /&gt;
            action: option.action&lt;br /&gt;
          };&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ul.id = &amp;#039;gmaps_context_menu&amp;#039;;&lt;br /&gt;
      ul.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.position = &amp;#039;absolute&amp;#039;;&lt;br /&gt;
      ul.style.minWidth = &amp;#039;100px&amp;#039;;&lt;br /&gt;
      ul.style.background = &amp;#039;white&amp;#039;;&lt;br /&gt;
      ul.style.listStyle = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.padding = &amp;#039;8px&amp;#039;;&lt;br /&gt;
      ul.style.boxShadow = &amp;#039;2px 2px 6px #ccc&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) {&lt;br /&gt;
        doc.body.appendChild(ul);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      google.maps.event.addDomListener(context_menu_element, &amp;#039;mouseout&amp;#039;, function(ev) {&lt;br /&gt;
        if (!ev.relatedTarget || !this.contains(ev.relatedTarget)) {&lt;br /&gt;
          window.setTimeout(function(){&lt;br /&gt;
            context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
          }, 400);&lt;br /&gt;
        }&lt;br /&gt;
      }, false);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Hide the current context menu&lt;br /&gt;
     */&lt;br /&gt;
    this.hideContextMenu = function() {&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (context_menu_element) {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var setupListener = function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
        if (e == undefined) {&lt;br /&gt;
          e = this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        options[name].apply(this, [e]);&lt;br /&gt;
&lt;br /&gt;
        self.hideContextMenu();&lt;br /&gt;
      });&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    //google.maps.event.addListener(this.map, &amp;#039;idle&amp;#039;, this.hideContextMenu);&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;zoom_changed&amp;#039;, this.hideContextMenu);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_doesnt_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_doesnt_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
      if (options.rightclick) {&lt;br /&gt;
        options.rightclick.apply(this, [e]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(window.context_menu[self.el.id][&amp;#039;map&amp;#039;] != undefined) {&lt;br /&gt;
        self.buildContextMenu(&amp;#039;map&amp;#039;, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Trigger a `resize` event, useful if you need to repaint the current map (for changes in the viewport or display / hide actions).&lt;br /&gt;
     */&lt;br /&gt;
    this.refresh = function() {&lt;br /&gt;
      google.maps.event.trigger(this.map, &amp;#039;resize&amp;#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the markers added in the map.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitZoom = function() {&lt;br /&gt;
      var latLngs = [],&lt;br /&gt;
          markers_length = this.markers.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; markers_length; i++) {&lt;br /&gt;
        if(typeof(this.markers[i].visible) === &amp;#039;boolean&amp;#039; &amp;amp;&amp;amp; this.markers[i].visible) {&lt;br /&gt;
          latLngs.push(this.markers[i].getPosition());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.fitLatLngBounds(latLngs);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the coordinates in the `latLngs` array.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {array} latLngs - Collection of `google.maps.LatLng` objects.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitLatLngBounds = function(latLngs) {&lt;br /&gt;
      var total = latLngs.length,&lt;br /&gt;
          bounds = new google.maps.LatLngBounds(),&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for(i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
        bounds.extend(latLngs[i]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.map.fitBounds(bounds);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Center the map using the `lat` and `lng` coordinates.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} lat - Latitude of the coordinate.&lt;br /&gt;
     * @param {number} lng - Longitude of the coordinate.&lt;br /&gt;
     * @param {function} [callback] - Callback that will be executed after the map is centered.&lt;br /&gt;
     */&lt;br /&gt;
    this.setCenter = function(lat, lng, callback) {&lt;br /&gt;
      this.map.panTo(new google.maps.LatLng(lat, lng));&lt;br /&gt;
&lt;br /&gt;
      if (callback) {&lt;br /&gt;
        callback();&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Return the HTML element container of the map.&lt;br /&gt;
     *&lt;br /&gt;
     * @returns {HTMLElement} the element container.&lt;br /&gt;
     */&lt;br /&gt;
    this.getElement = function() {&lt;br /&gt;
      return this.el;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Increase the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed in.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomIn = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() + value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Decrease the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed out.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomOut = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() - value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var native_methods = [],&lt;br /&gt;
        method;&lt;br /&gt;
&lt;br /&gt;
    for (method in this.map) {&lt;br /&gt;
      if (typeof(this.map[method]) == &amp;#039;function&amp;#039; &amp;amp;&amp;amp; !this[method]) {&lt;br /&gt;
        native_methods.push(method);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; native_methods.length; i++) {&lt;br /&gt;
      (function(gmaps, scope, method_name) {&lt;br /&gt;
        gmaps[method_name] = function(){&lt;br /&gt;
          return scope[method_name].apply(scope, arguments);&lt;br /&gt;
        };&lt;br /&gt;
      })(this, this.map, native_methods[i]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return GMaps;&lt;br /&gt;
})(this);&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createControl = function(options) {&lt;br /&gt;
  var control = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  control.style.cursor = &amp;#039;pointer&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.disableDefaultStyles !== true) {&lt;br /&gt;
    control.style.fontFamily = &amp;#039;Roboto, Arial, sans-serif&amp;#039;;&lt;br /&gt;
    control.style.fontSize = &amp;#039;11px&amp;#039;;&lt;br /&gt;
    control.style.boxShadow = &amp;#039;rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var option in options.style) {&lt;br /&gt;
    control.style[option] = options.style[option];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.id) {&lt;br /&gt;
    control.id = options.id;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.title) {&lt;br /&gt;
    control.title = options.title;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.classes) {&lt;br /&gt;
    control.className = options.classes;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.content) {&lt;br /&gt;
    if (typeof options.content === &amp;#039;string&amp;#039;) {&lt;br /&gt;
      control.innerHTML = options.content;&lt;br /&gt;
    }&lt;br /&gt;
    else if (options.content instanceof HTMLElement) {&lt;br /&gt;
      control.appendChild(options.content);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.position) {&lt;br /&gt;
    control.position = google.maps.ControlPosition[options.position.toUpperCase()];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev in options.events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addDomListener(object, name, function(){&lt;br /&gt;
        options.events[name].apply(this, [this]);&lt;br /&gt;
      });&lt;br /&gt;
    })(control, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  control.index = 1;&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Add a custom control to the map UI.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {object} options - The `options` object should contain:&lt;br /&gt;
 * * `style` (object): The keys and values of this object should be valid CSS properties and values.&lt;br /&gt;
 * * `id` (string): The HTML id for the custom control.&lt;br /&gt;
 * * `classes` (string): A string containing all the HTML classes for the custom control.&lt;br /&gt;
 * * `content` (string or HTML element): The content of the custom control.&lt;br /&gt;
 * * `position` (string): Any valid [`google.maps.ControlPosition`](https://developers.google.com/maps/documentation/javascript/controls#ControlPositioning) value, in lower or upper case.&lt;br /&gt;
 * * `events` (object): The keys of this object should be valid DOM events. The values should be functions.&lt;br /&gt;
 * * `disableDefaultStyles` (boolean): If false, removes the default styles for the controls like font (family and size), and box shadow.&lt;br /&gt;
 * @returns {HTMLElement}&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.addControl = function(options) {&lt;br /&gt;
  var control = this.createControl(options);&lt;br /&gt;
&lt;br /&gt;
  this.controls.push(control);&lt;br /&gt;
  this.map.controls[control.position].push(control);&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Remove a control from the map. `control` should be a control returned by `addControl()`.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {HTMLElement} control - One of the controls returned by `addControl()`.&lt;br /&gt;
 * @returns {HTMLElement} the removed control.&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.removeControl = function(control) {&lt;br /&gt;
  var position = null,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; this.controls.length; i++) {&lt;br /&gt;
    if (this.controls[i] == control) {&lt;br /&gt;
      position = this.controls[i].position;&lt;br /&gt;
      this.controls.splice(i, 1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (position) {&lt;br /&gt;
    for (i = 0; i &amp;lt; this.map.controls.length; i++) {&lt;br /&gt;
      var controlsForPosition = this.map.controls[control.position];&lt;br /&gt;
&lt;br /&gt;
      if (controlsForPosition.getAt(i) == control) {&lt;br /&gt;
        controlsForPosition.removeAt(i);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createMarker = function(options) {&lt;br /&gt;
  if (options.lat == undefined &amp;amp;&amp;amp; options.lng == undefined &amp;amp;&amp;amp; options.position == undefined) {&lt;br /&gt;
    throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      details = options.details,&lt;br /&gt;
      fences = options.fences,&lt;br /&gt;
      outside = options.outside,&lt;br /&gt;
      base_options = {&lt;br /&gt;
        position: new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        map: null&lt;br /&gt;
      },&lt;br /&gt;
      marker_options = extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  delete marker_options.lat;&lt;br /&gt;
  delete marker_options.lng;&lt;br /&gt;
  delete marker_options.fences;&lt;br /&gt;
  delete marker_options.outside;&lt;br /&gt;
&lt;br /&gt;
  var marker = new google.maps.Marker(marker_options);&lt;br /&gt;
&lt;br /&gt;
  marker.fences = fences;&lt;br /&gt;
&lt;br /&gt;
  if (options.infoWindow) {&lt;br /&gt;
    marker.infoWindow = new google.maps.InfoWindow(options.infoWindow);&lt;br /&gt;
&lt;br /&gt;
    var info_window_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;content_changed&amp;#039;, &amp;#039;domready&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; info_window_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        if (options.infoWindow[name]) {&lt;br /&gt;
          google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
            options.infoWindow[name].apply(this, [e]);&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      })(marker.infoWindow, info_window_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var marker_events = [&amp;#039;animation_changed&amp;#039;, &amp;#039;clickable_changed&amp;#039;, &amp;#039;cursor_changed&amp;#039;, &amp;#039;draggable_changed&amp;#039;, &amp;#039;flat_changed&amp;#039;, &amp;#039;icon_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;shadow_changed&amp;#039;, &amp;#039;shape_changed&amp;#039;, &amp;#039;title_changed&amp;#039;, &amp;#039;visible_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  var marker_events_with_mouse = [&amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;, &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this, [this]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(marker, marker_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events_with_mouse.length; ev++) {&lt;br /&gt;
    (function(map, object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(me){&lt;br /&gt;
          if(!me.pixel){&lt;br /&gt;
            me.pixel = map.getProjection().fromLatLngToPoint(me.latLng)&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          options[name].apply(this, [me]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(this.map, marker, marker_events_with_mouse[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
    this.details = details;&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      options.click.apply(this, [this]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      self.hideInfoWindows();&lt;br /&gt;
      marker.infoWindow.open(self.map, marker);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
    e.marker = this;&lt;br /&gt;
&lt;br /&gt;
    if (options.rightclick) {&lt;br /&gt;
      options.rightclick.apply(this, [e]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (window.context_menu[self.el.id][&amp;#039;marker&amp;#039;] != undefined) {&lt;br /&gt;
      self.buildContextMenu(&amp;#039;marker&amp;#039;, e);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    google.maps.event.addListener(marker, &amp;#039;dragend&amp;#039;, function() {&lt;br /&gt;
      self.checkMarkerGeofence(marker, function(m, f) {&lt;br /&gt;
        outside(m, f);&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarker = function(options) {&lt;br /&gt;
  var marker;&lt;br /&gt;
  if(options.hasOwnProperty(&amp;#039;gm_accessors_&amp;#039;)) {&lt;br /&gt;
    // Native google.maps.Marker object&lt;br /&gt;
    marker = options;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if ((options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) || options.position) {&lt;br /&gt;
      marker = this.createMarker(options);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  marker.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if(this.markerClusterer) {&lt;br /&gt;
    this.markerClusterer.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.markers.push(marker);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;marker_added&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarkers = function(array) {&lt;br /&gt;
  for (var i = 0, marker; marker=array[i]; i++) {&lt;br /&gt;
    this.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return this.markers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.hideInfoWindows = function() {&lt;br /&gt;
  for (var i = 0, marker; marker = this.markers[i]; i++){&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      marker.infoWindow.close();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarker = function(marker) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
    if (this.markers[i] === marker) {&lt;br /&gt;
      this.markers[i].setMap(null);&lt;br /&gt;
      this.markers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      if(this.markerClusterer) {&lt;br /&gt;
        this.markerClusterer.removeMarker(marker);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarkers = function (collection) {&lt;br /&gt;
  var new_markers = [];&lt;br /&gt;
&lt;br /&gt;
  if (typeof collection == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(this.markerClusterer &amp;amp;&amp;amp; this.markerClusterer.clearMarkers) {&lt;br /&gt;
      this.markerClusterer.clearMarkers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; collection.length; i++) {&lt;br /&gt;
      var index = this.markers.indexOf(collection[i]);&lt;br /&gt;
&lt;br /&gt;
      if (index &amp;gt; -1) {&lt;br /&gt;
        var marker = this.markers[index];&lt;br /&gt;
        marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
        if(this.markerClusterer) {&lt;br /&gt;
          this.markerClusterer.removeMarker(marker);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      if (marker.getMap() != null) {&lt;br /&gt;
        new_markers.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawOverlay = function(options) {&lt;br /&gt;
  var overlay = new google.maps.OverlayView(),&lt;br /&gt;
      auto_show = true;&lt;br /&gt;
&lt;br /&gt;
  overlay.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if (options.auto_show != null) {&lt;br /&gt;
    auto_show = options.auto_show;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  overlay.onAdd = function() {&lt;br /&gt;
    var el = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    el.style.borderStyle = &amp;quot;none&amp;quot;;&lt;br /&gt;
    el.style.borderWidth = &amp;quot;0px&amp;quot;;&lt;br /&gt;
    el.style.position = &amp;quot;absolute&amp;quot;;&lt;br /&gt;
    el.style.zIndex = 100;&lt;br /&gt;
    el.innerHTML = options.content;&lt;br /&gt;
&lt;br /&gt;
    overlay.el = el;&lt;br /&gt;
&lt;br /&gt;
    if (!options.layer) {&lt;br /&gt;
      options.layer = &amp;#039;overlayLayer&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var panes = this.getPanes(),&lt;br /&gt;
        overlayLayer = panes[options.layer],&lt;br /&gt;
        stop_overlay_events = [&amp;#039;contextmenu&amp;#039;, &amp;#039;DOMMouseScroll&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    overlayLayer.appendChild(el);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; stop_overlay_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        google.maps.event.addDomListener(object, name, function(e){&lt;br /&gt;
          if (navigator.userAgent.toLowerCase().indexOf(&amp;#039;msie&amp;#039;) != -1 &amp;amp;&amp;amp; document.all) {&lt;br /&gt;
            e.cancelBubble = true;&lt;br /&gt;
            e.returnValue = false;&lt;br /&gt;
          }&lt;br /&gt;
          else {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
      })(el, stop_overlay_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      panes.overlayMouseTarget.appendChild(overlay.el);&lt;br /&gt;
      google.maps.event.addDomListener(overlay.el, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
        options.click.apply(overlay, [overlay]);&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.trigger(this, &amp;#039;ready&amp;#039;);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.draw = function() {&lt;br /&gt;
    var projection = this.getProjection(),&lt;br /&gt;
        pixel = projection.fromLatLngToDivPixel(new google.maps.LatLng(options.lat, options.lng));&lt;br /&gt;
&lt;br /&gt;
    options.horizontalOffset = options.horizontalOffset || 0;&lt;br /&gt;
    options.verticalOffset = options.verticalOffset || 0;&lt;br /&gt;
&lt;br /&gt;
    var el = overlay.el,&lt;br /&gt;
        content = el.children[0],&lt;br /&gt;
        content_height = content.clientHeight,&lt;br /&gt;
        content_width = content.clientWidth;&lt;br /&gt;
&lt;br /&gt;
    switch (options.verticalAlign) {&lt;br /&gt;
      case &amp;#039;top&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - content_height + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;middle&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - (content_height / 2) + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;bottom&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (options.horizontalAlign) {&lt;br /&gt;
      case &amp;#039;left&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - content_width + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;center&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - (content_width / 2) + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;right&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    el.style.display = auto_show ? &amp;#039;block&amp;#039; : &amp;#039;none&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (!auto_show) {&lt;br /&gt;
      options.show.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.onRemove = function() {&lt;br /&gt;
    var el = overlay.el;&lt;br /&gt;
&lt;br /&gt;
    if (options.remove) {&lt;br /&gt;
      options.remove.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      overlay.el.parentNode.removeChild(overlay.el);&lt;br /&gt;
      overlay.el = null;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.overlays.push(overlay);&lt;br /&gt;
  return overlay;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlay = function(overlay) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.overlays.length; i++) {&lt;br /&gt;
    if (this.overlays[i] === overlay) {&lt;br /&gt;
      this.overlays[i].setMap(null);&lt;br /&gt;
      this.overlays.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlays = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.overlays[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.overlays = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolyline = function(options) {&lt;br /&gt;
  var path = [],&lt;br /&gt;
      points = options.path;&lt;br /&gt;
&lt;br /&gt;
  if (points.length) {&lt;br /&gt;
    if (points[0][0] === undefined) {&lt;br /&gt;
      path = points;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      for (var i = 0, latlng; latlng = points[i]; i++) {&lt;br /&gt;
        path.push(new google.maps.LatLng(latlng[0], latlng[1]));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    path: path,&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight,&lt;br /&gt;
    geodesic: options.geodesic,&lt;br /&gt;
    clickable: true,&lt;br /&gt;
    editable: false,&lt;br /&gt;
    visible: true&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;clickable&amp;quot;)) {&lt;br /&gt;
    polyline_options.clickable = options.clickable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;editable&amp;quot;)) {&lt;br /&gt;
    polyline_options.editable = options.editable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;zIndex&amp;quot;)) {&lt;br /&gt;
    polyline_options.zIndex = options.zIndex;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline = new google.maps.Polyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
  var polyline_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polyline_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polyline, polyline_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines.push(polyline);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polyline_added&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
  return polyline;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolyline = function(polyline) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polylines.length; i++) {&lt;br /&gt;
    if (this.polylines[i] === polyline) {&lt;br /&gt;
      this.polylines[i].setMap(null);&lt;br /&gt;
      this.polylines.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polyline_removed&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolylines = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polylines[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawCircle = function(options) {&lt;br /&gt;
  options =  extend_object({&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    center: new google.maps.LatLng(options.lat, options.lng)&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Circle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRectangle = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  var latLngBounds = new google.maps.LatLngBounds(&lt;br /&gt;
    new google.maps.LatLng(options.bounds[0][0], options.bounds[0][1]),&lt;br /&gt;
    new google.maps.LatLng(options.bounds[1][0], options.bounds[1][1])&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  options.bounds = latLngBounds;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Rectangle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolygon = function(options) {&lt;br /&gt;
  var useGeoJSON = false;&lt;br /&gt;
&lt;br /&gt;
  if(options.hasOwnProperty(&amp;quot;useGeoJSON&amp;quot;)) {&lt;br /&gt;
    useGeoJSON = options.useGeoJSON;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.useGeoJSON;&lt;br /&gt;
&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON == false) {&lt;br /&gt;
    options.paths = [options.paths.slice(0)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.paths.length &amp;gt; 0) {&lt;br /&gt;
    if (options.paths[0].length &amp;gt; 0) {&lt;br /&gt;
      options.paths = array_flat(array_map(options.paths, arrayToLatLng, useGeoJSON));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Polygon(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polygon_added&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygon = function(polygon) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polygons.length; i++) {&lt;br /&gt;
    if (this.polygons[i] === polygon) {&lt;br /&gt;
      this.polygons[i].setMap(null);&lt;br /&gt;
      this.polygons.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polygon_removed&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygons = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polygons[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromFusionTables = function(options) {&lt;br /&gt;
  var events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var fusion_tables_options = options,&lt;br /&gt;
      layer = new google.maps.FusionTablesLayer(fusion_tables_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromFusionTables = function(options) {&lt;br /&gt;
  var layer = this.getFromFusionTables(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromKML = function(options) {&lt;br /&gt;
  var url = options.url,&lt;br /&gt;
      events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.url;&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var kml_options = options,&lt;br /&gt;
      layer = new google.maps.KmlLayer(url, kml_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromKML = function(options) {&lt;br /&gt;
  var layer = this.getFromKML(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addLayer = function(layerName, options) {&lt;br /&gt;
  //var default_layers = [&amp;#039;weather&amp;#039;, &amp;#039;clouds&amp;#039;, &amp;#039;traffic&amp;#039;, &amp;#039;transit&amp;#039;, &amp;#039;bicycling&amp;#039;, &amp;#039;panoramio&amp;#039;, &amp;#039;places&amp;#039;];&lt;br /&gt;
  options = options || {};&lt;br /&gt;
  var layer;&lt;br /&gt;
&lt;br /&gt;
  switch(layerName) {&lt;br /&gt;
    case &amp;#039;weather&amp;#039;: this.singleLayers.weather = layer = new google.maps.weather.WeatherLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;clouds&amp;#039;: this.singleLayers.clouds = layer = new google.maps.weather.CloudLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;traffic&amp;#039;: this.singleLayers.traffic = layer = new google.maps.TrafficLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;: this.singleLayers.transit = layer = new google.maps.TransitLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;: this.singleLayers.bicycling = layer = new google.maps.BicyclingLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;panoramio&amp;#039;:&lt;br /&gt;
        this.singleLayers.panoramio = layer = new google.maps.panoramio.PanoramioLayer();&lt;br /&gt;
        layer.setTag(options.filter);&lt;br /&gt;
        delete options.filter;&lt;br /&gt;
&lt;br /&gt;
        //click event&lt;br /&gt;
        if (options.click) {&lt;br /&gt;
          google.maps.event.addListener(layer, &amp;#039;click&amp;#039;, function(event) {&lt;br /&gt;
            options.click(event);&lt;br /&gt;
            delete options.click;&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
      case &amp;#039;places&amp;#039;:&lt;br /&gt;
        this.singleLayers.places = layer = new google.maps.places.PlacesService(this.map);&lt;br /&gt;
&lt;br /&gt;
        //search, nearbySearch, radarSearch callback, Both are the same&lt;br /&gt;
        if (options.search || options.nearbySearch || options.radarSearch) {&lt;br /&gt;
          var placeSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            keyword : options.keyword || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            name : options.name || null,&lt;br /&gt;
            radius : options.radius || null,&lt;br /&gt;
            rankBy : options.rankBy || null,&lt;br /&gt;
            types : options.types || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          if (options.radarSearch) {&lt;br /&gt;
            layer.radarSearch(placeSearchRequest, options.radarSearch);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.search) {&lt;br /&gt;
            layer.search(placeSearchRequest, options.search);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.nearbySearch) {&lt;br /&gt;
            layer.nearbySearch(placeSearchRequest, options.nearbySearch);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //textSearch callback&lt;br /&gt;
        if (options.textSearch) {&lt;br /&gt;
          var textSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            query : options.query || null,&lt;br /&gt;
            radius : options.radius || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          layer.textSearch(textSearchRequest, options.textSearch);&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (layer !== undefined) {&lt;br /&gt;
    if (typeof layer.setOptions == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setOptions(options);&lt;br /&gt;
    }&lt;br /&gt;
    if (typeof layer.setMap == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setMap(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return layer;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeLayer = function(layer) {&lt;br /&gt;
  if (typeof(layer) == &amp;quot;string&amp;quot; &amp;amp;&amp;amp; this.singleLayers[layer] !== undefined) {&lt;br /&gt;
     this.singleLayers[layer].setMap(null);&lt;br /&gt;
&lt;br /&gt;
     delete this.singleLayers[layer];&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.layers.length; i++) {&lt;br /&gt;
      if (this.layers[i] === layer) {&lt;br /&gt;
        this.layers[i].setMap(null);&lt;br /&gt;
        this.layers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var travelMode, unitSystem;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getRoutes = function(options) {&lt;br /&gt;
  switch (options.travelMode) {&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.BICYCLING;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.TRANSIT;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;driving&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.DRIVING;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      travelMode = google.maps.TravelMode.WALKING;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.unitSystem === &amp;#039;imperial&amp;#039;) {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.IMPERIAL;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.METRIC;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var base_options = {&lt;br /&gt;
        avoidHighways: false,&lt;br /&gt;
        avoidTolls: false,&lt;br /&gt;
        optimizeWaypoints: false,&lt;br /&gt;
        waypoints: []&lt;br /&gt;
      },&lt;br /&gt;
      request_options =  extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]);&lt;br /&gt;
  request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]);&lt;br /&gt;
  request_options.travelMode = travelMode;&lt;br /&gt;
  request_options.unitSystem = unitSystem;&lt;br /&gt;
&lt;br /&gt;
  delete request_options.callback;&lt;br /&gt;
  delete request_options.error;&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      routes = [],&lt;br /&gt;
      service = new google.maps.DirectionsService();&lt;br /&gt;
&lt;br /&gt;
  service.route(request_options, function(result, status) {&lt;br /&gt;
    if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
      for (var r in result.routes) {&lt;br /&gt;
        if (result.routes.hasOwnProperty(r)) {&lt;br /&gt;
          routes.push(result.routes[r]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback(routes, result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      if (options.error) {&lt;br /&gt;
        options.error(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeRoutes = function() {&lt;br /&gt;
  this.routes.length = 0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getElevations = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    locations: [],&lt;br /&gt;
    path : false,&lt;br /&gt;
    samples : 256&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (options.locations.length &amp;gt; 0) {&lt;br /&gt;
    if (options.locations[0].length &amp;gt; 0) {&lt;br /&gt;
      options.locations = array_flat(array_map([options.locations], arrayToLatLng,  false));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
&lt;br /&gt;
  var service = new google.maps.ElevationService();&lt;br /&gt;
&lt;br /&gt;
  //location request&lt;br /&gt;
  if (!options.path) {&lt;br /&gt;
    delete options.path;&lt;br /&gt;
    delete options.samples;&lt;br /&gt;
&lt;br /&gt;
    service.getElevationForLocations(options, function(result, status) {&lt;br /&gt;
      if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  //path request&lt;br /&gt;
  } else {&lt;br /&gt;
    var pathRequest = {&lt;br /&gt;
      path : options.locations,&lt;br /&gt;
      samples : options.samples&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    service.getElevationAlongPath(pathRequest, function(result, status) {&lt;br /&gt;
     if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.renderRoute = function(options, renderOptions) {&lt;br /&gt;
  var self = this,&lt;br /&gt;
      panel = ((typeof renderOptions.panel === &amp;#039;string&amp;#039;) ? document.getElementById(renderOptions.panel.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;)) : renderOptions.panel),&lt;br /&gt;
      display;&lt;br /&gt;
&lt;br /&gt;
  renderOptions.panel = panel;&lt;br /&gt;
  renderOptions = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, renderOptions);&lt;br /&gt;
  display = new google.maps.DirectionsRenderer(renderOptions);&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes, response, status) {&lt;br /&gt;
      if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
        display.setDirections(response);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes) {&lt;br /&gt;
      if (routes.length &amp;gt; 0) {&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: routes[routes.length - 1].overview_path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
        if (options.callback) {&lt;br /&gt;
          options.callback(routes[routes.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.travelRoute = function(options) {&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      unitSystem: options.unitSystem,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawSteppedRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              var polyline_options = {&lt;br /&gt;
                path: step.path,&lt;br /&gt;
                strokeColor: options.strokeColor,&lt;br /&gt;
                strokeOpacity: options.strokeOpacity,&lt;br /&gt;
                strokeWeight: options.strokeWeight&lt;br /&gt;
              };&lt;br /&gt;
&lt;br /&gt;
              if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
                polyline_options.icons = options.icons;&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              self.drawPolyline(polyline_options);&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: step.path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route = function(options) {&lt;br /&gt;
  this.origin = options.origin;&lt;br /&gt;
  this.destination = options.destination;&lt;br /&gt;
  this.waypoints = options.waypoints;&lt;br /&gt;
&lt;br /&gt;
  this.map = options.map;&lt;br /&gt;
  this.route = options.route;&lt;br /&gt;
  this.step_count = 0;&lt;br /&gt;
  this.steps = this.route.legs[0].steps;&lt;br /&gt;
  this.steps_length = this.steps.length;&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    path: new google.maps.MVCArray(),&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polyline = this.map.drawPolyline(polyline_options).getPath();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.getRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.map.getRoutes({&lt;br /&gt;
    origin : this.origin,&lt;br /&gt;
    destination : this.destination,&lt;br /&gt;
    travelMode : options.travelMode,&lt;br /&gt;
    waypoints : this.waypoints || [],&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    callback : function() {&lt;br /&gt;
      self.route = e[0];&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback.call(self);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.back = function() {&lt;br /&gt;
  if (this.step_count &amp;gt; 0) {&lt;br /&gt;
    this.step_count--;&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.pop();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.forward = function() {&lt;br /&gt;
  if (this.step_count &amp;lt; this.steps_length) {&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.push(path[p]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    this.step_count++;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkGeofence = function(lat, lng, fence) {&lt;br /&gt;
  return fence.containsLatLng(new google.maps.LatLng(lat, lng));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkMarkerGeofence = function(marker, outside_callback) {&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    for (var i = 0, fence; fence = marker.fences[i]; i++) {&lt;br /&gt;
      var pos = marker.getPosition();&lt;br /&gt;
      if (!this.checkGeofence(pos.lat(), pos.lng(), fence)) {&lt;br /&gt;
        outside_callback(marker, fence);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.toImage = function(options) {&lt;br /&gt;
  var options = options || {},&lt;br /&gt;
      static_map_options = {};&lt;br /&gt;
&lt;br /&gt;
  static_map_options[&amp;#039;size&amp;#039;] = options[&amp;#039;size&amp;#039;] || [this.el.clientWidth, this.el.clientHeight];&lt;br /&gt;
  static_map_options[&amp;#039;lat&amp;#039;] = this.getCenter().lat();&lt;br /&gt;
  static_map_options[&amp;#039;lng&amp;#039;] = this.getCenter().lng();&lt;br /&gt;
&lt;br /&gt;
  if (this.markers.length &amp;gt; 0) {&lt;br /&gt;
    static_map_options[&amp;#039;markers&amp;#039;] = [];&lt;br /&gt;
    &lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      static_map_options[&amp;#039;markers&amp;#039;].push({&lt;br /&gt;
        lat: this.markers[i].getPosition().lat(),&lt;br /&gt;
        lng: this.markers[i].getPosition().lng()&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (this.polylines.length &amp;gt; 0) {&lt;br /&gt;
    var polyline = this.polylines[0];&lt;br /&gt;
    &lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;] = {};&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;path&amp;#039;] = google.maps.geometry.encoding.encodePath(polyline.getPath());&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeColor&amp;#039;] = polyline.strokeColor&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeOpacity&amp;#039;] = polyline.strokeOpacity&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeWeight&amp;#039;] = polyline.strokeWeight&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return GMaps.staticMapURL(static_map_options);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.staticMapURL = function(options){&lt;br /&gt;
  var parameters = [],&lt;br /&gt;
      data,&lt;br /&gt;
      static_root = (location.protocol === &amp;#039;file:&amp;#039; ? &amp;#039;http:&amp;#039; : location.protocol ) + &amp;#039;//maps.googleapis.com/maps/api/staticmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.url) {&lt;br /&gt;
    static_root = options.url;&lt;br /&gt;
    delete options.url;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  static_root += &amp;#039;?&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  var markers = options.markers;&lt;br /&gt;
  &lt;br /&gt;
  delete options.markers;&lt;br /&gt;
&lt;br /&gt;
  if (!markers &amp;amp;&amp;amp; options.marker) {&lt;br /&gt;
    markers = [options.marker];&lt;br /&gt;
    delete options.marker;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var styles = options.styles;&lt;br /&gt;
&lt;br /&gt;
  delete options.styles;&lt;br /&gt;
&lt;br /&gt;
  var polyline = options.polyline;&lt;br /&gt;
  delete options.polyline;&lt;br /&gt;
&lt;br /&gt;
  /** Map options **/&lt;br /&gt;
  if (options.center) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.center);&lt;br /&gt;
    delete options.center;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.address) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.address);&lt;br /&gt;
    delete options.address;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.lat) {&lt;br /&gt;
    parameters.push([&amp;#039;center=&amp;#039;, options.lat, &amp;#039;,&amp;#039;, options.lng].join(&amp;#039;&amp;#039;));&lt;br /&gt;
    delete options.lat;&lt;br /&gt;
    delete options.lng;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.visible) {&lt;br /&gt;
    var visible = encodeURI(options.visible.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
    parameters.push(&amp;#039;visible=&amp;#039; + visible);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var size = options.size;&lt;br /&gt;
  if (size) {&lt;br /&gt;
    if (size.join) {&lt;br /&gt;
      size = size.join(&amp;#039;x&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    delete options.size;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    size = &amp;#039;630x300&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  parameters.push(&amp;#039;size=&amp;#039; + size);&lt;br /&gt;
&lt;br /&gt;
  if (!options.zoom &amp;amp;&amp;amp; options.zoom !== false) {&lt;br /&gt;
    options.zoom = 15;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var sensor = options.hasOwnProperty(&amp;#039;sensor&amp;#039;) ? !!options.sensor : true;&lt;br /&gt;
  delete options.sensor;&lt;br /&gt;
  parameters.push(&amp;#039;sensor=&amp;#039; + sensor);&lt;br /&gt;
&lt;br /&gt;
  for (var param in options) {&lt;br /&gt;
    if (options.hasOwnProperty(param)) {&lt;br /&gt;
      parameters.push(param + &amp;#039;=&amp;#039; + options[param]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Markers **/&lt;br /&gt;
  if (markers) {&lt;br /&gt;
    var marker, loc;&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; data = markers[i]; i++) {&lt;br /&gt;
      marker = [];&lt;br /&gt;
&lt;br /&gt;
      if (data.size &amp;amp;&amp;amp; data.size !== &amp;#039;normal&amp;#039;) {&lt;br /&gt;
        marker.push(&amp;#039;size:&amp;#039; + data.size);&lt;br /&gt;
        delete data.size;&lt;br /&gt;
      }&lt;br /&gt;
      else if (data.icon) {&lt;br /&gt;
        marker.push(&amp;#039;icon:&amp;#039; + encodeURI(data.icon));&lt;br /&gt;
        delete data.icon;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.color) {&lt;br /&gt;
        marker.push(&amp;#039;color:&amp;#039; + data.color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;));&lt;br /&gt;
        delete data.color;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.label) {&lt;br /&gt;
        marker.push(&amp;#039;label:&amp;#039; + data.label[0].toUpperCase());&lt;br /&gt;
        delete data.label;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      loc = (data.address ? data.address : data.lat + &amp;#039;,&amp;#039; + data.lng);&lt;br /&gt;
      delete data.address;&lt;br /&gt;
      delete data.lat;&lt;br /&gt;
      delete data.lng;&lt;br /&gt;
&lt;br /&gt;
      for(var param in data){&lt;br /&gt;
        if (data.hasOwnProperty(param)) {&lt;br /&gt;
          marker.push(param + &amp;#039;:&amp;#039; + data[param]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (marker.length || i === 0) {&lt;br /&gt;
        marker.push(loc);&lt;br /&gt;
        marker = marker.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
        parameters.push(&amp;#039;markers=&amp;#039; + encodeURI(marker));&lt;br /&gt;
      }&lt;br /&gt;
      // New marker without styles&lt;br /&gt;
      else {&lt;br /&gt;
        marker = parameters.pop() + encodeURI(&amp;#039;|&amp;#039; + loc);&lt;br /&gt;
        parameters.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Map Styles **/&lt;br /&gt;
  if (styles) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; styles.length; i++) {&lt;br /&gt;
      var styleRule = [];&lt;br /&gt;
      if (styles[i].featureType){&lt;br /&gt;
        styleRule.push(&amp;#039;feature:&amp;#039; + styles[i].featureType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (styles[i].elementType) {&lt;br /&gt;
        styleRule.push(&amp;#039;element:&amp;#039; + styles[i].elementType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      for (var j = 0; j &amp;lt; styles[i].stylers.length; j++) {&lt;br /&gt;
        for (var p in styles[i].stylers[j]) {&lt;br /&gt;
          var ruleArg = styles[i].stylers[j][p];&lt;br /&gt;
          if (p == &amp;#039;hue&amp;#039; || p == &amp;#039;color&amp;#039;) {&lt;br /&gt;
            ruleArg = &amp;#039;0x&amp;#039; + ruleArg.substring(1);&lt;br /&gt;
          }&lt;br /&gt;
          styleRule.push(p + &amp;#039;:&amp;#039; + ruleArg);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var rule = styleRule.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
      if (rule != &amp;#039;&amp;#039;) {&lt;br /&gt;
        parameters.push(&amp;#039;style=&amp;#039; + rule);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Polylines **/&lt;br /&gt;
  function parseColor(color, opacity) {&lt;br /&gt;
    if (color[0] === &amp;#039;#&amp;#039;){&lt;br /&gt;
      color = color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (opacity) {&lt;br /&gt;
        opacity = parseFloat(opacity);&lt;br /&gt;
        opacity = Math.min(1, Math.max(opacity, 0));&lt;br /&gt;
        if (opacity === 0) {&lt;br /&gt;
          return &amp;#039;0x00000000&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        opacity = (opacity * 255).toString(16);&lt;br /&gt;
        if (opacity.length === 1) {&lt;br /&gt;
          opacity += opacity;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        color = color.slice(0,8) + opacity;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return color;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (polyline) {&lt;br /&gt;
    data = polyline;&lt;br /&gt;
    polyline = [];&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeWeight) {&lt;br /&gt;
      polyline.push(&amp;#039;weight:&amp;#039; + parseInt(data.strokeWeight, 10));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeColor) {&lt;br /&gt;
      var color = parseColor(data.strokeColor, data.strokeOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;color:&amp;#039; + color);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.fillColor) {&lt;br /&gt;
      var fillcolor = parseColor(data.fillColor, data.fillOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;fillcolor:&amp;#039; + fillcolor);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var path = data.path;&lt;br /&gt;
    if (path.join) {&lt;br /&gt;
      for (var j=0, pos; pos=path[j]; j++) {&lt;br /&gt;
        polyline.push(pos.join(&amp;#039;,&amp;#039;));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      polyline.push(&amp;#039;enc:&amp;#039; + path);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    polyline = polyline.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
    parameters.push(&amp;#039;path=&amp;#039; + encodeURI(polyline));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Retina support **/&lt;br /&gt;
  var dpi = window.devicePixelRatio || 1;&lt;br /&gt;
  parameters.push(&amp;#039;scale=&amp;#039; + dpi);&lt;br /&gt;
&lt;br /&gt;
  parameters = parameters.join(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
  return static_root + parameters;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMapType = function(mapTypeId, options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTileUrl&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTileUrl&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    options.tileSize = options.tileSize || new google.maps.Size(256, 256);&lt;br /&gt;
&lt;br /&gt;
    var mapType = new google.maps.ImageMapType(options);&lt;br /&gt;
&lt;br /&gt;
    this.map.mapTypes.set(mapTypeId, mapType);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTileUrl&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addOverlayMapType = function(options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTile&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTile&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    var overlayMapTypeIndex = options.index;&lt;br /&gt;
&lt;br /&gt;
    delete options.index;&lt;br /&gt;
&lt;br /&gt;
    this.map.overlayMapTypes.insertAt(overlayMapTypeIndex, options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTile&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlayMapType = function(overlayMapTypeIndex) {&lt;br /&gt;
  this.map.overlayMapTypes.removeAt(overlayMapTypeIndex);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addStyle = function(options) {&lt;br /&gt;
  var styledMapType = new google.maps.StyledMapType(options.styles, { name: options.styledMapName });&lt;br /&gt;
&lt;br /&gt;
  this.map.mapTypes.set(options.mapTypeId, styledMapType);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.setStyle = function(mapTypeId) {&lt;br /&gt;
  this.map.setMapTypeId(mapTypeId);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createPanorama = function(streetview_options) {&lt;br /&gt;
  if (!streetview_options.hasOwnProperty(&amp;#039;lat&amp;#039;) || !streetview_options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    streetview_options.lat = this.getCenter().lat();&lt;br /&gt;
    streetview_options.lng = this.getCenter().lng();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.panorama = GMaps.createPanorama(streetview_options);&lt;br /&gt;
&lt;br /&gt;
  this.map.setStreetView(this.panorama);&lt;br /&gt;
&lt;br /&gt;
  return this.panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.createPanorama = function(options) {&lt;br /&gt;
  var el = getElementById(options.el, options.context);&lt;br /&gt;
&lt;br /&gt;
  options.position = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
&lt;br /&gt;
  delete options.el;&lt;br /&gt;
  delete options.context;&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var streetview_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;links_changed&amp;#039;, &amp;#039;pano_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;pov_changed&amp;#039;, &amp;#039;resize&amp;#039;, &amp;#039;visible_changed&amp;#039;],&lt;br /&gt;
      streetview_options = extend_object({visible : true}, options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    delete streetview_options[streetview_events[i]];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var panorama = new google.maps.StreetViewPanorama(el, streetview_options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(panorama, streetview_events[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.on = function(event_name, handler) {&lt;br /&gt;
  return GMaps.on(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.off = function(event_name) {&lt;br /&gt;
  GMaps.off(event_name, this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.once = function(event_name, handler) {&lt;br /&gt;
  return GMaps.once(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.custom_events = [&amp;#039;marker_added&amp;#039;, &amp;#039;marker_removed&amp;#039;, &amp;#039;polyline_added&amp;#039;, &amp;#039;polyline_removed&amp;#039;, &amp;#039;polygon_added&amp;#039;, &amp;#039;polygon_removed&amp;#039;, &amp;#039;geolocated&amp;#039;, &amp;#039;geolocation_failed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
GMaps.on = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    return google.maps.event.addListener(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    var registered_event = {&lt;br /&gt;
      handler : handler,&lt;br /&gt;
      eventName : event_name&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    object.registered_events[event_name] = object.registered_events[event_name] || [];&lt;br /&gt;
    object.registered_events[event_name].push(registered_event);&lt;br /&gt;
&lt;br /&gt;
    return registered_event;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.off = function(event_name, object) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    google.maps.event.clearListeners(object, event_name);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    object.registered_events[event_name] = [];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.once = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map;&lt;br /&gt;
    return google.maps.event.addListenerOnce(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.fire = function(event_name, object, scope) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    google.maps.event.trigger(object, event_name, Array.prototype.slice.apply(arguments).slice(2));&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if(event_name in scope.registered_events) {&lt;br /&gt;
      var firing_events = scope.registered_events[event_name];&lt;br /&gt;
&lt;br /&gt;
      for(var i = 0; i &amp;lt; firing_events.length; i++) {&lt;br /&gt;
        (function(handler, scope, object) {&lt;br /&gt;
          handler.apply(scope, [object]);&lt;br /&gt;
        })(firing_events[i][&amp;#039;handler&amp;#039;], scope, object);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geolocate = function(options) {&lt;br /&gt;
  var complete_callback = options.always || options.complete;&lt;br /&gt;
&lt;br /&gt;
  if (navigator.geolocation) {&lt;br /&gt;
    navigator.geolocation.getCurrentPosition(function(position) {&lt;br /&gt;
      options.success(position);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, function(error) {&lt;br /&gt;
      options.error(error);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, options.options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    options.not_supported();&lt;br /&gt;
&lt;br /&gt;
    if (complete_callback) {&lt;br /&gt;
      complete_callback();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geocode = function(options) {&lt;br /&gt;
  this.geocoder = new google.maps.Geocoder();&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  if (options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    options.latLng = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
  &lt;br /&gt;
  this.geocoder.geocode(options, function(results, status) {&lt;br /&gt;
    callback(results, status);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
if (typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps) {&lt;br /&gt;
  //==========================&lt;br /&gt;
  // Polygon containsLatLng&lt;br /&gt;
  // https://github.com/tparkin/Google-Maps-Point-in-Polygon&lt;br /&gt;
  // Poygon getBounds extension - google-maps-extensions&lt;br /&gt;
  // http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js&lt;br /&gt;
  if (!google.maps.Polygon.prototype.getBounds) {&lt;br /&gt;
    google.maps.Polygon.prototype.getBounds = function(latLng) {&lt;br /&gt;
      var bounds = new google.maps.LatLngBounds();&lt;br /&gt;
      var paths = this.getPaths();&lt;br /&gt;
      var path;&lt;br /&gt;
&lt;br /&gt;
      for (var p = 0; p &amp;lt; paths.getLength(); p++) {&lt;br /&gt;
        path = paths.getAt(p);&lt;br /&gt;
        for (var i = 0; i &amp;lt; path.getLength(); i++) {&lt;br /&gt;
          bounds.extend(path.getAt(i));&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return bounds;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Polygon.prototype.containsLatLng) {&lt;br /&gt;
    // Polygon containsLatLng - method to determine if a latLng is within a polygon&lt;br /&gt;
    google.maps.Polygon.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      // Exclude points outside of bounds as there is no way they are in the poly&lt;br /&gt;
      var bounds = this.getBounds();&lt;br /&gt;
&lt;br /&gt;
      if (bounds !== null &amp;amp;&amp;amp; !bounds.contains(latLng)) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Raycast point in polygon method&lt;br /&gt;
      var inPoly = false;&lt;br /&gt;
&lt;br /&gt;
      var numPaths = this.getPaths().getLength();&lt;br /&gt;
      for (var p = 0; p &amp;lt; numPaths; p++) {&lt;br /&gt;
        var path = this.getPaths().getAt(p);&lt;br /&gt;
        var numPoints = path.getLength();&lt;br /&gt;
        var j = numPoints - 1;&lt;br /&gt;
&lt;br /&gt;
        for (var i = 0; i &amp;lt; numPoints; i++) {&lt;br /&gt;
          var vertex1 = path.getAt(i);&lt;br /&gt;
          var vertex2 = path.getAt(j);&lt;br /&gt;
&lt;br /&gt;
          if (vertex1.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex2.lng() &amp;gt;= latLng.lng() || vertex2.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex1.lng() &amp;gt;= latLng.lng()) {&lt;br /&gt;
            if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) &amp;lt; latLng.lat()) {&lt;br /&gt;
              inPoly = !inPoly;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          j = i;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return inPoly;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Circle.prototype.containsLatLng) {&lt;br /&gt;
    google.maps.Circle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      if (google.maps.geometry) {&lt;br /&gt;
        return google.maps.geometry.spherical.computeDistanceBetween(this.getCenter(), latLng) &amp;lt;= this.getRadius();&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.Rectangle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.getBounds().contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.setFences = function(fences) {&lt;br /&gt;
    this.fences = fences;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.addFence = function(fence) {&lt;br /&gt;
    this.fences.push(fence);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.getId = function() {&lt;br /&gt;
    return this[&amp;#039;__gm_id&amp;#039;];&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==========================&lt;br /&gt;
// Array indexOf&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf&lt;br /&gt;
if (!Array.prototype.indexOf) {&lt;br /&gt;
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {&lt;br /&gt;
      &amp;quot;use strict&amp;quot;;&lt;br /&gt;
      if (this == null) {&lt;br /&gt;
          throw new TypeError();&lt;br /&gt;
      }&lt;br /&gt;
      var t = Object(this);&lt;br /&gt;
      var len = t.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
      if (len === 0) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var n = 0;&lt;br /&gt;
      if (arguments.length &amp;gt; 1) {&lt;br /&gt;
          n = Number(arguments[1]);&lt;br /&gt;
          if (n != n) { // shortcut for verifying if it&amp;#039;s NaN&lt;br /&gt;
              n = 0;&lt;br /&gt;
          } else if (n != 0 &amp;amp;&amp;amp; n != Infinity &amp;amp;&amp;amp; n != -Infinity) {&lt;br /&gt;
              n = (n &amp;gt; 0 || -1) * Math.floor(Math.abs(n));&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      if (n &amp;gt;= len) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var k = n &amp;gt;= 0 ? n : Math.max(len - Math.abs(n), 0);&lt;br /&gt;
      for (; k &amp;lt; len; k++) {&lt;br /&gt;
          if (k in t &amp;amp;&amp;amp; t[k] === searchElement) {&lt;br /&gt;
              return k;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return GMaps;&lt;br /&gt;
}));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
approve.js&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
howlerjs.com - Cross Plattform Audio&lt;br /&gt;
&lt;br /&gt;
== Browser Fixing ==&lt;br /&gt;
[[JavaScript - iOS Orientation Change Fix]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Rich_Text_Editor_(RTE)&amp;diff=22874</id>
		<title>Typo3 - Rich Text Editor (RTE)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Rich_Text_Editor_(RTE)&amp;diff=22874"/>
		<updated>2018-03-06T08:25:57Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* iFrames im RTE erlauben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Snippets ==&lt;br /&gt;
=== iFrames im RTE erlauben ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Seiten TS-Config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typoscript&amp;quot;&amp;gt;&lt;br /&gt;
RTE.default.proc.allowTags := addToList(iframe,embed,object,param)&lt;br /&gt;
RTE.default.proc.entryHTMLparser_db.allowTags := addToList(iframe,embed,object,param)&lt;br /&gt;
RTE.default.proc.allowTagsOutside := addToList(iframe,embed,object,param)&lt;br /&gt;
  &lt;br /&gt;
plugin.tt_news.displaySingle.content_stdWrap.parseFunc {&lt;br /&gt;
  nonTypoTagStdWrap.encapsLines.nonWrappedTag &amp;gt;&lt;br /&gt;
  allowTags = script, iframe, param, embed, object, a, abbr, acronym, address, blockquote, b, br, caption, center, cite, code, div, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, link, ol, p, pre, q, sdfield, span, strike, strong, sub, sup, table, thead, tbody, tfoot, td, th, tr, tt, u, ul&lt;br /&gt;
}&lt;br /&gt;
plugin.tt_news.general_stdWrap.parseFunc.allowTags := addToList(iframe,embed,object,param,p)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TypoScript Template Konstanten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Achtung alles in eine Zeile schreiben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typoscript&amp;quot;&amp;gt;&lt;br /&gt;
styles.content.links.allowTags = b,i,u,a,img,br,div,center,pre,font, hr,sub,sup,p,strong,em,li,ul,ol,blockquote,strike,del,ins,span,h1,h2,h3,h4,h5,h6,address,iframe,object,param,embed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TYPO3 6.2 Config ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Deprecated property			Use instead&lt;br /&gt;
disableRightClick			contextMenu.disable&lt;br /&gt;
disableContextMenu			contextMenu.disable&lt;br /&gt;
hidePStyleItems				buttons.formatblock.removeItems&lt;br /&gt;
hideFontFaces				buttons.fontstyle.removeItems&lt;br /&gt;
fontFace				buttons.fontstyle.addItems&lt;br /&gt;
hideFontSizes				buttons.fontsize.removeItems&lt;br /&gt;
classesCharacter			buttons.textstyle.tags.span.allowedClasses&lt;br /&gt;
classesParagraph			buttons.blockstyle.tags.div.allowedClasses&lt;br /&gt;
classesTable				buttons.blockstyle.tags.table.allowedClasses&lt;br /&gt;
classesTD				buttons.blockstyle.tags.td.allowedClasses&lt;br /&gt;
classesImage				buttons.image.properties.class.allowedClasses&lt;br /&gt;
classesLinks				buttons.link.properties.class.allowedClasses&lt;br /&gt;
blindImageOptions			buttons.image.options.removeItems&lt;br /&gt;
blindLinkOptions			buttons.link.options.removeItems&lt;br /&gt;
defaultLinkTarget			buttons.link.properties.target.default&lt;br /&gt;
fontSize				buttons.fontsize.addItems&lt;br /&gt;
RTE.default.classesAnchor		RTE.default.buttons.link.properties.class.allowedClasses&lt;br /&gt;
RTE.default.classesAnchor.default.[link-type]	RTE.default.buttons.link.[link-type].properties.class.default&lt;br /&gt;
mainStyleOverride			contentCSS&lt;br /&gt;
mainStyleOverride_add.[key]		contentCSS&lt;br /&gt;
mainStyle_font				contentCSS&lt;br /&gt;
mainStyle_size				contentCSS&lt;br /&gt;
mainStyle_color				contentCSS&lt;br /&gt;
mainStyle_bgcolor			contentCSS&lt;br /&gt;
inlineStyle.[any-keystring]		contentCSS&lt;br /&gt;
ignoreMainStyleOverride			n.a.&lt;br /&gt;
disableTYPO3Browsers			buttons.image.TYPO3Browser.disabled and buttons.link.TYPO3Browser.disabled&lt;br /&gt;
showTagFreeClasses			buttons.blockstyle.showTagFreeClasses and buttons.textstyle.showTagFreeClasses&lt;br /&gt;
disablePCexamples			buttons.blockstyle.disableStyleOnOptionLabel and buttons.textstyle.disableStyleOnOptionLabel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== CSS für RTE und einige Eigenschaften ===&lt;br /&gt;
&lt;br /&gt;
TS Config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.default {&lt;br /&gt;
&lt;br /&gt;
    contentCSS = fileadmin/template/rte.css&lt;br /&gt;
&lt;br /&gt;
    ## Markup options (htmlArea RTE only)&lt;br /&gt;
    enableWordClean = 1&lt;br /&gt;
    removeTrailingBR = 1&lt;br /&gt;
    removeComments = 1&lt;br /&gt;
    removeTags = center, o:p, sdfield&lt;br /&gt;
    removeTagsAndContents = style,script&lt;br /&gt;
    roteSchrift {&lt;br /&gt;
        name = Rote Schrift&lt;br /&gt;
        value = color: #8A0020;&lt;br /&gt;
    }&lt;br /&gt;
    graueSchrift {&lt;br /&gt;
        name = Graue Schrift&lt;br /&gt;
        value = color: #C0C0C0;&lt;br /&gt;
    }&lt;br /&gt;
    grueneSchrift {&lt;br /&gt;
        name = Grüne Schrift&lt;br /&gt;
        value = color: #5e912b;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    proc.allowedClasses (&lt;br /&gt;
        external-link, external-link-new-window, internal-link, internal-link-new-window, download, mail,&lt;br /&gt;
        align-left, align-center, align-right, align-justify,&lt;br /&gt;
        csc-frame-frame1, csc-frame-frame2,&lt;br /&gt;
        component-items, action-items,&lt;br /&gt;
        component-items-ordered, action-items-ordered,&lt;br /&gt;
        roteSchrift, graueSchrift, grueneSchrift&lt;br /&gt;
        indent&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
classesCharacter = roteSchrift, graueSchrift, grueneSchrift&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiterführendes ==&lt;br /&gt;
Das sieht sehr gut aus -&amp;gt; sehr umfassend und ausführlich erklärt (Datum des Zugriffs 26.1.2010)&lt;br /&gt;
&lt;br /&gt;
http://www.site42.de/Wie-konfiguriert-man-den-RTE-h.58.0.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RTE-Konfiguration als Extension laden ==&lt;br /&gt;
Todo. Vgl. die Extension Rich Text Editor pre-configuration die bei den Examples steht.&lt;br /&gt;
&lt;br /&gt;
== RTE einrichten ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ab Version 4 ist der Editor &amp;#039;&amp;#039;&amp;#039;HTMLArea&amp;#039;&amp;#039;&amp;#039; eingesetzt, den es für frühere Versionen als Extension gibt. Für Typo3 Versionen unter 4 muß die HTMLArea Extension in einer Version kleiner 1.3 installiert werden sonst gibt&amp;#039;s eine Fehlermeldung beim Verlinken.&lt;br /&gt;
&lt;br /&gt;
Das Aussehten des RTE, die verfügbaren Optionen und die HTML-Ausgabe läßt sich einstellen.&lt;br /&gt;
Über das PageTS Config Feld der Seiten kann man z.B. einzelne Funktionen des RTE für den Seitenbaum abstellen.&lt;br /&gt;
=== Alternativer RTE ===&lt;br /&gt;
Als alternative bietet sich TinyMCE an. Er ist schlanker als htmlarea und läßt sich meist leichter einstellen. Allerdings bietet er nicht soviele Konfigurationsmöglichkeiten (Stand 2010)&lt;br /&gt;
&lt;br /&gt;
=== RTE Standard CSS Stylesheet anpassen ===&lt;br /&gt;
==== Eigenes Stylesheet einbinden ====&lt;br /&gt;
Eine eigene Datei funktioniert für die Innerhalb des Texteditors. Um die Styles in den Dropdown-Feldern anzupassen muß man aber TypoScript anwenden (s.u.).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.default {&lt;br /&gt;
   contentCSS = fileadmin/rte_css/css_htmlarea.css&lt;br /&gt;
   useCSS = 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Anpassen der Klassen über TypoScript ====&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Klassen hinzufügen&lt;br /&gt;
RTE.default.proc.allowedClasses := addToList(error,more-link, info-block, block)&lt;br /&gt;
RTE.default.classesParagraph := addToList(error,info-block)&lt;br /&gt;
RTE.default.classesCharacter := addToList(block)&lt;br /&gt;
RTE.default.classesAnchor := addToList(more-link)&lt;br /&gt;
&lt;br /&gt;
#nicht benoetigte Klassen entfernen&lt;br /&gt;
RTE.default.classesParagraph := removeFromList(csc-frame-frame1, csc-frame-frame2)&lt;br /&gt;
RTE.default.proc.allowedClasses := removeFromList(csc-frame-frame1, csc-frame-frame2, important, name-of-person, detail)&lt;br /&gt;
RTE.classes := removeFromList(csc-frame-frame1, csc-frame-frame2, important, name-of-person, detail) &lt;br /&gt;
&lt;br /&gt;
#Klassen fuer die RTE Auswahlfelder definieren&lt;br /&gt;
RTE.classes.error {&lt;br /&gt;
   name = Error in Red&lt;br /&gt;
   value = color: #FF0000; font-weight: bold; background-color: #ffff00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RTE.classesAnchor.more-link {&lt;br /&gt;
   name = Link with an Arrow&lt;br /&gt;
   value = background: transparent url(../img/arrow.png)no-repeat 0 0; padding:0 0 0 14px;&lt;br /&gt;
}&lt;br /&gt;
RTE.classesAnchor.info-block {&lt;br /&gt;
   name = Infoblock with grey background&lt;br /&gt;
   value = background-color: #ececec;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#NEUE CSS KLASSEN HINZUFUEGEN IM RTE&lt;br /&gt;
#**********************************************&lt;br /&gt;
RTE {&lt;br /&gt;
   default {&lt;br /&gt;
      contentCSS = fileadmin/templates/vdi-templates/css/rte.css&lt;br /&gt;
      showTagFreeClasses = 1&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RTE HTML-Ausgabe ===&lt;br /&gt;
Der RTE formatiert verändert den HTML Code auf verschiedene Weise. Wie er das macht läßt sich beeinflussen. Hier einige nützliche Beispiele:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Restriktive RTE-Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
1.Schritt: Nur die Inhaltselemente Text und Text mit Bild sollen mit dem RTE bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Im PageTS-Config Feld:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.default.disabled=1&lt;br /&gt;
RTE.config.tt_content.bodytext.types{&lt;br /&gt;
   text.disabled = 0&lt;br /&gt;
   textpic.disabled = 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2. Schritt: Nur noch die Standardformatierung und zwei Spezial formatierungen zur Auswahl lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.classes{&lt;br /&gt;
   highlight{&lt;br /&gt;
      name = Highlight&lt;br /&gt;
      value = font:bold; color: red;&lt;br /&gt;
   }&lt;br /&gt;
   zitat{&lt;br /&gt;
      name = Zitat&lt;br /&gt;
      value=font:italic 15px; margin-left:20px;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
RTE.default.classesCharacter = highlight, zitat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.Schritt: Üver das User TSConfig kann man nun einstellen welche Menüoptionen dem User angezeigt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   options.RTEkeyList = class, bold, italic, link&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfigurationsbeispiele ==&lt;br /&gt;
== htmlArea ==&lt;br /&gt;
Mit der Extension htmlarea steht auch für Mozilla basierte Browser ein Editor zur Verfügung der auf dem bekannten HTMLArea basiert.&lt;br /&gt;
&lt;br /&gt;
Viele der RTE Optionen funktionieren auch in htmlarea, darüber hinaus auch noch einige weitere. &lt;br /&gt;
&lt;br /&gt;
== Konfigurationsbeispiele htmlarea ==&lt;br /&gt;
&lt;br /&gt;
=== Kommentiertes Beispiel ===&lt;br /&gt;
Quelle: http://www.typo3-lisardo.de/home/blog-post/2010/09/02/rte-htmlarea-einrichten.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Konfiguration im Page TSconfig&lt;br /&gt;
########## Grundeinstellungen ##########&lt;br /&gt;
RTE.default{&lt;br /&gt;
  useCSS=1&lt;br /&gt;
  ignoreMainStyleOverride=0&lt;br /&gt;
 &lt;br /&gt;
  # Damit kann die übermäßig große Schriftdarstellung in den Tabellen&lt;br /&gt;
  # im Firefox korrigiert werden. Ausserdem ist es möglich, die grundlegende&lt;br /&gt;
  # Darstellung im RTE-Eingabefenster zu konfigurieren: Schrift, Schrifgrößen etc.&lt;br /&gt;
  mainStyleOverride_add.TD=font-size:12px;&lt;br /&gt;
  mainStyleOverride_add.H1=font-size:16px;color:#a7b198;&lt;br /&gt;
  mainStyleOverride_add.H2=font-size:16px;color:#a7b198;&lt;br /&gt;
 &lt;br /&gt;
  # Überschreiben der Default-Einstellungen zu den erlaubten Tags&lt;br /&gt;
  proc.allowTags=code,table,tbody,tr,th,td,h1,h2,h3,h4,h5,h6,div,p,br,span,ul,ol,li,pre,blockquote,strong,em,b,i,u,sub,sup,strike,a,link,img,nobr,hr,center,font,tt,q,cite&lt;br /&gt;
  proc.entryHTMLparser_db.allowTags&amp;lt;RTE.default.proc.allowTags&lt;br /&gt;
  proc.entryHTMLparser_db.tags.a.fixAttrib.title.unset =1&lt;br /&gt;
  # das ist nicht unbedingt erforderlich, wenn man in den »Default&lt;br /&gt;
  # configuration settings« die Option »Typical gewählt hat«. Wenn&lt;br /&gt;
  # man eine der anderen beiden eingestellt hat, muss man diese Zeile anpassen. &lt;br /&gt;
 &lt;br /&gt;
  # Welche Buttons sollen im RTE gezeigt werden?&lt;br /&gt;
  showButtons= *&lt;br /&gt;
  hideButtons=strikethrough,lefttoright,righttoleft&lt;br /&gt;
  keepButtonGroupTogether=1&lt;br /&gt;
 &lt;br /&gt;
  # wenn den Redakteuren eigene Klassen zur Verfügung gestellt werden, müssen&lt;br /&gt;
  # diese in einem Stylesheet extra dem RTE zur Verfüung gestellt werden.&lt;br /&gt;
  contentCSS=fileadmin/css/screen/content_rte.css&lt;br /&gt;
 &lt;br /&gt;
  # nur Klassen mit Tags erlauben. z. B. : p.klasse {border:1px solid #ccc}&lt;br /&gt;
  showTagFreeClasses=0&lt;br /&gt;
 &lt;br /&gt;
  # hier wird definiert, welche Klassen den Redakteuren zur&lt;br /&gt;
  # Verfügung gestellt werden: die vorhandenen Klassen für die&lt;br /&gt;
  # Zeichenformatierung werden hier ausgeschaltet:&lt;br /&gt;
  classesCharacter=&lt;br /&gt;
  # die vorhandenen Klassen zum Formatieren von Absätzen werden&lt;br /&gt;
  # durch die selbstdefinierten Klassen überschrieben:&lt;br /&gt;
  classesParagraph=linie_danach,linie_davor,kasten_gruen_hg&lt;br /&gt;
  # Tipp: wenn die default-Klassen übernommen und nur ergänzt&lt;br /&gt;
  # werden sollen, dann so schreiben:&lt;br /&gt;
  # classesParagraph := linie_danach ...&lt;br /&gt;
 &lt;br /&gt;
  # Klassendefinition für die gesamte Tabelle&lt;br /&gt;
  classesTable=tabelle01&lt;br /&gt;
  # Klassendefinition für die einzelnen Zellen&lt;br /&gt;
  classesTD=zelle01,zelle02&lt;br /&gt;
  # das kann für tr, thead, tbody ebenfalls gemacht werden&lt;br /&gt;
 &lt;br /&gt;
  # Jetzt müssen die einzelnen Klassen noch explizit erlaubt werden&lt;br /&gt;
  proc.allowedClasses=linie_danach,linie_davor,kasten_gruen_hg,tabelle01,zelle01,zelle02&lt;br /&gt;
 &lt;br /&gt;
  # Schriften erlauben&lt;br /&gt;
  fontFace=font1,font2&lt;br /&gt;
 &lt;br /&gt;
  # Farben erlauben&lt;br /&gt;
  colors=color1,color2&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
############ Achtung!! ###############&lt;br /&gt;
# Alle selbstdefinierten Klassen müssen in dem oben eingebundenen&lt;br /&gt;
# Stylesheet auch definiert sein!&lt;br /&gt;
# Dabei muss beachtet werden, dass Tag-lose Klassen durch showTagFreeClasses = 0&lt;br /&gt;
# ausgeschaltet wurden:&lt;br /&gt;
# Falsch: .linie_danach {border-bottom: ...}&lt;br /&gt;
# Richtig: p.linie_danach {border-bottom: ...}&lt;br /&gt;
# Genauso bei den Tabellen.&lt;br /&gt;
#######################################&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
########### Definition der Klassenbezeichnungen für die Redakteure&lt;br /&gt;
 &lt;br /&gt;
RTE.classes {&lt;br /&gt;
  # hier werden die Namen der Klassen »lesbar« gemacht&lt;br /&gt;
  linie_davor.name=Linie davor&lt;br /&gt;
  linie_danach.name=Linie danach&lt;br /&gt;
  kasten_gruen_hg.name=Kasten:grüner HG&lt;br /&gt;
  kasten_gruen_r.name=Kasten:grüner Rahmen&lt;br /&gt;
  kasten_info.name=Kasten:Info-Knopf&lt;br /&gt;
  tabelle01.name=Standard in Blau-Grau&lt;br /&gt;
  zelle01.name=Zellen blauer Hintergrund&lt;br /&gt;
  zelle02.name=Zellen ohne Hintergrund&lt;br /&gt;
  zelle03.name=Zellen grauer Hintergrund&lt;br /&gt;
 &lt;br /&gt;
  # Wenn man will kann man die Anzeige der Klassen in den Menüs für die&lt;br /&gt;
  # Redakteure auch noch optisch anpassen:&lt;br /&gt;
  linie_davor.name=Linie davor&lt;br /&gt;
  linie_davor.value=border-bottom:1x solid#ff0000&lt;br /&gt;
  # damit erscheint der Eintrag im Menü schon so formatiert, wie&lt;br /&gt;
  # später der Absatz. Nötig ist das aber nicht.&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
############# Definition de Schriftmenüs ###########&lt;br /&gt;
 &lt;br /&gt;
RTE.fonts {&lt;br /&gt;
  font1 {&lt;br /&gt;
    name=Verdana&lt;br /&gt;
    value=verdana,arial,helvetica,sans-serif&lt;br /&gt;
  }&lt;br /&gt;
  font2 {&lt;br /&gt;
    name=Georgia&lt;br /&gt;
    value=georgia,times,&amp;#039;times new roman&amp;#039;,serif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
########### Definition des Farbmenüs ##############&lt;br /&gt;
 &lt;br /&gt;
RTE.colors {&lt;br /&gt;
  color1 {&lt;br /&gt;
    name=t3 blau&lt;br /&gt;
    value=#0000ff&lt;br /&gt;
  }&lt;br /&gt;
  color2 {&lt;br /&gt;
    name=t3 grün&lt;br /&gt;
    value=#00ff00&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
########### Definition der Link-Klassen ##############&lt;br /&gt;
 &lt;br /&gt;
RTE.classesAnchor {&lt;br /&gt;
  externalLink {&lt;br /&gt;
    class =ext-link&lt;br /&gt;
    type=url&lt;br /&gt;
    image=fileadmin/icons/ext-link.gif&lt;br /&gt;
  }&lt;br /&gt;
  externalLinkInNewWindow {&lt;br /&gt;
    class =ext-link2&lt;br /&gt;
    type=url&lt;br /&gt;
    image=fileadmin/icons/ext-link2.gif&lt;br /&gt;
  }&lt;br /&gt;
  internalLink {&lt;br /&gt;
    class =int-link&lt;br /&gt;
    type=page&lt;br /&gt;
    image=fileadmin/icons/int-link.gif&lt;br /&gt;
  }&lt;br /&gt;
  internalLinkInNewWindow {&lt;br /&gt;
    class =int-link2&lt;br /&gt;
    type=page&lt;br /&gt;
    image=fileadmin/icons/int-link2.gif&lt;br /&gt;
  }&lt;br /&gt;
  download {&lt;br /&gt;
    class =download&lt;br /&gt;
    type=file&lt;br /&gt;
    image=fileadmin/icons/down.gif&lt;br /&gt;
  }&lt;br /&gt;
  mail {&lt;br /&gt;
    class =mail&lt;br /&gt;
    type=mail&lt;br /&gt;
    image=fileadmin/icons/mail.gif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Beispielkonfiguration für PageTS mit verschiedenen Möglichkeiten ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###########&lt;br /&gt;
### RTE ###&lt;br /&gt;
###########&lt;br /&gt;
# Klassendefinitionen löschen und neue Klassendefinitionen zulassen&lt;br /&gt;
RTE.config.tt_content.bodytext.proc.allowedClasses &amp;gt;&lt;br /&gt;
&lt;br /&gt;
# CSS für die Anzeige im Editor selbst #&lt;br /&gt;
RTE.default.contentCSS = fileadmin/templates/css/rte.css&lt;br /&gt;
&lt;br /&gt;
# Sichtbare Buttons #&lt;br /&gt;
&lt;br /&gt;
RTE.default{&lt;br /&gt;
   # diverse Einstellungen&lt;br /&gt;
   keepButtonGroupTogether = 1&lt;br /&gt;
   # Buttons (mit Tabelle)&lt;br /&gt;
   #showButtons = blockstylelabel, blockstyle, textstylelabel, textstyle, formatblock,left, right, center, bold, italic, subscript, superscript, orderedlist, unorderedlist, outdent, indent, insertcharacter, link, acronym, chMode, removeformat,table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge&lt;br /&gt;
   # Buttons (ohne Tabellen)&lt;br /&gt;
   showButtons = blockstylelabel, blockstyle, textstylelabel, textstyle, formatblock, bold, italic, subscript, superscript, orderedlist, unorderedlist, outdent, indent, insertcharacter, link, chMode, removeformat&lt;br /&gt;
   #hideButtons = fontstyle, formatblock, fontsize, strikethrough,lefttoright, righttoleft, textcolor, bgcolor, textindicator, emoticon, user, spellcheck, chMode, inserttag, outdent, indent, justifyfull, subscript, superscript, acronym, copy, cut, paste     &lt;br /&gt;
   &lt;br /&gt;
   proc{&lt;br /&gt;
      # zusätzliche ERLAUBTE TAGS&lt;br /&gt;
      #allowTags := addToList(blockquote,center,align)&lt;br /&gt;
      #allowedClasses := removeFromList(csc-frame-frame1, csc-frame-frame2) &lt;br /&gt;
      #allowedClasses := addToList(rahmen-blau)&lt;br /&gt;
      allowTags = table, tbody, tr, th, td, h1, h2, h3, h4, h5, h6, div, p, br, span, ul, ol, li, re, blockquote, strong, em, b, i, u, sub, sup, strike, a, img, nobr, hr, tt, q, cite, abbr, acronym, center&lt;br /&gt;
      denyTags = font&lt;br /&gt;
      HTMLparser_rte.tags.align.protect =1&lt;br /&gt;
      keepPDIVattribs = align,class,style,id&lt;br /&gt;
   }&lt;br /&gt;
   # weitere Klassen hinzufügen / verändern&lt;br /&gt;
   #classesParagraph := removeFromList(csc-frame-frame1, csc-frame-frame2)&lt;br /&gt;
   #classesParagraph := addToList(rahmen-blau)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Definition der Klassen für die Anzeige im Editor&lt;br /&gt;
#RTE.classes { &lt;br /&gt;
#   csc-frame-frame1 {&lt;br /&gt;
#      name = blauer Rahmen&lt;br /&gt;
#      value = font-family:Verdana,Arial,Helvetica,sans-serif;background: #ebeef5;border: 1px dotted #113388;&lt;br /&gt;
#   }&lt;br /&gt;
#   csc-frame-frame2 {&lt;br /&gt;
#      name = gelber Rahmen&lt;br /&gt;
#      value = font-family:Verdana,Arial,Helvetica,sans-serif;background: #fcf4e9;border: 1px dotted #f3ae00;&lt;br /&gt;
#   }&lt;br /&gt;
#} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Noch ein kleines Beispiel ===&lt;br /&gt;
(Aus seo-24.at)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TCEFORM.tt_content.bodytext.RTEfullScreenWidth = 650&lt;br /&gt;
&lt;br /&gt;
RTE.default {&lt;br /&gt;
enableWordClean = 1&lt;br /&gt;
removeTrailingBR = 1&lt;br /&gt;
removeComments = 1&lt;br /&gt;
removeTags = center, sdfield&lt;br /&gt;
removeTagsAndContents = style,script&lt;br /&gt;
&lt;br /&gt;
# Buttons die gezeigt/versteckt werden&lt;br /&gt;
showButtons = bold, italic, underline, left, center, right, orderedlist, unorderedlist, link, image, removeformat, table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge, findreplace, insertcharacter, undo, redo, textcolor, bgcolor&lt;br /&gt;
hideButtons = textstyletextstylelabel, blockstyle, blockstylelabel, fontstyle, formatblock, fontsize, strikethrough,lefttoright, righttoleft, textindicator, emoticon, user, spellcheck, chMode, inserttag, outdent, indent, justifyfull, subscript, superscript, acronym, copy, cut, paste, showhelp, about, insertcharacter, line&lt;br /&gt;
&lt;br /&gt;
# Hält die RTE Icons gegroupt zusammen&lt;br /&gt;
keepButtonGroupTogether = 1&lt;br /&gt;
&lt;br /&gt;
# blendet Statusbar in htmlarea aus&lt;br /&gt;
showStatusBar = 0&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eigene Tags verwenden===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.default.proc.allowTags = list-of-allowed-tags&lt;br /&gt;
RTE.default.proc.HTMLparser_rte.tags.mycustomtag.protect =1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where&lt;br /&gt;
list-of-allowed-tags is the list of all allowed tags, including your custom tag, and&lt;br /&gt;
mycustomtag is the name of your tag.&lt;br /&gt;
===Klasse für Tabellen ändern===&lt;br /&gt;
«Typo3 always replaces the class I selected in the RTE for a table with the class &amp;quot;contenttable&amp;quot;. Do you have an idea how to switch that off?»&lt;br /&gt;
Assuming that you have installed extension CSS Styled Content (css_styled_content), add the following line in your TS template Setup field:&lt;br /&gt;
 lib.parseFunc_RTE.externalBlocks.table.stdWrap.HTMLparser.tags.table.fixAttrib.class.list &amp;gt;&lt;br /&gt;
&lt;br /&gt;
The contenttable class will then be added only if no class is specified for the table.&lt;br /&gt;
=== diverses ===&lt;br /&gt;
==== eigene Klassen ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE {&lt;br /&gt;
    classes {&lt;br /&gt;
        Infobox {&lt;br /&gt;
            name = Infobox&lt;br /&gt;
            value = eigenschaften&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    default {&lt;br /&gt;
        classesParagraph = Infobox&lt;br /&gt;
        contentCSS = fileadmin/templates/version1/css/style.css&lt;br /&gt;
        classesCharacter = Infobox&lt;br /&gt;
        proc.allowedClasses (&lt;br /&gt;
            Infobox, ...&lt;br /&gt;
        )&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme und Lösungen ==&lt;br /&gt;
=== RTE speichert keine Attribute ===&lt;br /&gt;
Symptome: Wenn man im RTE target _blank angibt wird dieses nicht gespeichert und taucht nicht im HTML Code auf.&lt;br /&gt;
&lt;br /&gt;
Abhilfe: Die Attribute müssen erlaubt sein. Dies kann man z.B. im PageTS einstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
entryHTMLparser_db {&lt;br /&gt;
  tags {   &lt;br /&gt;
    a.allowedAttribs = id, title, dir, lang, xml:lang, class, href, rel, hreflang, target, nofollow&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Bug mit htmlarea und Firefox 2.0.0.3 ===&lt;br /&gt;
Der Editor lädt nicht in der oben genannten Version von Firefox. Das liegt an einem Filter von htmlarea der dafür sorgen soll das die richtigen Routinen verwendet werden. Dieser erkennt die 0.0.3 Signatur falsch (den User Agent String).&lt;br /&gt;
Der neue String heißt: &lt;br /&gt;
 Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3&lt;br /&gt;
das 1.3 verwechselt htmlarea mit dem IE für Mac&lt;br /&gt;
&lt;br /&gt;
Workaround: eine schnelle Lösung ist den Firefox mit einer anderen Signatur auszustatten:&lt;br /&gt;
Sie können den User Agent String in Firefox direkt ändern. Rufen Sie dazu in der Adresszeile auf:&lt;br /&gt;
&lt;br /&gt;
 about:config&lt;br /&gt;
&lt;br /&gt;
Im Anzeigebereich erscheinen die Firefox-Einstellungen. Klicken Sie hier auf die rechte Maustaste um das Kontextmenü zu öffnen und wählen Sie neu - String aus.&lt;br /&gt;
&lt;br /&gt;
Als Einstellungsname tragen Sie:&lt;br /&gt;
&lt;br /&gt;
 general.useragent.override&lt;br /&gt;
&lt;br /&gt;
ein. Als Wert tragen Sie beispielsweise ein (am Besten copy&amp;amp;paste):&lt;br /&gt;
&lt;br /&gt;
 Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.2pre) Gecko/20070111 Firefox/2.0.0.2&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen sind sofort wirksam (kein Neustart erforderlich). Falls Sie in Typo3 angemeldet waren, müssen Sie sich erneut anmelden.&lt;br /&gt;
&lt;br /&gt;
Um diesen User Agent Sting zu verwenden, wählen Sie ihn bitte aus dem Menü aus: &lt;br /&gt;
 Extras - User Agent Switcher - Firefox 2.0.0.2&lt;br /&gt;
Löschen Sie noch bitte den Cache von Firefox: &lt;br /&gt;
 Extras - Einstellungen - Erweitert - Netzwerk - Cache - Jetzt löschen&lt;br /&gt;
&lt;br /&gt;
Nun sollte der RTE in Typo3 wieder funktionieren. &lt;br /&gt;
=== htmlarea - Eigene Tags verwenden ===&lt;br /&gt;
In der Standard - Einstellung werden eigene Tags verworfen. So kann man das verhindern:&lt;br /&gt;
 ### Allow Custom Tags ###&lt;br /&gt;
 RTE.default.proc.allowTags = list-of-allowed-tags&lt;br /&gt;
 RTE.default.proc.HTMLparser_rte.tags.mycustomtag.protect =1&lt;br /&gt;
Wobei &amp;#039;&amp;#039;list-of-allowed-tags&amp;#039;&amp;#039; eine Kommaseparierte Liste der erlaubten Tags enthält und &amp;#039;&amp;#039;mycustomtag&amp;#039;&amp;#039; den betreffenden neuen Tag schützt.&lt;br /&gt;
&lt;br /&gt;
=== htmlarea - Bilder lassen sich nicht speichern ===&lt;br /&gt;
Das &amp;quot;Problem&amp;quot; liegt darin dass htmlarea standardmässig so&lt;br /&gt;
konfiguriert ist:&lt;br /&gt;
&lt;br /&gt;
 ## REMOVE IMG TAGS&lt;br /&gt;
 entryHTMLparser_db.tags.img.allowedAttribs = 0&lt;br /&gt;
 entryHTMLparser_db.tags.img.rmTagIfNoAttrib = 1&lt;br /&gt;
&lt;br /&gt;
Damit werden beim Speichern in typo3 also zuerst alle Attribute&lt;br /&gt;
aus dem Image-Tag entfernt und schließlich der gesamte Tag auch&lt;br /&gt;
noch, weil er ja kein Attribut mehr enthält.&lt;br /&gt;
&lt;br /&gt;
Ohne Häcken im Extension-Manager tut es also auch&lt;br /&gt;
&lt;br /&gt;
 ## SAVE IMG TAGS&lt;br /&gt;
 entryHTMLparser_db.tags.img.allowedAttribs = alt,class,style,src,title&lt;br /&gt;
 entryHTMLparser_db.tags.img.rmTagIfNoAttrib = 1&lt;br /&gt;
&lt;br /&gt;
Vor allem das Attribut src ist wichtig ;-)&lt;br /&gt;
&lt;br /&gt;
===htmlarea - Fehlermeldung wenn Bilder im Frontend angezeigt werden sollen===&lt;br /&gt;
Bei Versionen unter Typo3 4.0 eine niedrigere Version von htmlarea verwenden (1.1.3 oder evt. 1.1.6)&lt;br /&gt;
&lt;br /&gt;
=== Hide Buttons - Show Buttons ===&lt;br /&gt;
showButtons&lt;br /&gt;
hideButtons &lt;br /&gt;
list of id-strings&lt;br /&gt;
Note: In the case of htmlArea RTE, available buttons are: blockstylelabel, blockstyle, textstylelabel, textstyle, fontstyle, fontsize, formatblock, bold, italic, underline, strikethrough, subscript, superscript, lefttoright, righttoleft, left, center, right, justifyfull, orderedlist, unorderedlist, outdent, indent, textcolor, bgcolor, textindicator, emoticon, insertcharacter, line, link, image, table, user, acronym, findreplace, spellcheck, chMode, inserttag, removeformat, copy, cut, paste, undo, redo, showhelp, about, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge&lt;br /&gt;
&lt;br /&gt;
Note: In the case of htmlArea RTE, if extension sr_static_info is not installed, the spellcheck button is not enabled.&lt;br /&gt;
&lt;br /&gt;
Note:In the case of htmlArea RTE,  the following elements will always be shown: undo redo, about.&lt;br /&gt;
&lt;br /&gt;
Note: In the case of htmlArea RTE, buttons user and acronym are never available in the front end.&lt;br /&gt;
&lt;br /&gt;
Note:  In the case of htmlArea RTE, button Acronym is not currently available in IE.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Rich_Text_Editor_(RTE)&amp;diff=22873</id>
		<title>Typo3 - Rich Text Editor (RTE)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Rich_Text_Editor_(RTE)&amp;diff=22873"/>
		<updated>2018-03-06T08:25:29Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Snippets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Snippets ==&lt;br /&gt;
=== iFrames im RTE erlauben ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Seiten TS-Config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typoscript&amp;quot;&amp;gt;&lt;br /&gt;
RTE.default.proc.allowTags := addToList(iframe,embed,object,param)&lt;br /&gt;
RTE.default.proc.entryHTMLparser_db.allowTags := addToList(iframe,embed,object,param)&lt;br /&gt;
RTE.default.proc.allowTagsOutside := addToList(iframe,embed,object,param)&lt;br /&gt;
  &lt;br /&gt;
plugin.tt_news.displaySingle.content_stdWrap.parseFunc {&lt;br /&gt;
  nonTypoTagStdWrap.encapsLines.nonWrappedTag &amp;gt;&lt;br /&gt;
  allowTags = script, iframe, param, embed, object, a, abbr, acronym, address, blockquote, b, br, caption, center, cite, code, div, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, link, ol, p, pre, q, sdfield, span, strike, strong, sub, sup, table, thead, tbody, tfoot, td, th, tr, tt, u, ul&lt;br /&gt;
}&lt;br /&gt;
plugin.tt_news.general_stdWrap.parseFunc.allowTags := addToList(iframe,embed,object,param,p)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TypoScript Template Konstanten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Achtung alles in eine Zeile schreiben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typoscript&amp;quot;&amp;gt;&lt;br /&gt;
styles.content.links.allowTags = b,i,u,a,img,br,div,center,pre,font, hr,sub,sup,p,strong,em,li,ul,ol,blockquote,strike,del,ins,span, h1,h2,h3,h4,h5,h6,address,iframe,object,param,embed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== TYPO3 6.2 Config ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Deprecated property			Use instead&lt;br /&gt;
disableRightClick			contextMenu.disable&lt;br /&gt;
disableContextMenu			contextMenu.disable&lt;br /&gt;
hidePStyleItems				buttons.formatblock.removeItems&lt;br /&gt;
hideFontFaces				buttons.fontstyle.removeItems&lt;br /&gt;
fontFace				buttons.fontstyle.addItems&lt;br /&gt;
hideFontSizes				buttons.fontsize.removeItems&lt;br /&gt;
classesCharacter			buttons.textstyle.tags.span.allowedClasses&lt;br /&gt;
classesParagraph			buttons.blockstyle.tags.div.allowedClasses&lt;br /&gt;
classesTable				buttons.blockstyle.tags.table.allowedClasses&lt;br /&gt;
classesTD				buttons.blockstyle.tags.td.allowedClasses&lt;br /&gt;
classesImage				buttons.image.properties.class.allowedClasses&lt;br /&gt;
classesLinks				buttons.link.properties.class.allowedClasses&lt;br /&gt;
blindImageOptions			buttons.image.options.removeItems&lt;br /&gt;
blindLinkOptions			buttons.link.options.removeItems&lt;br /&gt;
defaultLinkTarget			buttons.link.properties.target.default&lt;br /&gt;
fontSize				buttons.fontsize.addItems&lt;br /&gt;
RTE.default.classesAnchor		RTE.default.buttons.link.properties.class.allowedClasses&lt;br /&gt;
RTE.default.classesAnchor.default.[link-type]	RTE.default.buttons.link.[link-type].properties.class.default&lt;br /&gt;
mainStyleOverride			contentCSS&lt;br /&gt;
mainStyleOverride_add.[key]		contentCSS&lt;br /&gt;
mainStyle_font				contentCSS&lt;br /&gt;
mainStyle_size				contentCSS&lt;br /&gt;
mainStyle_color				contentCSS&lt;br /&gt;
mainStyle_bgcolor			contentCSS&lt;br /&gt;
inlineStyle.[any-keystring]		contentCSS&lt;br /&gt;
ignoreMainStyleOverride			n.a.&lt;br /&gt;
disableTYPO3Browsers			buttons.image.TYPO3Browser.disabled and buttons.link.TYPO3Browser.disabled&lt;br /&gt;
showTagFreeClasses			buttons.blockstyle.showTagFreeClasses and buttons.textstyle.showTagFreeClasses&lt;br /&gt;
disablePCexamples			buttons.blockstyle.disableStyleOnOptionLabel and buttons.textstyle.disableStyleOnOptionLabel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== CSS für RTE und einige Eigenschaften ===&lt;br /&gt;
&lt;br /&gt;
TS Config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.default {&lt;br /&gt;
&lt;br /&gt;
    contentCSS = fileadmin/template/rte.css&lt;br /&gt;
&lt;br /&gt;
    ## Markup options (htmlArea RTE only)&lt;br /&gt;
    enableWordClean = 1&lt;br /&gt;
    removeTrailingBR = 1&lt;br /&gt;
    removeComments = 1&lt;br /&gt;
    removeTags = center, o:p, sdfield&lt;br /&gt;
    removeTagsAndContents = style,script&lt;br /&gt;
    roteSchrift {&lt;br /&gt;
        name = Rote Schrift&lt;br /&gt;
        value = color: #8A0020;&lt;br /&gt;
    }&lt;br /&gt;
    graueSchrift {&lt;br /&gt;
        name = Graue Schrift&lt;br /&gt;
        value = color: #C0C0C0;&lt;br /&gt;
    }&lt;br /&gt;
    grueneSchrift {&lt;br /&gt;
        name = Grüne Schrift&lt;br /&gt;
        value = color: #5e912b;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    proc.allowedClasses (&lt;br /&gt;
        external-link, external-link-new-window, internal-link, internal-link-new-window, download, mail,&lt;br /&gt;
        align-left, align-center, align-right, align-justify,&lt;br /&gt;
        csc-frame-frame1, csc-frame-frame2,&lt;br /&gt;
        component-items, action-items,&lt;br /&gt;
        component-items-ordered, action-items-ordered,&lt;br /&gt;
        roteSchrift, graueSchrift, grueneSchrift&lt;br /&gt;
        indent&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
classesCharacter = roteSchrift, graueSchrift, grueneSchrift&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiterführendes ==&lt;br /&gt;
Das sieht sehr gut aus -&amp;gt; sehr umfassend und ausführlich erklärt (Datum des Zugriffs 26.1.2010)&lt;br /&gt;
&lt;br /&gt;
http://www.site42.de/Wie-konfiguriert-man-den-RTE-h.58.0.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RTE-Konfiguration als Extension laden ==&lt;br /&gt;
Todo. Vgl. die Extension Rich Text Editor pre-configuration die bei den Examples steht.&lt;br /&gt;
&lt;br /&gt;
== RTE einrichten ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ab Version 4 ist der Editor &amp;#039;&amp;#039;&amp;#039;HTMLArea&amp;#039;&amp;#039;&amp;#039; eingesetzt, den es für frühere Versionen als Extension gibt. Für Typo3 Versionen unter 4 muß die HTMLArea Extension in einer Version kleiner 1.3 installiert werden sonst gibt&amp;#039;s eine Fehlermeldung beim Verlinken.&lt;br /&gt;
&lt;br /&gt;
Das Aussehten des RTE, die verfügbaren Optionen und die HTML-Ausgabe läßt sich einstellen.&lt;br /&gt;
Über das PageTS Config Feld der Seiten kann man z.B. einzelne Funktionen des RTE für den Seitenbaum abstellen.&lt;br /&gt;
=== Alternativer RTE ===&lt;br /&gt;
Als alternative bietet sich TinyMCE an. Er ist schlanker als htmlarea und läßt sich meist leichter einstellen. Allerdings bietet er nicht soviele Konfigurationsmöglichkeiten (Stand 2010)&lt;br /&gt;
&lt;br /&gt;
=== RTE Standard CSS Stylesheet anpassen ===&lt;br /&gt;
==== Eigenes Stylesheet einbinden ====&lt;br /&gt;
Eine eigene Datei funktioniert für die Innerhalb des Texteditors. Um die Styles in den Dropdown-Feldern anzupassen muß man aber TypoScript anwenden (s.u.).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.default {&lt;br /&gt;
   contentCSS = fileadmin/rte_css/css_htmlarea.css&lt;br /&gt;
   useCSS = 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Anpassen der Klassen über TypoScript ====&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Klassen hinzufügen&lt;br /&gt;
RTE.default.proc.allowedClasses := addToList(error,more-link, info-block, block)&lt;br /&gt;
RTE.default.classesParagraph := addToList(error,info-block)&lt;br /&gt;
RTE.default.classesCharacter := addToList(block)&lt;br /&gt;
RTE.default.classesAnchor := addToList(more-link)&lt;br /&gt;
&lt;br /&gt;
#nicht benoetigte Klassen entfernen&lt;br /&gt;
RTE.default.classesParagraph := removeFromList(csc-frame-frame1, csc-frame-frame2)&lt;br /&gt;
RTE.default.proc.allowedClasses := removeFromList(csc-frame-frame1, csc-frame-frame2, important, name-of-person, detail)&lt;br /&gt;
RTE.classes := removeFromList(csc-frame-frame1, csc-frame-frame2, important, name-of-person, detail) &lt;br /&gt;
&lt;br /&gt;
#Klassen fuer die RTE Auswahlfelder definieren&lt;br /&gt;
RTE.classes.error {&lt;br /&gt;
   name = Error in Red&lt;br /&gt;
   value = color: #FF0000; font-weight: bold; background-color: #ffff00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RTE.classesAnchor.more-link {&lt;br /&gt;
   name = Link with an Arrow&lt;br /&gt;
   value = background: transparent url(../img/arrow.png)no-repeat 0 0; padding:0 0 0 14px;&lt;br /&gt;
}&lt;br /&gt;
RTE.classesAnchor.info-block {&lt;br /&gt;
   name = Infoblock with grey background&lt;br /&gt;
   value = background-color: #ececec;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#NEUE CSS KLASSEN HINZUFUEGEN IM RTE&lt;br /&gt;
#**********************************************&lt;br /&gt;
RTE {&lt;br /&gt;
   default {&lt;br /&gt;
      contentCSS = fileadmin/templates/vdi-templates/css/rte.css&lt;br /&gt;
      showTagFreeClasses = 1&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RTE HTML-Ausgabe ===&lt;br /&gt;
Der RTE formatiert verändert den HTML Code auf verschiedene Weise. Wie er das macht läßt sich beeinflussen. Hier einige nützliche Beispiele:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Restriktive RTE-Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
1.Schritt: Nur die Inhaltselemente Text und Text mit Bild sollen mit dem RTE bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Im PageTS-Config Feld:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.default.disabled=1&lt;br /&gt;
RTE.config.tt_content.bodytext.types{&lt;br /&gt;
   text.disabled = 0&lt;br /&gt;
   textpic.disabled = 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2. Schritt: Nur noch die Standardformatierung und zwei Spezial formatierungen zur Auswahl lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.classes{&lt;br /&gt;
   highlight{&lt;br /&gt;
      name = Highlight&lt;br /&gt;
      value = font:bold; color: red;&lt;br /&gt;
   }&lt;br /&gt;
   zitat{&lt;br /&gt;
      name = Zitat&lt;br /&gt;
      value=font:italic 15px; margin-left:20px;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
RTE.default.classesCharacter = highlight, zitat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.Schritt: Üver das User TSConfig kann man nun einstellen welche Menüoptionen dem User angezeigt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   options.RTEkeyList = class, bold, italic, link&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfigurationsbeispiele ==&lt;br /&gt;
== htmlArea ==&lt;br /&gt;
Mit der Extension htmlarea steht auch für Mozilla basierte Browser ein Editor zur Verfügung der auf dem bekannten HTMLArea basiert.&lt;br /&gt;
&lt;br /&gt;
Viele der RTE Optionen funktionieren auch in htmlarea, darüber hinaus auch noch einige weitere. &lt;br /&gt;
&lt;br /&gt;
== Konfigurationsbeispiele htmlarea ==&lt;br /&gt;
&lt;br /&gt;
=== Kommentiertes Beispiel ===&lt;br /&gt;
Quelle: http://www.typo3-lisardo.de/home/blog-post/2010/09/02/rte-htmlarea-einrichten.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Konfiguration im Page TSconfig&lt;br /&gt;
########## Grundeinstellungen ##########&lt;br /&gt;
RTE.default{&lt;br /&gt;
  useCSS=1&lt;br /&gt;
  ignoreMainStyleOverride=0&lt;br /&gt;
 &lt;br /&gt;
  # Damit kann die übermäßig große Schriftdarstellung in den Tabellen&lt;br /&gt;
  # im Firefox korrigiert werden. Ausserdem ist es möglich, die grundlegende&lt;br /&gt;
  # Darstellung im RTE-Eingabefenster zu konfigurieren: Schrift, Schrifgrößen etc.&lt;br /&gt;
  mainStyleOverride_add.TD=font-size:12px;&lt;br /&gt;
  mainStyleOverride_add.H1=font-size:16px;color:#a7b198;&lt;br /&gt;
  mainStyleOverride_add.H2=font-size:16px;color:#a7b198;&lt;br /&gt;
 &lt;br /&gt;
  # Überschreiben der Default-Einstellungen zu den erlaubten Tags&lt;br /&gt;
  proc.allowTags=code,table,tbody,tr,th,td,h1,h2,h3,h4,h5,h6,div,p,br,span,ul,ol,li,pre,blockquote,strong,em,b,i,u,sub,sup,strike,a,link,img,nobr,hr,center,font,tt,q,cite&lt;br /&gt;
  proc.entryHTMLparser_db.allowTags&amp;lt;RTE.default.proc.allowTags&lt;br /&gt;
  proc.entryHTMLparser_db.tags.a.fixAttrib.title.unset =1&lt;br /&gt;
  # das ist nicht unbedingt erforderlich, wenn man in den »Default&lt;br /&gt;
  # configuration settings« die Option »Typical gewählt hat«. Wenn&lt;br /&gt;
  # man eine der anderen beiden eingestellt hat, muss man diese Zeile anpassen. &lt;br /&gt;
 &lt;br /&gt;
  # Welche Buttons sollen im RTE gezeigt werden?&lt;br /&gt;
  showButtons= *&lt;br /&gt;
  hideButtons=strikethrough,lefttoright,righttoleft&lt;br /&gt;
  keepButtonGroupTogether=1&lt;br /&gt;
 &lt;br /&gt;
  # wenn den Redakteuren eigene Klassen zur Verfügung gestellt werden, müssen&lt;br /&gt;
  # diese in einem Stylesheet extra dem RTE zur Verfüung gestellt werden.&lt;br /&gt;
  contentCSS=fileadmin/css/screen/content_rte.css&lt;br /&gt;
 &lt;br /&gt;
  # nur Klassen mit Tags erlauben. z. B. : p.klasse {border:1px solid #ccc}&lt;br /&gt;
  showTagFreeClasses=0&lt;br /&gt;
 &lt;br /&gt;
  # hier wird definiert, welche Klassen den Redakteuren zur&lt;br /&gt;
  # Verfügung gestellt werden: die vorhandenen Klassen für die&lt;br /&gt;
  # Zeichenformatierung werden hier ausgeschaltet:&lt;br /&gt;
  classesCharacter=&lt;br /&gt;
  # die vorhandenen Klassen zum Formatieren von Absätzen werden&lt;br /&gt;
  # durch die selbstdefinierten Klassen überschrieben:&lt;br /&gt;
  classesParagraph=linie_danach,linie_davor,kasten_gruen_hg&lt;br /&gt;
  # Tipp: wenn die default-Klassen übernommen und nur ergänzt&lt;br /&gt;
  # werden sollen, dann so schreiben:&lt;br /&gt;
  # classesParagraph := linie_danach ...&lt;br /&gt;
 &lt;br /&gt;
  # Klassendefinition für die gesamte Tabelle&lt;br /&gt;
  classesTable=tabelle01&lt;br /&gt;
  # Klassendefinition für die einzelnen Zellen&lt;br /&gt;
  classesTD=zelle01,zelle02&lt;br /&gt;
  # das kann für tr, thead, tbody ebenfalls gemacht werden&lt;br /&gt;
 &lt;br /&gt;
  # Jetzt müssen die einzelnen Klassen noch explizit erlaubt werden&lt;br /&gt;
  proc.allowedClasses=linie_danach,linie_davor,kasten_gruen_hg,tabelle01,zelle01,zelle02&lt;br /&gt;
 &lt;br /&gt;
  # Schriften erlauben&lt;br /&gt;
  fontFace=font1,font2&lt;br /&gt;
 &lt;br /&gt;
  # Farben erlauben&lt;br /&gt;
  colors=color1,color2&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
############ Achtung!! ###############&lt;br /&gt;
# Alle selbstdefinierten Klassen müssen in dem oben eingebundenen&lt;br /&gt;
# Stylesheet auch definiert sein!&lt;br /&gt;
# Dabei muss beachtet werden, dass Tag-lose Klassen durch showTagFreeClasses = 0&lt;br /&gt;
# ausgeschaltet wurden:&lt;br /&gt;
# Falsch: .linie_danach {border-bottom: ...}&lt;br /&gt;
# Richtig: p.linie_danach {border-bottom: ...}&lt;br /&gt;
# Genauso bei den Tabellen.&lt;br /&gt;
#######################################&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
########### Definition der Klassenbezeichnungen für die Redakteure&lt;br /&gt;
 &lt;br /&gt;
RTE.classes {&lt;br /&gt;
  # hier werden die Namen der Klassen »lesbar« gemacht&lt;br /&gt;
  linie_davor.name=Linie davor&lt;br /&gt;
  linie_danach.name=Linie danach&lt;br /&gt;
  kasten_gruen_hg.name=Kasten:grüner HG&lt;br /&gt;
  kasten_gruen_r.name=Kasten:grüner Rahmen&lt;br /&gt;
  kasten_info.name=Kasten:Info-Knopf&lt;br /&gt;
  tabelle01.name=Standard in Blau-Grau&lt;br /&gt;
  zelle01.name=Zellen blauer Hintergrund&lt;br /&gt;
  zelle02.name=Zellen ohne Hintergrund&lt;br /&gt;
  zelle03.name=Zellen grauer Hintergrund&lt;br /&gt;
 &lt;br /&gt;
  # Wenn man will kann man die Anzeige der Klassen in den Menüs für die&lt;br /&gt;
  # Redakteure auch noch optisch anpassen:&lt;br /&gt;
  linie_davor.name=Linie davor&lt;br /&gt;
  linie_davor.value=border-bottom:1x solid#ff0000&lt;br /&gt;
  # damit erscheint der Eintrag im Menü schon so formatiert, wie&lt;br /&gt;
  # später der Absatz. Nötig ist das aber nicht.&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
############# Definition de Schriftmenüs ###########&lt;br /&gt;
 &lt;br /&gt;
RTE.fonts {&lt;br /&gt;
  font1 {&lt;br /&gt;
    name=Verdana&lt;br /&gt;
    value=verdana,arial,helvetica,sans-serif&lt;br /&gt;
  }&lt;br /&gt;
  font2 {&lt;br /&gt;
    name=Georgia&lt;br /&gt;
    value=georgia,times,&amp;#039;times new roman&amp;#039;,serif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
########### Definition des Farbmenüs ##############&lt;br /&gt;
 &lt;br /&gt;
RTE.colors {&lt;br /&gt;
  color1 {&lt;br /&gt;
    name=t3 blau&lt;br /&gt;
    value=#0000ff&lt;br /&gt;
  }&lt;br /&gt;
  color2 {&lt;br /&gt;
    name=t3 grün&lt;br /&gt;
    value=#00ff00&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
########### Definition der Link-Klassen ##############&lt;br /&gt;
 &lt;br /&gt;
RTE.classesAnchor {&lt;br /&gt;
  externalLink {&lt;br /&gt;
    class =ext-link&lt;br /&gt;
    type=url&lt;br /&gt;
    image=fileadmin/icons/ext-link.gif&lt;br /&gt;
  }&lt;br /&gt;
  externalLinkInNewWindow {&lt;br /&gt;
    class =ext-link2&lt;br /&gt;
    type=url&lt;br /&gt;
    image=fileadmin/icons/ext-link2.gif&lt;br /&gt;
  }&lt;br /&gt;
  internalLink {&lt;br /&gt;
    class =int-link&lt;br /&gt;
    type=page&lt;br /&gt;
    image=fileadmin/icons/int-link.gif&lt;br /&gt;
  }&lt;br /&gt;
  internalLinkInNewWindow {&lt;br /&gt;
    class =int-link2&lt;br /&gt;
    type=page&lt;br /&gt;
    image=fileadmin/icons/int-link2.gif&lt;br /&gt;
  }&lt;br /&gt;
  download {&lt;br /&gt;
    class =download&lt;br /&gt;
    type=file&lt;br /&gt;
    image=fileadmin/icons/down.gif&lt;br /&gt;
  }&lt;br /&gt;
  mail {&lt;br /&gt;
    class =mail&lt;br /&gt;
    type=mail&lt;br /&gt;
    image=fileadmin/icons/mail.gif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Beispielkonfiguration für PageTS mit verschiedenen Möglichkeiten ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###########&lt;br /&gt;
### RTE ###&lt;br /&gt;
###########&lt;br /&gt;
# Klassendefinitionen löschen und neue Klassendefinitionen zulassen&lt;br /&gt;
RTE.config.tt_content.bodytext.proc.allowedClasses &amp;gt;&lt;br /&gt;
&lt;br /&gt;
# CSS für die Anzeige im Editor selbst #&lt;br /&gt;
RTE.default.contentCSS = fileadmin/templates/css/rte.css&lt;br /&gt;
&lt;br /&gt;
# Sichtbare Buttons #&lt;br /&gt;
&lt;br /&gt;
RTE.default{&lt;br /&gt;
   # diverse Einstellungen&lt;br /&gt;
   keepButtonGroupTogether = 1&lt;br /&gt;
   # Buttons (mit Tabelle)&lt;br /&gt;
   #showButtons = blockstylelabel, blockstyle, textstylelabel, textstyle, formatblock,left, right, center, bold, italic, subscript, superscript, orderedlist, unorderedlist, outdent, indent, insertcharacter, link, acronym, chMode, removeformat,table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge&lt;br /&gt;
   # Buttons (ohne Tabellen)&lt;br /&gt;
   showButtons = blockstylelabel, blockstyle, textstylelabel, textstyle, formatblock, bold, italic, subscript, superscript, orderedlist, unorderedlist, outdent, indent, insertcharacter, link, chMode, removeformat&lt;br /&gt;
   #hideButtons = fontstyle, formatblock, fontsize, strikethrough,lefttoright, righttoleft, textcolor, bgcolor, textindicator, emoticon, user, spellcheck, chMode, inserttag, outdent, indent, justifyfull, subscript, superscript, acronym, copy, cut, paste     &lt;br /&gt;
   &lt;br /&gt;
   proc{&lt;br /&gt;
      # zusätzliche ERLAUBTE TAGS&lt;br /&gt;
      #allowTags := addToList(blockquote,center,align)&lt;br /&gt;
      #allowedClasses := removeFromList(csc-frame-frame1, csc-frame-frame2) &lt;br /&gt;
      #allowedClasses := addToList(rahmen-blau)&lt;br /&gt;
      allowTags = table, tbody, tr, th, td, h1, h2, h3, h4, h5, h6, div, p, br, span, ul, ol, li, re, blockquote, strong, em, b, i, u, sub, sup, strike, a, img, nobr, hr, tt, q, cite, abbr, acronym, center&lt;br /&gt;
      denyTags = font&lt;br /&gt;
      HTMLparser_rte.tags.align.protect =1&lt;br /&gt;
      keepPDIVattribs = align,class,style,id&lt;br /&gt;
   }&lt;br /&gt;
   # weitere Klassen hinzufügen / verändern&lt;br /&gt;
   #classesParagraph := removeFromList(csc-frame-frame1, csc-frame-frame2)&lt;br /&gt;
   #classesParagraph := addToList(rahmen-blau)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Definition der Klassen für die Anzeige im Editor&lt;br /&gt;
#RTE.classes { &lt;br /&gt;
#   csc-frame-frame1 {&lt;br /&gt;
#      name = blauer Rahmen&lt;br /&gt;
#      value = font-family:Verdana,Arial,Helvetica,sans-serif;background: #ebeef5;border: 1px dotted #113388;&lt;br /&gt;
#   }&lt;br /&gt;
#   csc-frame-frame2 {&lt;br /&gt;
#      name = gelber Rahmen&lt;br /&gt;
#      value = font-family:Verdana,Arial,Helvetica,sans-serif;background: #fcf4e9;border: 1px dotted #f3ae00;&lt;br /&gt;
#   }&lt;br /&gt;
#} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Noch ein kleines Beispiel ===&lt;br /&gt;
(Aus seo-24.at)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TCEFORM.tt_content.bodytext.RTEfullScreenWidth = 650&lt;br /&gt;
&lt;br /&gt;
RTE.default {&lt;br /&gt;
enableWordClean = 1&lt;br /&gt;
removeTrailingBR = 1&lt;br /&gt;
removeComments = 1&lt;br /&gt;
removeTags = center, sdfield&lt;br /&gt;
removeTagsAndContents = style,script&lt;br /&gt;
&lt;br /&gt;
# Buttons die gezeigt/versteckt werden&lt;br /&gt;
showButtons = bold, italic, underline, left, center, right, orderedlist, unorderedlist, link, image, removeformat, table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge, findreplace, insertcharacter, undo, redo, textcolor, bgcolor&lt;br /&gt;
hideButtons = textstyletextstylelabel, blockstyle, blockstylelabel, fontstyle, formatblock, fontsize, strikethrough,lefttoright, righttoleft, textindicator, emoticon, user, spellcheck, chMode, inserttag, outdent, indent, justifyfull, subscript, superscript, acronym, copy, cut, paste, showhelp, about, insertcharacter, line&lt;br /&gt;
&lt;br /&gt;
# Hält die RTE Icons gegroupt zusammen&lt;br /&gt;
keepButtonGroupTogether = 1&lt;br /&gt;
&lt;br /&gt;
# blendet Statusbar in htmlarea aus&lt;br /&gt;
showStatusBar = 0&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eigene Tags verwenden===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE.default.proc.allowTags = list-of-allowed-tags&lt;br /&gt;
RTE.default.proc.HTMLparser_rte.tags.mycustomtag.protect =1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where&lt;br /&gt;
list-of-allowed-tags is the list of all allowed tags, including your custom tag, and&lt;br /&gt;
mycustomtag is the name of your tag.&lt;br /&gt;
===Klasse für Tabellen ändern===&lt;br /&gt;
«Typo3 always replaces the class I selected in the RTE for a table with the class &amp;quot;contenttable&amp;quot;. Do you have an idea how to switch that off?»&lt;br /&gt;
Assuming that you have installed extension CSS Styled Content (css_styled_content), add the following line in your TS template Setup field:&lt;br /&gt;
 lib.parseFunc_RTE.externalBlocks.table.stdWrap.HTMLparser.tags.table.fixAttrib.class.list &amp;gt;&lt;br /&gt;
&lt;br /&gt;
The contenttable class will then be added only if no class is specified for the table.&lt;br /&gt;
=== diverses ===&lt;br /&gt;
==== eigene Klassen ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RTE {&lt;br /&gt;
    classes {&lt;br /&gt;
        Infobox {&lt;br /&gt;
            name = Infobox&lt;br /&gt;
            value = eigenschaften&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    default {&lt;br /&gt;
        classesParagraph = Infobox&lt;br /&gt;
        contentCSS = fileadmin/templates/version1/css/style.css&lt;br /&gt;
        classesCharacter = Infobox&lt;br /&gt;
        proc.allowedClasses (&lt;br /&gt;
            Infobox, ...&lt;br /&gt;
        )&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme und Lösungen ==&lt;br /&gt;
=== RTE speichert keine Attribute ===&lt;br /&gt;
Symptome: Wenn man im RTE target _blank angibt wird dieses nicht gespeichert und taucht nicht im HTML Code auf.&lt;br /&gt;
&lt;br /&gt;
Abhilfe: Die Attribute müssen erlaubt sein. Dies kann man z.B. im PageTS einstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
entryHTMLparser_db {&lt;br /&gt;
  tags {   &lt;br /&gt;
    a.allowedAttribs = id, title, dir, lang, xml:lang, class, href, rel, hreflang, target, nofollow&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Bug mit htmlarea und Firefox 2.0.0.3 ===&lt;br /&gt;
Der Editor lädt nicht in der oben genannten Version von Firefox. Das liegt an einem Filter von htmlarea der dafür sorgen soll das die richtigen Routinen verwendet werden. Dieser erkennt die 0.0.3 Signatur falsch (den User Agent String).&lt;br /&gt;
Der neue String heißt: &lt;br /&gt;
 Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3&lt;br /&gt;
das 1.3 verwechselt htmlarea mit dem IE für Mac&lt;br /&gt;
&lt;br /&gt;
Workaround: eine schnelle Lösung ist den Firefox mit einer anderen Signatur auszustatten:&lt;br /&gt;
Sie können den User Agent String in Firefox direkt ändern. Rufen Sie dazu in der Adresszeile auf:&lt;br /&gt;
&lt;br /&gt;
 about:config&lt;br /&gt;
&lt;br /&gt;
Im Anzeigebereich erscheinen die Firefox-Einstellungen. Klicken Sie hier auf die rechte Maustaste um das Kontextmenü zu öffnen und wählen Sie neu - String aus.&lt;br /&gt;
&lt;br /&gt;
Als Einstellungsname tragen Sie:&lt;br /&gt;
&lt;br /&gt;
 general.useragent.override&lt;br /&gt;
&lt;br /&gt;
ein. Als Wert tragen Sie beispielsweise ein (am Besten copy&amp;amp;paste):&lt;br /&gt;
&lt;br /&gt;
 Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.2pre) Gecko/20070111 Firefox/2.0.0.2&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen sind sofort wirksam (kein Neustart erforderlich). Falls Sie in Typo3 angemeldet waren, müssen Sie sich erneut anmelden.&lt;br /&gt;
&lt;br /&gt;
Um diesen User Agent Sting zu verwenden, wählen Sie ihn bitte aus dem Menü aus: &lt;br /&gt;
 Extras - User Agent Switcher - Firefox 2.0.0.2&lt;br /&gt;
Löschen Sie noch bitte den Cache von Firefox: &lt;br /&gt;
 Extras - Einstellungen - Erweitert - Netzwerk - Cache - Jetzt löschen&lt;br /&gt;
&lt;br /&gt;
Nun sollte der RTE in Typo3 wieder funktionieren. &lt;br /&gt;
=== htmlarea - Eigene Tags verwenden ===&lt;br /&gt;
In der Standard - Einstellung werden eigene Tags verworfen. So kann man das verhindern:&lt;br /&gt;
 ### Allow Custom Tags ###&lt;br /&gt;
 RTE.default.proc.allowTags = list-of-allowed-tags&lt;br /&gt;
 RTE.default.proc.HTMLparser_rte.tags.mycustomtag.protect =1&lt;br /&gt;
Wobei &amp;#039;&amp;#039;list-of-allowed-tags&amp;#039;&amp;#039; eine Kommaseparierte Liste der erlaubten Tags enthält und &amp;#039;&amp;#039;mycustomtag&amp;#039;&amp;#039; den betreffenden neuen Tag schützt.&lt;br /&gt;
&lt;br /&gt;
=== htmlarea - Bilder lassen sich nicht speichern ===&lt;br /&gt;
Das &amp;quot;Problem&amp;quot; liegt darin dass htmlarea standardmässig so&lt;br /&gt;
konfiguriert ist:&lt;br /&gt;
&lt;br /&gt;
 ## REMOVE IMG TAGS&lt;br /&gt;
 entryHTMLparser_db.tags.img.allowedAttribs = 0&lt;br /&gt;
 entryHTMLparser_db.tags.img.rmTagIfNoAttrib = 1&lt;br /&gt;
&lt;br /&gt;
Damit werden beim Speichern in typo3 also zuerst alle Attribute&lt;br /&gt;
aus dem Image-Tag entfernt und schließlich der gesamte Tag auch&lt;br /&gt;
noch, weil er ja kein Attribut mehr enthält.&lt;br /&gt;
&lt;br /&gt;
Ohne Häcken im Extension-Manager tut es also auch&lt;br /&gt;
&lt;br /&gt;
 ## SAVE IMG TAGS&lt;br /&gt;
 entryHTMLparser_db.tags.img.allowedAttribs = alt,class,style,src,title&lt;br /&gt;
 entryHTMLparser_db.tags.img.rmTagIfNoAttrib = 1&lt;br /&gt;
&lt;br /&gt;
Vor allem das Attribut src ist wichtig ;-)&lt;br /&gt;
&lt;br /&gt;
===htmlarea - Fehlermeldung wenn Bilder im Frontend angezeigt werden sollen===&lt;br /&gt;
Bei Versionen unter Typo3 4.0 eine niedrigere Version von htmlarea verwenden (1.1.3 oder evt. 1.1.6)&lt;br /&gt;
&lt;br /&gt;
=== Hide Buttons - Show Buttons ===&lt;br /&gt;
showButtons&lt;br /&gt;
hideButtons &lt;br /&gt;
list of id-strings&lt;br /&gt;
Note: In the case of htmlArea RTE, available buttons are: blockstylelabel, blockstyle, textstylelabel, textstyle, fontstyle, fontsize, formatblock, bold, italic, underline, strikethrough, subscript, superscript, lefttoright, righttoleft, left, center, right, justifyfull, orderedlist, unorderedlist, outdent, indent, textcolor, bgcolor, textindicator, emoticon, insertcharacter, line, link, image, table, user, acronym, findreplace, spellcheck, chMode, inserttag, removeformat, copy, cut, paste, undo, redo, showhelp, about, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge&lt;br /&gt;
&lt;br /&gt;
Note: In the case of htmlArea RTE, if extension sr_static_info is not installed, the spellcheck button is not enabled.&lt;br /&gt;
&lt;br /&gt;
Note:In the case of htmlArea RTE,  the following elements will always be shown: undo redo, about.&lt;br /&gt;
&lt;br /&gt;
Note: In the case of htmlArea RTE, buttons user and acronym are never available in the front end.&lt;br /&gt;
&lt;br /&gt;
Note:  In the case of htmlArea RTE, button Acronym is not currently available in IE.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Launchpad_Remote_Scripts&amp;diff=22872</id>
		<title>Launchpad Remote Scripts</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Launchpad_Remote_Scripts&amp;diff=22872"/>
		<updated>2018-03-02T08:16:27Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Ableton Live]]&lt;br /&gt;
== Launchpad 95 ==&lt;br /&gt;
Super nützliches Tool mit Drum Step Sequencer mode to edit midi clips, a medodic step sequencer, and Device Controller mode to edit any parameter of any instrument, effect or device on any track of your arrangement, and finally an Instrument Mode providing a tighter integration with Live. &lt;br /&gt;
&lt;br /&gt;
Wird ausgepackt und in den Midi Remote Script Ordner von Ableton gepackt. Im Prinzip handelt es sich um eine Reihe Python Scripts. Danach kann es in den Midi Settings ausgewählt werden.&lt;br /&gt;
* http://motscousus.com/stuff/2011-07_Novation_Launchpad_Ableton_Live_Scripts/&lt;br /&gt;
* [[:File:Launchpad95.zip]]&lt;br /&gt;
=== Install ===&lt;br /&gt;
[[File:Launchpad95-Install.png|800px]]&lt;br /&gt;
=== Instrument Mode ===&lt;br /&gt;
[[File:Launchpad95-Instrument.jpg|800px]]&lt;br /&gt;
=== Drum Step Sequenzer ===&lt;br /&gt;
[[File:Launchpad95-Drum-Step-Sequenzer.jpg|800px]]&lt;br /&gt;
=== Melodic Step Sequenzer ===&lt;br /&gt;
[[File:Launchpad95-Melodic-Step-Sequenzer.jpg|800px]]&lt;br /&gt;
=== Device Controller ===&lt;br /&gt;
[[File:Launchpad95-Device-Controller.jpg|800px]]&lt;br /&gt;
=== Other Modes ===&lt;br /&gt;
[[File:Launchpad95-Other-Modes.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
== Launchpad Pro95 ==&lt;br /&gt;
Wie Launchpad 95 aber für das Pro.&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad Pro95.zip]]&lt;br /&gt;
&lt;br /&gt;
[[File:Launchpad Pro95.png]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Ableton_Live&amp;diff=22871</id>
		<title>Ableton Live</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Ableton_Live&amp;diff=22871"/>
		<updated>2018-03-02T08:15:37Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Ableton - Tipps und Tricks]]&lt;br /&gt;
 [[Max for Live]] Make interactive software&lt;br /&gt;
 [[Launchpad Remote Scripts]] - Geniale Skripts für das Arbeiten mit Ableton und Launchpad&lt;br /&gt;
== Clips ==&lt;br /&gt;
[[Ableton - Clips Basics]]&lt;br /&gt;
&lt;br /&gt;
== Tastaturkürzel ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Live / Session Umschalten  ||  Tab&lt;br /&gt;
|-&lt;br /&gt;
| Geräteansicht / Clip Ansicht umschalten || Shift + Tab&lt;br /&gt;
|-&lt;br /&gt;
| Quantisieren || cmd + U&lt;br /&gt;
|-&lt;br /&gt;
| Fade automatisch erzeugen || cmd + opt +F (erzeugt aus Selektion am Anfang, Ende oder in der Mitte Fade in und outs&lt;br /&gt;
|-&lt;br /&gt;
| Cliplänge konsolidieren || cmd + j (manche Dinge wie gemeinsames Warpen braucht gleiche Längen).&lt;br /&gt;
|-&lt;br /&gt;
| Gruppen erstellen  || cmd + g (funktioniert bei Tracks, Racks und vielem mehr).&lt;br /&gt;
|-&lt;br /&gt;
| Hand Navigation || cmd + opt (wie Leertaste bei Photoshop)&lt;br /&gt;
|-&lt;br /&gt;
| Mute single Midi Notes and Clips || 0 &lt;br /&gt;
|-&lt;br /&gt;
| Editieren in Oktaven || Shift + Pfeiltasten hoch/runter -&amp;gt; Midinoten oder Pitcher rasten in Oktaven ein.&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Midi Rechnertastatur ===&lt;br /&gt;
Oben rechts Keyboard Symbol muß an sein.&lt;br /&gt;
&lt;br /&gt;
QWER...                                              schwarze Tasten&lt;br /&gt;
ASDF... weiße Tasten&lt;br /&gt;
y,x     Oktave runter / hoch&lt;br /&gt;
c,v     Anschlagdynamik stärker schwächer&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22870</id>
		<title>JavaScript - Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22870"/>
		<updated>2018-03-01T16:35:54Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Parallax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Libraries Skripte und Plugins für JavaScript, sortiert nach Kategorien&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.jqueryscript.net/&lt;br /&gt;
&lt;br /&gt;
== Images Loaded ==&lt;br /&gt;
Testen ob alle Bilder geladen sind, um dann weitere Funktionen auzuführen.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Images Loaded]]&lt;br /&gt;
== Events ==&lt;br /&gt;
=== Gesture Recognition ===&lt;br /&gt;
[[JavaScript - hammer.js Webapp Touch Gestures]]&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
=== CreateJS ===&lt;br /&gt;
Tools für Animation und Interaktion&lt;br /&gt;
&lt;br /&gt;
http://createjs.com&lt;br /&gt;
&lt;br /&gt;
=== jQuery Appear ===&lt;br /&gt;
[[jQuery Appear - Plugin]] - Events wenn Elemente im Viewport auftauchen / verschwinden&lt;br /&gt;
&lt;br /&gt;
=== jQuery Easing ===&lt;br /&gt;
Easing Kurven für Animationen [[jQuery Easing - Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Simple Text Rotator ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Simple Text Rotator&lt;br /&gt;
!function(e){var t={animation:&amp;quot;dissolve&amp;quot;,separator:&amp;quot;,&amp;quot;,speed:2e3};e.fn.textrotator=function(n){var r=e.extend({},t,n);return this.each(function(){var t=e(this);var n=[];e.each(t.text().split(r.separator),function(e,t){n.push(t)});t.text(n[0]);var i=function(){switch(r.animation){case&amp;quot;dissolve&amp;quot;:t.animate({textShadowBlur:20,opacity:0},500,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).animate({textShadowBlur:0,opacity:1},500)});break;case&amp;quot;flip&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,transform:&amp;quot; rotateY(-180deg)&amp;quot;});break;case&amp;quot;flipUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,transform:&amp;quot; rotateX(-180deg)&amp;quot;});break;case&amp;quot;flipCube&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,transform:&amp;quot; rotateY(180deg)&amp;quot;});break;case&amp;quot;flipCubeUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,transform:&amp;quot; rotateX(180deg)&amp;quot;});break;case&amp;quot;spin&amp;quot;:if(t.find(&amp;quot;.rotating&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.rotating&amp;quot;).html())}s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating spin&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().text(n[s+1]).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotate(0) scale(1)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,transform:&amp;quot;rotate(0) scale(1)&amp;quot;});break;case&amp;quot;fade&amp;quot;:t.fadeOut(r.speed,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).fadeIn(r.speed)});break}};setInterval(i,r.speed)})}}(window.jQuery)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wow Reveal Animations ===&lt;br /&gt;
Kostenpflichtig für kommerzielle Seiten. Developer Lizenz ca 99$. Enthalten z.B. bei angelajochum.de. Kann kostenlos geladen werden zum testen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthieua/WOW&lt;br /&gt;
&lt;br /&gt;
http://mynameismatthieu.com/WOW/index.html&lt;br /&gt;
&lt;br /&gt;
=== Flippy Text Effekt ===&lt;br /&gt;
https://github.com/yemM/flippy&lt;br /&gt;
&lt;br /&gt;
Verwendet in Hera Template&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
=== Pushy ===&lt;br /&gt;
Gutes Mobiles Off-Canvas Menu&lt;br /&gt;
&lt;br /&gt;
[[Pushy Menu]]&lt;br /&gt;
=== Meanmenu ===&lt;br /&gt;
Verwandelt ein Normales verschachteltes Menu in ein gut zu bediendendes Mobiles Menu.&lt;br /&gt;
&lt;br /&gt;
[[Meanmenu.js - jQuery Plugin]] (1.x,2.x)&lt;br /&gt;
&lt;br /&gt;
=== jQuery Mobile Menu ===&lt;br /&gt;
Mobiles Dropdownmenü aus ul Liste&lt;br /&gt;
&lt;br /&gt;
[[jQuery Mobile Menu - Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Parallax ==&lt;br /&gt;
=== jquery-parallax (jQuery) ===&lt;br /&gt;
Einfach und effektiv.&lt;br /&gt;
&lt;br /&gt;
[[jquery-parallax]]&lt;br /&gt;
&lt;br /&gt;
=== Stellar.js ===&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/&lt;br /&gt;
&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/docs/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*! Stellar.js v0.6.2 | Copyright 2014, Mark Dalgleish | http://markdalgleish.com/projects/stellar.js | http://markdalgleish.mit-license.org */&lt;br /&gt;
!function(a,b,c,d){function e(b,c){this.element=b,this.options=a.extend({},g,c),this._defaults=g,this._name=f,this.init()}var f=&amp;quot;stellar&amp;quot;,g={scrollProperty:&amp;quot;scroll&amp;quot;,positionProperty:&amp;quot;position&amp;quot;,horizontalScrolling:!0,verticalScrolling:!0,horizontalOffset:0,verticalOffset:0,responsive:!1,parallaxBackgrounds:!0,parallaxElements:!0,hideDistantElements:!0,hideElement:function(a){a.hide()},showElement:function(a){a.show()}},h={scroll:{getLeft:function(a){return a.scrollLeft()},setLeft:function(a,b){a.scrollLeft(b)},getTop:function(a){return a.scrollTop()},setTop:function(a,b){a.scrollTop(b)}},position:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;top&amp;quot;),10)}},margin:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;margin-left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;margin-top&amp;quot;),10)}},transform:{getLeft:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[4],10):0},getTop:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[5],10):0}}},i={position:{setLeft:function(a,b){a.css(&amp;quot;left&amp;quot;,b)},setTop:function(a,b){a.css(&amp;quot;top&amp;quot;,b)}},transform:{setPosition:function(a,b,c,d,e){a[0].style[k]=&amp;quot;translate3d(&amp;quot;+(b-c)+&amp;quot;px, &amp;quot;+(d-e)+&amp;quot;px, 0)&amp;quot;}}},j=function(){var b,c=/^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/,d=a(&amp;quot;script&amp;quot;)[0].style,e=&amp;quot;&amp;quot;;for(b in d)if(c.test(b)){e=b.match(c)[0];break}return&amp;quot;WebkitOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Webkit&amp;quot;),&amp;quot;KhtmlOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Khtml&amp;quot;),function(a){return e+(e.length&amp;gt;0?a.charAt(0).toUpperCase()+a.slice(1):a)}}(),k=j(&amp;quot;transform&amp;quot;),l=a(&amp;quot;&amp;lt;div /&amp;gt;&amp;quot;,{style:&amp;quot;background:#fff&amp;quot;}).css(&amp;quot;background-position-x&amp;quot;)!==d,m=l?function(a,b,c){a.css({&amp;quot;background-position-x&amp;quot;:b,&amp;quot;background-position-y&amp;quot;:c})}:function(a,b,c){a.css(&amp;quot;background-position&amp;quot;,b+&amp;quot; &amp;quot;+c)},n=l?function(a){return[a.css(&amp;quot;background-position-x&amp;quot;),a.css(&amp;quot;background-position-y&amp;quot;)]}:function(a){return a.css(&amp;quot;background-position&amp;quot;).split(&amp;quot; &amp;quot;)},o=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a){setTimeout(a,1e3/60)};e.prototype={init:function(){this.options.name=f+&amp;quot;_&amp;quot;+Math.floor(1e9*Math.random()),this._defineElements(),this._defineGetters(),this._defineSetters(),this._handleWindowLoadAndResize(),this._detectViewport(),this.refresh({firstLoad:!0}),&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this._handleScrollEvent():this._startAnimationLoop()},_defineElements:function(){this.element===c.body&amp;amp;&amp;amp;(this.element=b),this.$scrollElement=a(this.element),this.$element=this.element===b?a(&amp;quot;body&amp;quot;):this.$scrollElement,this.$viewportElement=this.options.viewportElement!==d?a(this.options.viewportElement):this.$scrollElement[0]===b||&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this.$scrollElement:this.$scrollElement.parent()},_defineGetters:function(){var a=this,b=h[a.options.scrollProperty];this._getScrollLeft=function(){return b.getLeft(a.$scrollElement)},this._getScrollTop=function(){return b.getTop(a.$scrollElement)}},_defineSetters:function(){var b=this,c=h[b.options.scrollProperty],d=i[b.options.positionProperty],e=c.setLeft,f=c.setTop;this._setScrollLeft=&amp;quot;function&amp;quot;==typeof e?function(a){e(b.$scrollElement,a)}:a.noop,this._setScrollTop=&amp;quot;function&amp;quot;==typeof f?function(a){f(b.$scrollElement,a)}:a.noop,this._setPosition=d.setPosition||function(a,c,e,f,g){b.options.horizontalScrolling&amp;amp;&amp;amp;d.setLeft(a,c,e),b.options.verticalScrolling&amp;amp;&amp;amp;d.setTop(a,f,g)}},_handleWindowLoadAndResize:function(){var c=this,d=a(b);c.options.responsive&amp;amp;&amp;amp;d.bind(&amp;quot;load.&amp;quot;+this.name,function(){c.refresh()}),d.bind(&amp;quot;resize.&amp;quot;+this.name,function(){c._detectViewport(),c.options.responsive&amp;amp;&amp;amp;c.refresh()})},refresh:function(c){var d=this,e=d._getScrollLeft(),f=d._getScrollTop();c&amp;amp;&amp;amp;c.firstLoad||this._reset(),this._setScrollLeft(0),this._setScrollTop(0),this._setOffsets(),this._findParticles(),this._findBackgrounds(),c&amp;amp;&amp;amp;c.firstLoad&amp;amp;&amp;amp;/WebKit/.test(navigator.userAgent)&amp;amp;&amp;amp;a(b).load(function(){var a=d._getScrollLeft(),b=d._getScrollTop();d._setScrollLeft(a+1),d._setScrollTop(b+1),d._setScrollLeft(a),d._setScrollTop(b)}),this._setScrollLeft(e),this._setScrollTop(f)},_detectViewport:function(){var a=this.$viewportElement.offset(),b=null!==a&amp;amp;&amp;amp;a!==d;this.viewportWidth=this.$viewportElement.width(),this.viewportHeight=this.$viewportElement.height(),this.viewportOffsetTop=b?a.top:0,this.viewportOffsetLeft=b?a.left:0},_findParticles:function(){{var b=this;this._getScrollLeft(),this._getScrollTop()}if(this.particles!==d)for(var c=this.particles.length-1;c&amp;gt;=0;c--)this.particles[c].$element.data(&amp;quot;stellar-elementIsActive&amp;quot;,d);this.particles=[],this.options.parallaxElements&amp;amp;&amp;amp;this.$element.find(&amp;quot;[data-stellar-ratio]&amp;quot;).each(function(){var c,e,f,g,h,i,j,k,l,m=a(this),n=0,o=0,p=0,q=0;if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)){if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)!==this)return}else m.data(&amp;quot;stellar-elementIsActive&amp;quot;,this);b.options.showElement(m),m.data(&amp;quot;stellar-startingLeft&amp;quot;)?(m.css(&amp;quot;left&amp;quot;,m.data(&amp;quot;stellar-startingLeft&amp;quot;)),m.css(&amp;quot;top&amp;quot;,m.data(&amp;quot;stellar-startingTop&amp;quot;))):(m.data(&amp;quot;stellar-startingLeft&amp;quot;,m.css(&amp;quot;left&amp;quot;)),m.data(&amp;quot;stellar-startingTop&amp;quot;,m.css(&amp;quot;top&amp;quot;))),f=m.position().left,g=m.position().top,h=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-top&amp;quot;),10),k=m.offset().left-h,l=m.offset().top-i,m.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(n=p,o=q,j=b,!1):(p+=b.position().left,void(q+=b.position().top))}),c=m.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-horizontal-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-horizontal-offset&amp;quot;):b.horizontalOffset,e=m.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-vertical-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-vertical-offset&amp;quot;):b.verticalOffset,b.particles.push({$element:m,$offsetParent:j,isFixed:&amp;quot;fixed&amp;quot;===m.css(&amp;quot;position&amp;quot;),horizontalOffset:c,verticalOffset:e,startingPositionLeft:f,startingPositionTop:g,startingOffsetLeft:k,startingOffsetTop:l,parentOffsetLeft:n,parentOffsetTop:o,stellarRatio:m.data(&amp;quot;stellar-ratio&amp;quot;)!==d?m.data(&amp;quot;stellar-ratio&amp;quot;):1,width:m.outerWidth(!0),height:m.outerHeight(!0),isHidden:!1})})},_findBackgrounds:function(){var b,c=this,e=this._getScrollLeft(),f=this._getScrollTop();this.backgrounds=[],this.options.parallaxBackgrounds&amp;amp;&amp;amp;(b=this.$element.find(&amp;quot;[data-stellar-background-ratio]&amp;quot;),this.$element.data(&amp;quot;stellar-background-ratio&amp;quot;)&amp;amp;&amp;amp;(b=b.add(this.$element)),b.each(function(){var b,g,h,i,j,k,l,o=a(this),p=n(o),q=0,r=0,s=0,t=0;if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)){if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)!==this)return}else o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;,this);o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;)?m(o,o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;)):(o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,p[0]),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,p[1])),h=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-top&amp;quot;),10),j=o.offset().left-h-e,k=o.offset().top-i-f,o.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(q=s,r=t,l=b,!1):(s+=b.position().left,void(t+=b.position().top))}),b=o.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-horizontal-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-horizontal-offset&amp;quot;):c.horizontalOffset,g=o.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-vertical-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-vertical-offset&amp;quot;):c.verticalOffset,c.backgrounds.push({$element:o,$offsetParent:l,isFixed:&amp;quot;fixed&amp;quot;===o.css(&amp;quot;background-attachment&amp;quot;),horizontalOffset:b,verticalOffset:g,startingValueLeft:p[0],startingValueTop:p[1],startingBackgroundPositionLeft:isNaN(parseInt(p[0],10))?0:parseInt(p[0],10),startingBackgroundPositionTop:isNaN(parseInt(p[1],10))?0:parseInt(p[1],10),startingPositionLeft:o.position().left,startingPositionTop:o.position().top,startingOffsetLeft:j,startingOffsetTop:k,parentOffsetLeft:q,parentOffsetTop:r,stellarRatio:o.data(&amp;quot;stellar-background-ratio&amp;quot;)===d?1:o.data(&amp;quot;stellar-background-ratio&amp;quot;)})}))},_reset:function(){var a,b,c,d,e;for(e=this.particles.length-1;e&amp;gt;=0;e--)a=this.particles[e],b=a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;),c=a.$element.data(&amp;quot;stellar-startingTop&amp;quot;),this._setPosition(a.$element,b,b,c,c),this.options.showElement(a.$element),a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;,null).data(&amp;quot;stellar-elementIsActive&amp;quot;,null).data(&amp;quot;stellar-backgroundIsActive&amp;quot;,null);for(e=this.backgrounds.length-1;e&amp;gt;=0;e--)d=this.backgrounds[e],d.$element.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,null).data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,null),m(d.$element,d.startingValueLeft,d.startingValueTop)},destroy:function(){this._reset(),this.$scrollElement.unbind(&amp;quot;resize.&amp;quot;+this.name).unbind(&amp;quot;scroll.&amp;quot;+this.name),this._animationLoop=a.noop,a(b).unbind(&amp;quot;load.&amp;quot;+this.name).unbind(&amp;quot;resize.&amp;quot;+this.name)},_setOffsets:function(){var c=this,d=a(b);d.unbind(&amp;quot;resize.horizontal-&amp;quot;+this.name).unbind(&amp;quot;resize.vertical-&amp;quot;+this.name),&amp;quot;function&amp;quot;==typeof this.options.horizontalOffset?(this.horizontalOffset=this.options.horizontalOffset(),d.bind(&amp;quot;resize.horizontal-&amp;quot;+this.name,function(){c.horizontalOffset=c.options.horizontalOffset()})):this.horizontalOffset=this.options.horizontalOffset,&amp;quot;function&amp;quot;==typeof this.options.verticalOffset?(this.verticalOffset=this.options.verticalOffset(),d.bind(&amp;quot;resize.vertical-&amp;quot;+this.name,function(){c.verticalOffset=c.options.verticalOffset()})):this.verticalOffset=this.options.verticalOffset},_repositionElements:function(){var a,b,c,d,e,f,g,h,i,j,k=this._getScrollLeft(),l=this._getScrollTop(),n=!0,o=!0;if(this.currentScrollLeft!==k||this.currentScrollTop!==l||this.currentWidth!==this.viewportWidth||this.currentHeight!==this.viewportHeight){for(this.currentScrollLeft=k,this.currentScrollTop=l,this.currentWidth=this.viewportWidth,this.currentHeight=this.viewportHeight,j=this.particles.length-1;j&amp;gt;=0;j--)a=this.particles[j],b=a.isFixed?1:0,this.options.horizontalScrolling?(f=(k+a.horizontalOffset+this.viewportOffsetLeft+a.startingPositionLeft-a.startingOffsetLeft+a.parentOffsetLeft)*-(a.stellarRatio+b-1)+a.startingPositionLeft,h=f-a.startingPositionLeft+a.startingOffsetLeft):(f=a.startingPositionLeft,h=a.startingOffsetLeft),this.options.verticalScrolling?(g=(l+a.verticalOffset+this.viewportOffsetTop+a.startingPositionTop-a.startingOffsetTop+a.parentOffsetTop)*-(a.stellarRatio+b-1)+a.startingPositionTop,i=g-a.startingPositionTop+a.startingOffsetTop):(g=a.startingPositionTop,i=a.startingOffsetTop),this.options.hideDistantElements&amp;amp;&amp;amp;(o=!this.options.horizontalScrolling||h+a.width&amp;gt;(a.isFixed?0:k)&amp;amp;&amp;amp;h&amp;lt;(a.isFixed?0:k)+this.viewportWidth+this.viewportOffsetLeft,n=!this.options.verticalScrolling||i+a.height&amp;gt;(a.isFixed?0:l)&amp;amp;&amp;amp;i&amp;lt;(a.isFixed?0:l)+this.viewportHeight+this.viewportOffsetTop),o&amp;amp;&amp;amp;n?(a.isHidden&amp;amp;&amp;amp;(this.options.showElement(a.$element),a.isHidden=!1),this._setPosition(a.$element,f,a.startingPositionLeft,g,a.startingPositionTop)):a.isHidden||(this.options.hideElement(a.$element),a.isHidden=!0);for(j=this.backgrounds.length-1;j&amp;gt;=0;j--)c=this.backgrounds[j],b=c.isFixed?0:1,d=this.options.horizontalScrolling?(k+c.horizontalOffset-this.viewportOffsetLeft-c.startingOffsetLeft+c.parentOffsetLeft-c.startingBackgroundPositionLeft)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueLeft,e=this.options.verticalScrolling?(l+c.verticalOffset-this.viewportOffsetTop-c.startingOffsetTop+c.parentOffsetTop-c.startingBackgroundPositionTop)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueTop,m(c.$element,d,e)}},_handleScrollEvent:function(){var a=this,b=!1,c=function(){a._repositionElements(),b=!1},d=function(){b||(o(c),b=!0)};this.$scrollElement.bind(&amp;quot;scroll.&amp;quot;+this.name,d),d()},_startAnimationLoop:function(){var a=this;this._animationLoop=function(){o(a._animationLoop),a._repositionElements()},this._animationLoop()}},a.fn[f]=function(b){var c=arguments;return b===d||&amp;quot;object&amp;quot;==typeof b?this.each(function(){a.data(this,&amp;quot;plugin_&amp;quot;+f)||a.data(this,&amp;quot;plugin_&amp;quot;+f,new e(this,b))}):&amp;quot;string&amp;quot;==typeof b&amp;amp;&amp;amp;&amp;quot;_&amp;quot;!==b[0]&amp;amp;&amp;amp;&amp;quot;init&amp;quot;!==b?this.each(function(){var d=a.data(this,&amp;quot;plugin_&amp;quot;+f);d instanceof e&amp;amp;&amp;amp;&amp;quot;function&amp;quot;==typeof d[b]&amp;amp;&amp;amp;d[b].apply(d,Array.prototype.slice.call(c,1)),&amp;quot;destroy&amp;quot;===b&amp;amp;&amp;amp;a.data(this,&amp;quot;plugin_&amp;quot;+f,null)}):void 0},a[f]=function(){var c=a(b);return c.stellar.apply(c,Array.prototype.slice.call(arguments,0))},a[f].scrollProperty=h,a[f].positionProperty=i,b.Stellar=e}(jQuery,this,document);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scrolly ===&lt;br /&gt;
[[JQuery.Scrolly]]&lt;br /&gt;
&lt;br /&gt;
== Lightbox, Gallery &amp;amp; co ==&lt;br /&gt;
&lt;br /&gt;
=== Chocolat ===&lt;br /&gt;
Nette responsive Lightbox für Anfänger und Profis&lt;br /&gt;
&lt;br /&gt;
http://chocolat.insipi.de&lt;br /&gt;
&lt;br /&gt;
[[Chocolat Lightbox]]&lt;br /&gt;
&lt;br /&gt;
=== Lightbox ===&lt;br /&gt;
Der Klassiker: [[Lightbox jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Magnific Popup ===&lt;br /&gt;
Galt lange als DER Nachfolger der Lightbox [[Magnific Popup jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Isotope / Masonry ==&lt;br /&gt;
[[JavaScript - Masonry / Isotope]]&lt;br /&gt;
&lt;br /&gt;
== Charts / Counter ==&lt;br /&gt;
=== jQuery CountTo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// jQuery CountTo&lt;br /&gt;
!function(t){&amp;quot;use strict&amp;quot;;function e(t,e){return t.toFixed(e.decimals)}t.fn.countTo=function(e){return e=e||{},t(this).each(function(){function a(){s+=l,c++,n(s),&amp;quot;function&amp;quot;==typeof o.onUpdate&amp;amp;&amp;amp;o.onUpdate.call(i,s),c&amp;gt;=r&amp;amp;&amp;amp;(f.removeData(&amp;quot;countTo&amp;quot;),clearInterval(d.interval),s=o.to,&amp;quot;function&amp;quot;==typeof o.onComplete&amp;amp;&amp;amp;o.onComplete.call(i,s))}function n(t){var e=o.formatter.call(i,t,o);f.text(e)}var o=t.extend({},t.fn.countTo.defaults,{from:t(this).data(&amp;quot;from&amp;quot;),to:t(this).data(&amp;quot;to&amp;quot;),speed:t(this).data(&amp;quot;speed&amp;quot;),refreshInterval:t(this).data(&amp;quot;refresh-interval&amp;quot;),decimals:t(this).data(&amp;quot;decimals&amp;quot;)},e),r=Math.ceil(o.speed/o.refreshInterval),l=(o.to-o.from)/r,i=this,f=t(this),c=0,s=o.from,d=f.data(&amp;quot;countTo&amp;quot;)||{};f.data(&amp;quot;countTo&amp;quot;,d),d.interval&amp;amp;&amp;amp;clearInterval(d.interval),d.interval=setInterval(a,o.refreshInterval),n(s)})},t.fn.countTo.defaults={from:0,to:0,speed:1e3,refreshInterval:100,decimals:0,formatter:e,onUpdate:null,onComplete:null}}(jQuery);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Easy Pie Chart ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**!&lt;br /&gt;
 * easyPieChart&lt;br /&gt;
 * Lightweight plugin to render simple, animated and retina optimized pie charts&lt;br /&gt;
 *&lt;br /&gt;
 * @license &lt;br /&gt;
 * @author Robert Fleischmann &amp;lt;rendro87@gmail.com&amp;gt; (http://robert-fleischmann.de)&lt;br /&gt;
 * @version 2.1.6&lt;br /&gt;
 **/&lt;br /&gt;
!function(a,b){&amp;quot;object&amp;quot;==typeof exports?module.exports=b(require(&amp;quot;jquery&amp;quot;)):&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement(&amp;quot;canvas&amp;quot;);a.appendChild(d),&amp;quot;undefined&amp;quot;!=typeof G_vmlCanvasManager&amp;amp;&amp;amp;G_vmlCanvasManager.initElement(d);var e=d.getContext(&amp;quot;2d&amp;quot;);d.width=d.height=b.size;var f=1;window.devicePixelRatio&amp;gt;1&amp;amp;&amp;amp;(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,&amp;quot;px&amp;quot;].join(&amp;quot;&amp;quot;),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&amp;amp;&amp;amp;b.scaleLength&amp;amp;&amp;amp;(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0&amp;gt;=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d&amp;gt;0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&amp;amp;&amp;amp;i(),b.trackColor&amp;amp;&amp;amp;h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&amp;amp;&amp;amp;e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d=&amp;quot;function&amp;quot;==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f&amp;gt;=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:&amp;quot;#ef1e25&amp;quot;,trackColor:&amp;quot;#f9f9f9&amp;quot;,scaleColor:&amp;quot;#dfe0e0&amp;quot;,scaleLength:5,lineCap:&amp;quot;round&amp;quot;,lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1&amp;gt;b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if(&amp;quot;undefined&amp;quot;!=typeof b)d.renderer=b;else{if(&amp;quot;undefined&amp;quot;==typeof SVGRenderer)throw new Error(&amp;quot;Please load either the SVG- or the CanvasRenderer&amp;quot;);d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&amp;amp;&amp;amp;(e[b]=c&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof c[b]?c[b]:d[b],&amp;quot;function&amp;quot;==typeof e[b]&amp;amp;&amp;amp;(e[b]=e[b].bind(this)));e.easing=&amp;quot;string&amp;quot;==typeof e.easing&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof jQuery&amp;amp;&amp;amp;jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,&amp;quot;number&amp;quot;==typeof e.animate&amp;amp;&amp;amp;(e.animate={duration:e.animate,enabled:!0}),&amp;quot;boolean&amp;quot;!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&amp;amp;&amp;amp;a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&amp;amp;&amp;amp;a.getAttribute(&amp;quot;data-percent&amp;quot;)&amp;amp;&amp;amp;this.update(parseFloat(a.getAttribute(&amp;quot;data-percent&amp;quot;)))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,&amp;quot;easyPieChart&amp;quot;)||(d=a.extend({},b,a(this).data()),a.data(this,&amp;quot;easyPieChart&amp;quot;,new c(this,d)))})}});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Audio / Video / MediaPlayer ==&lt;br /&gt;
Siehe auch: [[JavaScript - HTML5 Audio]]&lt;br /&gt;
https://ourcodeworld.com/articles/read/148/top-7-best-html5-media-player-javascript-plugins&lt;br /&gt;
&lt;br /&gt;
* Plyr (HTML5, YouTube, Vimeo, accessible, lightweight, customisable, responsive, no dependencies) https://github.com/sampotts/plyr&lt;br /&gt;
* Video.js (Video, build new from ground in 2010, popular)&lt;br /&gt;
* Popcorn.js (HTML5 Event Framework for Filmmakers, Audio Video, Vimeo, YouTube, Soundcloud...)&lt;br /&gt;
* Afterglow ( HTML5 Elements, little Effort)&lt;br /&gt;
* MediaElement.js (Mimics HTML5, Flash Fallback, Accessible)&lt;br /&gt;
* jPlayer (Audio, Video, Skinnable, API&lt;br /&gt;
* Projekktor (OpenSource Video/Audio, Flashfallback different output devices)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FitVids ===&lt;br /&gt;
Embedding Videos from YouTube, Vimeo,...&lt;br /&gt;
&lt;br /&gt;
[[FitVids jQuery Plugin]] https://github.com/davatron5000/FitVids.js&lt;br /&gt;
&lt;br /&gt;
=== Vide - Video Backgrounds ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Vide - v0.5.1&lt;br /&gt;
 *  Easy as hell jQuery plugin for video backgrounds.&lt;br /&gt;
 *  http://vodkabears.github.io/vide/&lt;br /&gt;
 *&lt;br /&gt;
 *  Made by Ilya Makarov&lt;br /&gt;
 *  Under MIT License&lt;br /&gt;
 */&lt;br /&gt;
!function(a,b){&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(&amp;quot;object&amp;quot;==typeof exports?require(&amp;quot;jquery&amp;quot;):a.jQuery)}(this,function(a){&amp;quot;use strict&amp;quot;;function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,&amp;quot;:&amp;quot;).replace(/\s*,\s*/g,&amp;quot;,&amp;quot;).split(&amp;quot;,&amp;quot;),h=0,g=f.length;h&amp;lt;g&amp;amp;&amp;amp;(c=f[h],c.search(/^(http|https|ftp):\/\//)===-1&amp;amp;&amp;amp;c.search(&amp;quot;:&amp;quot;)!==-1);h++)b=c.indexOf(&amp;quot;:&amp;quot;),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=&amp;quot;true&amp;quot;===e||&amp;quot;false&amp;quot;!==e&amp;amp;&amp;amp;e),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=isNaN(e)?e:+e),i[d]=e;return null==d&amp;amp;&amp;amp;null==e?a:i}function c(a){a=&amp;quot;&amp;quot;+a;var b,c,d,e=a.split(/\s+/),f=&amp;quot;50%&amp;quot;,g=&amp;quot;50%&amp;quot;;for(d=0,b=e.length;d&amp;lt;b;d++)c=e[d],&amp;quot;left&amp;quot;===c?f=&amp;quot;0%&amp;quot;:&amp;quot;right&amp;quot;===c?f=&amp;quot;100%&amp;quot;:&amp;quot;top&amp;quot;===c?g=&amp;quot;0%&amp;quot;:&amp;quot;bottom&amp;quot;===c?g=&amp;quot;100%&amp;quot;:&amp;quot;center&amp;quot;===c?0===d?f=&amp;quot;50%&amp;quot;:g=&amp;quot;50%&amp;quot;:0===d?f=c:g=c;return{x:f,y:g}}function d(b,c){var d=function(){c(this.src)};a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.gif&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpeg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.png&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d)}function e(c,d,e){if(this.$element=a(c),&amp;quot;string&amp;quot;==typeof d&amp;amp;&amp;amp;(d=b(d)),e?&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=b(e)):e={},&amp;quot;string&amp;quot;==typeof d)d=d.replace(/\.\w*$/,&amp;quot;&amp;quot;);else if(&amp;quot;object&amp;quot;==typeof d)for(var f in d)d.hasOwnProperty(f)&amp;amp;&amp;amp;(d[f]=d[f].replace(/\.\w*$/,&amp;quot;&amp;quot;));this.settings=a.extend({},g,e),this.path=d;try{this.init()}catch(i){if(i.message!==h)throw i}}var f=&amp;quot;vide&amp;quot;,g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:&amp;quot;50% 50%&amp;quot;,posterType:&amp;quot;detect&amp;quot;,resizing:!0,bgColor:&amp;quot;transparent&amp;quot;,className:&amp;quot;&amp;quot;},h=&amp;quot;Not implemented&amp;quot;;e.prototype.init=function(){var b,e,f=this,g=f.path,i=g,j=&amp;quot;&amp;quot;,k=f.$element,l=f.settings,m=c(l.position),n=l.posterType;e=f.$wrapper=a(&amp;quot;&amp;lt;div&amp;gt;&amp;quot;).addClass(l.className).css({position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:0,left:0,bottom:0,right:0,overflow:&amp;quot;hidden&amp;quot;,&amp;quot;-webkit-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-moz-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-o-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-color&amp;quot;:l.bgColor,&amp;quot;background-repeat&amp;quot;:&amp;quot;no-repeat&amp;quot;,&amp;quot;background-position&amp;quot;:m.x+&amp;quot; &amp;quot;+m.y}),&amp;quot;object&amp;quot;==typeof g&amp;amp;&amp;amp;(g.poster?i=g.poster:g.mp4?i=g.mp4:g.webm?i=g.webm:g.ogv&amp;amp;&amp;amp;(i=g.ogv)),&amp;quot;detect&amp;quot;===n?d(i,function(a){e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+a+&amp;quot;)&amp;quot;)}):&amp;quot;none&amp;quot;!==n&amp;amp;&amp;amp;e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+i+&amp;quot;.&amp;quot;+n+&amp;quot;)&amp;quot;),&amp;quot;static&amp;quot;===k.css(&amp;quot;position&amp;quot;)&amp;amp;&amp;amp;k.css(&amp;quot;position&amp;quot;,&amp;quot;relative&amp;quot;),k.prepend(e),&amp;quot;object&amp;quot;==typeof g?(g.mp4&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.mp4+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;#039;),g.webm&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.webm+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;#039;),g.ogv&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.ogv+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;#039;),b=f.$video=a(&amp;quot;&amp;lt;video&amp;gt;&amp;quot;+j+&amp;quot;&amp;lt;/video&amp;gt;&amp;quot;)):b=f.$video=a(&amp;#039;&amp;lt;video&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;lt;/video&amp;gt;&amp;#039;);try{b.prop({autoplay:l.autoplay,loop:l.loop,volume:l.volume,muted:l.muted,defaultMuted:l.muted,playbackRate:l.playbackRate,defaultPlaybackRate:l.playbackRate})}catch(o){throw new Error(h)}b.css({margin:&amp;quot;auto&amp;quot;,position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:m.y,left:m.x,&amp;quot;-webkit-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-ms-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,transform:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,visibility:&amp;quot;hidden&amp;quot;,opacity:0}).one(&amp;quot;canplaythrough.vide&amp;quot;,function(){f.resize()}).one(&amp;quot;playing.vide&amp;quot;,function(){b.css({visibility:&amp;quot;visible&amp;quot;,opacity:1}),e.css(&amp;quot;background-image&amp;quot;,&amp;quot;none&amp;quot;)}),k.on(&amp;quot;resize.vide&amp;quot;,function(){l.resizing&amp;amp;&amp;amp;f.resize()}),e.append(b)},e.prototype.getVideoObject=function(){return this.$video[0]},e.prototype.resize=function(){if(this.$video){var a=this.$wrapper,b=this.$video,c=b[0],d=c.videoHeight,e=c.videoWidth,f=a.height(),g=a.width();g/e&amp;gt;f/d?b.css({width:g+2,height:&amp;quot;auto&amp;quot;}):b.css({width:&amp;quot;auto&amp;quot;,height:f+2})}},e.prototype.destroy=function(){delete a[f].lookup[this.index],this.$video&amp;amp;&amp;amp;this.$video.off(f),this.$element.off(f).removeData(f),this.$wrapper.remove()},a[f]={lookup:[]},a.fn[f]=function(b,c){var d;return this.each(function(){d=a.data(this,f),d&amp;amp;&amp;amp;d.destroy(),d=new e(this,b,c),d.index=a[f].lookup.push(d)-1,a.data(this,f,d)}),this},a(document).ready(function(){var b=a(window);b.on(&amp;quot;resize.vide&amp;quot;,function(){for(var b,c=a[f].lookup.length,d=0;d&amp;lt;c;d++)b=a[f].lookup[d],b&amp;amp;&amp;amp;b.settings.resizing&amp;amp;&amp;amp;b.resize()}),b.on(&amp;quot;unload.vide&amp;quot;,function(){return!1}),a(document).find(&amp;quot;[data-vide-bg]&amp;quot;).each(function(b,c){var d=a(c),e=d.data(&amp;quot;vide-options&amp;quot;),g=d.data(&amp;quot;vide-bg&amp;quot;);d[f](g,e)})})});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Siehe Extra Seite&lt;br /&gt;
&lt;br /&gt;
== Slider &amp;amp; Carousel ==&lt;br /&gt;
=== Slick Carousel &amp;amp; Slider ===&lt;br /&gt;
Der kann fast alles Slider. Gehört mit Owl Slider zu den vielseitigen.&lt;br /&gt;
&lt;br /&gt;
http://kenwheeler.github.io/slick/&lt;br /&gt;
&lt;br /&gt;
=== Owl Carousel===&lt;br /&gt;
[[Owl Carousel - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Revolution Slider ===&lt;br /&gt;
https://revolution.themepunch.com/examples-jquery/&lt;br /&gt;
&lt;br /&gt;
=== FlexSlider ===&lt;br /&gt;
[[FlexSlider - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Schlichter aber vielseitiger Slider mit schönem KenBurns Effekt und div. Übergängen. Erfordert etwas JS Kenntnisse wenn mehr angepasst werden soll.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Vegas Slider]]&lt;br /&gt;
&lt;br /&gt;
=== MultiScroll.js ===&lt;br /&gt;
http://alvarotrigo.com/multiScroll&lt;br /&gt;
&lt;br /&gt;
Gegenläufiger Scroller&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;jquery.multiscroll.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- This following line is needed in case of using the default easing option or when using another&lt;br /&gt;
 one rather than &amp;quot;linear&amp;quot; or &amp;quot;swing&amp;quot;. You can also add the full jQuery UI instead of this file if you prefer --&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;vendors/jquery.easings.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery.multiscroll.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;multiscroll&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-left&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-right&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Elemente manipulieren ==&lt;br /&gt;
=== Match Heights ===&lt;br /&gt;
Spalten in der Länge anpassen. Siehe auch Flex Grid in CSS3&lt;br /&gt;
&lt;br /&gt;
[[Equal Heights]]&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Match Height]]&lt;br /&gt;
&lt;br /&gt;
=== Fit Viewport ===&lt;br /&gt;
==== Viewport Height ====&lt;br /&gt;
Element an die Höhe des Viewports anpassen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  $(document).ready(function(){&lt;br /&gt;
      $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
          $(window).resize(function(){&lt;br /&gt;
              $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
      });&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scrolling ==&lt;br /&gt;
Hinweis die meisten Scroll To and ScrollTops lassen sich auch mit einfachen jquery Snippets realisieren. &lt;br /&gt;
=== Einfaches jQuery Scroll To Top ===&lt;br /&gt;
Mehr brauchts nicht :-) [[Scroll ToTop (jQuery)]]&lt;br /&gt;
&lt;br /&gt;
=== Perfect Scrollbar ===&lt;br /&gt;
[[Perfect Scrollbar]]&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler ScrollTo ===&lt;br /&gt;
https://github.com/flesler/jquery.scrollTo&lt;br /&gt;
&lt;br /&gt;
Lightweight, cross-browser and highly customizable animated scrolling with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler LocalScroll ===&lt;br /&gt;
https://github.com/flesler/jquery.localScroll&lt;br /&gt;
&lt;br /&gt;
Animated anchor navigation made easy with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Smooth Scroll ===&lt;br /&gt;
Oil for Scrolling - damit ruckelt es nicht so beim Scrollen mit dem Mausrad&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// SmoothScroll for websites v1.4.0 (Balazs Galambosi)&lt;br /&gt;
// http://www.smoothscroll.net/&lt;br /&gt;
//&lt;br /&gt;
// Licensed under the terms of the MIT license.&lt;br /&gt;
//&lt;br /&gt;
// You may use it in your theme if you credit me. &lt;br /&gt;
// It is also free to use on any individual website.&lt;br /&gt;
//&lt;br /&gt;
// Exception:&lt;br /&gt;
// The only restriction is to not publish any  &lt;br /&gt;
// extension for browsers or native application&lt;br /&gt;
// without getting a written permission first.&lt;br /&gt;
//&lt;br /&gt;
!function(){function e(){z.keyboardSupport&amp;amp;&amp;amp;m(&amp;quot;keydown&amp;quot;,a)}function t(){if(!A&amp;amp;&amp;amp;document.body){A=!0;var t=document.body,o=document.documentElement,n=window.innerHeight,r=t.scrollHeight;if(B=document.compatMode.indexOf(&amp;quot;CSS&amp;quot;)&amp;gt;=0?o:t,D=t,e(),top!=self)X=!0;else if(r&amp;gt;n&amp;amp;&amp;amp;(t.offsetHeight&amp;lt;=n||o.offsetHeight&amp;lt;=n)){var a=document.createElement(&amp;quot;div&amp;quot;);a.style.cssText=&amp;quot;position:absolute; z-index:-10000; top:0; left:0; right:0; height:&amp;quot;+B.scrollHeight+&amp;quot;px&amp;quot;,document.body.appendChild(a);var i;T=function(){i||(i=setTimeout(function(){L||(a.style.height=&amp;quot;0&amp;quot;,a.style.height=B.scrollHeight+&amp;quot;px&amp;quot;,i=null)},500))},setTimeout(T,10),m(&amp;quot;resize&amp;quot;,T);var l={attributes:!0,childList:!0,characterData:!1};if(M=new V(T),M.observe(t,l),B.offsetHeight&amp;lt;=n){var c=document.createElement(&amp;quot;div&amp;quot;);c.style.clear=&amp;quot;both&amp;quot;,t.appendChild(c)}}z.fixedBackground||L||(t.style.backgroundAttachment=&amp;quot;scroll&amp;quot;,o.style.backgroundAttachment=&amp;quot;scroll&amp;quot;)}}function o(){M&amp;amp;&amp;amp;M.disconnect(),h(I,r),h(&amp;quot;mousedown&amp;quot;,i),h(&amp;quot;keydown&amp;quot;,a),h(&amp;quot;resize&amp;quot;,T),h(&amp;quot;load&amp;quot;,t)}function n(e,t,o){if(p(t,o),1!=z.accelerationMax){var n=Date.now(),r=n-R;if(r&amp;lt;z.accelerationDelta){var a=(1+50/r)/2;a&amp;gt;1&amp;amp;&amp;amp;(a=Math.min(a,z.accelerationMax),t*=a,o*=a)}R=Date.now()}if(q.push({x:t,y:o,lastX:0&amp;gt;t?.99:-.99,lastY:0&amp;gt;o?.99:-.99,start:Date.now()}),!P){var i=e===document.body,l=function(n){for(var r=Date.now(),a=0,c=0,u=0;u&amp;lt;q.length;u++){var d=q[u],s=r-d.start,f=s&amp;gt;=z.animationTime,m=f?1:s/z.animationTime;z.pulseAlgorithm&amp;amp;&amp;amp;(m=x(m));var h=d.x*m-d.lastX&amp;gt;&amp;gt;0,w=d.y*m-d.lastY&amp;gt;&amp;gt;0;a+=h,c+=w,d.lastX+=h,d.lastY+=w,f&amp;amp;&amp;amp;(q.splice(u,1),u--)}i?window.scrollBy(a,c):(a&amp;amp;&amp;amp;(e.scrollLeft+=a),c&amp;amp;&amp;amp;(e.scrollTop+=c)),t||o||(q=[]),q.length?_(l,e,1e3/z.frameRate+1):P=!1};_(l,e,0),P=!0}}function r(e){A||t();var o=e.target,r=u(o);if(!r||e.defaultPrevented||e.ctrlKey)return!0;if(w(D,&amp;quot;embed&amp;quot;)||w(o,&amp;quot;embed&amp;quot;)&amp;amp;&amp;amp;/\.pdf/i.test(o.src)||w(D,&amp;quot;object&amp;quot;))return!0;var a=-e.wheelDeltaX||e.deltaX||0,i=-e.wheelDeltaY||e.deltaY||0;return K&amp;amp;&amp;amp;(e.wheelDeltaX&amp;amp;&amp;amp;b(e.wheelDeltaX,120)&amp;amp;&amp;amp;(a=-120*(e.wheelDeltaX/Math.abs(e.wheelDeltaX))),e.wheelDeltaY&amp;amp;&amp;amp;b(e.wheelDeltaY,120)&amp;amp;&amp;amp;(i=-120*(e.wheelDeltaY/Math.abs(e.wheelDeltaY)))),a||i||(i=-e.wheelDelta||0),1===e.deltaMode&amp;amp;&amp;amp;(a*=40,i*=40),!z.touchpadSupport&amp;amp;&amp;amp;v(i)?!0:(Math.abs(a)&amp;gt;1.2&amp;amp;&amp;amp;(a*=z.stepSize/120),Math.abs(i)&amp;gt;1.2&amp;amp;&amp;amp;(i*=z.stepSize/120),n(r,a,i),e.preventDefault(),void l())}function a(e){var t=e.target,o=e.ctrlKey||e.altKey||e.metaKey||e.shiftKey&amp;amp;&amp;amp;e.keyCode!==N.spacebar;document.contains(D)||(D=document.activeElement);var r=/^(textarea|select|embed|object)$/i,a=/^(button|submit|radio|checkbox|file|color|image)$/i;if(r.test(t.nodeName)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;!a.test(t.type)||w(D,&amp;quot;video&amp;quot;)||y(e)||t.isContentEditable||e.defaultPrevented||o)return!0;if((w(t,&amp;quot;button&amp;quot;)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;a.test(t.type))&amp;amp;&amp;amp;e.keyCode===N.spacebar)return!0;var i,c=0,d=0,s=u(D),f=s.clientHeight;switch(s==document.body&amp;amp;&amp;amp;(f=window.innerHeight),e.keyCode){case N.up:d=-z.arrowScroll;break;case N.down:d=z.arrowScroll;break;case N.spacebar:i=e.shiftKey?1:-1,d=-i*f*.9;break;case N.pageup:d=.9*-f;break;case N.pagedown:d=.9*f;break;case N.home:d=-s.scrollTop;break;case N.end:var m=s.scrollHeight-s.scrollTop-f;d=m&amp;gt;0?m+10:0;break;case N.left:c=-z.arrowScroll;break;case N.right:c=z.arrowScroll;break;default:return!0}n(s,c,d),e.preventDefault(),l()}function i(e){D=e.target}function l(){clearTimeout(E),E=setInterval(function(){F={}},1e3)}function c(e,t){for(var o=e.length;o--;)F[j(e[o])]=t;return t}function u(e){var t=[],o=document.body,n=B.scrollHeight;do{var r=F[j(e)];if(r)return c(t,r);if(t.push(e),n===e.scrollHeight){var a=s(B)&amp;amp;&amp;amp;s(o),i=a||f(B);if(X&amp;amp;&amp;amp;d(B)||!X&amp;amp;&amp;amp;i)return c(t,$())}else if(d(e)&amp;amp;&amp;amp;f(e))return c(t,e)}while(e=e.parentElement)}function d(e){return e.clientHeight+10&amp;lt;e.scrollHeight}function s(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;hidden&amp;quot;!==t}function f(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;scroll&amp;quot;===t||&amp;quot;auto&amp;quot;===t}function m(e,t){window.addEventListener(e,t,!1)}function h(e,t){window.removeEventListener(e,t,!1)}function w(e,t){return(e.nodeName||&amp;quot;&amp;quot;).toLowerCase()===t.toLowerCase()}function p(e,t){e=e&amp;gt;0?1:-1,t=t&amp;gt;0?1:-1,(Y.x!==e||Y.y!==t)&amp;amp;&amp;amp;(Y.x=e,Y.y=t,q=[],R=0)}function v(e){return e?(O.length||(O=[e,e,e]),e=Math.abs(e),O.push(e),O.shift(),clearTimeout(H),H=setTimeout(function(){window.localStorage&amp;amp;&amp;amp;(localStorage.SS_deltaBuffer=O.join(&amp;quot;,&amp;quot;))},1e3),!g(120)&amp;amp;&amp;amp;!g(100)):void 0}function b(e,t){return Math.floor(e/t)==e/t}function g(e){return b(O[0],e)&amp;amp;&amp;amp;b(O[1],e)&amp;amp;&amp;amp;b(O[2],e)}function y(e){var t=e.target,o=!1;if(-1!=document.URL.indexOf(&amp;quot;www.youtube.com/watch&amp;quot;))do if(o=t.classList&amp;amp;&amp;amp;t.classList.contains(&amp;quot;html5-video-controls&amp;quot;))break;while(t=t.parentNode);return o}function S(e){var t,o,n;return e*=z.pulseScale,1&amp;gt;e?t=e-(1-Math.exp(-e)):(o=Math.exp(-1),e-=1,n=1-Math.exp(-e),t=o+n*(1-o)),t*z.pulseNormalize}function x(e){return e&amp;gt;=1?1:0&amp;gt;=e?0:(1==z.pulseNormalize&amp;amp;&amp;amp;(z.pulseNormalize/=S(1)),S(e))}function k(e){for(var t in e)C.hasOwnProperty(t)&amp;amp;&amp;amp;(z[t]=e[t])}var D,M,T,E,H,C={frameRate:150,animationTime:400,stepSize:100,pulseAlgorithm:!0,pulseScale:4,pulseNormalize:1,accelerationDelta:50,accelerationMax:3,keyboardSupport:!0,arrowScroll:50,touchpadSupport:!1,fixedBackground:!0,excluded:&amp;quot;&amp;quot;},z=C,L=!1,X=!1,Y={x:0,y:0},A=!1,B=document.documentElement,O=[],K=/^Mac/.test(navigator.platform),N={left:37,up:38,right:39,down:40,spacebar:32,pageup:33,pagedown:34,end:35,home:36},q=[],P=!1,R=Date.now(),j=function(){var e=0;return function(t){return t.uniqueID||(t.uniqueID=e++)}}(),F={};window.localStorage&amp;amp;&amp;amp;localStorage.SS_deltaBuffer&amp;amp;&amp;amp;(O=localStorage.SS_deltaBuffer.split(&amp;quot;,&amp;quot;));var I,_=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e,t,o){window.setTimeout(e,o||1e3/60)}}(),V=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,$=function(){var e;return function(){if(!e){var t=document.createElement(&amp;quot;div&amp;quot;);t.style.cssText=&amp;quot;height:10000px;width:1px;&amp;quot;,document.body.appendChild(t);var o=document.body.scrollTop;document.documentElement.scrollTop;window.scrollBy(0,1),e=document.body.scrollTop!=o?document.body:document.documentElement,window.scrollBy(0,-1),document.body.removeChild(t)}return e}}(),U=window.navigator.userAgent,W=/Edge/.test(U),G=/chrome/i.test(U)&amp;amp;&amp;amp;!W,J=/safari/i.test(U)&amp;amp;&amp;amp;!W,Q=/mobile/i.test(U),Z=(G||J)&amp;amp;&amp;amp;!Q;&amp;quot;onwheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)?I=&amp;quot;wheel&amp;quot;:&amp;quot;onmousewheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)&amp;amp;&amp;amp;(I=&amp;quot;mousewheel&amp;quot;),I&amp;amp;&amp;amp;Z&amp;amp;&amp;amp;(m(I,r),m(&amp;quot;mousedown&amp;quot;,i),m(&amp;quot;load&amp;quot;,t)),k.destroy=o,window.SmoothScrollOptions&amp;amp;&amp;amp;k(window.SmoothScrollOptions),&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define(function(){return k}):&amp;quot;object&amp;quot;==typeof exports?module.exports=k:window.SmoothScroll=k}();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Typography, Fonts, etc==&lt;br /&gt;
=== Letter.js ===&lt;br /&gt;
Zerpflückt Texte und wrappt Buchstaben / Wörter / Zeilen in durchnummerierte Klassen. Diese kann man dann cool Stylen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/davatron5000/Lettering.js&lt;br /&gt;
&lt;br /&gt;
=== Fittext ===&lt;br /&gt;
Responsive Textgrößen in Typographie-Spielereien für Überschriften etc.&lt;br /&gt;
&lt;br /&gt;
http://fittextjs.com/&lt;br /&gt;
&lt;br /&gt;
=== Prism.js ===&lt;br /&gt;
Syntaxhighlighter&lt;br /&gt;
&lt;br /&gt;
== Google Maps mit gmaps.js ==&lt;br /&gt;
https://hpneo.github.io/gmaps/&lt;br /&gt;
Einfache Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
new GMaps({&lt;br /&gt;
  div: &amp;#039;#map&amp;#039;,&lt;br /&gt;
  lat: -12.043333,&lt;br /&gt;
  lng: -77.028333&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Grey Style Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Google map	&lt;br /&gt;
/*global $:false */&lt;br /&gt;
    var map;&lt;br /&gt;
    $(document).ready(function(){&amp;quot;use strict&amp;quot;;&lt;br /&gt;
      map = new GMaps({&lt;br /&gt;
    disableDefaultUI: true,&lt;br /&gt;
    scrollwheel: false,&lt;br /&gt;
        el: &amp;#039;#map&amp;#039;,&lt;br /&gt;
        lat: 48.4912812,&lt;br /&gt;
        lng: 9.2175255&lt;br /&gt;
      });&lt;br /&gt;
      map.drawOverlay({&lt;br /&gt;
        lat: map.getCenter().lat(),&lt;br /&gt;
        lng: map.getCenter().lng(),&lt;br /&gt;
        layer: &amp;#039;overlayLayer&amp;#039;,&lt;br /&gt;
        content: &amp;#039;&amp;lt;div class=&amp;quot;overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
        verticalAlign: &amp;#039;center&amp;#039;,&lt;br /&gt;
        horizontalAlign: &amp;#039;center&amp;#039;&lt;br /&gt;
      });&lt;br /&gt;
        var styles = [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;visibility&amp;quot;: &amp;quot;on&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.9 },&lt;br /&gt;
      { &amp;quot;lightness&amp;quot;: 37 },&lt;br /&gt;
      { &amp;quot;gamma&amp;quot;: 0.62 },&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -93 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -1 },&lt;br /&gt;
      { &amp;quot;color&amp;quot;: &amp;quot;#ffffff&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.2 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;road&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -98 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;landscape&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -89 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;water&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#cfa144&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.4 },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -38 }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
];&lt;br /&gt;
        &lt;br /&gt;
        map.addStyle({&lt;br /&gt;
            styledMapName:&amp;quot;Styled Map&amp;quot;,&lt;br /&gt;
            styles: styles,&lt;br /&gt;
            mapTypeId: &amp;quot;map_style&amp;quot;  &lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        map.setStyle(&amp;quot;map_style&amp;quot;);	&lt;br /&gt;
		&lt;br /&gt;
    });			&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
(function(root, factory) {&lt;br /&gt;
  if(typeof exports === &amp;#039;object&amp;#039;) {&lt;br /&gt;
    module.exports = factory();&lt;br /&gt;
  }&lt;br /&gt;
  else if(typeof define === &amp;#039;function&amp;#039; &amp;amp;&amp;amp; define.amd) {&lt;br /&gt;
    define([&amp;#039;jquery&amp;#039;, &amp;#039;googlemaps!&amp;#039;], factory);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    root.GMaps = factory();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}(this, function() {&lt;br /&gt;
&lt;br /&gt;
/*!&lt;br /&gt;
 * GMaps.js v0.4.25&lt;br /&gt;
 * http://hpneo.github.com/gmaps/&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2017, Gustavo Leon&lt;br /&gt;
 * Released under the MIT License.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var extend_object = function(obj, new_obj) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === new_obj) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in new_obj) {&lt;br /&gt;
    if (new_obj[name] !== undefined) {&lt;br /&gt;
      obj[name] = new_obj[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var replace_object = function(obj, replace) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === replace) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in replace) {&lt;br /&gt;
    if (obj[name] != undefined) {&lt;br /&gt;
      obj[name] = replace[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_map = function(array, callback) {&lt;br /&gt;
  var original_callback_params = Array.prototype.slice.call(arguments, 2),&lt;br /&gt;
      array_return = [],&lt;br /&gt;
      array_length = array.length,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  if (Array.prototype.map &amp;amp;&amp;amp; array.map === Array.prototype.map) {&lt;br /&gt;
    array_return = Array.prototype.map.call(array, function(item) {&lt;br /&gt;
      var callback_params = original_callback_params.slice(0);&lt;br /&gt;
      callback_params.splice(0, 0, item);&lt;br /&gt;
&lt;br /&gt;
      return callback.apply(this, callback_params);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (i = 0; i &amp;lt; array_length; i++) {&lt;br /&gt;
      callback_params = original_callback_params;&lt;br /&gt;
      callback_params.splice(0, 0, array[i]);&lt;br /&gt;
      array_return.push(callback.apply(this, callback_params));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return array_return;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_flat = function(array) {&lt;br /&gt;
  var new_array = [],&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
    new_array = new_array.concat(array[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new_array;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var coordsToLatLngs = function(coords, useGeoJSON) {&lt;br /&gt;
  var first_coord = coords[0],&lt;br /&gt;
      second_coord = coords[1];&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON) {&lt;br /&gt;
    first_coord = coords[1];&lt;br /&gt;
    second_coord = coords[0];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new google.maps.LatLng(first_coord, second_coord);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var arrayToLatLng = function(coords, useGeoJSON) {&lt;br /&gt;
  var i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; coords.length; i++) {&lt;br /&gt;
    if (!(coords[i] instanceof google.maps.LatLng)) {&lt;br /&gt;
      if (coords[i].length &amp;gt; 0 &amp;amp;&amp;amp; typeof(coords[i][0]) === &amp;quot;object&amp;quot;) {&lt;br /&gt;
        coords[i] = arrayToLatLng(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        coords[i] = coordsToLatLngs(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return coords;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementsByClassName = function (class_name, context) {&lt;br /&gt;
    var element,&lt;br /&gt;
        _class = class_name.replace(&amp;#039;.&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    if (&amp;#039;jQuery&amp;#039; in this &amp;amp;&amp;amp; context) {&lt;br /&gt;
        element = $(&amp;quot;.&amp;quot; + _class, context)[0];&lt;br /&gt;
    } else {&lt;br /&gt;
        element = document.getElementsByClassName(_class)[0];&lt;br /&gt;
    }&lt;br /&gt;
    return element;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementById = function(id, context) {&lt;br /&gt;
  var element,&lt;br /&gt;
  id = id.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  if (&amp;#039;jQuery&amp;#039; in window &amp;amp;&amp;amp; context) {&lt;br /&gt;
    element = $(&amp;#039;#&amp;#039; + id, context)[0];&lt;br /&gt;
  } else {&lt;br /&gt;
    element = document.getElementById(id);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return element;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var findAbsolutePosition = function(obj)  {&lt;br /&gt;
  var curleft = 0,&lt;br /&gt;
      curtop = 0;&lt;br /&gt;
&lt;br /&gt;
  if (obj.getBoundingClientRect) {&lt;br /&gt;
      var rect = obj.getBoundingClientRect();&lt;br /&gt;
      var sx = -(window.scrollX ? window.scrollX : window.pageXOffset);&lt;br /&gt;
      var sy = -(window.scrollY ? window.scrollY : window.pageYOffset);&lt;br /&gt;
&lt;br /&gt;
      return [(rect.left - sx), (rect.top - sy)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (obj.offsetParent) {&lt;br /&gt;
    do {&lt;br /&gt;
      curleft += obj.offsetLeft;&lt;br /&gt;
      curtop += obj.offsetTop;&lt;br /&gt;
    } while (obj = obj.offsetParent);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return [curleft, curtop];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var GMaps = (function(global) {&lt;br /&gt;
  &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  var doc = document;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new GMaps instance, including a Google Maps map.&lt;br /&gt;
   * @class GMaps&lt;br /&gt;
   * @constructs&lt;br /&gt;
   * @param {object} options - `options` accepts all the [MapOptions](https://developers.google.com/maps/documentation/javascript/reference#MapOptions) and [events](https://developers.google.com/maps/documentation/javascript/reference#Map) listed in the Google Maps API. Also accepts:&lt;br /&gt;
   * * `lat` (number): Latitude of the map&amp;#039;s center&lt;br /&gt;
   * * `lng` (number): Longitude of the map&amp;#039;s center&lt;br /&gt;
   * * `el` (string or HTMLElement): container where the map will be rendered&lt;br /&gt;
   * * `markerClusterer` (function): A function to create a marker cluster. You can use MarkerClusterer or MarkerClustererPlus.&lt;br /&gt;
   */&lt;br /&gt;
  var GMaps = function(options) {&lt;br /&gt;
&lt;br /&gt;
    if (!(typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps)) {&lt;br /&gt;
      if (typeof window.console === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.console.error) {&lt;br /&gt;
        console.error(&amp;#039;Google Maps API is required. Please register the following JavaScript library https://maps.googleapis.com/maps/api/js.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return function() {};&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!this) return new GMaps(options);&lt;br /&gt;
&lt;br /&gt;
    options.zoom = options.zoom || 15;&lt;br /&gt;
    options.mapType = options.mapType || &amp;#039;roadmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var valueOrDefault = function(value, defaultValue) {&lt;br /&gt;
      return value === undefined ? defaultValue : value;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var self = this,&lt;br /&gt;
        i,&lt;br /&gt;
        events_that_hide_context_menu = [&lt;br /&gt;
          &amp;#039;bounds_changed&amp;#039;, &amp;#039;center_changed&amp;#039;, &amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;,&lt;br /&gt;
          &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;idle&amp;#039;, &amp;#039;maptypeid_changed&amp;#039;, &amp;#039;projection_changed&amp;#039;,&lt;br /&gt;
          &amp;#039;resize&amp;#039;, &amp;#039;tilesloaded&amp;#039;, &amp;#039;zoom_changed&amp;#039;&lt;br /&gt;
        ],&lt;br /&gt;
        events_that_doesnt_hide_context_menu = [&amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;],&lt;br /&gt;
        options_to_be_deleted = [&amp;#039;el&amp;#039;, &amp;#039;lat&amp;#039;, &amp;#039;lng&amp;#039;, &amp;#039;mapType&amp;#039;, &amp;#039;width&amp;#039;, &amp;#039;height&amp;#039;, &amp;#039;markerClusterer&amp;#039;, &amp;#039;enableNewStyle&amp;#039;],&lt;br /&gt;
        identifier = options.el || options.div,&lt;br /&gt;
        markerClustererFunction = options.markerClusterer,&lt;br /&gt;
        mapType = google.maps.MapTypeId[options.mapType.toUpperCase()],&lt;br /&gt;
        map_center = new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        zoomControl = valueOrDefault(options.zoomControl, true),&lt;br /&gt;
        zoomControlOpt = options.zoomControlOpt || {&lt;br /&gt;
          style: &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
          position: &amp;#039;TOP_LEFT&amp;#039;&lt;br /&gt;
        },&lt;br /&gt;
        zoomControlStyle = zoomControlOpt.style || &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
        zoomControlPosition = zoomControlOpt.position || &amp;#039;TOP_LEFT&amp;#039;,&lt;br /&gt;
        panControl = valueOrDefault(options.panControl, true),&lt;br /&gt;
        mapTypeControl = valueOrDefault(options.mapTypeControl, true),&lt;br /&gt;
        scaleControl = valueOrDefault(options.scaleControl, true),&lt;br /&gt;
        streetViewControl = valueOrDefault(options.streetViewControl, true),&lt;br /&gt;
        overviewMapControl = valueOrDefault(overviewMapControl, true),&lt;br /&gt;
        map_options = {},&lt;br /&gt;
        map_base_options = {&lt;br /&gt;
          zoom: this.zoom,&lt;br /&gt;
          center: map_center,&lt;br /&gt;
          mapTypeId: mapType&lt;br /&gt;
        },&lt;br /&gt;
        map_controls_options = {&lt;br /&gt;
          panControl: panControl,&lt;br /&gt;
          zoomControl: zoomControl,&lt;br /&gt;
          zoomControlOptions: {&lt;br /&gt;
            style: google.maps.ZoomControlStyle[zoomControlStyle],&lt;br /&gt;
            position: google.maps.ControlPosition[zoomControlPosition]&lt;br /&gt;
          },&lt;br /&gt;
          mapTypeControl: mapTypeControl,&lt;br /&gt;
          scaleControl: scaleControl,&lt;br /&gt;
          streetViewControl: streetViewControl,&lt;br /&gt;
          overviewMapControl: overviewMapControl&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
      if (typeof(options.el) === &amp;#039;string&amp;#039; || typeof(options.div) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
        if (identifier.indexOf(&amp;quot;#&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Container element&lt;br /&gt;
             *&lt;br /&gt;
             * @type {HTMLElement}&lt;br /&gt;
             */&lt;br /&gt;
            this.el = getElementById(identifier, options.context);&lt;br /&gt;
        } else {&lt;br /&gt;
            this.el = getElementsByClassName.apply(this, [identifier, options.context]);&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
          this.el = identifier;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if (typeof(this.el) === &amp;#039;undefined&amp;#039; || this.el === null) {&lt;br /&gt;
      throw &amp;#039;No element defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.context_menu = window.context_menu || {};&lt;br /&gt;
    window.context_menu[self.el.id] = {};&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of custom controls in the map UI&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.controls = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s overlays&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.overlays = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of KML/GeoRSS and FusionTable layers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.layers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of data layers (See {@link GMaps#addLayer})&lt;br /&gt;
     *&lt;br /&gt;
     * @type {object}&lt;br /&gt;
     */&lt;br /&gt;
    this.singleLayers = {};&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s markers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.markers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s lines&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polylines = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s routes requested by {@link GMaps#getRoutes}, {@link GMaps#renderRoute}, {@link GMaps#drawRoute}, {@link GMaps#travelRoute} or {@link GMaps#drawSteppedRoute}&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.routes = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s polygons&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polygons = [];&lt;br /&gt;
    this.infoWindow = null;&lt;br /&gt;
    this.overlay_el = null;&lt;br /&gt;
    /**&lt;br /&gt;
     * Current map&amp;#039;s zoom&lt;br /&gt;
     *&lt;br /&gt;
     * @type {number}&lt;br /&gt;
     */&lt;br /&gt;
    this.zoom = options.zoom;&lt;br /&gt;
    this.registered_events = {};&lt;br /&gt;
&lt;br /&gt;
    this.el.style.width = options.width || this.el.scrollWidth || this.el.offsetWidth;&lt;br /&gt;
    this.el.style.height = options.height || this.el.scrollHeight || this.el.offsetHeight;&lt;br /&gt;
&lt;br /&gt;
    google.maps.visualRefresh = options.enableNewStyle;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; options_to_be_deleted.length; i++) {&lt;br /&gt;
      delete options[options_to_be_deleted[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(options.disableDefaultUI != true) {&lt;br /&gt;
      map_base_options = extend_object(map_base_options, map_controls_options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    map_options = extend_object(map_base_options, options);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_doesnt_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_doesnt_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Google Maps map instance&lt;br /&gt;
     *&lt;br /&gt;
     * @type {google.maps.Map}&lt;br /&gt;
     */&lt;br /&gt;
    this.map = new google.maps.Map(this.el, map_options);&lt;br /&gt;
&lt;br /&gt;
    if (markerClustererFunction) {&lt;br /&gt;
      /**&lt;br /&gt;
       * Marker Clusterer instance&lt;br /&gt;
       *&lt;br /&gt;
       * @type {object}&lt;br /&gt;
       */&lt;br /&gt;
      this.markerClusterer = markerClustererFunction.apply(this, [this.map]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var buildContextMenuHTML = function(control, e) {&lt;br /&gt;
      var html = &amp;#039;&amp;#039;,&lt;br /&gt;
          options = window.context_menu[self.el.id][control];&lt;br /&gt;
&lt;br /&gt;
      for (var i in options){&lt;br /&gt;
        if (options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options[i];&lt;br /&gt;
&lt;br /&gt;
          html += &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a id=&amp;quot;&amp;#039; + control + &amp;#039;_&amp;#039; + i + &amp;#039;&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;&amp;#039; + option.title + &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) return;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.innerHTML = html;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_items = context_menu_element.getElementsByTagName(&amp;#039;a&amp;#039;),&lt;br /&gt;
          context_menu_items_count = context_menu_items.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; context_menu_items_count; i++) {&lt;br /&gt;
        var context_menu_item = context_menu_items[i];&lt;br /&gt;
&lt;br /&gt;
        var assign_menu_item_action = function(ev){&lt;br /&gt;
          ev.preventDefault();&lt;br /&gt;
&lt;br /&gt;
          options[this.id.replace(control + &amp;#039;_&amp;#039;, &amp;#039;&amp;#039;)].action.apply(self, [e]);&lt;br /&gt;
          self.hideContextMenu();&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        google.maps.event.clearListeners(context_menu_item, &amp;#039;click&amp;#039;);&lt;br /&gt;
        google.maps.event.addDomListenerOnce(context_menu_item, &amp;#039;click&amp;#039;, assign_menu_item_action, false);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var position = findAbsolutePosition.apply(this, [self.el]),&lt;br /&gt;
          left = position[0] + e.pixel.x - 15,&lt;br /&gt;
          top = position[1] + e.pixel.y- 15;&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.style.left = left + &amp;quot;px&amp;quot;;&lt;br /&gt;
      context_menu_element.style.top = top + &amp;quot;px&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      // context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this.buildContextMenu = function(control, e) {&lt;br /&gt;
      if (control === &amp;#039;marker&amp;#039;) {&lt;br /&gt;
        e.pixel = {};&lt;br /&gt;
&lt;br /&gt;
        var overlay = new google.maps.OverlayView();&lt;br /&gt;
        overlay.setMap(self.map);&lt;br /&gt;
&lt;br /&gt;
        overlay.draw = function() {&lt;br /&gt;
          var projection = overlay.getProjection(),&lt;br /&gt;
              position = e.marker.getPosition();&lt;br /&gt;
&lt;br /&gt;
          e.pixel = projection.fromLatLngToContainerPixel(position);&lt;br /&gt;
&lt;br /&gt;
          buildContextMenuHTML(control, e);&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        buildContextMenuHTML(control, e);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      setTimeout(function() {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
      }, 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Add a context menu for a map or a marker.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {object} options - The `options` object should contain:&lt;br /&gt;
     * * `control` (string): Kind of control the context menu will be attached. Can be &amp;quot;map&amp;quot; or &amp;quot;marker&amp;quot;.&lt;br /&gt;
     * * `options` (array): A collection of context menu items:&lt;br /&gt;
     *   * `title` (string): Item&amp;#039;s title shown in the context menu.&lt;br /&gt;
     *   * `name` (string): Item&amp;#039;s identifier.&lt;br /&gt;
     *   * `action` (function): Function triggered after selecting the context menu item.&lt;br /&gt;
     */&lt;br /&gt;
    this.setContextMenu = function(options) {&lt;br /&gt;
      window.context_menu[self.el.id][options.control] = {};&lt;br /&gt;
&lt;br /&gt;
      var i,&lt;br /&gt;
          ul = doc.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      for (i in options.options) {&lt;br /&gt;
        if (options.options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options.options[i];&lt;br /&gt;
&lt;br /&gt;
          window.context_menu[self.el.id][options.control][option.name] = {&lt;br /&gt;
            title: option.title,&lt;br /&gt;
            action: option.action&lt;br /&gt;
          };&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ul.id = &amp;#039;gmaps_context_menu&amp;#039;;&lt;br /&gt;
      ul.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.position = &amp;#039;absolute&amp;#039;;&lt;br /&gt;
      ul.style.minWidth = &amp;#039;100px&amp;#039;;&lt;br /&gt;
      ul.style.background = &amp;#039;white&amp;#039;;&lt;br /&gt;
      ul.style.listStyle = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.padding = &amp;#039;8px&amp;#039;;&lt;br /&gt;
      ul.style.boxShadow = &amp;#039;2px 2px 6px #ccc&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) {&lt;br /&gt;
        doc.body.appendChild(ul);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      google.maps.event.addDomListener(context_menu_element, &amp;#039;mouseout&amp;#039;, function(ev) {&lt;br /&gt;
        if (!ev.relatedTarget || !this.contains(ev.relatedTarget)) {&lt;br /&gt;
          window.setTimeout(function(){&lt;br /&gt;
            context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
          }, 400);&lt;br /&gt;
        }&lt;br /&gt;
      }, false);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Hide the current context menu&lt;br /&gt;
     */&lt;br /&gt;
    this.hideContextMenu = function() {&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (context_menu_element) {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var setupListener = function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
        if (e == undefined) {&lt;br /&gt;
          e = this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        options[name].apply(this, [e]);&lt;br /&gt;
&lt;br /&gt;
        self.hideContextMenu();&lt;br /&gt;
      });&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    //google.maps.event.addListener(this.map, &amp;#039;idle&amp;#039;, this.hideContextMenu);&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;zoom_changed&amp;#039;, this.hideContextMenu);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_doesnt_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_doesnt_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
      if (options.rightclick) {&lt;br /&gt;
        options.rightclick.apply(this, [e]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(window.context_menu[self.el.id][&amp;#039;map&amp;#039;] != undefined) {&lt;br /&gt;
        self.buildContextMenu(&amp;#039;map&amp;#039;, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Trigger a `resize` event, useful if you need to repaint the current map (for changes in the viewport or display / hide actions).&lt;br /&gt;
     */&lt;br /&gt;
    this.refresh = function() {&lt;br /&gt;
      google.maps.event.trigger(this.map, &amp;#039;resize&amp;#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the markers added in the map.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitZoom = function() {&lt;br /&gt;
      var latLngs = [],&lt;br /&gt;
          markers_length = this.markers.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; markers_length; i++) {&lt;br /&gt;
        if(typeof(this.markers[i].visible) === &amp;#039;boolean&amp;#039; &amp;amp;&amp;amp; this.markers[i].visible) {&lt;br /&gt;
          latLngs.push(this.markers[i].getPosition());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.fitLatLngBounds(latLngs);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the coordinates in the `latLngs` array.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {array} latLngs - Collection of `google.maps.LatLng` objects.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitLatLngBounds = function(latLngs) {&lt;br /&gt;
      var total = latLngs.length,&lt;br /&gt;
          bounds = new google.maps.LatLngBounds(),&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for(i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
        bounds.extend(latLngs[i]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.map.fitBounds(bounds);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Center the map using the `lat` and `lng` coordinates.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} lat - Latitude of the coordinate.&lt;br /&gt;
     * @param {number} lng - Longitude of the coordinate.&lt;br /&gt;
     * @param {function} [callback] - Callback that will be executed after the map is centered.&lt;br /&gt;
     */&lt;br /&gt;
    this.setCenter = function(lat, lng, callback) {&lt;br /&gt;
      this.map.panTo(new google.maps.LatLng(lat, lng));&lt;br /&gt;
&lt;br /&gt;
      if (callback) {&lt;br /&gt;
        callback();&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Return the HTML element container of the map.&lt;br /&gt;
     *&lt;br /&gt;
     * @returns {HTMLElement} the element container.&lt;br /&gt;
     */&lt;br /&gt;
    this.getElement = function() {&lt;br /&gt;
      return this.el;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Increase the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed in.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomIn = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() + value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Decrease the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed out.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomOut = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() - value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var native_methods = [],&lt;br /&gt;
        method;&lt;br /&gt;
&lt;br /&gt;
    for (method in this.map) {&lt;br /&gt;
      if (typeof(this.map[method]) == &amp;#039;function&amp;#039; &amp;amp;&amp;amp; !this[method]) {&lt;br /&gt;
        native_methods.push(method);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; native_methods.length; i++) {&lt;br /&gt;
      (function(gmaps, scope, method_name) {&lt;br /&gt;
        gmaps[method_name] = function(){&lt;br /&gt;
          return scope[method_name].apply(scope, arguments);&lt;br /&gt;
        };&lt;br /&gt;
      })(this, this.map, native_methods[i]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return GMaps;&lt;br /&gt;
})(this);&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createControl = function(options) {&lt;br /&gt;
  var control = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  control.style.cursor = &amp;#039;pointer&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.disableDefaultStyles !== true) {&lt;br /&gt;
    control.style.fontFamily = &amp;#039;Roboto, Arial, sans-serif&amp;#039;;&lt;br /&gt;
    control.style.fontSize = &amp;#039;11px&amp;#039;;&lt;br /&gt;
    control.style.boxShadow = &amp;#039;rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var option in options.style) {&lt;br /&gt;
    control.style[option] = options.style[option];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.id) {&lt;br /&gt;
    control.id = options.id;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.title) {&lt;br /&gt;
    control.title = options.title;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.classes) {&lt;br /&gt;
    control.className = options.classes;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.content) {&lt;br /&gt;
    if (typeof options.content === &amp;#039;string&amp;#039;) {&lt;br /&gt;
      control.innerHTML = options.content;&lt;br /&gt;
    }&lt;br /&gt;
    else if (options.content instanceof HTMLElement) {&lt;br /&gt;
      control.appendChild(options.content);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.position) {&lt;br /&gt;
    control.position = google.maps.ControlPosition[options.position.toUpperCase()];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev in options.events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addDomListener(object, name, function(){&lt;br /&gt;
        options.events[name].apply(this, [this]);&lt;br /&gt;
      });&lt;br /&gt;
    })(control, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  control.index = 1;&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Add a custom control to the map UI.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {object} options - The `options` object should contain:&lt;br /&gt;
 * * `style` (object): The keys and values of this object should be valid CSS properties and values.&lt;br /&gt;
 * * `id` (string): The HTML id for the custom control.&lt;br /&gt;
 * * `classes` (string): A string containing all the HTML classes for the custom control.&lt;br /&gt;
 * * `content` (string or HTML element): The content of the custom control.&lt;br /&gt;
 * * `position` (string): Any valid [`google.maps.ControlPosition`](https://developers.google.com/maps/documentation/javascript/controls#ControlPositioning) value, in lower or upper case.&lt;br /&gt;
 * * `events` (object): The keys of this object should be valid DOM events. The values should be functions.&lt;br /&gt;
 * * `disableDefaultStyles` (boolean): If false, removes the default styles for the controls like font (family and size), and box shadow.&lt;br /&gt;
 * @returns {HTMLElement}&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.addControl = function(options) {&lt;br /&gt;
  var control = this.createControl(options);&lt;br /&gt;
&lt;br /&gt;
  this.controls.push(control);&lt;br /&gt;
  this.map.controls[control.position].push(control);&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Remove a control from the map. `control` should be a control returned by `addControl()`.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {HTMLElement} control - One of the controls returned by `addControl()`.&lt;br /&gt;
 * @returns {HTMLElement} the removed control.&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.removeControl = function(control) {&lt;br /&gt;
  var position = null,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; this.controls.length; i++) {&lt;br /&gt;
    if (this.controls[i] == control) {&lt;br /&gt;
      position = this.controls[i].position;&lt;br /&gt;
      this.controls.splice(i, 1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (position) {&lt;br /&gt;
    for (i = 0; i &amp;lt; this.map.controls.length; i++) {&lt;br /&gt;
      var controlsForPosition = this.map.controls[control.position];&lt;br /&gt;
&lt;br /&gt;
      if (controlsForPosition.getAt(i) == control) {&lt;br /&gt;
        controlsForPosition.removeAt(i);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createMarker = function(options) {&lt;br /&gt;
  if (options.lat == undefined &amp;amp;&amp;amp; options.lng == undefined &amp;amp;&amp;amp; options.position == undefined) {&lt;br /&gt;
    throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      details = options.details,&lt;br /&gt;
      fences = options.fences,&lt;br /&gt;
      outside = options.outside,&lt;br /&gt;
      base_options = {&lt;br /&gt;
        position: new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        map: null&lt;br /&gt;
      },&lt;br /&gt;
      marker_options = extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  delete marker_options.lat;&lt;br /&gt;
  delete marker_options.lng;&lt;br /&gt;
  delete marker_options.fences;&lt;br /&gt;
  delete marker_options.outside;&lt;br /&gt;
&lt;br /&gt;
  var marker = new google.maps.Marker(marker_options);&lt;br /&gt;
&lt;br /&gt;
  marker.fences = fences;&lt;br /&gt;
&lt;br /&gt;
  if (options.infoWindow) {&lt;br /&gt;
    marker.infoWindow = new google.maps.InfoWindow(options.infoWindow);&lt;br /&gt;
&lt;br /&gt;
    var info_window_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;content_changed&amp;#039;, &amp;#039;domready&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; info_window_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        if (options.infoWindow[name]) {&lt;br /&gt;
          google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
            options.infoWindow[name].apply(this, [e]);&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      })(marker.infoWindow, info_window_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var marker_events = [&amp;#039;animation_changed&amp;#039;, &amp;#039;clickable_changed&amp;#039;, &amp;#039;cursor_changed&amp;#039;, &amp;#039;draggable_changed&amp;#039;, &amp;#039;flat_changed&amp;#039;, &amp;#039;icon_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;shadow_changed&amp;#039;, &amp;#039;shape_changed&amp;#039;, &amp;#039;title_changed&amp;#039;, &amp;#039;visible_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  var marker_events_with_mouse = [&amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;, &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this, [this]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(marker, marker_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events_with_mouse.length; ev++) {&lt;br /&gt;
    (function(map, object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(me){&lt;br /&gt;
          if(!me.pixel){&lt;br /&gt;
            me.pixel = map.getProjection().fromLatLngToPoint(me.latLng)&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          options[name].apply(this, [me]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(this.map, marker, marker_events_with_mouse[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
    this.details = details;&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      options.click.apply(this, [this]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      self.hideInfoWindows();&lt;br /&gt;
      marker.infoWindow.open(self.map, marker);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
    e.marker = this;&lt;br /&gt;
&lt;br /&gt;
    if (options.rightclick) {&lt;br /&gt;
      options.rightclick.apply(this, [e]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (window.context_menu[self.el.id][&amp;#039;marker&amp;#039;] != undefined) {&lt;br /&gt;
      self.buildContextMenu(&amp;#039;marker&amp;#039;, e);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    google.maps.event.addListener(marker, &amp;#039;dragend&amp;#039;, function() {&lt;br /&gt;
      self.checkMarkerGeofence(marker, function(m, f) {&lt;br /&gt;
        outside(m, f);&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarker = function(options) {&lt;br /&gt;
  var marker;&lt;br /&gt;
  if(options.hasOwnProperty(&amp;#039;gm_accessors_&amp;#039;)) {&lt;br /&gt;
    // Native google.maps.Marker object&lt;br /&gt;
    marker = options;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if ((options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) || options.position) {&lt;br /&gt;
      marker = this.createMarker(options);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  marker.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if(this.markerClusterer) {&lt;br /&gt;
    this.markerClusterer.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.markers.push(marker);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;marker_added&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarkers = function(array) {&lt;br /&gt;
  for (var i = 0, marker; marker=array[i]; i++) {&lt;br /&gt;
    this.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return this.markers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.hideInfoWindows = function() {&lt;br /&gt;
  for (var i = 0, marker; marker = this.markers[i]; i++){&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      marker.infoWindow.close();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarker = function(marker) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
    if (this.markers[i] === marker) {&lt;br /&gt;
      this.markers[i].setMap(null);&lt;br /&gt;
      this.markers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      if(this.markerClusterer) {&lt;br /&gt;
        this.markerClusterer.removeMarker(marker);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarkers = function (collection) {&lt;br /&gt;
  var new_markers = [];&lt;br /&gt;
&lt;br /&gt;
  if (typeof collection == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(this.markerClusterer &amp;amp;&amp;amp; this.markerClusterer.clearMarkers) {&lt;br /&gt;
      this.markerClusterer.clearMarkers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; collection.length; i++) {&lt;br /&gt;
      var index = this.markers.indexOf(collection[i]);&lt;br /&gt;
&lt;br /&gt;
      if (index &amp;gt; -1) {&lt;br /&gt;
        var marker = this.markers[index];&lt;br /&gt;
        marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
        if(this.markerClusterer) {&lt;br /&gt;
          this.markerClusterer.removeMarker(marker);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      if (marker.getMap() != null) {&lt;br /&gt;
        new_markers.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawOverlay = function(options) {&lt;br /&gt;
  var overlay = new google.maps.OverlayView(),&lt;br /&gt;
      auto_show = true;&lt;br /&gt;
&lt;br /&gt;
  overlay.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if (options.auto_show != null) {&lt;br /&gt;
    auto_show = options.auto_show;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  overlay.onAdd = function() {&lt;br /&gt;
    var el = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    el.style.borderStyle = &amp;quot;none&amp;quot;;&lt;br /&gt;
    el.style.borderWidth = &amp;quot;0px&amp;quot;;&lt;br /&gt;
    el.style.position = &amp;quot;absolute&amp;quot;;&lt;br /&gt;
    el.style.zIndex = 100;&lt;br /&gt;
    el.innerHTML = options.content;&lt;br /&gt;
&lt;br /&gt;
    overlay.el = el;&lt;br /&gt;
&lt;br /&gt;
    if (!options.layer) {&lt;br /&gt;
      options.layer = &amp;#039;overlayLayer&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var panes = this.getPanes(),&lt;br /&gt;
        overlayLayer = panes[options.layer],&lt;br /&gt;
        stop_overlay_events = [&amp;#039;contextmenu&amp;#039;, &amp;#039;DOMMouseScroll&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    overlayLayer.appendChild(el);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; stop_overlay_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        google.maps.event.addDomListener(object, name, function(e){&lt;br /&gt;
          if (navigator.userAgent.toLowerCase().indexOf(&amp;#039;msie&amp;#039;) != -1 &amp;amp;&amp;amp; document.all) {&lt;br /&gt;
            e.cancelBubble = true;&lt;br /&gt;
            e.returnValue = false;&lt;br /&gt;
          }&lt;br /&gt;
          else {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
      })(el, stop_overlay_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      panes.overlayMouseTarget.appendChild(overlay.el);&lt;br /&gt;
      google.maps.event.addDomListener(overlay.el, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
        options.click.apply(overlay, [overlay]);&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.trigger(this, &amp;#039;ready&amp;#039;);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.draw = function() {&lt;br /&gt;
    var projection = this.getProjection(),&lt;br /&gt;
        pixel = projection.fromLatLngToDivPixel(new google.maps.LatLng(options.lat, options.lng));&lt;br /&gt;
&lt;br /&gt;
    options.horizontalOffset = options.horizontalOffset || 0;&lt;br /&gt;
    options.verticalOffset = options.verticalOffset || 0;&lt;br /&gt;
&lt;br /&gt;
    var el = overlay.el,&lt;br /&gt;
        content = el.children[0],&lt;br /&gt;
        content_height = content.clientHeight,&lt;br /&gt;
        content_width = content.clientWidth;&lt;br /&gt;
&lt;br /&gt;
    switch (options.verticalAlign) {&lt;br /&gt;
      case &amp;#039;top&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - content_height + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;middle&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - (content_height / 2) + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;bottom&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (options.horizontalAlign) {&lt;br /&gt;
      case &amp;#039;left&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - content_width + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;center&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - (content_width / 2) + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;right&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    el.style.display = auto_show ? &amp;#039;block&amp;#039; : &amp;#039;none&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (!auto_show) {&lt;br /&gt;
      options.show.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.onRemove = function() {&lt;br /&gt;
    var el = overlay.el;&lt;br /&gt;
&lt;br /&gt;
    if (options.remove) {&lt;br /&gt;
      options.remove.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      overlay.el.parentNode.removeChild(overlay.el);&lt;br /&gt;
      overlay.el = null;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.overlays.push(overlay);&lt;br /&gt;
  return overlay;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlay = function(overlay) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.overlays.length; i++) {&lt;br /&gt;
    if (this.overlays[i] === overlay) {&lt;br /&gt;
      this.overlays[i].setMap(null);&lt;br /&gt;
      this.overlays.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlays = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.overlays[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.overlays = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolyline = function(options) {&lt;br /&gt;
  var path = [],&lt;br /&gt;
      points = options.path;&lt;br /&gt;
&lt;br /&gt;
  if (points.length) {&lt;br /&gt;
    if (points[0][0] === undefined) {&lt;br /&gt;
      path = points;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      for (var i = 0, latlng; latlng = points[i]; i++) {&lt;br /&gt;
        path.push(new google.maps.LatLng(latlng[0], latlng[1]));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    path: path,&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight,&lt;br /&gt;
    geodesic: options.geodesic,&lt;br /&gt;
    clickable: true,&lt;br /&gt;
    editable: false,&lt;br /&gt;
    visible: true&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;clickable&amp;quot;)) {&lt;br /&gt;
    polyline_options.clickable = options.clickable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;editable&amp;quot;)) {&lt;br /&gt;
    polyline_options.editable = options.editable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;zIndex&amp;quot;)) {&lt;br /&gt;
    polyline_options.zIndex = options.zIndex;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline = new google.maps.Polyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
  var polyline_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polyline_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polyline, polyline_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines.push(polyline);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polyline_added&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
  return polyline;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolyline = function(polyline) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polylines.length; i++) {&lt;br /&gt;
    if (this.polylines[i] === polyline) {&lt;br /&gt;
      this.polylines[i].setMap(null);&lt;br /&gt;
      this.polylines.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polyline_removed&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolylines = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polylines[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawCircle = function(options) {&lt;br /&gt;
  options =  extend_object({&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    center: new google.maps.LatLng(options.lat, options.lng)&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Circle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRectangle = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  var latLngBounds = new google.maps.LatLngBounds(&lt;br /&gt;
    new google.maps.LatLng(options.bounds[0][0], options.bounds[0][1]),&lt;br /&gt;
    new google.maps.LatLng(options.bounds[1][0], options.bounds[1][1])&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  options.bounds = latLngBounds;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Rectangle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolygon = function(options) {&lt;br /&gt;
  var useGeoJSON = false;&lt;br /&gt;
&lt;br /&gt;
  if(options.hasOwnProperty(&amp;quot;useGeoJSON&amp;quot;)) {&lt;br /&gt;
    useGeoJSON = options.useGeoJSON;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.useGeoJSON;&lt;br /&gt;
&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON == false) {&lt;br /&gt;
    options.paths = [options.paths.slice(0)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.paths.length &amp;gt; 0) {&lt;br /&gt;
    if (options.paths[0].length &amp;gt; 0) {&lt;br /&gt;
      options.paths = array_flat(array_map(options.paths, arrayToLatLng, useGeoJSON));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Polygon(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polygon_added&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygon = function(polygon) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polygons.length; i++) {&lt;br /&gt;
    if (this.polygons[i] === polygon) {&lt;br /&gt;
      this.polygons[i].setMap(null);&lt;br /&gt;
      this.polygons.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polygon_removed&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygons = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polygons[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromFusionTables = function(options) {&lt;br /&gt;
  var events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var fusion_tables_options = options,&lt;br /&gt;
      layer = new google.maps.FusionTablesLayer(fusion_tables_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromFusionTables = function(options) {&lt;br /&gt;
  var layer = this.getFromFusionTables(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromKML = function(options) {&lt;br /&gt;
  var url = options.url,&lt;br /&gt;
      events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.url;&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var kml_options = options,&lt;br /&gt;
      layer = new google.maps.KmlLayer(url, kml_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromKML = function(options) {&lt;br /&gt;
  var layer = this.getFromKML(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addLayer = function(layerName, options) {&lt;br /&gt;
  //var default_layers = [&amp;#039;weather&amp;#039;, &amp;#039;clouds&amp;#039;, &amp;#039;traffic&amp;#039;, &amp;#039;transit&amp;#039;, &amp;#039;bicycling&amp;#039;, &amp;#039;panoramio&amp;#039;, &amp;#039;places&amp;#039;];&lt;br /&gt;
  options = options || {};&lt;br /&gt;
  var layer;&lt;br /&gt;
&lt;br /&gt;
  switch(layerName) {&lt;br /&gt;
    case &amp;#039;weather&amp;#039;: this.singleLayers.weather = layer = new google.maps.weather.WeatherLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;clouds&amp;#039;: this.singleLayers.clouds = layer = new google.maps.weather.CloudLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;traffic&amp;#039;: this.singleLayers.traffic = layer = new google.maps.TrafficLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;: this.singleLayers.transit = layer = new google.maps.TransitLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;: this.singleLayers.bicycling = layer = new google.maps.BicyclingLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;panoramio&amp;#039;:&lt;br /&gt;
        this.singleLayers.panoramio = layer = new google.maps.panoramio.PanoramioLayer();&lt;br /&gt;
        layer.setTag(options.filter);&lt;br /&gt;
        delete options.filter;&lt;br /&gt;
&lt;br /&gt;
        //click event&lt;br /&gt;
        if (options.click) {&lt;br /&gt;
          google.maps.event.addListener(layer, &amp;#039;click&amp;#039;, function(event) {&lt;br /&gt;
            options.click(event);&lt;br /&gt;
            delete options.click;&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
      case &amp;#039;places&amp;#039;:&lt;br /&gt;
        this.singleLayers.places = layer = new google.maps.places.PlacesService(this.map);&lt;br /&gt;
&lt;br /&gt;
        //search, nearbySearch, radarSearch callback, Both are the same&lt;br /&gt;
        if (options.search || options.nearbySearch || options.radarSearch) {&lt;br /&gt;
          var placeSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            keyword : options.keyword || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            name : options.name || null,&lt;br /&gt;
            radius : options.radius || null,&lt;br /&gt;
            rankBy : options.rankBy || null,&lt;br /&gt;
            types : options.types || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          if (options.radarSearch) {&lt;br /&gt;
            layer.radarSearch(placeSearchRequest, options.radarSearch);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.search) {&lt;br /&gt;
            layer.search(placeSearchRequest, options.search);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.nearbySearch) {&lt;br /&gt;
            layer.nearbySearch(placeSearchRequest, options.nearbySearch);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //textSearch callback&lt;br /&gt;
        if (options.textSearch) {&lt;br /&gt;
          var textSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            query : options.query || null,&lt;br /&gt;
            radius : options.radius || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          layer.textSearch(textSearchRequest, options.textSearch);&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (layer !== undefined) {&lt;br /&gt;
    if (typeof layer.setOptions == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setOptions(options);&lt;br /&gt;
    }&lt;br /&gt;
    if (typeof layer.setMap == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setMap(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return layer;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeLayer = function(layer) {&lt;br /&gt;
  if (typeof(layer) == &amp;quot;string&amp;quot; &amp;amp;&amp;amp; this.singleLayers[layer] !== undefined) {&lt;br /&gt;
     this.singleLayers[layer].setMap(null);&lt;br /&gt;
&lt;br /&gt;
     delete this.singleLayers[layer];&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.layers.length; i++) {&lt;br /&gt;
      if (this.layers[i] === layer) {&lt;br /&gt;
        this.layers[i].setMap(null);&lt;br /&gt;
        this.layers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var travelMode, unitSystem;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getRoutes = function(options) {&lt;br /&gt;
  switch (options.travelMode) {&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.BICYCLING;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.TRANSIT;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;driving&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.DRIVING;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      travelMode = google.maps.TravelMode.WALKING;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.unitSystem === &amp;#039;imperial&amp;#039;) {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.IMPERIAL;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.METRIC;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var base_options = {&lt;br /&gt;
        avoidHighways: false,&lt;br /&gt;
        avoidTolls: false,&lt;br /&gt;
        optimizeWaypoints: false,&lt;br /&gt;
        waypoints: []&lt;br /&gt;
      },&lt;br /&gt;
      request_options =  extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]);&lt;br /&gt;
  request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]);&lt;br /&gt;
  request_options.travelMode = travelMode;&lt;br /&gt;
  request_options.unitSystem = unitSystem;&lt;br /&gt;
&lt;br /&gt;
  delete request_options.callback;&lt;br /&gt;
  delete request_options.error;&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      routes = [],&lt;br /&gt;
      service = new google.maps.DirectionsService();&lt;br /&gt;
&lt;br /&gt;
  service.route(request_options, function(result, status) {&lt;br /&gt;
    if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
      for (var r in result.routes) {&lt;br /&gt;
        if (result.routes.hasOwnProperty(r)) {&lt;br /&gt;
          routes.push(result.routes[r]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback(routes, result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      if (options.error) {&lt;br /&gt;
        options.error(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeRoutes = function() {&lt;br /&gt;
  this.routes.length = 0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getElevations = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    locations: [],&lt;br /&gt;
    path : false,&lt;br /&gt;
    samples : 256&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (options.locations.length &amp;gt; 0) {&lt;br /&gt;
    if (options.locations[0].length &amp;gt; 0) {&lt;br /&gt;
      options.locations = array_flat(array_map([options.locations], arrayToLatLng,  false));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
&lt;br /&gt;
  var service = new google.maps.ElevationService();&lt;br /&gt;
&lt;br /&gt;
  //location request&lt;br /&gt;
  if (!options.path) {&lt;br /&gt;
    delete options.path;&lt;br /&gt;
    delete options.samples;&lt;br /&gt;
&lt;br /&gt;
    service.getElevationForLocations(options, function(result, status) {&lt;br /&gt;
      if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  //path request&lt;br /&gt;
  } else {&lt;br /&gt;
    var pathRequest = {&lt;br /&gt;
      path : options.locations,&lt;br /&gt;
      samples : options.samples&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    service.getElevationAlongPath(pathRequest, function(result, status) {&lt;br /&gt;
     if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.renderRoute = function(options, renderOptions) {&lt;br /&gt;
  var self = this,&lt;br /&gt;
      panel = ((typeof renderOptions.panel === &amp;#039;string&amp;#039;) ? document.getElementById(renderOptions.panel.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;)) : renderOptions.panel),&lt;br /&gt;
      display;&lt;br /&gt;
&lt;br /&gt;
  renderOptions.panel = panel;&lt;br /&gt;
  renderOptions = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, renderOptions);&lt;br /&gt;
  display = new google.maps.DirectionsRenderer(renderOptions);&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes, response, status) {&lt;br /&gt;
      if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
        display.setDirections(response);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes) {&lt;br /&gt;
      if (routes.length &amp;gt; 0) {&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: routes[routes.length - 1].overview_path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
        if (options.callback) {&lt;br /&gt;
          options.callback(routes[routes.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.travelRoute = function(options) {&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      unitSystem: options.unitSystem,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawSteppedRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              var polyline_options = {&lt;br /&gt;
                path: step.path,&lt;br /&gt;
                strokeColor: options.strokeColor,&lt;br /&gt;
                strokeOpacity: options.strokeOpacity,&lt;br /&gt;
                strokeWeight: options.strokeWeight&lt;br /&gt;
              };&lt;br /&gt;
&lt;br /&gt;
              if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
                polyline_options.icons = options.icons;&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              self.drawPolyline(polyline_options);&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: step.path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route = function(options) {&lt;br /&gt;
  this.origin = options.origin;&lt;br /&gt;
  this.destination = options.destination;&lt;br /&gt;
  this.waypoints = options.waypoints;&lt;br /&gt;
&lt;br /&gt;
  this.map = options.map;&lt;br /&gt;
  this.route = options.route;&lt;br /&gt;
  this.step_count = 0;&lt;br /&gt;
  this.steps = this.route.legs[0].steps;&lt;br /&gt;
  this.steps_length = this.steps.length;&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    path: new google.maps.MVCArray(),&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polyline = this.map.drawPolyline(polyline_options).getPath();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.getRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.map.getRoutes({&lt;br /&gt;
    origin : this.origin,&lt;br /&gt;
    destination : this.destination,&lt;br /&gt;
    travelMode : options.travelMode,&lt;br /&gt;
    waypoints : this.waypoints || [],&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    callback : function() {&lt;br /&gt;
      self.route = e[0];&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback.call(self);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.back = function() {&lt;br /&gt;
  if (this.step_count &amp;gt; 0) {&lt;br /&gt;
    this.step_count--;&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.pop();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.forward = function() {&lt;br /&gt;
  if (this.step_count &amp;lt; this.steps_length) {&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.push(path[p]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    this.step_count++;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkGeofence = function(lat, lng, fence) {&lt;br /&gt;
  return fence.containsLatLng(new google.maps.LatLng(lat, lng));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkMarkerGeofence = function(marker, outside_callback) {&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    for (var i = 0, fence; fence = marker.fences[i]; i++) {&lt;br /&gt;
      var pos = marker.getPosition();&lt;br /&gt;
      if (!this.checkGeofence(pos.lat(), pos.lng(), fence)) {&lt;br /&gt;
        outside_callback(marker, fence);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.toImage = function(options) {&lt;br /&gt;
  var options = options || {},&lt;br /&gt;
      static_map_options = {};&lt;br /&gt;
&lt;br /&gt;
  static_map_options[&amp;#039;size&amp;#039;] = options[&amp;#039;size&amp;#039;] || [this.el.clientWidth, this.el.clientHeight];&lt;br /&gt;
  static_map_options[&amp;#039;lat&amp;#039;] = this.getCenter().lat();&lt;br /&gt;
  static_map_options[&amp;#039;lng&amp;#039;] = this.getCenter().lng();&lt;br /&gt;
&lt;br /&gt;
  if (this.markers.length &amp;gt; 0) {&lt;br /&gt;
    static_map_options[&amp;#039;markers&amp;#039;] = [];&lt;br /&gt;
    &lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      static_map_options[&amp;#039;markers&amp;#039;].push({&lt;br /&gt;
        lat: this.markers[i].getPosition().lat(),&lt;br /&gt;
        lng: this.markers[i].getPosition().lng()&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (this.polylines.length &amp;gt; 0) {&lt;br /&gt;
    var polyline = this.polylines[0];&lt;br /&gt;
    &lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;] = {};&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;path&amp;#039;] = google.maps.geometry.encoding.encodePath(polyline.getPath());&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeColor&amp;#039;] = polyline.strokeColor&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeOpacity&amp;#039;] = polyline.strokeOpacity&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeWeight&amp;#039;] = polyline.strokeWeight&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return GMaps.staticMapURL(static_map_options);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.staticMapURL = function(options){&lt;br /&gt;
  var parameters = [],&lt;br /&gt;
      data,&lt;br /&gt;
      static_root = (location.protocol === &amp;#039;file:&amp;#039; ? &amp;#039;http:&amp;#039; : location.protocol ) + &amp;#039;//maps.googleapis.com/maps/api/staticmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.url) {&lt;br /&gt;
    static_root = options.url;&lt;br /&gt;
    delete options.url;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  static_root += &amp;#039;?&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  var markers = options.markers;&lt;br /&gt;
  &lt;br /&gt;
  delete options.markers;&lt;br /&gt;
&lt;br /&gt;
  if (!markers &amp;amp;&amp;amp; options.marker) {&lt;br /&gt;
    markers = [options.marker];&lt;br /&gt;
    delete options.marker;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var styles = options.styles;&lt;br /&gt;
&lt;br /&gt;
  delete options.styles;&lt;br /&gt;
&lt;br /&gt;
  var polyline = options.polyline;&lt;br /&gt;
  delete options.polyline;&lt;br /&gt;
&lt;br /&gt;
  /** Map options **/&lt;br /&gt;
  if (options.center) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.center);&lt;br /&gt;
    delete options.center;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.address) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.address);&lt;br /&gt;
    delete options.address;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.lat) {&lt;br /&gt;
    parameters.push([&amp;#039;center=&amp;#039;, options.lat, &amp;#039;,&amp;#039;, options.lng].join(&amp;#039;&amp;#039;));&lt;br /&gt;
    delete options.lat;&lt;br /&gt;
    delete options.lng;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.visible) {&lt;br /&gt;
    var visible = encodeURI(options.visible.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
    parameters.push(&amp;#039;visible=&amp;#039; + visible);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var size = options.size;&lt;br /&gt;
  if (size) {&lt;br /&gt;
    if (size.join) {&lt;br /&gt;
      size = size.join(&amp;#039;x&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    delete options.size;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    size = &amp;#039;630x300&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  parameters.push(&amp;#039;size=&amp;#039; + size);&lt;br /&gt;
&lt;br /&gt;
  if (!options.zoom &amp;amp;&amp;amp; options.zoom !== false) {&lt;br /&gt;
    options.zoom = 15;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var sensor = options.hasOwnProperty(&amp;#039;sensor&amp;#039;) ? !!options.sensor : true;&lt;br /&gt;
  delete options.sensor;&lt;br /&gt;
  parameters.push(&amp;#039;sensor=&amp;#039; + sensor);&lt;br /&gt;
&lt;br /&gt;
  for (var param in options) {&lt;br /&gt;
    if (options.hasOwnProperty(param)) {&lt;br /&gt;
      parameters.push(param + &amp;#039;=&amp;#039; + options[param]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Markers **/&lt;br /&gt;
  if (markers) {&lt;br /&gt;
    var marker, loc;&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; data = markers[i]; i++) {&lt;br /&gt;
      marker = [];&lt;br /&gt;
&lt;br /&gt;
      if (data.size &amp;amp;&amp;amp; data.size !== &amp;#039;normal&amp;#039;) {&lt;br /&gt;
        marker.push(&amp;#039;size:&amp;#039; + data.size);&lt;br /&gt;
        delete data.size;&lt;br /&gt;
      }&lt;br /&gt;
      else if (data.icon) {&lt;br /&gt;
        marker.push(&amp;#039;icon:&amp;#039; + encodeURI(data.icon));&lt;br /&gt;
        delete data.icon;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.color) {&lt;br /&gt;
        marker.push(&amp;#039;color:&amp;#039; + data.color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;));&lt;br /&gt;
        delete data.color;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.label) {&lt;br /&gt;
        marker.push(&amp;#039;label:&amp;#039; + data.label[0].toUpperCase());&lt;br /&gt;
        delete data.label;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      loc = (data.address ? data.address : data.lat + &amp;#039;,&amp;#039; + data.lng);&lt;br /&gt;
      delete data.address;&lt;br /&gt;
      delete data.lat;&lt;br /&gt;
      delete data.lng;&lt;br /&gt;
&lt;br /&gt;
      for(var param in data){&lt;br /&gt;
        if (data.hasOwnProperty(param)) {&lt;br /&gt;
          marker.push(param + &amp;#039;:&amp;#039; + data[param]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (marker.length || i === 0) {&lt;br /&gt;
        marker.push(loc);&lt;br /&gt;
        marker = marker.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
        parameters.push(&amp;#039;markers=&amp;#039; + encodeURI(marker));&lt;br /&gt;
      }&lt;br /&gt;
      // New marker without styles&lt;br /&gt;
      else {&lt;br /&gt;
        marker = parameters.pop() + encodeURI(&amp;#039;|&amp;#039; + loc);&lt;br /&gt;
        parameters.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Map Styles **/&lt;br /&gt;
  if (styles) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; styles.length; i++) {&lt;br /&gt;
      var styleRule = [];&lt;br /&gt;
      if (styles[i].featureType){&lt;br /&gt;
        styleRule.push(&amp;#039;feature:&amp;#039; + styles[i].featureType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (styles[i].elementType) {&lt;br /&gt;
        styleRule.push(&amp;#039;element:&amp;#039; + styles[i].elementType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      for (var j = 0; j &amp;lt; styles[i].stylers.length; j++) {&lt;br /&gt;
        for (var p in styles[i].stylers[j]) {&lt;br /&gt;
          var ruleArg = styles[i].stylers[j][p];&lt;br /&gt;
          if (p == &amp;#039;hue&amp;#039; || p == &amp;#039;color&amp;#039;) {&lt;br /&gt;
            ruleArg = &amp;#039;0x&amp;#039; + ruleArg.substring(1);&lt;br /&gt;
          }&lt;br /&gt;
          styleRule.push(p + &amp;#039;:&amp;#039; + ruleArg);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var rule = styleRule.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
      if (rule != &amp;#039;&amp;#039;) {&lt;br /&gt;
        parameters.push(&amp;#039;style=&amp;#039; + rule);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Polylines **/&lt;br /&gt;
  function parseColor(color, opacity) {&lt;br /&gt;
    if (color[0] === &amp;#039;#&amp;#039;){&lt;br /&gt;
      color = color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (opacity) {&lt;br /&gt;
        opacity = parseFloat(opacity);&lt;br /&gt;
        opacity = Math.min(1, Math.max(opacity, 0));&lt;br /&gt;
        if (opacity === 0) {&lt;br /&gt;
          return &amp;#039;0x00000000&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        opacity = (opacity * 255).toString(16);&lt;br /&gt;
        if (opacity.length === 1) {&lt;br /&gt;
          opacity += opacity;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        color = color.slice(0,8) + opacity;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return color;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (polyline) {&lt;br /&gt;
    data = polyline;&lt;br /&gt;
    polyline = [];&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeWeight) {&lt;br /&gt;
      polyline.push(&amp;#039;weight:&amp;#039; + parseInt(data.strokeWeight, 10));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeColor) {&lt;br /&gt;
      var color = parseColor(data.strokeColor, data.strokeOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;color:&amp;#039; + color);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.fillColor) {&lt;br /&gt;
      var fillcolor = parseColor(data.fillColor, data.fillOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;fillcolor:&amp;#039; + fillcolor);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var path = data.path;&lt;br /&gt;
    if (path.join) {&lt;br /&gt;
      for (var j=0, pos; pos=path[j]; j++) {&lt;br /&gt;
        polyline.push(pos.join(&amp;#039;,&amp;#039;));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      polyline.push(&amp;#039;enc:&amp;#039; + path);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    polyline = polyline.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
    parameters.push(&amp;#039;path=&amp;#039; + encodeURI(polyline));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Retina support **/&lt;br /&gt;
  var dpi = window.devicePixelRatio || 1;&lt;br /&gt;
  parameters.push(&amp;#039;scale=&amp;#039; + dpi);&lt;br /&gt;
&lt;br /&gt;
  parameters = parameters.join(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
  return static_root + parameters;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMapType = function(mapTypeId, options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTileUrl&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTileUrl&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    options.tileSize = options.tileSize || new google.maps.Size(256, 256);&lt;br /&gt;
&lt;br /&gt;
    var mapType = new google.maps.ImageMapType(options);&lt;br /&gt;
&lt;br /&gt;
    this.map.mapTypes.set(mapTypeId, mapType);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTileUrl&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addOverlayMapType = function(options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTile&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTile&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    var overlayMapTypeIndex = options.index;&lt;br /&gt;
&lt;br /&gt;
    delete options.index;&lt;br /&gt;
&lt;br /&gt;
    this.map.overlayMapTypes.insertAt(overlayMapTypeIndex, options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTile&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlayMapType = function(overlayMapTypeIndex) {&lt;br /&gt;
  this.map.overlayMapTypes.removeAt(overlayMapTypeIndex);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addStyle = function(options) {&lt;br /&gt;
  var styledMapType = new google.maps.StyledMapType(options.styles, { name: options.styledMapName });&lt;br /&gt;
&lt;br /&gt;
  this.map.mapTypes.set(options.mapTypeId, styledMapType);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.setStyle = function(mapTypeId) {&lt;br /&gt;
  this.map.setMapTypeId(mapTypeId);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createPanorama = function(streetview_options) {&lt;br /&gt;
  if (!streetview_options.hasOwnProperty(&amp;#039;lat&amp;#039;) || !streetview_options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    streetview_options.lat = this.getCenter().lat();&lt;br /&gt;
    streetview_options.lng = this.getCenter().lng();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.panorama = GMaps.createPanorama(streetview_options);&lt;br /&gt;
&lt;br /&gt;
  this.map.setStreetView(this.panorama);&lt;br /&gt;
&lt;br /&gt;
  return this.panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.createPanorama = function(options) {&lt;br /&gt;
  var el = getElementById(options.el, options.context);&lt;br /&gt;
&lt;br /&gt;
  options.position = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
&lt;br /&gt;
  delete options.el;&lt;br /&gt;
  delete options.context;&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var streetview_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;links_changed&amp;#039;, &amp;#039;pano_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;pov_changed&amp;#039;, &amp;#039;resize&amp;#039;, &amp;#039;visible_changed&amp;#039;],&lt;br /&gt;
      streetview_options = extend_object({visible : true}, options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    delete streetview_options[streetview_events[i]];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var panorama = new google.maps.StreetViewPanorama(el, streetview_options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(panorama, streetview_events[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.on = function(event_name, handler) {&lt;br /&gt;
  return GMaps.on(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.off = function(event_name) {&lt;br /&gt;
  GMaps.off(event_name, this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.once = function(event_name, handler) {&lt;br /&gt;
  return GMaps.once(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.custom_events = [&amp;#039;marker_added&amp;#039;, &amp;#039;marker_removed&amp;#039;, &amp;#039;polyline_added&amp;#039;, &amp;#039;polyline_removed&amp;#039;, &amp;#039;polygon_added&amp;#039;, &amp;#039;polygon_removed&amp;#039;, &amp;#039;geolocated&amp;#039;, &amp;#039;geolocation_failed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
GMaps.on = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    return google.maps.event.addListener(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    var registered_event = {&lt;br /&gt;
      handler : handler,&lt;br /&gt;
      eventName : event_name&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    object.registered_events[event_name] = object.registered_events[event_name] || [];&lt;br /&gt;
    object.registered_events[event_name].push(registered_event);&lt;br /&gt;
&lt;br /&gt;
    return registered_event;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.off = function(event_name, object) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    google.maps.event.clearListeners(object, event_name);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    object.registered_events[event_name] = [];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.once = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map;&lt;br /&gt;
    return google.maps.event.addListenerOnce(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.fire = function(event_name, object, scope) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    google.maps.event.trigger(object, event_name, Array.prototype.slice.apply(arguments).slice(2));&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if(event_name in scope.registered_events) {&lt;br /&gt;
      var firing_events = scope.registered_events[event_name];&lt;br /&gt;
&lt;br /&gt;
      for(var i = 0; i &amp;lt; firing_events.length; i++) {&lt;br /&gt;
        (function(handler, scope, object) {&lt;br /&gt;
          handler.apply(scope, [object]);&lt;br /&gt;
        })(firing_events[i][&amp;#039;handler&amp;#039;], scope, object);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geolocate = function(options) {&lt;br /&gt;
  var complete_callback = options.always || options.complete;&lt;br /&gt;
&lt;br /&gt;
  if (navigator.geolocation) {&lt;br /&gt;
    navigator.geolocation.getCurrentPosition(function(position) {&lt;br /&gt;
      options.success(position);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, function(error) {&lt;br /&gt;
      options.error(error);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, options.options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    options.not_supported();&lt;br /&gt;
&lt;br /&gt;
    if (complete_callback) {&lt;br /&gt;
      complete_callback();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geocode = function(options) {&lt;br /&gt;
  this.geocoder = new google.maps.Geocoder();&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  if (options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    options.latLng = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
  &lt;br /&gt;
  this.geocoder.geocode(options, function(results, status) {&lt;br /&gt;
    callback(results, status);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
if (typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps) {&lt;br /&gt;
  //==========================&lt;br /&gt;
  // Polygon containsLatLng&lt;br /&gt;
  // https://github.com/tparkin/Google-Maps-Point-in-Polygon&lt;br /&gt;
  // Poygon getBounds extension - google-maps-extensions&lt;br /&gt;
  // http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js&lt;br /&gt;
  if (!google.maps.Polygon.prototype.getBounds) {&lt;br /&gt;
    google.maps.Polygon.prototype.getBounds = function(latLng) {&lt;br /&gt;
      var bounds = new google.maps.LatLngBounds();&lt;br /&gt;
      var paths = this.getPaths();&lt;br /&gt;
      var path;&lt;br /&gt;
&lt;br /&gt;
      for (var p = 0; p &amp;lt; paths.getLength(); p++) {&lt;br /&gt;
        path = paths.getAt(p);&lt;br /&gt;
        for (var i = 0; i &amp;lt; path.getLength(); i++) {&lt;br /&gt;
          bounds.extend(path.getAt(i));&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return bounds;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Polygon.prototype.containsLatLng) {&lt;br /&gt;
    // Polygon containsLatLng - method to determine if a latLng is within a polygon&lt;br /&gt;
    google.maps.Polygon.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      // Exclude points outside of bounds as there is no way they are in the poly&lt;br /&gt;
      var bounds = this.getBounds();&lt;br /&gt;
&lt;br /&gt;
      if (bounds !== null &amp;amp;&amp;amp; !bounds.contains(latLng)) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Raycast point in polygon method&lt;br /&gt;
      var inPoly = false;&lt;br /&gt;
&lt;br /&gt;
      var numPaths = this.getPaths().getLength();&lt;br /&gt;
      for (var p = 0; p &amp;lt; numPaths; p++) {&lt;br /&gt;
        var path = this.getPaths().getAt(p);&lt;br /&gt;
        var numPoints = path.getLength();&lt;br /&gt;
        var j = numPoints - 1;&lt;br /&gt;
&lt;br /&gt;
        for (var i = 0; i &amp;lt; numPoints; i++) {&lt;br /&gt;
          var vertex1 = path.getAt(i);&lt;br /&gt;
          var vertex2 = path.getAt(j);&lt;br /&gt;
&lt;br /&gt;
          if (vertex1.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex2.lng() &amp;gt;= latLng.lng() || vertex2.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex1.lng() &amp;gt;= latLng.lng()) {&lt;br /&gt;
            if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) &amp;lt; latLng.lat()) {&lt;br /&gt;
              inPoly = !inPoly;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          j = i;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return inPoly;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Circle.prototype.containsLatLng) {&lt;br /&gt;
    google.maps.Circle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      if (google.maps.geometry) {&lt;br /&gt;
        return google.maps.geometry.spherical.computeDistanceBetween(this.getCenter(), latLng) &amp;lt;= this.getRadius();&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.Rectangle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.getBounds().contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.setFences = function(fences) {&lt;br /&gt;
    this.fences = fences;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.addFence = function(fence) {&lt;br /&gt;
    this.fences.push(fence);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.getId = function() {&lt;br /&gt;
    return this[&amp;#039;__gm_id&amp;#039;];&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==========================&lt;br /&gt;
// Array indexOf&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf&lt;br /&gt;
if (!Array.prototype.indexOf) {&lt;br /&gt;
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {&lt;br /&gt;
      &amp;quot;use strict&amp;quot;;&lt;br /&gt;
      if (this == null) {&lt;br /&gt;
          throw new TypeError();&lt;br /&gt;
      }&lt;br /&gt;
      var t = Object(this);&lt;br /&gt;
      var len = t.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
      if (len === 0) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var n = 0;&lt;br /&gt;
      if (arguments.length &amp;gt; 1) {&lt;br /&gt;
          n = Number(arguments[1]);&lt;br /&gt;
          if (n != n) { // shortcut for verifying if it&amp;#039;s NaN&lt;br /&gt;
              n = 0;&lt;br /&gt;
          } else if (n != 0 &amp;amp;&amp;amp; n != Infinity &amp;amp;&amp;amp; n != -Infinity) {&lt;br /&gt;
              n = (n &amp;gt; 0 || -1) * Math.floor(Math.abs(n));&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      if (n &amp;gt;= len) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var k = n &amp;gt;= 0 ? n : Math.max(len - Math.abs(n), 0);&lt;br /&gt;
      for (; k &amp;lt; len; k++) {&lt;br /&gt;
          if (k in t &amp;amp;&amp;amp; t[k] === searchElement) {&lt;br /&gt;
              return k;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return GMaps;&lt;br /&gt;
}));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
approve.js&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
howlerjs.com - Cross Plattform Audio&lt;br /&gt;
&lt;br /&gt;
== Browser Fixing ==&lt;br /&gt;
[[JavaScript - iOS Orientation Change Fix]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Tonproduktion&amp;diff=22869</id>
		<title>Mac - Tonproduktion</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Tonproduktion&amp;diff=22869"/>
		<updated>2018-02-27T12:55:53Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „== Nützliche Tools == === Soundflower - virtuelle Soundkarte === Mit Soundflower kann man verschiedene Programme neu Verkabeln. ==== Beispiel Logic Instrument…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Nützliche Tools ==&lt;br /&gt;
=== Soundflower - virtuelle Soundkarte ===&lt;br /&gt;
Mit Soundflower kann man verschiedene Programme neu Verkabeln.&lt;br /&gt;
==== Beispiel Logic Instrumente in Ableton Live nutzen ====&lt;br /&gt;
Ableton kann als Slave Instrument für Logic fungieren. Dazu startet man einfach Logic zuerst. Anders herum funktioniert das nicht. Man kann aber den Output von Logic über Soundflower den Eingängen von Audiospuren in Ableton zuordnen. So kann man dann doch die Instrumente spielen. Allerdings nur über Recording.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Ableton_-_Tipps_und_Tricks&amp;diff=22868</id>
		<title>Ableton - Tipps und Tricks</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Ableton_-_Tipps_und_Tricks&amp;diff=22868"/>
		<updated>2018-02-27T12:12:48Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Timing ==&lt;br /&gt;
=== Pitch for Length ===&lt;br /&gt;
Wenn der Warp Modus aus ist dann wirken sich Pitch Änderungen auf die Länge des Clips aus (wie bei einem Plattenspieler). Das kann man bei Drumloops für die Feinustage nutzen (wenn es auf die Tonhöhe nicht so genau ankommt)&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
=== Launchpad Remote Scripts ===&lt;br /&gt;
Super Useful:&lt;br /&gt;
&lt;br /&gt;
[[Launchpad Remote Scripts]]&lt;br /&gt;
== FX ==&lt;br /&gt;
=== Wet / Dry Knopf für alles ===&lt;br /&gt;
Beispiel: Ein Effekt ohne Wet Dry Knopf soll gemäßigt abgespielt werden&lt;br /&gt;
* Effekt wählen und cmd + g -&amp;gt; Group Effekt&lt;br /&gt;
* Chain aufklappen&lt;br /&gt;
* Rechtsklick in Chain und leeren Chain erzeugen (Erzeugt ein Dry Signal)&lt;br /&gt;
Jetzt haben wir einmal ein bearbeitetes und ein trockenes Signal. Jetzt müssen wir einen Übergang schaffen und mit einem Button verknüpfen.&lt;br /&gt;
* Mit dem Chain Button die Zonen anzeigen und dort dry und wet über fast den ganzen Bereich aufziehen (Dry kurz vor dem Ende aufhören lassen und Wet kurz nach dem Anfang starten.) Dann mit dem oberen Zonen Editor Button den einen Effekt ein und den anderen ausblenden.&lt;br /&gt;
* Makroregler in der Chain einblenden, dann Map klicken und die Chain (oben die Werteanzeige klicken) auf einen Makroregler legen. Mapping beenden.&lt;br /&gt;
* Speichern wenn man es öfter benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Sudo Sidechaining Sidechain ohne Sidechain ===&lt;br /&gt;
Autopanning, ohne Seitenwechsel einstellen und Sägezahn nehmen&lt;br /&gt;
&lt;br /&gt;
=== Fatten Sound Tricks ===&lt;br /&gt;
Spur z.B. Vocals 2x duplizieren rechts / links Panorama und im Warpmodus (complex oder complex pro) leicht detunen (Custom  Chorus) . Evtl. Distortion etc. drauf.&lt;br /&gt;
&lt;br /&gt;
=== Sidechain Gating ===&lt;br /&gt;
Rhythmus Track triggert z.B. einen Vokal Track&lt;br /&gt;
* Gate auf Local Track&lt;br /&gt;
* Sidechain auf Rhythmus Track&lt;br /&gt;
&lt;br /&gt;
=== Metallic Chorus Screech ===&lt;br /&gt;
* Cleaner Bass Sound&lt;br /&gt;
* Chorus LFO *20 Feedback volle Lotte und Modulation testen&lt;br /&gt;
&lt;br /&gt;
=== Glitchy Grain Size Fills ===&lt;br /&gt;
Ein Audio Track (Beat) soll einen schönen Glitchy Fill bekommen.&lt;br /&gt;
* Clip (am besten ein einfacher Beat) auf neue Spur kopieren und im Warp Mode stretchen soweit es geht (BPM auf 999). Nicht vergessen nach dem BPM Stretch wird der Clip auch in der Timeline länger - hier auch auseinander ziehen.&lt;br /&gt;
* Warp Mode auf Tones oder Texture Mode. Hier kann man die Grain Size einstellen. Grain Size voll und Flux auf 0.&lt;br /&gt;
* Envelopes einschalten und an jedem großen Schlag in verschieden vielen Stufen einblenden, danach wieder auf 0 gehen, so dass schöne Rhythmische Figuren entstehen.&lt;br /&gt;
* Auf neue Spur aufnehmen und beim Aufnehmen mit dem Pitch Regler spielen.&lt;br /&gt;
* Das Sample auf die gewünschte Stelle ziehen und einen schönen Ausschnitt suchen.&lt;br /&gt;
&lt;br /&gt;
== Midi FX ==&lt;br /&gt;
=== Recording Midi FX ===&lt;br /&gt;
Möchte man Midi Effekte wie z.B. Chord Creation oder Appegiatoren in Einzelnoten auflösen, kann man einen leeren Midikanal anlegen und als Eingang den Quellkanal wählen. Dann einfach aufnehmen.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Ableton_-_Tipps_und_Tricks&amp;diff=22867</id>
		<title>Ableton - Tipps und Tricks</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Ableton_-_Tipps_und_Tricks&amp;diff=22867"/>
		<updated>2018-02-27T12:12:26Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== FX ==&lt;br /&gt;
=== Wet / Dry Knopf für alles ===&lt;br /&gt;
Beispiel: Ein Effekt ohne Wet Dry Knopf soll gemäßigt abgespielt werden&lt;br /&gt;
* Effekt wählen und cmd + g -&amp;gt; Group Effekt&lt;br /&gt;
* Chain aufklappen&lt;br /&gt;
* Rechtsklick in Chain und leeren Chain erzeugen (Erzeugt ein Dry Signal)&lt;br /&gt;
Jetzt haben wir einmal ein bearbeitetes und ein trockenes Signal. Jetzt müssen wir einen Übergang schaffen und mit einem Button verknüpfen.&lt;br /&gt;
* Mit dem Chain Button die Zonen anzeigen und dort dry und wet über fast den ganzen Bereich aufziehen (Dry kurz vor dem Ende aufhören lassen und Wet kurz nach dem Anfang starten.) Dann mit dem oberen Zonen Editor Button den einen Effekt ein und den anderen ausblenden.&lt;br /&gt;
* Makroregler in der Chain einblenden, dann Map klicken und die Chain (oben die Werteanzeige klicken) auf einen Makroregler legen. Mapping beenden.&lt;br /&gt;
* Speichern wenn man es öfter benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Sudo Sidechaining Sidechain ohne Sidechain ===&lt;br /&gt;
Autopanning, ohne Seitenwechsel einstellen und Sägezahn nehmen&lt;br /&gt;
&lt;br /&gt;
=== Fatten Sound Tricks ===&lt;br /&gt;
Spur z.B. Vocals 2x duplizieren rechts / links Panorama und im Warpmodus (complex oder complex pro) leicht detunen (Custom  Chorus) . Evtl. Distortion etc. drauf.&lt;br /&gt;
&lt;br /&gt;
=== Sidechain Gating ===&lt;br /&gt;
Rhythmus Track triggert z.B. einen Vokal Track&lt;br /&gt;
* Gate auf Local Track&lt;br /&gt;
* Sidechain auf Rhythmus Track&lt;br /&gt;
&lt;br /&gt;
=== Metallic Chorus Screech ===&lt;br /&gt;
* Cleaner Bass Sound&lt;br /&gt;
* Chorus LFO *20 Feedback volle Lotte und Modulation testen&lt;br /&gt;
&lt;br /&gt;
=== Glitchy Grain Size Fills ===&lt;br /&gt;
Ein Audio Track (Beat) soll einen schönen Glitchy Fill bekommen.&lt;br /&gt;
* Clip (am besten ein einfacher Beat) auf neue Spur kopieren und im Warp Mode stretchen soweit es geht (BPM auf 999). Nicht vergessen nach dem BPM Stretch wird der Clip auch in der Timeline länger - hier auch auseinander ziehen.&lt;br /&gt;
* Warp Mode auf Tones oder Texture Mode. Hier kann man die Grain Size einstellen. Grain Size voll und Flux auf 0.&lt;br /&gt;
* Envelopes einschalten und an jedem großen Schlag in verschieden vielen Stufen einblenden, danach wieder auf 0 gehen, so dass schöne Rhythmische Figuren entstehen.&lt;br /&gt;
* Auf neue Spur aufnehmen und beim Aufnehmen mit dem Pitch Regler spielen.&lt;br /&gt;
* Das Sample auf die gewünschte Stelle ziehen und einen schönen Ausschnitt suchen.&lt;br /&gt;
&lt;br /&gt;
== Timing ==&lt;br /&gt;
=== Pitch for Length ===&lt;br /&gt;
Wenn der Warp Modus aus ist dann wirken sich Pitch Änderungen auf die Länge des Clips aus (wie bei einem Plattenspieler). Das kann man bei Drumloops für die Feinustage nutzen (wenn es auf die Tonhöhe nicht so genau ankommt)&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
=== Launchpad Remote Scripts ===&lt;br /&gt;
Super Useful:&lt;br /&gt;
&lt;br /&gt;
[[Launchpad Remote Scripts]]&lt;br /&gt;
&lt;br /&gt;
== Midi FX ==&lt;br /&gt;
=== Recording Midi FX ===&lt;br /&gt;
Möchte man Midi Effekte wie z.B. Chord Creation oder Appegiatoren in Einzelnoten auflösen, kann man einen leeren Midikanal anlegen und als Eingang den Quellkanal wählen. Dann einfach aufnehmen.&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Ableton_-_Clips_Basics&amp;diff=22866</id>
		<title>Ableton - Clips Basics</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Ableton_-_Clips_Basics&amp;diff=22866"/>
		<updated>2018-02-27T12:02:40Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „https://www.ableton.com/de/manual/launching-clips/“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://www.ableton.com/de/manual/launching-clips/&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Ableton_Live&amp;diff=22865</id>
		<title>Ableton Live</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Ableton_Live&amp;diff=22865"/>
		<updated>2018-02-27T12:02:17Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Loops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Ableton - Tipps und Tricks]]&lt;br /&gt;
 [[Max for Live]] Make interactive software&lt;br /&gt;
== Clips ==&lt;br /&gt;
[[Ableton - Clips Basics]]&lt;br /&gt;
&lt;br /&gt;
== Tastaturkürzel ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Live / Session Umschalten  ||  Tab&lt;br /&gt;
|-&lt;br /&gt;
| Geräteansicht / Clip Ansicht umschalten || Shift + Tab&lt;br /&gt;
|-&lt;br /&gt;
| Quantisieren || cmd + U&lt;br /&gt;
|-&lt;br /&gt;
| Fade automatisch erzeugen || cmd + opt +F (erzeugt aus Selektion am Anfang, Ende oder in der Mitte Fade in und outs&lt;br /&gt;
|-&lt;br /&gt;
| Cliplänge konsolidieren || cmd + j (manche Dinge wie gemeinsames Warpen braucht gleiche Längen).&lt;br /&gt;
|-&lt;br /&gt;
| Gruppen erstellen  || cmd + g (funktioniert bei Tracks, Racks und vielem mehr).&lt;br /&gt;
|-&lt;br /&gt;
| Hand Navigation || cmd + opt (wie Leertaste bei Photoshop)&lt;br /&gt;
|-&lt;br /&gt;
| Mute single Midi Notes and Clips || 0 &lt;br /&gt;
|-&lt;br /&gt;
| Editieren in Oktaven || Shift + Pfeiltasten hoch/runter -&amp;gt; Midinoten oder Pitcher rasten in Oktaven ein.&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Midi Rechnertastatur ===&lt;br /&gt;
Oben rechts Keyboard Symbol muß an sein.&lt;br /&gt;
&lt;br /&gt;
QWER...                                              schwarze Tasten&lt;br /&gt;
ASDF... weiße Tasten&lt;br /&gt;
y,x     Oktave runter / hoch&lt;br /&gt;
c,v     Anschlagdynamik stärker schwächer&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Ableton_-_Loop_Basics&amp;diff=22864</id>
		<title>Ableton - Loop Basics</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Ableton_-_Loop_Basics&amp;diff=22864"/>
		<updated>2018-02-27T12:01:40Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: Die Seite wurde neu angelegt: „Siehe Ableton - Clips Basics“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe [[Ableton - Clips Basics]]&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Ableton_Live&amp;diff=22863</id>
		<title>Ableton Live</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Ableton_Live&amp;diff=22863"/>
		<updated>2018-02-27T11:59:55Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Ableton - Tipps und Tricks]]&lt;br /&gt;
 [[Max for Live]] Make interactive software&lt;br /&gt;
== Loops ==&lt;br /&gt;
[[Ableton - Loop Basics]]&lt;br /&gt;
== Tastaturkürzel ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Live / Session Umschalten  ||  Tab&lt;br /&gt;
|-&lt;br /&gt;
| Geräteansicht / Clip Ansicht umschalten || Shift + Tab&lt;br /&gt;
|-&lt;br /&gt;
| Quantisieren || cmd + U&lt;br /&gt;
|-&lt;br /&gt;
| Fade automatisch erzeugen || cmd + opt +F (erzeugt aus Selektion am Anfang, Ende oder in der Mitte Fade in und outs&lt;br /&gt;
|-&lt;br /&gt;
| Cliplänge konsolidieren || cmd + j (manche Dinge wie gemeinsames Warpen braucht gleiche Längen).&lt;br /&gt;
|-&lt;br /&gt;
| Gruppen erstellen  || cmd + g (funktioniert bei Tracks, Racks und vielem mehr).&lt;br /&gt;
|-&lt;br /&gt;
| Hand Navigation || cmd + opt (wie Leertaste bei Photoshop)&lt;br /&gt;
|-&lt;br /&gt;
| Mute single Midi Notes and Clips || 0 &lt;br /&gt;
|-&lt;br /&gt;
| Editieren in Oktaven || Shift + Pfeiltasten hoch/runter -&amp;gt; Midinoten oder Pitcher rasten in Oktaven ein.&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Beispiel || Beispiel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Midi Rechnertastatur ===&lt;br /&gt;
Oben rechts Keyboard Symbol muß an sein.&lt;br /&gt;
&lt;br /&gt;
QWER...                                              schwarze Tasten&lt;br /&gt;
ASDF... weiße Tasten&lt;br /&gt;
y,x     Oktave runter / hoch&lt;br /&gt;
c,v     Anschlagdynamik stärker schwächer&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_Module:_MarkupSimpleNavigation&amp;diff=22862</id>
		<title>Processwire Module: MarkupSimpleNavigation</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_Module:_MarkupSimpleNavigation&amp;diff=22862"/>
		<updated>2018-02-27T08:22:13Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* Selektoren und Filter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MarkupSimpleNavigation ==&lt;br /&gt;
Bekanntestes Navigation Modul http://modules.processwire.com/modules/markup-simple-navigation/&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
nav-simpleTreeMenu.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// needs Plugin MarkupSimpleNavigation&lt;br /&gt;
// use $treeMenu = $modules-&amp;gt;get(&amp;quot;MarkupSimpleNavigation&amp;quot;);&lt;br /&gt;
// load module in _init.php or heren like...&lt;br /&gt;
$treeMenu = $modules-&amp;gt;get(&amp;quot;MarkupSimpleNavigation&amp;quot;);&lt;br /&gt;
$options = array(&lt;br /&gt;
    &amp;#039;parent_class&amp;#039; =&amp;gt; &amp;#039;parent&amp;#039;,&lt;br /&gt;
    &amp;#039;current_class&amp;#039; =&amp;gt; &amp;#039;current&amp;#039;,&lt;br /&gt;
    &amp;#039;has_children_class&amp;#039; =&amp;gt; &amp;#039;has_children&amp;#039;,&lt;br /&gt;
    &amp;#039;levels&amp;#039; =&amp;gt; true,&lt;br /&gt;
    &amp;#039;levels_prefix&amp;#039; =&amp;gt; &amp;#039;level-&amp;#039;,&lt;br /&gt;
    &amp;#039;max_levels&amp;#039; =&amp;gt; null,&lt;br /&gt;
    &amp;#039;firstlast&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;collapsed&amp;#039; =&amp;gt; true,&lt;br /&gt;
    &amp;#039;show_root&amp;#039; =&amp;gt; true,&lt;br /&gt;
    &amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;selector_field&amp;#039; =&amp;gt; &amp;#039;nav_selector&amp;#039;,&lt;br /&gt;
    &amp;#039;outer_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul class=&amp;quot;sf-menu&amp;quot;&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;inner_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;list_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;li%s&amp;gt;||&amp;lt;/li&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;list_field_class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;xitem_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;xitem_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;date_format&amp;#039; =&amp;gt; &amp;#039;d.m.Y&amp;#039;,&lt;br /&gt;
    &amp;#039;code_formatting&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;debug&amp;#039; =&amp;gt; false&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- navbar 1st level--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;nav&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
echo $treeMenu-&amp;gt;render($options);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
  &amp;lt;/nav&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur einen Level rendern ==&lt;br /&gt;
Top root menu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// default root is &amp;quot;/&amp;quot;&lt;br /&gt;
echo $treeMenu-&amp;gt;render(array(&amp;quot;max_levels&amp;quot; =&amp;gt; 1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Submenu &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$root = $page-&amp;gt;rootParent; // top root parent of current page&lt;br /&gt;
echo $treeMenu-&amp;gt;render(array(&amp;quot;max_levels&amp;quot; =&amp;gt; 1), null, $root);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionen und Anwendung ==&lt;br /&gt;
 render($options, $page, $rootPage)&lt;br /&gt;
* $options, is an array of options&lt;br /&gt;
* $page, is a page object for the current page&lt;br /&gt;
* $rootPage, is a page object for the root of the menu&lt;br /&gt;
&lt;br /&gt;
=== Default options ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$options = array(&lt;br /&gt;
    &amp;#039;parent_class&amp;#039; =&amp;gt; &amp;#039;parent&amp;#039;,&lt;br /&gt;
    &amp;#039;current_class&amp;#039; =&amp;gt; &amp;#039;current&amp;#039;,&lt;br /&gt;
    &amp;#039;has_children_class&amp;#039; =&amp;gt; &amp;#039;has_children&amp;#039;,&lt;br /&gt;
    &amp;#039;levels&amp;#039; =&amp;gt; true,&lt;br /&gt;
    &amp;#039;levels_prefix&amp;#039; =&amp;gt; &amp;#039;level-&amp;#039;,&lt;br /&gt;
    &amp;#039;max_levels&amp;#039; =&amp;gt; null,&lt;br /&gt;
    &amp;#039;firstlast&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;collapsed&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;show_root&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;selector_field&amp;#039; =&amp;gt; &amp;#039;nav_selector&amp;#039;,&lt;br /&gt;
    &amp;#039;outer_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;inner_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;list_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;li%s&amp;gt;||&amp;lt;/li&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;list_field_class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;xitem_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;xitem_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;date_format&amp;#039; =&amp;gt; &amp;#039;Y/m/d&amp;#039;,&lt;br /&gt;
    &amp;#039;code_formatting&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;debug&amp;#039; =&amp;gt; false&lt;br /&gt;
);&lt;br /&gt;
echo $treeMenu-&amp;gt;render($options);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Same with comments&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$options = array(&lt;br /&gt;
    &amp;#039;parent_class&amp;#039; =&amp;gt; &amp;#039;parent&amp;#039;,&lt;br /&gt;
    // overwrite class name for current parent levels&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;current_class&amp;#039; =&amp;gt; &amp;#039;current&amp;#039;,&lt;br /&gt;
    // overwrite current class&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;has_children_class&amp;#039; =&amp;gt; &amp;#039;has_children&amp;#039;,&lt;br /&gt;
    // overwrite class name for entries with children&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;levels&amp;#039; =&amp;gt; true,&lt;br /&gt;
    // wether to output &amp;quot;level-1, level-2, ...&amp;quot; as css class in links&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;levels_prefix&amp;#039; =&amp;gt; &amp;#039;level-&amp;#039;,&lt;br /&gt;
    // prefix string that will be used for level class&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;max_levels&amp;#039; =&amp;gt; null,&lt;br /&gt;
    // set the max level rendered&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;firstlast&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // puts last,first class to link items&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;collapsed&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // if you want to auto-collapse the tree you set this to true&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;show_root&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // set this to true if you want to rootPage to get prepended to the menu&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    // define custom PW selector, you may sanitize values from user input&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;selector_field&amp;#039; =&amp;gt; &amp;#039;nav_selector&amp;#039;,&lt;br /&gt;
    // string (default &amp;#039;nav_selector&amp;#039;) define custom PW selector by using a property or field on a page. Use this setting if you want to overwrite the default nav_selector&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;outer_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for the outer most wrapper. || will contain entries&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;inner_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for inner wrappers. || will contain entries&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;list_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;li%s&amp;gt;||&amp;lt;/li&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for the items. || will contain entries, %s will replaced with class=&amp;quot;...&amp;quot; string&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;list_field_class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // string (default &amp;#039;&amp;#039;) add custom classes to each list_tpl using tags like {field} i.e. {template} p_{id}&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for the inner items. Use {anyfield} and {url}, i.e. {headline|title}, if field is of type image it will return url to image (first image if multiple)&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;item_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for the active inner items.&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    // specify one or more templates separated with a pipe | to use the xitem_tpl and xitem_current_tpl markup&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;xitem_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    // same as &amp;#039;item_tpl&amp;#039; but for xtemplates pages, can be used to define placeholders&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;xitem_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    // same as &amp;#039;item_current_tpl&amp;#039; but for xtemplates pages&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;date_format&amp;#039; =&amp;gt; &amp;#039;Y/m/d&amp;#039;,&lt;br /&gt;
    // default date formatting for Datetime fields and native created/modified&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;code_formatting&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // enable or disable code indentations and newslines in markup output&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;debug&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // show some inline information about rendertime and selectors used as html comments&lt;br /&gt;
&lt;br /&gt;
);&lt;br /&gt;
echo $treeMenu-&amp;gt;render($options);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== More Examples ==&lt;br /&gt;
=== Aktive Seite oder Root Seite überschreiben ===&lt;br /&gt;
&lt;br /&gt;
If you want to overwrite starting point for the root page to be another page you could do it like this:&lt;br /&gt;
&lt;br /&gt;
 $rootPage = $pages-&amp;gt;get(&amp;quot;/en/&amp;quot;); // or any other page that has subpages&lt;br /&gt;
 echo $treeMenu-&amp;gt;render(null, null, $rootPage); // null at first is to not have to specify options, just use default&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Or to even overwrite the current active page&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 $currentPage = $pages-&amp;gt;get(1242);&lt;br /&gt;
 $rootPage = $pages-&amp;gt;get(&amp;quot;/en/&amp;quot;);&lt;br /&gt;
 echo $treeMenu-&amp;gt;render(null, $currentPage, $rootPage);&lt;br /&gt;
&lt;br /&gt;
=== Menü aus definierten Seiten ===&lt;br /&gt;
Dazu übergibt man ein PageArray statt einer einzelnen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Build a menu using a PageArray instead of a single root page&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Define a PageArray as the root page argument. Instead of a root it will take the PageArray as the first level entries. This can be used to &amp;#039;&amp;#039;&amp;#039;build a menu from a page select field for example&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Assuming you have a page field &amp;quot;navigation_entries&amp;quot; on your home root page:&lt;br /&gt;
 $entries = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;navigation_entries;&lt;br /&gt;
 echo $treeMenu-&amp;gt;render(null, null, $entries);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Variable in der Navigation ===&lt;br /&gt;
Z.B. Feldnamen&lt;br /&gt;
 &amp;#039;inner_tpl&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul id=&amp;#039;{name}&amp;#039; class=&amp;#039;drop-down&amp;#039;&amp;gt;||&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== Selektoren und Filter ===&lt;br /&gt;
Man kann die Menüpunkte z.B. anhand von einem Backend-Feld oder Templates Filtern. Man kann sogar für einzelne Level Filter vergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$pages-&amp;gt;get(1001)-&amp;gt;my_selector = &amp;quot;template=projects&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$options = array(&lt;br /&gt;
  &amp;quot;selector_level1&amp;quot; =&amp;gt; &amp;quot;template=ressort&amp;quot;,&lt;br /&gt;
  &amp;quot;selector_level2&amp;quot; =&amp;gt; &amp;quot;start=0, limit=10&amp;quot;,&lt;br /&gt;
  &amp;quot;selector_level3&amp;quot; =&amp;gt; &amp;quot;template=news|events, sort=-created&amp;quot;,&lt;br /&gt;
  &amp;quot;selector_field&amp;quot; =&amp;gt; &amp;quot;my_selector&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
echo $nav-&amp;gt;render($options);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel - Menüauswahl ====&lt;br /&gt;
Todo Funktionalität genauer checken&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$treeMenu = $modules-&amp;gt;get(&amp;quot;MarkupSimpleNavigation&amp;quot;); // load the module&lt;br /&gt;
$homepage-&amp;gt;my_selector = &amp;quot;menus.id=1&amp;quot;;&lt;br /&gt;
$options = array(&lt;br /&gt;
//...&lt;br /&gt;
		&amp;#039;max_levels&amp;#039; =&amp;gt; 3,&lt;br /&gt;
		&amp;#039;show_root&amp;#039; =&amp;gt; true,&lt;br /&gt;
		&amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
		&amp;#039;selector_field&amp;#039; =&amp;gt; &amp;#039;my_selector&amp;#039;,&lt;br /&gt;
		&amp;#039;selector_level2&amp;#039; =&amp;gt; &amp;#039;menus.id=1&amp;#039;,&lt;br /&gt;
		&amp;#039;selector_level3&amp;#039; =&amp;gt; &amp;#039;menus.id=1&amp;#039;,&lt;br /&gt;
		&amp;#039;selector_level4&amp;#039; =&amp;gt; &amp;#039;menus.id=1&amp;#039;&lt;br /&gt;
&lt;br /&gt;
);&lt;br /&gt;
$menu = $treeMenu-&amp;gt;render($options);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_Module:_MarkupSimpleNavigation&amp;diff=22861</id>
		<title>Processwire Module: MarkupSimpleNavigation</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_Module:_MarkupSimpleNavigation&amp;diff=22861"/>
		<updated>2018-02-26T18:46:14Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: /* More Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MarkupSimpleNavigation ==&lt;br /&gt;
Bekanntestes Navigation Modul http://modules.processwire.com/modules/markup-simple-navigation/&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
nav-simpleTreeMenu.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// needs Plugin MarkupSimpleNavigation&lt;br /&gt;
// use $treeMenu = $modules-&amp;gt;get(&amp;quot;MarkupSimpleNavigation&amp;quot;);&lt;br /&gt;
// load module in _init.php or heren like...&lt;br /&gt;
$treeMenu = $modules-&amp;gt;get(&amp;quot;MarkupSimpleNavigation&amp;quot;);&lt;br /&gt;
$options = array(&lt;br /&gt;
    &amp;#039;parent_class&amp;#039; =&amp;gt; &amp;#039;parent&amp;#039;,&lt;br /&gt;
    &amp;#039;current_class&amp;#039; =&amp;gt; &amp;#039;current&amp;#039;,&lt;br /&gt;
    &amp;#039;has_children_class&amp;#039; =&amp;gt; &amp;#039;has_children&amp;#039;,&lt;br /&gt;
    &amp;#039;levels&amp;#039; =&amp;gt; true,&lt;br /&gt;
    &amp;#039;levels_prefix&amp;#039; =&amp;gt; &amp;#039;level-&amp;#039;,&lt;br /&gt;
    &amp;#039;max_levels&amp;#039; =&amp;gt; null,&lt;br /&gt;
    &amp;#039;firstlast&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;collapsed&amp;#039; =&amp;gt; true,&lt;br /&gt;
    &amp;#039;show_root&amp;#039; =&amp;gt; true,&lt;br /&gt;
    &amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;selector_field&amp;#039; =&amp;gt; &amp;#039;nav_selector&amp;#039;,&lt;br /&gt;
    &amp;#039;outer_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul class=&amp;quot;sf-menu&amp;quot;&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;inner_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;list_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;li%s&amp;gt;||&amp;lt;/li&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;list_field_class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;xitem_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;xitem_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;date_format&amp;#039; =&amp;gt; &amp;#039;d.m.Y&amp;#039;,&lt;br /&gt;
    &amp;#039;code_formatting&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;debug&amp;#039; =&amp;gt; false&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- navbar 1st level--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;nav&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
echo $treeMenu-&amp;gt;render($options);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
  &amp;lt;/nav&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur einen Level rendern ==&lt;br /&gt;
Top root menu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// default root is &amp;quot;/&amp;quot;&lt;br /&gt;
echo $treeMenu-&amp;gt;render(array(&amp;quot;max_levels&amp;quot; =&amp;gt; 1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Submenu &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$root = $page-&amp;gt;rootParent; // top root parent of current page&lt;br /&gt;
echo $treeMenu-&amp;gt;render(array(&amp;quot;max_levels&amp;quot; =&amp;gt; 1), null, $root);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionen und Anwendung ==&lt;br /&gt;
 render($options, $page, $rootPage)&lt;br /&gt;
* $options, is an array of options&lt;br /&gt;
* $page, is a page object for the current page&lt;br /&gt;
* $rootPage, is a page object for the root of the menu&lt;br /&gt;
&lt;br /&gt;
=== Default options ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$options = array(&lt;br /&gt;
    &amp;#039;parent_class&amp;#039; =&amp;gt; &amp;#039;parent&amp;#039;,&lt;br /&gt;
    &amp;#039;current_class&amp;#039; =&amp;gt; &amp;#039;current&amp;#039;,&lt;br /&gt;
    &amp;#039;has_children_class&amp;#039; =&amp;gt; &amp;#039;has_children&amp;#039;,&lt;br /&gt;
    &amp;#039;levels&amp;#039; =&amp;gt; true,&lt;br /&gt;
    &amp;#039;levels_prefix&amp;#039; =&amp;gt; &amp;#039;level-&amp;#039;,&lt;br /&gt;
    &amp;#039;max_levels&amp;#039; =&amp;gt; null,&lt;br /&gt;
    &amp;#039;firstlast&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;collapsed&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;show_root&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;selector_field&amp;#039; =&amp;gt; &amp;#039;nav_selector&amp;#039;,&lt;br /&gt;
    &amp;#039;outer_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;inner_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;list_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;li%s&amp;gt;||&amp;lt;/li&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;list_field_class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;xitem_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;xitem_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    &amp;#039;date_format&amp;#039; =&amp;gt; &amp;#039;Y/m/d&amp;#039;,&lt;br /&gt;
    &amp;#039;code_formatting&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;debug&amp;#039; =&amp;gt; false&lt;br /&gt;
);&lt;br /&gt;
echo $treeMenu-&amp;gt;render($options);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Same with comments&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$options = array(&lt;br /&gt;
    &amp;#039;parent_class&amp;#039; =&amp;gt; &amp;#039;parent&amp;#039;,&lt;br /&gt;
    // overwrite class name for current parent levels&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;current_class&amp;#039; =&amp;gt; &amp;#039;current&amp;#039;,&lt;br /&gt;
    // overwrite current class&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;has_children_class&amp;#039; =&amp;gt; &amp;#039;has_children&amp;#039;,&lt;br /&gt;
    // overwrite class name for entries with children&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;levels&amp;#039; =&amp;gt; true,&lt;br /&gt;
    // wether to output &amp;quot;level-1, level-2, ...&amp;quot; as css class in links&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;levels_prefix&amp;#039; =&amp;gt; &amp;#039;level-&amp;#039;,&lt;br /&gt;
    // prefix string that will be used for level class&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;max_levels&amp;#039; =&amp;gt; null,&lt;br /&gt;
    // set the max level rendered&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;firstlast&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // puts last,first class to link items&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;collapsed&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // if you want to auto-collapse the tree you set this to true&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;show_root&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // set this to true if you want to rootPage to get prepended to the menu&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    // define custom PW selector, you may sanitize values from user input&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;selector_field&amp;#039; =&amp;gt; &amp;#039;nav_selector&amp;#039;,&lt;br /&gt;
    // string (default &amp;#039;nav_selector&amp;#039;) define custom PW selector by using a property or field on a page. Use this setting if you want to overwrite the default nav_selector&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;outer_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for the outer most wrapper. || will contain entries&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;inner_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;||&amp;lt;/ul&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for inner wrappers. || will contain entries&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;list_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;li%s&amp;gt;||&amp;lt;/li&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for the items. || will contain entries, %s will replaced with class=&amp;quot;...&amp;quot; string&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;list_field_class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // string (default &amp;#039;&amp;#039;) add custom classes to each list_tpl using tags like {field} i.e. {template} p_{id}&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for the inner items. Use {anyfield} and {url}, i.e. {headline|title}, if field is of type image it will return url to image (first image if multiple)&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;item_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    // template string for the active inner items.&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    // specify one or more templates separated with a pipe | to use the xitem_tpl and xitem_current_tpl markup&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;xitem_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
    // same as &amp;#039;item_tpl&amp;#039; but for xtemplates pages, can be used to define placeholders&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;xitem_current_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    // same as &amp;#039;item_current_tpl&amp;#039; but for xtemplates pages&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;date_format&amp;#039; =&amp;gt; &amp;#039;Y/m/d&amp;#039;,&lt;br /&gt;
    // default date formatting for Datetime fields and native created/modified&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;code_formatting&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // enable or disable code indentations and newslines in markup output&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;debug&amp;#039; =&amp;gt; false,&lt;br /&gt;
    // show some inline information about rendertime and selectors used as html comments&lt;br /&gt;
&lt;br /&gt;
);&lt;br /&gt;
echo $treeMenu-&amp;gt;render($options);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== More Examples ==&lt;br /&gt;
=== Aktive Seite oder Root Seite überschreiben ===&lt;br /&gt;
&lt;br /&gt;
If you want to overwrite starting point for the root page to be another page you could do it like this:&lt;br /&gt;
&lt;br /&gt;
 $rootPage = $pages-&amp;gt;get(&amp;quot;/en/&amp;quot;); // or any other page that has subpages&lt;br /&gt;
 echo $treeMenu-&amp;gt;render(null, null, $rootPage); // null at first is to not have to specify options, just use default&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Or to even overwrite the current active page&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 $currentPage = $pages-&amp;gt;get(1242);&lt;br /&gt;
 $rootPage = $pages-&amp;gt;get(&amp;quot;/en/&amp;quot;);&lt;br /&gt;
 echo $treeMenu-&amp;gt;render(null, $currentPage, $rootPage);&lt;br /&gt;
&lt;br /&gt;
=== Menü aus definierten Seiten ===&lt;br /&gt;
Dazu übergibt man ein PageArray statt einer einzelnen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Build a menu using a PageArray instead of a single root page&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Define a PageArray as the root page argument. Instead of a root it will take the PageArray as the first level entries. This can be used to &amp;#039;&amp;#039;&amp;#039;build a menu from a page select field for example&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Assuming you have a page field &amp;quot;navigation_entries&amp;quot; on your home root page:&lt;br /&gt;
 $entries = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;navigation_entries;&lt;br /&gt;
 echo $treeMenu-&amp;gt;render(null, null, $entries);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Variable in der Navigation ===&lt;br /&gt;
Z.B. Feldnamen&lt;br /&gt;
 &amp;#039;inner_tpl&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul id=&amp;#039;{name}&amp;#039; class=&amp;#039;drop-down&amp;#039;&amp;gt;||&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== Selektoren und Filter ===&lt;br /&gt;
Man kann die Menüpunkte z.B. anhand von einem Backend-Feld oder Templates Filtern. Man kann sogar für einzelne Level Filter vergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$pages-&amp;gt;get(1001)-&amp;gt;my_selector = &amp;quot;template=projects&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$options = array(&lt;br /&gt;
  &amp;quot;selector_level1&amp;quot; =&amp;gt; &amp;quot;template=ressort&amp;quot;,&lt;br /&gt;
  &amp;quot;selector_level2&amp;quot; =&amp;gt; &amp;quot;start=0, limit=10&amp;quot;,&lt;br /&gt;
  &amp;quot;selector_level3&amp;quot; =&amp;gt; &amp;quot;template=news|events, sort=-created&amp;quot;,&lt;br /&gt;
  &amp;quot;selector_field&amp;quot; =&amp;gt; &amp;quot;my_selector&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
echo $nav-&amp;gt;render($options);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=22860</id>
		<title>ProcessWire - Navigation Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=22860"/>
		<updated>2018-02-26T18:23:36Z</updated>

		<summary type="html">&lt;p&gt;149.172.225.28: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TODO Seite aufräumen ==&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[Processwire Module: MarkupSimpleNavigation]]&lt;br /&gt;
&lt;br /&gt;
== Navigation in Pagewire - Einführung ==&lt;br /&gt;
=== Navigationstypen allgemein ===&lt;br /&gt;
Es gibt verschiedene &amp;#039;&amp;#039;&amp;#039;Typen von Navigationen&amp;#039;&amp;#039;&amp;#039;. In Processwire hat man ein &amp;#039;&amp;#039;&amp;#039;Pages Objekt&amp;#039;&amp;#039;&amp;#039;, indem auch Zugriff auf Kind- und Elternseiten möglich sind. Es bildet also immer die Sitestruktur ab. Daher übergibt man an die unten aufgeführten Funktionen entweder die Homepage oder die aktuelle Seite.&lt;br /&gt;
&lt;br /&gt;
Unter dem Aspekt auf welcher Seite man sich befindet kann man unterscheiden zwischen:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;absolute Navigation&amp;#039;&amp;#039;&amp;#039; normalerweise ausgehend von der Rootseite. diese ist dann auf allen Seiten gleich.&lt;br /&gt;
** z.B. alle Seiten des ersten Levels stehen in der Hauptnavigation egal auf welcher Seite ich im Moment bin&lt;br /&gt;
** z.B. verschachtelte Liste mit 2 oder mehr Leveln für Dropdown Navigationen wie Superfish, Megamenüs (mit zusätzlichen Infos...) oder Bootstrap Navigationen.&lt;br /&gt;
** Sitemap&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Navigation relativ zur Seite&amp;#039;&amp;#039;&amp;#039; Diese kann sich von Seite zu Seite unterscheiden.&lt;br /&gt;
** Alle &amp;#039;&amp;#039;&amp;#039;Seiten der aktuellen Ebene&amp;#039;&amp;#039;&amp;#039; (oft kombiniert mit Breadcrumb / Hier-bin-ich) ) &lt;br /&gt;
** Hauptebene &amp;#039;&amp;#039;&amp;#039;und&amp;#039;&amp;#039;&amp;#039; aktueller Level&lt;br /&gt;
** Alle Ebenen &amp;#039;&amp;#039;&amp;#039;bis zur aktuellen Seite + deren Unterseiten&amp;#039;&amp;#039;&amp;#039; falls vorhanden. &lt;br /&gt;
In letzten Fall könnte man auch Varianten bauen in denen eine Verschachtelte Liste erzeugt wird aber nur bestimmte Teile absolut Positioniert angezeigt werden und andere versteckt werden. Manchmal möchte man bestimmte Level aber auch an anderer Position zeigen (z.B. Sidebar)&lt;br /&gt;
In der Praxis hat man in der Regel&lt;br /&gt;
* Mindestens eine Hauptnavigation mit allen Seiten der 1. Ebene oder eine Hauptnavigation mit mehreren Ebenen für Dropdown Navigationen, mobile Navigation oder auch Sitemapartige Navigationen für den Footer (oft mit kleinen Beschreibungen).&lt;br /&gt;
* Eine Metanavigation mit Service Seiten wie Kontakt, Impressum etc. oft ist diese im Footer.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede zwischen Verstecken, Veröffentlichen, Sperren ===&lt;br /&gt;
In Processwire sind diese Begriffe mit Userrechten verknüpft. Eine unveröffentlichte Seite kann also durchaus im Frontend aufgerufen werden (es sei denn man regelt das anders.) Vielmehr geht es darum das man User Rollen so gestalten kann, dass man z.B. einem User nur erlaubt unveröffentlichte Seiten zu editieren.&lt;br /&gt;
&lt;br /&gt;
Denoch gibt es auch ein paar weitere Unterschiede.&lt;br /&gt;
&lt;br /&gt;
Gesperrt -&amp;gt; Man kann die Seite nicht zum Editieren aufrufen. Über die Url kann Sie aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Unpublished -&amp;gt; Die Seite kann sobald sie gespeichert ist auch aufgerufen werden, WENN der User berechtigt ist. Nicht für Guest User (der normale Viewer)&lt;br /&gt;
&lt;br /&gt;
TODO checken ob die Tabelle so für nicht angemeldete User stimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Im Menü ($pages-&amp;gt;find) !! Über URL ($pages-&amp;gt;get)&lt;br /&gt;
|-&lt;br /&gt;
| Unpublished / Unveröffentlicht || Nein || Nur User mit passenden Rechten &lt;br /&gt;
|-&lt;br /&gt;
| Hidden / Versteckt || Nein || Ja &lt;br /&gt;
|-&lt;br /&gt;
| Locked / Gesperrt || Ja || Ja  &lt;br /&gt;
|-&lt;br /&gt;
| Trash || Nein || Nein &lt;br /&gt;
|}&lt;br /&gt;
==== Seiten auf unveröffentlicht stellen ====&lt;br /&gt;
https://processwire.com/talk/topic/29-how-to-unpublish-a-page-without-deleting-it/&lt;br /&gt;
&lt;br /&gt;
Was soll man tun wenn man eine Seite tatsächlich nicht mehr anzeigen will, sie aber noch nicht wegwerfen will?&lt;br /&gt;
Ryan schlägt folgendes vor:&lt;br /&gt;
* Mülleimer&lt;br /&gt;
* Remove Guest Role&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
&lt;br /&gt;
=== Page Level ===&lt;br /&gt;
In which level in page tree we are?&lt;br /&gt;
 $level = count($page-&amp;gt;parents);&lt;br /&gt;
&lt;br /&gt;
=== Link to Subpage und Platzhalter (Spacer) ===&lt;br /&gt;
Kann man gut für Superfish Menüs etc. benutzen. Bildet das Verhalten von Shortcuts und Spacern aus TYPO3 nach.&lt;br /&gt;
&lt;br /&gt;
Anpassung der renderNavTree() Funktion von Ryan Cramer. Options Field Installieren und als globales Feld &amp;quot;navigation_type&amp;quot; mit den Optionen &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=normal|Normal&lt;br /&gt;
2=doNotLink|Do not link&lt;br /&gt;
3=linkToFirstChild|Link to first childpage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
konfigurieren. Dann Funktion etwa so anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect (301) ===&lt;br /&gt;
==== Redirect zu erster Unterseite ====&lt;br /&gt;
https://processwire.com/talk/topic/15-how-do-i-create-a-page-that-redirects-to-its-first-child/&lt;br /&gt;
&lt;br /&gt;
Field &amp;#039;&amp;#039;redirects_to_first_child&amp;#039;&amp;#039; erstellen und im Template einfügen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;redirects_to_first_child) &lt;br /&gt;
  $session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url); &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erzeugt 301 Weiterleitung&lt;br /&gt;
&lt;br /&gt;
Anderer Ansatz wäre evtl. den Link bei der Menügenerierung direkt zu generieren. finde ich persönlich besser siehe &amp;#039;&amp;#039;Link to subpage und Platzhalter&amp;#039;&amp;#039; Beispiel. Allerdings sollte man dann vielleicht die Seite trotzdem per 301 Weiterleiten, falls die URL mal direkt aufgerufen wird oder bei Google gelistet ist.&lt;br /&gt;
&lt;br /&gt;
==== Redirect zu anderer Seite in der Navigation ====&lt;br /&gt;
https://processwire.com/talk/topic/762-howto-menu-item-that-links-to-another-page/&lt;br /&gt;
&lt;br /&gt;
1. Create a new field and call it &amp;#039;redirect_url&amp;#039; or something like that, and use the &amp;#039;URL&amp;#039; fieldtype. &lt;br /&gt;
&lt;br /&gt;
2. Add that field to your template where you&amp;#039;d want to use it, or create a new template just for the purpose, like a template named &amp;#039;redirect&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. Edit the page that you want to be a symlink and populate the &amp;#039;redirect_url&amp;#039; field with the URL you want it to redirect to.&lt;br /&gt;
&lt;br /&gt;
4. In your nav-generation code that links to the pages, do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$url = $subpage-&amp;gt;get(&amp;quot;redirect_url|url&amp;quot;); // use redirect_url if there, otherwise use url&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$url&amp;#039;&amp;gt;{$subpage-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. You might also want to add this to your template that has the &amp;#039;redirect_url&amp;#039; field: just in case there&amp;#039;s anything linking to it directly. That way it&amp;#039;ll send people to the right place either way:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if($page-&amp;gt;redirect_url) $session-&amp;gt;redirect($page-&amp;gt;redirect_url); &lt;br /&gt;
&lt;br /&gt;
=== Breadcrumb ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- breadcrumbs --&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;breadcrumbs&amp;#039;&amp;gt;&amp;lt;?php &lt;br /&gt;
		// breadcrumbs are the current page&amp;#039;s parents&lt;br /&gt;
		foreach($page-&amp;gt;parents() as $item) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;span&amp;gt;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
		}&lt;br /&gt;
		// optionally output the current page as the last item&lt;br /&gt;
		echo &amp;quot;&amp;lt;span&amp;gt;$page-&amp;gt;title&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
	?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Level Navigation Bar ===&lt;br /&gt;
[[ProcessWire - One Level Navigation]]&lt;br /&gt;
=== Nächste Seite / Next Page Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zurück zur Elternseite ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;back&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent()-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;zurück&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kindseiten mit $page-&amp;gt;children ===&lt;br /&gt;
 &amp;lt;?=$page-&amp;gt;children?&amp;gt;&lt;br /&gt;
Output&lt;br /&gt;
 5723,4958,5937&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($page-&amp;gt;children as $child)&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$child-&amp;gt;url}&amp;#039;&amp;gt;{$child-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/contact/&amp;#039;&amp;gt;Contact Us&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/press/&amp;#039;&amp;gt;Press Releases&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/staff/&amp;#039;&amp;gt;Our Staff&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Children Tree ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function listChildrenTree($children, $current, $w) {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($children as $page) {&lt;br /&gt;
&lt;br /&gt;
	$class = &amp;#039;&amp;#039;;&lt;br /&gt;
	if($page === $current || $current-&amp;gt;parents-&amp;gt;slice(1)-&amp;gt;has($page) ) {&lt;br /&gt;
		$class = &amp;quot;class=&amp;#039;on&amp;#039; style=&amp;#039;font-weight:bold&amp;#039;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$rootid = $w-&amp;gt;pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;id;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$page-&amp;gt;url}&amp;#039; $class&amp;gt;&amp;quot;;&lt;br /&gt;
	if($page-&amp;gt;id == $rootid) echo &amp;quot;&amp;lt;img src=&amp;#039;&amp;quot; . $w-&amp;gt;config-&amp;gt;urls-&amp;gt;templates . &amp;quot;styles/images/home.png&amp;#039; width=&amp;#039;24&amp;#039; height=&amp;#039;28&amp;#039; alt=&amp;#039;&amp;#039; /&amp;gt;&amp;quot;;&lt;br /&gt;
	echo &amp;quot;{$page-&amp;gt;title}&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;id != $rootid) listChildrenTree($page-&amp;gt;children, $current, $w);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$children = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;children();&lt;br /&gt;
$children-&amp;gt;prepend($pages-&amp;gt;get(&amp;quot;/&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
listChildrenTree($children, $page, $wire);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bootstrap Navigation ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// Markup to use wicht navigation_type field (normal=1, no-link=2,subpage=3)&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// bundle up the first level pages and prepend the root home page&lt;br /&gt;
$homepage = $pages-&amp;gt;get(1);&lt;br /&gt;
$pa = $homepage-&amp;gt;children;&lt;br /&gt;
$pa = $pa-&amp;gt;prepend($homepage);&lt;br /&gt;
&lt;br /&gt;
// Set the ball rolling...&lt;br /&gt;
$myMenu = renderChildrenOf($pa);&lt;br /&gt;
$wrapper = &amp;#039;&lt;br /&gt;
&amp;lt;nav class=&amp;quot;navbar navbar-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;navbar-header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;navbar-toggle collapsed&amp;quot; data-toggle=&amp;quot;collapse&amp;quot; data-target=&amp;quot;#navbar-collapse-1&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Menü&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;collapse navbar-collapse&amp;quot; id=&amp;quot;navbar-collapse-1&amp;quot;&amp;gt;&lt;br /&gt;
      |&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
$myMenu = wrap($myMenu,$wrapper);&lt;br /&gt;
echo $myMenu;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Navigation for ProcessWire using the Bootstrap 2.2.2 markup&lt;br /&gt;
This menu was written by Soma based on work by NetCarver and a bit thrown in by Joss&lt;br /&gt;
Bootstrap 3 update by Damienov, with multi level dropdown support fix&lt;br /&gt;
*/&lt;br /&gt;
function renderChildrenOf($pa, $output = &amp;#039;&amp;#039;, $level = 0)&lt;br /&gt;
{&lt;br /&gt;
    $output = &amp;#039;&amp;#039;;&lt;br /&gt;
    $level++;&lt;br /&gt;
&lt;br /&gt;
    foreach ($pa as $child) {&lt;br /&gt;
        $atoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot; data-toggle=&amp;quot;dropdown&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1 ) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-submenu&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Makes the current page and it&amp;#039;s top level parent add an active class&lt;br /&gt;
        $class .= ($child === wire(&amp;quot;page&amp;quot;) || $child === wire(&amp;quot;page&amp;quot;)-&amp;gt;rootParent) ? &amp;quot; active&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = strlen($class) ? &amp;quot; class=&amp;#039;&amp;quot; . trim($class) . &amp;quot;&amp;#039;&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            // Add Caret if have children&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title &amp;lt;b class=&amp;#039;caret&amp;#039;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1) {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a tabindex=&amp;#039;-1&amp;#039; href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If this child is itself a parent and not the root page, then render it&amp;#039;s children in their own menu too...&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $output .= renderChildrenOf($child-&amp;gt;children, $output, $level);&lt;br /&gt;
        }&lt;br /&gt;
        $output .= &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    $outerclass = ($level == 1) ? &amp;quot;nav navbar-nav&amp;quot; : &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
    return &amp;quot;&amp;lt;ul class=&amp;#039;$outerclass&amp;#039;&amp;gt;$output&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modul: MarkupSimpleNavigation==&lt;br /&gt;
[[Processwire Modul - MarkupSimpleNavigation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Menübeispiele ==&lt;br /&gt;
=== Standard Tree Navigation ===&lt;br /&gt;
Für viele Zwecke ausreichend und leicht anpassbar, die klassische verschachtelte Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Menüauswahl Hauptmenü / Metamenü / Footer-Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
Backend Feld menus anlegen Options: &lt;br /&gt;
&lt;br /&gt;
 1=Main Menu&lt;br /&gt;
 2=Meta Menu &lt;br /&gt;
&lt;br /&gt;
topnav.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pa = $homepage-&amp;gt;and($homepage-&amp;gt;children(&amp;quot;menus.id=1&amp;quot;));//only if main menu is checked&lt;br /&gt;
$options = array(&amp;#039;level&amp;#039; =&amp;gt; &amp;#039;1&amp;#039;, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;sf-menu&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;);&lt;br /&gt;
echo &amp;quot;&amp;lt;div&amp;gt;&amp;quot;.renderNavTreeType($pa, $maxDepth = 1, $fieldNames = &amp;#039;&amp;#039;, $options).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2 (älter)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Checkbox anlegen (footer_nav), und dann das Seitenarray etwa so modifizieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$footer_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox=1&amp;quot;);&lt;br /&gt;
$main_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox!=1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zweispaltige Navigation aus Kindseiten ===&lt;br /&gt;
Verbesserungsvorschlag: Anstatt if lieber zwei for Schleifen -&amp;gt; bessere Performance&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Childrens&lt;br /&gt;
$n = count($page-&amp;gt;children);&lt;br /&gt;
$m = ceil($n/2);&lt;br /&gt;
$c = 0;&lt;br /&gt;
&lt;br /&gt;
// NAVIGATION &amp;amp; SLIDER Items&lt;br /&gt;
$listItem = &amp;#039;&amp;#039;;&lt;br /&gt;
$navList = &amp;#039;&amp;#039;;&lt;br /&gt;
$col1 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col1&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$col2 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col2&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($page-&amp;gt;children as $item) {&lt;br /&gt;
	if($item-&amp;gt;id == $page-&amp;gt;rootParent-&amp;gt;id) {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$listItem .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	($c &amp;lt; $m) ? $col1 .= $listItem : $col2 .= $listItem;&lt;br /&gt;
	$c++;&lt;br /&gt;
}&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$navList = $col1.$col2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pushy Menu ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 * Assumes there is a field navigation_type to decide how a list item is&lt;br /&gt;
 * rendered&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param array $options extra options for classes configuration etc.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderPushyMenu($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    //if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) {&lt;br /&gt;
      // BUTTON instead of Link&lt;br /&gt;
      $out .= &amp;#039;&amp;lt;li class=&amp;quot;pushy-submenu&amp;quot;&amp;gt;&amp;lt;button&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
		}else{&lt;br /&gt;
      $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
  		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
      unset($classes);&lt;br /&gt;
&lt;br /&gt;
  		// A ITEM&lt;br /&gt;
  		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
  		$classes = $liClasses;&lt;br /&gt;
  		switch ( $navigation_type ) {&lt;br /&gt;
  			case 2: // do not link&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  			case 3: // link to subpage&lt;br /&gt;
  				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
  					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				}else{&lt;br /&gt;
  					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
  				}&lt;br /&gt;
  				break;&lt;br /&gt;
  			default:&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  		}&lt;br /&gt;
  		unset($classes);&lt;br /&gt;
		}&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Do not link / link to subpage ==&lt;br /&gt;
Zusätzliches Feld (Options) im Backend mit Namen navigation_type&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 * If there is a field navigation_type the vals have following meaning&lt;br /&gt;
 * 1 = Normal&lt;br /&gt;
 * 2 = Do not link&lt;br /&gt;
 * 3 = Link to subpage&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTreeType($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;nav&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) $classes[] = &amp;#039;has_children&amp;#039;;&lt;br /&gt;
    $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    unset($classes);&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
		unset($classes);&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele für Funktionen (z.B. in _func.php)==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele für Funktionen die Navigationen erzeugen. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
=== One Level ===&lt;br /&gt;
==== Original ProcessWire Demo Beispiel ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nested List ausgehend von einer Seite (meistens Homepage) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages, render a one level navbar&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavMain($pa,$pageId){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;nav class=&amp;quot;menu menu--ferdinand&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nav navbar-nav menu__list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item) {&lt;br /&gt;
     if($item-&amp;gt;id == $pageId) {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item menu__item--current cur\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
     // if template isotope-parent add first isotope-child name as hash&lt;br /&gt;
     if($item-&amp;gt;template-&amp;gt;name == &amp;#039;isotope-parent&amp;#039;){&lt;br /&gt;
       $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;#&amp;#039;.$item-&amp;gt;child-&amp;gt;name.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
     }else $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
     $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/nav&amp;gt;&amp;quot;;&lt;br /&gt;
     return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 function renderNavIsotope($pa){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;ul class=&amp;quot;submenu&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item){&lt;br /&gt;
     $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;#039;.$item-&amp;gt;name.&amp;#039;&amp;quot; class=&amp;quot;isotope-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
   $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
   return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a simple &amp;lt;ul&amp;gt; navigation&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a simple shared function.&lt;br /&gt;
 * Usage is completely optional.&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $items&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNav(PageArray $items) {&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// render markup for each navigation item as an &amp;lt;li&amp;gt;&lt;br /&gt;
		if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) {&lt;br /&gt;
			// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			// otherwise just a regular list item&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if the item has summary text, include that too&lt;br /&gt;
		if($item-&amp;gt;summary) $out .= &amp;quot;&amp;lt;div class=&amp;#039;summary&amp;#039;&amp;gt;$item-&amp;gt;summary&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;nav&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTree($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $class = &amp;#039;nav&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$out .= renderNavTree($item-&amp;gt;children, $maxDepth-1, $fieldNames, $class);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;$class&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>149.172.225.28</name></author>
	</entry>
</feed>