�PNG  IHDR����Q�gAMA�� �a cHRMz&�����u0�`:�p��Q<�bKGD�������gmIDATx���w�U���ﹻ�& �^C��X(�����J I@� ���"% (** B�X� �+*�i��"]j(IH�{~�R)��[��~��>h��{�}g�y�)I�$I��j��� ������.I�$I�$�ʊ�y@�}x�.�: �$I�$I��i}��V�Z�����PC)I�$I��F� ����^��0ʐJ�$I�$�Q^���}{�"���r�=��OzI��$gR�ZeC.�IO����vH eK��X� �����$IM�px��sk�.��쒷/��&���r�[޳����<���v|�� ��.I���~�)@������$�up��dY�R�����a�$I �|�M�.�e ��Jaֶ�pS�Y�R��6j��>h�%IR��ز�� �i�f&���u�J)������M�����$I vL���i���=�H;�7UJ�,�]�,X��$I��1��AҒ�J����$ X�Y� XzI��@G����N��ҥR���T)E��@��;��]K*�M�w;#�5_�wO�n~\ DC&�$(A�5 �R�R��FkvIR���}�l��!�RytRl;��~^Ƿ�Jj� �اy�뷦BZ��Jr����&ӥ�8�P�j��w~�vn�����v ���X���^�(I;�4�R=�P[�3]J�,�]ȏ�~��:�3�?��[��� ��a��&e)`�e*����P[�4]�T��=Cq�6�R[ ~ޤ����r�XR Հg(�t�_HZ�-Hg �M�$�ãm�L5�R� �u��k�*`%C-�E6/����%[�t X.{��8�P9Z�������.vk����XŐKj����gKZ��Hg�(����aK9ڦ��mKj��Ѻm�_ \�#�$5�,)- � �61eJ�,��5m|� ��r�'��=��� ��&ڡd���%-]J �on�� X���m|�{ ��R�Ҟ����e $eڧY X��Y�����rԮ-a�7�RK�6h���>n$5A�V�ڴ�i��*�ֆ�K)���mѦ���tm�r�1p| �q:흺,)O�����i��*�ֺ�K)���ܬ�֦����K-5�r�3�>0ԔHj��Jئ�EZ��j�,%��r�e��~�/��z��%j�V��M��ڸ�mr��t)��3]J�,���T ��K֦O�vԒg��i�i��*�����bK�i�NO~�%�P��W���0=�d��i�i�������2�t�J9��J����ݕ�{�7�"I P��9�JK�Tb�u,%��r���"�6�RKU��}�Ij�2����HK�Z�XJ�,妝�� X��Y�����rP��� ެ�2�4�c��%i��^���IK|.H�,%��r�b���:XR�l��1X��4Pe/`����x��&����P��8�Pj��28��M��z���s��x���2���r�\���zR��P�z�4J����}�y���P[g=�L)��� .Q[�6Rj�Wgp ��FI�H�*-`I�����M�RaK9T��X��c�q�����*I� y���[j��E>cw%��gL�R���ԕi�F�Cj�-��ď�a`������#e~���I�� j�,%��r�,)?[gp �FI˨���mn��WX#��>mʔ X�A��� �DZf9,�nKҲz�����I��Z�XJ�,�L#��k�i��P�z�4JZF�����,�I,`���61%�2s �$���,�VO��Ϛ2��/U��FJ�fy��7����K�> X�+�6� S�TX����Ie�����JI���Lz�M�fKm ��L�RaK9�%|��4p9L�w�JI��!`N����sia���zĔ)������%-� X��M���q�>�pk�$-$�Q���2����x#�N� ؎�-�QR��}ᶦHZ�ډ��)�J�,�l#��i@y�n3������L��N`���;�nڔ X�����u����X5��p��F)��m|��^�0(��>B�H���F9(c�զE��er��JI rg��7 ��4I@z�0\�JI��������i�䵙���RR��0�s;�$�s6eJ�,�`n �䂦���0�a�)S)�A������ ���1eJ�,堌#�6�35R��I�gpN��Hu������TH���_S���ԕqV�����e `� ��&S)���>�p;S$魁eKI����uX��`I�����4��춒�o}`m�$1"��:�PI���<[�v9�^�\p��TJj�r�iRŭ ��P{#�{R2,`)e-`mgj�~�1�ϣ�L��Kam�7�&U\j�/�3mJ�,�`F��;M��'�䱀�� .KR#��)y�h�Tq�;p���cK9(���q!w�?����u�RR,n.yw�*UXj#�\�]ɱ���(q�v2=R���q����f����B#i��Jm�m�L����<]�Y����͙�#�$5� ��u�TU�7��Ӧ�X�R+q�,`I}����qL�����'���`��6�K�ͷ�6���r�,�]����0S$-���� ��[RKR3���o��iRE����|�nӦ�X�R.�(i�:�L��D�L��TJj�Y��%o�:����)�����6���r�x���zҒ��q��TJj��h㞦I���.�$Y�R.ʼ�n�GZ�\ֿ��f:%5�5 ��I�˼!�6����dK�x��m��4E�"mG�_�� �s? �.e*��?L�RfK9��%�����q�#�uh$�)�i���3U�����L�RfK9yx��m܌b�j�����8��4���$�i��1U��^@Wbm��4uJ�,�����Ҫ�A�>���_Ij�?1�v�3�2����[�gL�R��D��9�6�o�Ta�R���׿��N7%�����L�2�� NT�,`)7�&�Ɲ��L�*꽙��yp���_$���M�2�#�A�����S�,`)7�$r��k�TA���29�_���Iy�e"�|/0�t)�$�n X�T2���`Y���J���;�6��J�x"�����.e�<�`�����$)� P�I$��5�V4]���29���SRI>�~�=@j�]��l�p�2`K9Jaai�^" Ԋ��29�O�RI%��:X�V5]J��m��N9���]�H;1U���C39���NI%���Xe78�t)a��;���O��i Ҙ�>X�t�"~G>�_mn:%���|~ޅ_�+]�$�o���)�@��ǀ{hgN;�IK�6�G&�rp�)�T2�i�୦K�Ju���v*���T��=�T��O�SV�>(��~D�>d�����m�,I*��Ɛ�:���R�#��ۙNI%��D>G��.n��$�o��;�+#��R�R��!��.e�U��˽���TRI�2��8�t)1L��WϚ>IJ�a3�oF��b��u&���:�tJ*��(F7��y�0�Z�R ^�p���'Ii� ����L�24x�| X��RI%�ۄ>S1]J�y��[z��L�$�adB7��.eh4��%���%�누>W�E���Tf+3�����IR:�I�3Xה)3אO�ۦSR�O'�ٺ�)S�}"��q�O��r[B7�ϙ.edG�)^E���TR"R��t��R�ݜh���0}������<�S����ɧx�.6,)�&���)SI�p��j�'I��?���A�L�"���L����.\TZV�N���!�'I�Y.��pAS����5}� �TRbNL�3��”�d�����b�e��)��4]��Mg/S���Z{ni����,)=k����Д�d��p��ǦO��uLb7�ߛ2%lO�}u�)���K��]le�T�P��j�eS(I�Z���ִ��R�^eJ%%*�/\ Ke�̈́�-O�M�$����|.5eJ��o�s)^]oJ%%,�㚃R� <�p��LS��� �*����`GӦ�tdt<�5���o'��/�6�٧�� _��BIJ�kH��_�6%d ���rQ�b�gZ%%n�ڍ9o1mj�U�g���JR>�L�F�VӦD�B^k_���J�Dj��\����=�L���S(I������v─a���T�eZ%e�U����A�M-�0;�~˃@�i��|l�� �@S���4y���7��2��>���sX-vA�}�ϛBI���!ݎߨ����W�l�*)3{'�Y|�iS�lEڻ(��5�����K��t��SI�$��Uv0��2���,~��ԩ~�x��;�P��4��ց��C�r�O%ty�n4��25:���KM��l�D� ^���4JR������xS��ه�F_}شJ�T�S��6uj�+ﷸk�$e���Z�O%�G�*^�V2�����u3E�Mj�3��k%)ok��I]d�T����)�UR�K���DS� �7�~�m@�TJR�~�荪�f�T"�֛L�� �\���s��M��� �-0��T �K�f�J��z+��n�إK�r� �L�����&j��(��)�[�E&I����� ߴ>e �FW�_�kJR�|!���O�:5�/2跌3��T-�'|�zX�� r�yp0��J����S ~^�F�>-�2�< �`*%�ZFP�)����bS��n"���L�� :)���+pʷf(pO���3��TMW$~����>@~ū:����TA�IsV�1}�S2�<���%��ޟ�M�?@�iT ,E�ū�oz%i�~��g�|`wS(�]�oȤ��8��)�$�� �� ntu`өe�`6y�Pl� Iz�MI{�ʣ�z����ʨ�� �)IZ�2��= ld:5+���請M�$-ї���;�U�>_���g��sY��$Á����N�5��W���z�W�fIZ��)�-��y�u�XI�fp���~S*IZ��dt�;�t�>K�ū��KR�|$���#Lc�Ԁ+2�\�;kJ��`]�Y���ǔ��M1B)��U�bG"IRߊ���<x����ܾ��ӔJ�������0�Z����=��'�Y��嵤����� Le�v�e�g��)�$��z���n����V-º����^�3Ւ�o�f��#0�Tfk�^�Z�s[�*I꯳3{���)�ˬ����W�4Ւ4 �Odp��bZ��R���S��|�*I� �����5��5�#��"�&�-IvT&��/��윚Ye:��i�$ �9��{�Lk�u�R���e�[��I~�_�\��ؠ%�>�GL�$iY�8 �9ܕ��"�S���`kS.I�l���C;Ҏ4���x&�>�u_0J��Lr����<��J�2�(^��$5��L� s�=Mg�V� �~�,Ij�u��>�� 7��r2�)^=G���$�1:��3�G< �`J�3�~�&IR%�� 6���T�x�/�rIj���3�O< �ʔ&#f�_yX��J�i�ގN��Sz;�� T�x�(��i���8%���#���4 �~�AS+Ij��e���r�I�U�rIj�����3�62��v8��8�5�+Ij�A�h�K__5���X��%�n�V%Iͳ-y��|7��XV��2��v4���fzo��_6��8���"�S/I-qbf��;� Lk��F�)K���SM�$���� Ms�>K� W�N���V����}�^`��-�큧3����2Œ�Vؙ�G��d��u�,^�^m�%��6���~��N�n�&�͓��3Œ�V�Z����MsRpfE�W���%I�wd���ǀ�Lm[��7���W&�bIR��L�@Q�|�)*�� ����i ImsI�����MmKm�y��V`�i�$��G+R� 0�t�V'����!���V�)֏���28����v���U�7͒�v���H����ꦼt���x�ꗞ�T ;S���}��7�M�f���+��fIR���H��N��ZUk�U�x5��SA�Jㄌ�9��Mq��μ���AIRi|�j�5��)o����*^���'<$�T����w���I�1��hE�U�^c�_�j�?���Е$%d`z� �c�y�f��,X���O IJ�nTg����A�� �����U�XRD��������� ���}�������{�H�}��^�S,P5��V��2���\����Xx`p�Z����|Y�k:����$e�� ��~ ��@nW�L�.j�+��ϝ���Y��b퇪��bZ� �BV�u�)�u�������/IJ_ �1�[�p.p60�bC�� >|X����9�1P�:��N\�!�5�qUB}5�a5ja `ub��c�VxYt1N�0�Z����z���l4����]7­gKj�]�?�4ϻ� ���*���[��b��g$)+À���*x쳀ogO$~,5� �ز���U��S�����9���� lq3�+5�mgw@��n�p1��sso Ӻ=����|�N6 /�g(�Wv7U��;��zωM=��wk�,0���u��T��g�_��`_�P`�uz?�2�yI��!b��`�k���ĸSo��+Q���x%!\��ο����e����|�އ���ԁK��S-s6��pu���_����(ֿ�$�i+��+�T8=�e�Y;��� �צ��P�+p��h�x��WQ���v���*���|p1��. ��ά. XRk�IQ�Y�P,���d�r�Z�� |����� ��������B�%������w��P|�S5`��~́@�i�޾��� E�;��Չaw{o'�Q��?%�iL{u D��?���������N1��B��D������!�o��w�����PHRe��FZ�*�� ���k�_-~����{����E9�b-��~P�`��f��E{AܶB�J�A�FO��� wx6��R�ox�5 K5����=�W����we�������hS8 (��J���C���l�J���~ p+���F���i�;ŗo+��:�bD�#g(��C��"�wA^�� r.�F�8L;�dzd�IH�U�X��݆�Ϟ�X�g� �)I�F����q��e�m��%I�4�d�j&pp�T�{���'{�HO���x�( Rk���6^C�٫����O.�)�3�:s(��۳(Z�?~ٻ8�9�zmT"�PL�tw䥈��5��&b<8GZ-�Y��&�K�?e8,`I��6���e�����(֍x�b8�3 � `���r�����zX�j��)F�=l($I�j� �2*�(F�?h(/9ik:��I`m#�p3�Mg���L�aKj�c�/U��#�n5����S�# �������m(^)=y=đ�x8Ŭ����I���[U]����~S�цA�4�p���$-F �i(��R�,�7C�x�;X��=�c����I��>���{���Km�\ �o(T��v�2������v�x�2q�i����iDJ�N�,���Ҏ����!1f� �5quB�j��1��!�8 �r���D�Fd(���!���W���Ql��,g�S��k����L��1Bx��g'�'�՞�^���ǘ;�p����Q ���P(c���_ IRu����j�g(�W�z ����b�s�#�P�­rz�>���� k�� c&nB=�q+��ؔX���n#r5����)co���*Ũ�+G��?7��<�� |�P�����Q��ӣ'�G�����`uO�d>%M�ct�z�#�� Ԫ�����ڞ�&�7��CaQ��~N�'��-P�.�W`Oedp0�3C!IZc�I�AMP��U�ۀ5�J�<��\u~+�{�9�(Fb�b���y�A�e�B����hOS���ܳ�1� b��È���T�#��ŠyDžs�����,`5�}��D���C�-�`��̞%r&�ڙa��8�7Q����W����W����p6e7� ��Rϫ/�o����Y� ꇅ N��ܶ�ը��tc��!��L���A ���T�7�V4�J�sū� I-�0����P��x�z7�QN�F���_�i����Z�g�úW�k�G���83� ���0e�Wr9 X����]㾮݁#���Jˢ C�}0��=3�ݱ��tB��i�]�_ ��&�{�{[/�o[�~ \q�鯜�0��0��٩���|��cD��3�=4��B_b� ���RY��b$ó�BR���sf�&������l�L�X#M*��C����_�L܄:gx�)WΘs���GSb���u��L ���rF$9�'�;\4�Ɍ�q�'�n�[%p.�Q`�������u ��h���N�b`eCQyQ|���l�_���C>L���b꟟3h��Sb�� �#��x��N��xS���������s^�� 88�|�Mz�)��}:�](vbۢ�amŖ࿥� ��0)Q����7���@�0���=?^k(*�J�����}�3ib�kF�n H�jB׻���NO���� �z�� �x}�7p 0�t��f����D����X�.lw��gȔ��h�Ծ�Ų� }6�g� E� |�Lk��LZ���t��eu+=���q���\I�v0쮑�)��Q�ٵpH8�/2?Σ�o�>�J�vpp��h�������o~�f>%bM��M���}���\�//��":�PT��c(v���9v���!��g�ո��Q ��)��U�fV��G��+!� ��35{=�x\�2�+��k�i,y$���~A1��iC�6#)v��C�5�^>�+gǵ�@1�Hy٪7����u;p ps�ϰ�u���/S�� <��aʸ����Gu't�D1�ԝI��<��p��g|����6�j��'p:�tպ�h��X�{�o(7v],��*�}��6�a_����<�u`��Ȯ�r.E�;ˑ�q�io�p�R��"������26�2E�8j�� ]����U��鿍ǜ�v���D��,2���վ�8ϫ�:�e/^AQ����T�H{�WgRl���̊���2Yx���"1�Q�> �wX�Rk,O�]�Lܳ���~V<�����F���8��a��_g~�o.�XCD�?S�t���h���梫A�o�%���~K1ݵ��O1�LyZ�bJ�� E��Q���xpq�i�Cpv��a6��_�:�wejT����]����"����<��u`"���� 2>���o4��5rp"N5k��;�m���{���rZ�b������Φ${#)��`(��Ŵ�g�,;j���%�6�j���.�pyYT��?}-��kB������D���c3q����A`��N��WQ���ū2�0�/^A��Z�W%�N�Q��� ��MI�.��X#P��#����,^Eb�c&��?X�R tA�V�|Y���.�1����!�����؅�⨉ccww���>���i��v��l(J��T�~� �u`��ٵDm �q)���+���Ri�� x/�x��8cyFO�!�/���*�!/��&��,7�<.���N���,�������YDŽ�&ܑ�Q�F1�Bz��)F���P�ʛ�?5����d� �6`�����kQձ �λc�؎�%58�2��Y��&nD�_$Je4��>a��?��!� ��ͨ�|�Ȏ�WZ��S�s��v���8� �j����(�I��&��y�j� �Jb5��m��?��H������Wp��=����g}�G��3��#�|I��,5v珿�] H~�R3�@B��������[☉9Ox~��oMy�=J���;�xUVoj�� �b�U�s�l_��35�t-�(Ճɼ�RB7�U!�q��c��+�x�4�H�_�Q�o֮$[���GO<��4`��&č�\GO�c[�.[*�A�f%m��G/� ň�M�/�r ��W�/Nw~B1U3������J�?��P&���Y�� �)`�ѓ����Z�����1���p]�^l“��W#)lWZ�i����l�U�Q�u`��-����m|xĐ,������_�ƪ|9i:�_��{*(3G�ѧ}�Uo�D+�>m_�?V��Pۅ�15���&}2�|���/p�IOʵ�>���� G�Z9�cmíت�mnz��)yߐb���D�������� �>e}:�)� �r|@�R5q�V�S�����A�10�C%�E�_��'^�8c��������R��7O;�6�[���eKeP�������G������ϦX7�j���b}��OT�GO^j��n*媓����7n����GMC�� � ���t,�k31�R�b �(v�yܴ�ʭ�!��iTh8~�ZY�Z�p��(q��s���RL ?�b���}����c�Ũ�ʊGO^���!��rP�JO��1��5�MJ[��c&~������Z`"��ѓޔ����H1���C&����^|��Ш|�rʼ,�A�wĴ?�����b��5)�t��L��U��)F�|�� �&��g٣O]���oqSU����j���y(��x<��Ϳ3 ���.���FS�k���oYg�2� \_#w��j�{u'r�Q������>���o���;���%n�|�F�*�O�_��L�"�e�9um��Dds�����?.��fu�u����Qb��IW�z |4\0� s�b;�O�v��xOS�s�; G%����T4g��FR�u�rj���(֍ڑb �u�ԖK�D���u��1MK{���1^ q;�� �C=�6\8��F��R��艇�!���%\Y�Ô�U| �88�m��)֓��Nc��L�ve�� C�6z;��o&�X x5�9�:q���6�1�Z��(T����7���>C?�g�c�ļ�x�ѐ�� Z� ���o�o-�0�8j�ہ �x�,�`���'��� ��Ҕ���Oc��Rl��f��~���`�����jj�"�.N�v+���sM������_��]������Z�k��� �g( UOP���������y�εx%�pU����h�2�������(���@��il0���ݽ��QXxp�px-�N�S��( W�O+�轾 n��Fߢ����3M��<;z�)��FBZ�j����c�i��u�/�Q�oF�� �7R�¥ Z��F�L�F�~��#����ȣ��ߨ^<쩡�ݛк���v�џ)��)���M��E>ώ�x4�m#!-�m���!L;vv#~Y[��đ��K�����m����x�9.[,��U����FS �����C���VkZ ���+���ߟ�r�Y٧��IZd/�io�i$�%��͝ب_ֶX�3���ܫ��hNU �� Z����Z�g�k�=���]��=������b���b��JS[�w��j�U(��)���*I =ώ:}-蹞�l�Uj�:��1��}����M�W��m�=̛���� _�� ¾,8��{__�����m{_�P��V���K^n3�e����sw5�ӫh�#�$-�q=�A̟> ,^I}P�^�J$�qY~Q[ Xq���9�<�r�d�sߏǜs�#������%/���y����kKZ�������b��?� S�k�tc�񫝶L���&I ���W!�b �>{#�&�T.^����G��Vj�_���_R��K�p����n,b=`�ż����Y@�^՝��;z�{p�aV��Kk����QXj�/�)y� ��TI�c&F�;FB�G�7w����g� ZZD�G��!����x�� �r_�t��Ƣ!�}�i�/�V��=M����/��#��n��B8 Xx�Ы ^�@�CR�<{䤭����Y��CN��)�e���K��OSƟa $��&�g[i3�.C�6x�rOc���8�TI���;�o�� ��hH6�P�&L{�@�q��6�[���� �G��zp�^���71�j��(�l�`�J�}]���e6�X����☉#͕� ���׈$A�B1�Vj��h㭦IRs��qFBj�w�Q_7�Xk��>y"������N=�M�B0� ��,�C #�o6MR��c���0��|�$�)�ف����"1����!i���xY<���B��9mx�� ��`���,��t�A�>)5ػ�Q���?j��Q�?�cn�>Y�Z�e�� �Tis���v���h�#�� �GMމȇ���p�:���ԴVuږ�8ɼH��]C.���5C!UV;F`m�b��Bk��� ��L�TM�vP���ʍϤj�?��ԯ/Q�r1���N�B`9s"����s�� �TYs����z��� ��&�9S%U԰�> �{��<�ؿ���SM���xB��|H�\3�@!U�|�� �k']������$U�+>��� |�HHM����Lޢ�?��V9i�D!-�@��x�� �TI���î�%�6Z��*��9X�@HMW#�?��n�N� ,o�e6�?tQw��ڱ�.�]-����y����'�:mW�0#!�J82qF�jH -`�ѓ�&��M��0����u� Uγmxϵ��^-��_�\�]����)@0R���t.8�/?ٰ�C��Y]�x���}=sD3�o��j�ަ���Ы�N���uS%U��}Ԥw��HH�>ڗ�jܷ_3gN �����q7�[q���2�l���a���*����A�r���Ǔ��Ԗ+p�8���/��R��GM�� ]j�a����c�d(�JhWko�6��ڎb�j�]i���5���Bj�����3+�3�!\j��1�����U�Z���L��s��L�T�v8�HHmup<��U���\��GMމ�3�R+��w4R�����6�j� XW�M�T!��u(�*!��Pz�,����#���Sq���*�8?vww )kO���a��$�[&��?�*�bB�X� �@���%�����8�]�=���R�r)kO��w�0j��i��M�Tq�� ng$�2\�q�8f�:���e�N1�R�xr<��5 ������;��M��p^�@;��7]R��ꎾ�JtER�.�/(5�v3�R[�@=�h�l����?����l�@;���.���[]�Q*�Z\�4��"1P�'Y��w��x��# ���ǀg���{��5�i��_IUR���z�RɞsyS5q�E����=�@�Y���っ �����v�k��6 ��&��5�1E�o0�|�kp�c��#�j=`�D���WRU�����j̟���J'P� �����w2 �S� �v�:��p�g�3Rv�},�#�����8�b��Z~�&��(F�=�i�><�>gK�M���Jj����0�@H%��,����W�΃�7�R) "�>c�,����� x�ix������ј���^ ��aܖ>�H[�i.UI�Hc �U�1=y�W\���=��S*���G���R~�)AF���=�`�&�����2��h`�D�z���T��󑓶�����J+����?�W+}��C�%��P:|�0H���܆��}-�<;O����C[�~o.��$~��i�}��~�HQ�� �Tv�X������Έ�r=b}$��v����i�z�L��4�:�ȰT|4�~����*��!o�X�QR6��L�k+�#������t/g �lԁߖ����[��Jڶ_N$�k���������*"�.� ���x���s��xX���7jRVbA��A�ʯKҎ��U3����)�zS�NN �_�'��s�?f����)��6������X���!%s�s�A���kʱ>���qƷ�b ��h�g� %n���� �~p�1RE��GM���HH�=�������B�Jiy[<�5 ���ǁJҖ�����g�K���R��*�倳��e��~�HUy��)A���g,K)`�V�w6bRR:��q����L#\�r���cl��K��/�$�s�h�*$�� ������6�����덤�� ����KԖc� 3��Z�9��=�Ɣ�=o>�X � �Ώ�"1�� )a��`�S��JJ�6�k<��U�������-]�� b�m`��{r�y;����T���u��_GR5���*�%6�do�#XRg#���-!nl��$u�3��A�� L+Q{��9�x~�a-�|�H� �vbq[\�NJT%�]���rO8,��E�-F�����w)+?(Y{�Lz�n6����׀��?C������R�~�,)m�䎧�R�7���cww����qpW�ڳ=i.��U`Xf�F�b=�V��LJ��H^LI}��%�} ��|��w���� aG�$�,��^�R^�6 k2�^B�{7��t�������V�%@G�q� p�%R�zģN_ ��HHI[7�ֱ�>(��<�c e�{%kϊ����P�+��SL'�T�cM���J����WR���m ���ŏ�"�w)qc e�f�꒵i?��b7�b����(�'�"��2r%��������~�HUS�1���\<��(`�1�W����x��9�=�8HY9��m:X��1�8�b��g�����D1��u ���~|H��;K��-��U�ep�,,� C�1 RV.���M�R�5�άh����,�t��W�O8W���C�$ XRV�sQS]3G�J|�1��2����� [�v�M� ������:��k�#����~tH�3�0Rf-�����HYݺ-`I�9�%l�I��D�T�m\ ����S�{]��9�gO���ڒ�M���NCV\��G��*����2���J�R�Ũ;�R��ҏ^���ڽ�̱�mq�1E�u?�To�3I���)��y^��#�j�J�w���^�Ń�j��^�v����vl����B_��⋌�P�4x>0$�c>���K†A�ļ9s_V���jT��t0l�#������m��>E��-�,�,�x�,��-�W��)������سo&�9�6�R�E XR.6b���Xw�+)G���A�����E�v�L�)�͞K4�$p=�Ũ��i_ѱ�O�j��b�� HY����/���+@�θH9޼]�N�ԥ��%n�{����� �&zjT�?�� �Ty) s^�U��L�����lb�,�P�iTf�^���<À�]������� ��62R^V��7)S!nl�l��S�6~�͝�V�}�-=%*� ʻ>���G�� ���������D��nK��<��y��&>L����Py7'r=Hj���� ���9��V`[c"�*��^�8H��pc�����O�8�b�nU�`4���J��ȪA�Ƌ#��1_\ XϘH��PR���gi�k(�~G�~��0��D���A���A����_2�p�|�J�묭a����2���\N�C�r�]����M���_0 �^T��%e#����vD��^��%��x��y-n���}�-E�\�3�aS%�yN!�r_��{ �)s���A��w ���ڼp1pEAk�~v�<�:`'ӭ^�5 �����A�r���X�������OI驻��T �(��dk�)�_�\<��w���^��W�I��"�RFj3��V# ���M<,o�J��.H��#�\�SK���s]���� )��9> P��u�������A�*�B�Y�]����y�B�"�l�\�ey��� ��hH���*t��b�K)3��� IK�Z��򹞋X�jN�� �n� �*n>k�]��X�_��d�!�ry��BH� � ]��*R�� ��0(#'�7 ������%es9??��ښFC��,ՁQP��������j�����AR��J�\Ρw� �K��#��j���ah�g�w�;�2$�l*�)� ��%���Xq5�!U᢯�6Re] |�0����[�_�����_64�c�h�&�_}��i�L8K��Eg�Ҏ�7 M��/�\`|.p,�~`�a���=�BR?x�ܐrQ���8K� XR���2M�8�f ?�`s�gW�S%�"� ������Ԉ 7R%���$� N������}��?QL1|-э�ټwI�Z��%���pv�L���3Hk>,I����m�g�W���7{��E�� x�PHx�7�3R�����A�� ���@R�S�� CC���� �������!\ȟ���5I��XR^Z���xHл�$Q[��ŝ�40 (�>�+� �_C ���>���BR�t��<,T�r�T �������{���O�����/�H��+˟Pl6 I ���B)/�V���C��<6���a��2����~�����(�XwV4�g�n���XR� ϱ5�ǀHٻ?tw�똤Eyxp���{�#���WK��� �q����G%5���]�,���(�0ӈH����� HZ���])ג=K1j��&��G(FbM�@����)%�I` XR�����g ʔ�� KZ�G(v��P,�<`�[� K���n^ ��SJR���sAʠ�5xՅF`�0&R�b�V� ��t��x�:Ea�UE�/{�f��i�2;.I����A��wW8��/��t�T�x�A��GOo��N�?�G���}�l L�(���n�����`�Zv?���p�B��8K�_g�����I�+ܗ � #��i��?���ޙ�.��) p����$�u�tc �~DžfՈE�o3��l/)I-U�?a�ԅ�^��j�x�A�r����A�� ΧX��������}�DmZ@QLےbTXGd�.^|x�KHR{���|Ε�W_h]�� ���I��J`[�G9�{��)�.y�)�� ��<���D�*��zk�(ּ���Ya����O���8S����?��2-��� ������H13����#pK"���I`]`O� ��h�&=�S���F1Z�/Ie����D1R�W�a�"t'�x?!)Ou:��1 ��|��6��gt\s�����7�=�z_;�ؠ��>�0X Y��A1]q�p?�p�_���k+J*��Y�@HI>�^��?�g�t.06R�n ��,��`�� ��?)�;p pSF9����Z����X���L�����BJP�W���j���gQ|�&)7!�� Hj��Q��t���<| ؅��W�5 x �W��� �� HIz�Y���oV���M�G�P��� Hj��n`+�\�(d��N���W)F+I�rS�[���|��/a�����`K��|�ͻ�0Hj�{�R,���Q=��\� (F�}\�W�������R)A�g��SG`I��s�n���AR�=|�8�$}�G(v��C��$)s���� FBJ�?]�_�u XRv�ύ��6z�� �Ũ�G[��3��6-�T9�H��z��p����W�̞ú������� X�����g�큽�=�7C�u������fzI���$��)�k�i���^q��k��-) � ���0H*�N` �QZ��k�k]/���t���nn���sI�^Gu't=��7$�� Z;�{���8�^��jB��%� ��IItR�QS7�[�ϭ���3 �$�_���O�Q�J`7�!�]���W��"��W,)�����Iy �W��� �AJA�;K���WG��`IY�{8���k$I�$�^��%����9�.�^(`��N|���LJ�%�@�$I�}ֽp���=FB*�xN��=gI?Q{٥�4B)m���w �$I���gc~d��Z@G�9K��� X�?7)a�K�%�݅K�$IZ��-`I���p����C ������U��6�$I��\0��>!��9�k}��� Xa� ����II�S���0H�$I �H ?1R��.�Ч�j���:�4~R�w���@p�$I����r��A*�u��}��W�j�WFPJ����$I�➓/���6#!�� L�Ӿ��+ X36�x�8J �|+L;v���$I���o�4����3���0����1�R2�0��M� I�$-E}��@����,pS�^ޟR[���/����s¹'��0H�$IKyf��Ÿ���f�������VO�π�FT*�����a$I��>��H��e��~����V���Y/3�R�/�)��>d$I��>2��8`Cj���w�,n@�FU*�9tt�f$I��~<;��=�/4RD~����@��� X��-�ѕ�z��ἱI�$��:� ԍ��R �a�@��b X��{��+�Qx��u�q�$I�Л�z�o���� /~3\8����ڒ���4B������N7�$IҀ���j �V]n1�8H�$I��YFBj�3��̚�̵���ja ����p���p��� �$I���s/3R� Ӻ�-�Yj+L;�.0�R�́��I�$�A���v?� #!5�"��aʄ��j}���U���Km�ɽ��H�$Ij��C���Ys?h$I��Dl8�4��3���.��v�}���m���7�UiI=�&�=0L�g0$I��4���: ���emb�e��`���� e�Qbm�0u�? �$I�T!Sƍ'�-���s��v�)s#C��0�:�XB���2���a� w I�$�zbww�{�."p��Pz�O� �=�Ɔ�\����[� �����o($I������aw]�`���E���).K���v�i�:�L�*#gР7[��$I�����yG���PI=@��R� �4�y��R~�̮�´cg I�$I/<�t�P�ͽ ��h�Dg�o� 94����Z^k盇�΄8��I���56��^�W�$I�^�0���̜�N�?4*�H`237}g��+h���x�o��q)��SJ@p|�`�� �$I��%>������-�h���O�0e�O�>��\ԣNߌZ��D6��R�=K ����~n($I�$��y�3��D>o4�b#px�2���$��yڪt���z���W���~a�� �$I��~?�x<��e{W���g��ô�{�x$/�=�{t�G�0�7��e���a���B�$IҀ�yG��^S�卆�"puS��3��*�E=洣��,`9�>��'���Bww�pH�$IZ��ݑ�nC�㧄���Pc�_9��sO gw����J=l1�:mKB�>�����Ab<4L�p���$I�����b �o1Z���Q�@8�5�b�̍ S'�F���,�F��e���,^I�$Ij���E�dù{�l4� �8�Ys_�s� Z8.��x �m"+{~��?q,��Z D�!I�$��ϻ�'|X�h��B�)=��…'�]��M�>��5��� r�g���otԎ 獽�PH�$Ij����IP���hh)n#�cÔq���A'�ug5qw���U�&r�F|1��E%I�$%����]��!'�3�AFD/;C�k_`�9��� �v�!ٴt�PV�;��x`�'��*b�Qa� w I�$I�x�5� �����FC�3D����_��~��A�_�#O݆���Dv��V?<���q�w�+I�$I�{��=�Z�8"�.#RI���Y�yj���Ǫ����=f�D�l�9�%�M�,�����a8$I�$��Yw�i[�7�ݍFe�$�s��1��ՋBV�A?�`�]#!��oz����4zjLJ���o8$I�$%�@3j�A��a4��(�o�� �;�p,,dya�=��F9ً[��LS���PH�$IJ�Y�Љ+3��> 5"���3�9�aZ�<ñh!�{T�pB�G��k��j}��S�p��� �$I��lvF��.���F$I� ��z<� '\���K*qq��.f�<���2�Y�!�S"-\I�$I��Yw�č��jF$ w9��� \ߪB�.�1�v!Ʊ���?+��r�:�^�!I�$�BϹ�B� ����H��"�B�;L��'G[ 4�U�����#5>�੐�)|#�o0��aڱ���$I���>�}��k&�1`U#�V��?��Ys��V x���>�{t���1�[�I~D���&(I�$I/{��H�0fw�"�q"���y�%��4����� I�X�y�E~��M�3 8Xψ��L}q�������E�$I���[�> �nD�?~�s����f��� �����]o�΁� �cT��6"?'�_�Ἣ� �$I��>�~��.f�|'!������N�?�⟩����0��G KkX�Z�E��]�ޡ;�����/����&�?k�� O�ۘH�$IR��������ۀw�XӨ��<�7@��P��nS��04�a����Ӷ�p�.��:��@���\IWQ�J6�s�S%I�$���e��5��ڑ���v`�3:���x'�;��w��q_�vp�gHyX�Z� ��3�gЂ7{{���E�����uԹ�n�±��}�$I�$��������8t;b|��5��91n��ء����Q"�P������6���O�5�i���� }�i�R�̈́���%�Q�̄p!�I䮢�]��������O{�H�$IR�ϻ�9��s֧�� a=`-� aB\X��0"+5"C�1�H�b?߮����3x��3�&�g�ş�g��g����l��_���h�����Z^,`5�?���ߎ��vĸ%�̀M!�OZC2#0x ����LJ��0�� �G�w����$I�$I�}�<�{Eb�+y���;�iI,`����ܚ��F�����:�5��ܛ�A�8���-O�-|�8�K�7��s�|#�Z8�a&�>���<��a&����/V��tb�t��L��ʌI�$I�$I�$I�$I�$I�$IRj���D��D�%tEXtdate:create2022-05-31T04:40:26+00:00�!Î%tEXtdate:modify2022-05-31T04:40:26+00:00�|{2IEND�B`�Mini Shell

HOME


Mini Shell 1.0
DIR:/home/agribioinnovations.com/www/wp-content/plugins/jetpack/modules/shortcodes/js/
Upload File :
Current File : //home/agribioinnovations.com/www/wp-content/plugins/jetpack/modules/shortcodes/js/jmpress.js
/**
 * jmpress.js v0.4.5
 * http://jmpressjs.github.com/jmpress.js
 *
 * A jQuery plugin to build a website on the infinite canvas.
 *
 * Copyright 2013 Kyle Robinson Young @shama & Tobias Koppers @sokra
 * Licensed MIT
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Based on the foundation laid by Bartek Szopka @bartaz
 */ /*
 * core.js
 * The core of jmpress.js
 */
( function ( $, document, window, undefined ) {
	'use strict';

	/**
	 * Set supported prefixes
	 *
	 * @access protected
	 * @return Function to get prefixed property
	 */
	var pfx = ( function () {
		var style = document.createElement( 'dummy' ).style,
			prefixes = 'Webkit Moz O ms Khtml'.split( ' ' ),
			memory = {};
		return function ( prop ) {
			if ( typeof memory[ prop ] === 'undefined' ) {
				var ucProp = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 ),
					props = ( prop + ' ' + prefixes.join( ucProp + ' ' ) + ucProp ).split( ' ' );
				memory[ prop ] = null;
				for ( var i in props ) {
					if ( style[ props[ i ] ] !== undefined ) {
						memory[ prop ] = props[ i ];
						break;
					}
				}
			}
			return memory[ prop ];
		};
	} )();

	/**
	 * map ex. "WebkitTransform" to "-webkit-transform"
	 */
	function mapProperty( name ) {
		if ( ! name ) {
			return;
		}
		var index = 1 + name.substr( 1 ).search( /[A-Z]/ );
		var prefix = name.substr( 0, index ).toLowerCase();
		var postfix = name.substr( index ).toLowerCase();
		return '-' + prefix + '-' + postfix;
	}
	function addComma( attribute ) {
		if ( ! attribute ) {
			return '';
		}
		return attribute + ',';
	}
	/**
	 * Return an jquery object only if it's not empty
	 */
	function ifNotEmpty( el ) {
		if ( el.length > 0 ) {
			return el;
		}
		return null;
	}

	/**
	 * Default Settings
	 */
	var defaults = {
		/* CLASSES */
		stepSelector: '.step',
		containerClass: '',
		canvasClass: '',
		areaClass: '',
		notSupportedClass: 'not-supported',

		/* CONFIG */
		fullscreen: true,

		/* ANIMATION */
		animation: {
			transformOrigin: 'top left',
			transitionProperty:
				addComma( mapProperty( pfx( 'transform' ) ) ) +
				addComma( mapProperty( pfx( 'perspective' ) ) ) +
				'opacity',
			transitionDuration: '1s',
			transitionDelay: '500ms',
			transitionTimingFunction: 'ease-in-out',
			transformStyle: 'preserve-3d',
		},
		transitionDuration: 1500,
	};
	var callbacks = {
		beforeChange: 1,
		beforeInitStep: 1,
		initStep: 1,
		beforeInit: 1,
		afterInit: 1,
		beforeDeinit: 1,
		afterDeinit: 1,
		applyStep: 1,
		unapplyStep: 1,
		setInactive: 1,
		beforeActive: 1,
		setActive: 1,
		selectInitialStep: 1,
		selectPrev: 1,
		selectNext: 1,
		selectHome: 1,
		selectEnd: 1,
		idle: 1,
		applyTarget: 1,
	};
	for ( var callbackName in callbacks ) {
		defaults[ callbackName ] = [];
	}

	/**
	 * Initialize jmpress
	 */
	function init( args ) {
		args = $.extend( true, {}, args || {} );

		// accept functions and arrays of functions as callbacks
		var callbackArgs = {};
		var callbackName = null;
		for ( callbackName in callbacks ) {
			callbackArgs[ callbackName ] = $.isFunction( args[ callbackName ] )
				? [ args[ callbackName ] ]
				: args[ callbackName ];
			args[ callbackName ] = [];
		}

		// MERGE SETTINGS
		var settings = $.extend( true, {}, defaults, args );

		for ( callbackName in callbacks ) {
			if ( callbackArgs[ callbackName ] ) {
				Array.prototype.push.apply( settings[ callbackName ], callbackArgs[ callbackName ] );
			}
		}

		/*** MEMBER VARS ***/

		var jmpress = $( this ),
			container = null,
			area = null,
			oldStyle = {
				container: '',
				area: '',
			},
			canvas = null,
			current = null,
			active = false,
			activeSubstep = null,
			activeDelegated = false;

		/*** MEMBER FUNCTIONS ***/
		// functions have to be called with this

		/**
		 * Init a single step
		 *
		 * @param element the element of the step
		 * @param idx number of step
		 */
		function doStepInit( element, idx ) {
			var data = dataset( element );
			var step = {
				oldStyle: $( element ).attr( 'style' ) || '',
			};

			var callbackData = {
				data: data,
				stepData: step,
			};
			callCallback.call( this, 'beforeInitStep', $( element ), callbackData );
			step.delegate = data.delegate;
			callCallback.call( this, 'initStep', $( element ), callbackData );

			$( element ).data( 'stepData', step );

			if ( ! $( element ).attr( 'id' ) ) {
				$( element ).attr( 'id', 'step-' + ( idx + 1 ) );
			}

			callCallback.call( this, 'applyStep', $( element ), callbackData );
		}
		/**
		 * Deinit a single step
		 *
		 * @param element the element of the step
		 */
		function doStepDeinit( element ) {
			var stepData = $( element ).data( 'stepData' );

			$( element ).attr( 'style', stepData.oldStyle );

			callCallback.call( this, 'unapplyStep', $( element ), {
				stepData: stepData,
			} );
		}
		/**
		 * Reapplies stepData to the element
		 *
		 * @param element
		 */
		function doStepReapply( element ) {
			callCallback.call( this, 'unapplyStep', $( element ), {
				stepData: element.data( 'stepData' ),
			} );

			callCallback.call( this, 'applyStep', $( element ), {
				stepData: element.data( 'stepData' ),
			} );
		}
		/**
		 * Completly deinit jmpress
		 *
		 */
		function deinit() {
			if ( active ) {
				callCallback.call( this, 'setInactive', active, {
					stepData: $( active ).data( 'stepData' ),
					reason: 'deinit',
				} );
			}
			if ( current.jmpressClass ) {
				$( jmpress ).removeClass( current.jmpressClass );
			}

			callCallback.call( this, 'beforeDeinit', $( this ), {} );

			$( settings.stepSelector, jmpress ).each( function ( idx ) {
				doStepDeinit.call( jmpress, this );
			} );

			container.attr( 'style', oldStyle.container );
			if ( settings.fullscreen ) {
				$( 'html' ).attr( 'style', '' );
			}
			area.attr( 'style', oldStyle.area );
			$( canvas )
				.children()
				.each( function () {
					jmpress.append( $( this ) );
				} );
			if ( settings.fullscreen ) {
				canvas.remove();
			} else {
				canvas.remove();
				area.remove();
			}

			callCallback.call( this, 'afterDeinit', $( this ), {} );

			$( jmpress ).data( 'jmpressmethods', false );
		}
		/**
		 * Call a callback
		 *
		 * @param callbackName String callback which should be called
		 * @param element some arguments to the callback
		 * @param eventData
		 */
		function callCallback( callbackName, element, eventData ) {
			eventData.settings = settings;
			eventData.current = current;
			eventData.container = container;
			eventData.parents = element ? getStepParents( element ) : null;
			eventData.current = current;
			eventData.jmpress = this;
			var result = {};
			$.each( settings[ callbackName ], function ( idx, callback ) {
				result.value = callback.call( jmpress, element, eventData ) || result.value;
			} );
			return result.value;
		}
		/**
		 *
		 */
		function getStepParents( el ) {
			return $( el ).parentsUntil( jmpress ).not( jmpress ).filter( settings.stepSelector );
		}
		/**
		 * Reselect the active step
		 *
		 * @param String type reason of reselecting step
		 */
		function reselect( type ) {
			return select( { step: active, substep: activeSubstep }, type );
		}
		/**
		 * Select a given step
		 *
		 * @param el element to select
		 * @param type reason of changing step
		 * @return Object element selected
		 */
		function select( el, type ) {
			var substep;
			if ( $.isPlainObject( el ) ) {
				substep = el.substep;
				el = el.step;
			}
			if ( typeof el === 'string' ) {
				el = jmpress.find( el ).first();
			}
			if ( ! el || ! $( el ).data( 'stepData' ) ) {
				return false;
			}

			scrollFix.call( this );

			var step = $( el ).data( 'stepData' );

			var cancelSelect = false;
			callCallback.call( this, 'beforeChange', el, {
				stepData: step,
				reason: type,
				cancel: function () {
					cancelSelect = true;
				},
			} );
			if ( cancelSelect ) {
				return undefined;
			}

			var target = {};

			var delegated = el;
			if ( $( el ).data( 'stepData' ).delegate ) {
				delegated =
					ifNotEmpty(
						$( el ).parentsUntil( jmpress ).filter( settings.stepSelector ).filter( step.delegate )
					) ||
					ifNotEmpty( $( el ).near( step.delegate ) ) ||
					ifNotEmpty( $( el ).near( step.delegate, true ) ) ||
					ifNotEmpty( $( step.delegate, jmpress ) );
				if ( delegated ) {
					step = delegated.data( 'stepData' );
				} else {
					// Do not delegate if expression not found
					delegated = el;
				}
			}
			if ( activeDelegated ) {
				callCallback.call( this, 'setInactive', activeDelegated, {
					stepData: $( activeDelegated ).data( 'stepData' ),
					delegatedFrom: active,
					reason: type,
					target: target,
					nextStep: delegated,
					nextSubstep: substep,
					nextStepData: step,
				} );
			}
			var callbackData = {
				stepData: step,
				delegatedFrom: el,
				reason: type,
				target: target,
				substep: substep,
				prevStep: activeDelegated,
				prevSubstep: activeSubstep,
				prevStepData: activeDelegated && $( activeDelegated ).data( 'stepData' ),
			};
			callCallback.call( this, 'beforeActive', delegated, callbackData );
			callCallback.call( this, 'setActive', delegated, callbackData );

			// Set on step class on root element
			if ( current.jmpressClass ) {
				$( jmpress ).removeClass( current.jmpressClass );
			}
			$( jmpress ).addClass( ( current.jmpressClass = 'step-' + $( delegated ).attr( 'id' ) ) );
			if ( current.jmpressDelegatedClass ) {
				$( jmpress ).removeClass( current.jmpressDelegatedClass );
			}
			$( jmpress ).addClass(
				( current.jmpressDelegatedClass = 'delegating-step-' + $( el ).attr( 'id' ) )
			);

			callCallback.call(
				this,
				'applyTarget',
				delegated,
				$.extend(
					{
						canvas: canvas,
						area: area,
						beforeActive: activeDelegated,
					},
					callbackData
				)
			);

			active = el;
			activeSubstep = callbackData.substep;
			activeDelegated = delegated;

			if ( current.idleTimeout ) {
				clearTimeout( current.idleTimeout );
			}
			current.idleTimeout = setTimeout( function () {
				callCallback.call( this, 'idle', delegated, callbackData );
			}, Math.max( 1, settings.transitionDuration - 100 ) );

			return delegated;
		}
		/**
		 * This should fix ANY kind of buggy scrolling
		 */
		function scrollFix() {
			( function fix() {
				if ( $( container )[ 0 ].tagName === 'BODY' ) {
					try {
						window.scrollTo( 0, 0 );
					} catch ( e ) {}
				}
				$( container ).scrollTop( 0 );
				$( container ).scrollLeft( 0 );
				function check() {
					if ( $( container ).scrollTop() !== 0 || $( container ).scrollLeft() !== 0 ) {
						fix();
					}
				}
				setTimeout( check, 1 );
				setTimeout( check, 10 );
				setTimeout( check, 100 );
				setTimeout( check, 200 );
				setTimeout( check, 400 );
			} )();
		}
		/**
		 * Alias for select
		 */
		function goTo( el ) {
			return select.call( this, el, 'jump' );
		}
		/**
		 * Goto Next Slide
		 *
		 * @return Object newly active slide
		 */
		function next() {
			return select.call(
				this,
				callCallback.call( this, 'selectNext', active, {
					stepData: $( active ).data( 'stepData' ),
					substep: activeSubstep,
				} ),
				'next'
			);
		}
		/**
		 * Goto Previous Slide
		 *
		 * @return Object newly active slide
		 */
		function prev() {
			return select.call(
				this,
				callCallback.call( this, 'selectPrev', active, {
					stepData: $( active ).data( 'stepData' ),
					substep: activeSubstep,
				} ),
				'prev'
			);
		}
		/**
		 * Goto First Slide
		 *
		 * @return Object newly active slide
		 */
		function home() {
			return select.call(
				this,
				callCallback.call( this, 'selectHome', active, {
					stepData: $( active ).data( 'stepData' ),
				} ),
				'home'
			);
		}
		/**
		 * Goto Last Slide
		 *
		 * @return Object newly active slide
		 */
		function end() {
			return select.call(
				this,
				callCallback.call( this, 'selectEnd', active, {
					stepData: $( active ).data( 'stepData' ),
				} ),
				'end'
			);
		}
		/**
		 * Manipulate the canvas
		 *
		 * @param props
		 * @return Object
		 */
		function canvasMod( props ) {
			css( canvas, props || {} );
			return $( canvas );
		}
		/**
		 * Return current step
		 *
		 * @return Object
		 */
		function getActive() {
			return activeDelegated && $( activeDelegated );
		}
		/**
		 * fire a callback
		 *
		 * @param callbackName
		 * @param element
		 * @param eventData
		 * @return void
		 */
		function fire( callbackName, element, eventData ) {
			if ( ! callbacks[ callbackName ] ) {
				$.error( 'callback ' + callbackName + ' is not registered.' );
			} else {
				return callCallback.call( this, callbackName, element, eventData );
			}
		}

		/**
		 * PUBLIC METHODS LIST
		 */
		jmpress.data( 'jmpressmethods', {
			select: select,
			reselect: reselect,
			scrollFix: scrollFix,
			goTo: goTo,
			next: next,
			prev: prev,
			home: home,
			end: end,
			canvas: canvasMod,
			container: function () {
				return container;
			},
			settings: function () {
				return settings;
			},
			active: getActive,
			current: function () {
				return current;
			},
			fire: fire,
			init: function ( step ) {
				doStepInit.call( this, $( step ), current.nextIdNumber++ );
			},
			deinit: function ( step ) {
				if ( step ) {
					doStepDeinit.call( this, $( step ) );
				} else {
					deinit.call( this );
				}
			},
			reapply: doStepReapply,
		} );

		/**
		 * Check for support
		 * This will be removed in near future, when support is coming
		 *
		 * @access protected
		 * @return void
		 */
		function checkSupport() {
			var ua = navigator.userAgent.toLowerCase();
			return ua.search( /(iphone)|(ipod)|(android)/ ) === -1 || ua.search( /(chrome)/ ) !== -1;
		}

		// BEGIN INIT

		// CHECK FOR SUPPORT
		if ( checkSupport() === false ) {
			if ( settings.notSupportedClass ) {
				jmpress.addClass( settings.notSupportedClass );
			}
			return;
		} else {
			if ( settings.notSupportedClass ) {
				jmpress.removeClass( settings.notSupportedClass );
			}
		}

		// grabbing all steps
		var steps = $( settings.stepSelector, jmpress );

		// GERNERAL INIT OF FRAME
		container = jmpress;
		area = $( '<div />' );
		canvas = $( '<div />' );
		$( jmpress )
			.children()
			.filter( steps )
			.each( function () {
				canvas.append( $( this ) );
			} );
		if ( settings.fullscreen ) {
			container = $( 'body' );
			$( 'html' ).css( {
				overflow: 'hidden',
			} );
			area = jmpress;
		}
		oldStyle.area = area.attr( 'style' ) || '';
		oldStyle.container = container.attr( 'style' ) || '';
		if ( settings.fullscreen ) {
			container.css( {
				height: '100%',
			} );
			jmpress.append( canvas );
		} else {
			container.css( {
				position: 'relative',
			} );
			area.append( canvas );
			jmpress.append( area );
		}

		$( container ).addClass( settings.containerClass );
		$( area ).addClass( settings.areaClass );
		$( canvas ).addClass( settings.canvasClass );

		document.documentElement.style.height = '100%';
		container.css( {
			overflow: 'hidden',
		} );

		var props = {
			position: 'absolute',
			transitionDuration: '0s',
		};
		props = $.extend( {}, settings.animation, props );
		css( area, props );
		css( area, {
			top: '50%',
			left: '50%',
			perspective: '1000px',
		} );
		css( canvas, props );

		current = {};

		callCallback.call( this, 'beforeInit', null, {} );

		// INITIALIZE EACH STEP
		steps.each( function ( idx ) {
			doStepInit.call( jmpress, this, idx );
		} );
		current.nextIdNumber = steps.length;

		callCallback.call( this, 'afterInit', null, {} );

		// START
		select.call( this, callCallback.call( this, 'selectInitialStep', 'init', {} ) );

		if ( settings.initClass ) {
			$( steps ).removeClass( settings.initClass );
		}
	}
	/**
	 * Return default settings
	 *
	 * @return Object
	 */
	function getDefaults() {
		return defaults;
	}
	/**
	 * Register a callback or a jmpress function
	 *
	 * @access public
	 * @param name String the name of the callback or function
	 * @param func Function? the function to be added
	 */
	function register( name, func ) {
		if ( $.isFunction( func ) ) {
			if ( methods[ name ] ) {
				$.error( 'function ' + name + ' is already registered.' );
			} else {
				methods[ name ] = func;
			}
		} else {
			if ( callbacks[ name ] ) {
				$.error( 'callback ' + name + ' is already registered.' );
			} else {
				callbacks[ name ] = 1;
				defaults[ name ] = [];
			}
		}
	}
	/**
	 * Set CSS on element w/ prefixes
	 *
	 * @return Object element which properties were set
	 *
	 * TODO: Consider bypassing pfx and blindly set as jQuery
	 * already checks for support
	 */
	function css( el, props ) {
		var key,
			pkey,
			cssObj = {};
		for ( key in props ) {
			if ( props.hasOwnProperty( key ) ) {
				pkey = pfx( key );
				if ( pkey !== null ) {
					cssObj[ pkey ] = props[ key ];
				}
			}
		}
		$( el ).css( cssObj );
		return el;
	}
	/**
	 * Return dataset for element
	 *
	 * @param el element
	 * @return Object
	 */
	function dataset( el ) {
		if ( $( el )[ 0 ].dataset ) {
			return $.extend( {}, $( el )[ 0 ].dataset );
		}
		function toCamelcase( str ) {
			str = str.split( '-' );
			for ( var i = 1; i < str.length; i++ ) {
				str[ i ] = str[ i ].substr( 0, 1 ).toUpperCase() + str[ i ].substr( 1 );
			}
			return str.join( '' );
		}
		var returnDataset = {};
		var attrs = $( el )[ 0 ].attributes;
		$.each( attrs, function ( idx, attr ) {
			if ( attr.nodeName.substr( 0, 5 ) === 'data-' ) {
				returnDataset[ toCamelcase( attr.nodeName.substr( 5 ) ) ] = attr.nodeValue;
			}
		} );
		return returnDataset;
	}
	/**
	 * Returns true, if jmpress is initialized
	 *
	 * @return bool
	 */
	function initialized() {
		return !! $( this ).data( 'jmpressmethods' );
	}

	/**
	 * PUBLIC STATIC METHODS LIST
	 */
	var methods = {
		init: init,
		initialized: initialized,
		deinit: function () {},
		css: css,
		pfx: pfx,
		defaults: getDefaults,
		register: register,
		dataset: dataset,
	};

	/**
	 * $.jmpress()
	 */
	$.fn.jmpress = function ( method ) {
		function f() {
			var jmpressmethods = $( this ).data( 'jmpressmethods' );
			if ( jmpressmethods && jmpressmethods[ method ] ) {
				return jmpressmethods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );
			} else if ( methods[ method ] ) {
				return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );
			} else if ( callbacks[ method ] && jmpressmethods ) {
				var settings = jmpressmethods.settings();
				var func = Array.prototype.slice.call( arguments, 1 )[ 0 ];
				if ( $.isFunction( func ) ) {
					settings[ method ] = settings[ method ] || [];
					settings[ method ].push( func );
				}
			} else if ( typeof method === 'object' || ! method ) {
				return init.apply( this, arguments );
			} else {
				$.error( 'Method ' + method + ' does not exist on jQuery.jmpress' );
			}
			// to allow chaining
			return this;
		}
		var args = arguments;
		var result;
		$( this ).each( function ( idx, element ) {
			result = f.apply( element, args );
		} );
		return result;
	};
	$.extend( {
		jmpress: function ( method ) {
			if ( methods[ method ] ) {
				return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );
			} else if ( callbacks[ method ] ) {
				// plugin interface
				var func = Array.prototype.slice.call( arguments, 1 )[ 0 ];
				if ( $.isFunction( func ) ) {
					defaults[ method ].push( func );
				} else {
					$.error(
						'Second parameter should be a function: $.jmpress( callbackName, callbackFunction )'
					);
				}
			} else {
				$.error( 'Method ' + method + ' does not exist on jQuery.jmpress' );
			}
		},
	} );
} )( jQuery, document, window );

/*
 * near.js
 * Find steps near each other
 */
( function ( $, document, window, undefined ) {
	'use strict';

	// add near( selector, backwards = false) to jquery

	function checkAndGo( elements, func, selector, backwards ) {
		var next;
		elements.each( function ( idx, element ) {
			if ( backwards ) {
				next = func( element, selector, backwards );
				if ( next ) {
					return false;
				}
			}
			if ( $( element ).is( selector ) ) {
				next = element;
				return false;
			}
			if ( ! backwards ) {
				next = func( element, selector, backwards );
				if ( next ) {
					return false;
				}
			}
		} );
		return next;
	}
	function findNextInChildren( item, selector, backwards ) {
		var children = $( item ).children();
		if ( backwards ) {
			children = $( children.get().reverse() );
		}
		return checkAndGo( children, findNextInChildren, selector, backwards );
	}
	function findNextInSiblings( item, selector, backwards ) {
		return checkAndGo(
			$( item )[ backwards ? 'prevAll' : 'nextAll' ](),
			findNextInChildren,
			selector,
			backwards
		);
	}
	function findNextInParents( item, selector, backwards ) {
		var next;
		var parents = $( item ).parents();
		parents = $( parents.get() );
		$.each( parents.get(), function ( idx, element ) {
			if ( backwards && $( element ).is( selector ) ) {
				next = element;
				return false;
			}
			next = findNextInSiblings( element, selector, backwards );
			if ( next ) {
				return false;
			}
		} );
		return next;
	}

	$.fn.near = function ( selector, backwards ) {
		var array = [];
		$( this ).each( function ( idx, element ) {
			var near =
				( backwards ? false : findNextInChildren( element, selector, backwards ) ) ||
				findNextInSiblings( element, selector, backwards ) ||
				findNextInParents( element, selector, backwards );
			if ( near ) {
				array.push( near );
			}
		} );
		return $( array );
	};
} )( jQuery, document, window );
/*
 * transform.js
 * The engine that powers the transforms or falls back to other methods
 */
( function ( $, document, window, undefined ) {
	'use strict';

	/* FUNCTIONS */
	function toCssNumber( number ) {
		return Math.round( 10000 * number ) / 10000 + '';
	}

	/**
	 * 3D and 2D engines
	 */
	var engines = {
		3: {
			transform: function ( el, data ) {
				var transform = 'translate(-50%,-50%)';
				$.each( data, function ( idx, item ) {
					var coord = [ 'X', 'Y', 'Z' ];
					var i;
					if ( item[ 0 ] === 'translate' ) {
						// ["translate", x, y, z]
						transform +=
							' translate3d(' +
							toCssNumber( item[ 1 ] || 0 ) +
							'px,' +
							toCssNumber( item[ 2 ] || 0 ) +
							'px,' +
							toCssNumber( item[ 3 ] || 0 ) +
							'px)';
					} else if ( item[ 0 ] === 'rotate' ) {
						var order = item[ 4 ] ? [ 1, 2, 3 ] : [ 3, 2, 1 ];
						for ( i = 0; i < 3; i++ ) {
							transform +=
								' rotate' +
								coord[ order[ i ] - 1 ] +
								'(' +
								toCssNumber( item[ order[ i ] ] || 0 ) +
								'deg)';
						}
					} else if ( item[ 0 ] === 'scale' ) {
						for ( i = 0; i < 3; i++ ) {
							transform += ' scale' + coord[ i ] + '(' + toCssNumber( item[ i + 1 ] || 1 ) + ')';
						}
					}
				} );
				$.jmpress( 'css', el, $.extend( {}, { transform: transform } ) );
			},
		},
		2: {
			transform: function ( el, data ) {
				var transform = 'translate(-50%,-50%)';
				$.each( data, function ( idx, item ) {
					var coord = [ 'X', 'Y' ];
					if ( item[ 0 ] === 'translate' ) {
						// ["translate", x, y, z]
						transform +=
							' translate(' +
							toCssNumber( item[ 1 ] || 0 ) +
							'px,' +
							toCssNumber( item[ 2 ] || 0 ) +
							'px)';
					} else if ( item[ 0 ] === 'rotate' ) {
						transform += ' rotate(' + toCssNumber( item[ 3 ] || 0 ) + 'deg)';
					} else if ( item[ 0 ] === 'scale' ) {
						for ( var i = 0; i < 2; i++ ) {
							transform += ' scale' + coord[ i ] + '(' + toCssNumber( item[ i + 1 ] || 1 ) + ')';
						}
					}
				} );
				$.jmpress( 'css', el, $.extend( {}, { transform: transform } ) );
			},
		},
		1: {
			// CHECK IF SUPPORT IS REALLY NEEDED?
			// this not even work without scaling...
			// it may better to display the normal view
			transform: function ( el, data ) {
				var anitarget = { top: 0, left: 0 };
				$.each( data, function ( idx, item ) {
					var coord = [ 'X', 'Y' ];
					if ( item[ 0 ] === 'translate' ) {
						// ["translate", x, y, z]
						anitarget.left = Math.round( item[ 1 ] || 0 ) + 'px';
						anitarget.top = Math.round( item[ 2 ] || 0 ) + 'px';
					}
				} );
				el.animate( anitarget, 1000 ); // TODO: Use animation duration
			},
		},
	};

	/**
	 * Engine to power cross-browser translate, scale and rotate.
	 */
	var engine = ( function () {
		if ( $.jmpress( 'pfx', 'perspective' ) ) {
			return engines[ 3 ];
		} else if ( $.jmpress( 'pfx', 'transform' ) ) {
			return engines[ 2 ];
		} else {
			// CHECK IF SUPPORT IS REALLY NEEDED?
			return engines[ 1 ];
		}
	} )();

	$.jmpress( 'defaults' ).reasonableAnimation = {};
	$.jmpress( 'initStep', function ( step, eventData ) {
		var data = eventData.data;
		var stepData = eventData.stepData;
		var pf = parseFloat;
		$.extend( stepData, {
			x: pf( data.x ) || 0,
			y: pf( data.y ) || 0,
			z: pf( data.z ) || 0,
			r: pf( data.r ) || 0,
			phi: pf( data.phi ) || 0,
			rotate: pf( data.rotate ) || 0,
			rotateX: pf( data.rotateX ) || 0,
			rotateY: pf( data.rotateY ) || 0,
			rotateZ: pf( data.rotateZ ) || 0,
			revertRotate: false,
			scale: pf( data.scale ) || 1,
			scaleX: pf( data.scaleX ) || false,
			scaleY: pf( data.scaleY ) || false,
			scaleZ: pf( data.scaleZ ) || 1,
		} );
	} );
	$.jmpress( 'afterInit', function ( nil, eventData ) {
		var stepSelector = eventData.settings.stepSelector,
			current = eventData.current;
		current.perspectiveScale = 1;
		current.maxNestedDepth = 0;
		var nestedSteps = $( eventData.jmpress ).find( stepSelector ).children( stepSelector );
		while ( nestedSteps.length ) {
			current.maxNestedDepth++;
			nestedSteps = nestedSteps.children( stepSelector );
		}
	} );
	$.jmpress( 'applyStep', function ( step, eventData ) {
		$.jmpress( 'css', $( step ), {
			position: 'absolute',
			transformStyle: 'preserve-3d',
		} );
		if ( eventData.parents.length > 0 ) {
			$.jmpress( 'css', $( step ), {
				top: '50%',
				left: '50%',
			} );
		}
		var sd = eventData.stepData;
		var transform = [
			[
				'translate',
				sd.x || sd.r * Math.sin( ( sd.phi * Math.PI ) / 180 ),
				sd.y || -sd.r * Math.cos( ( sd.phi * Math.PI ) / 180 ),
				sd.z,
			],
			[ 'rotate', sd.rotateX, sd.rotateY, sd.rotateZ || sd.rotate, true ],
			[ 'scale', sd.scaleX || sd.scale, sd.scaleY || sd.scale, sd.scaleZ || sd.scale ],
		];
		engine.transform( step, transform );
	} );
	$.jmpress( 'setActive', function ( element, eventData ) {
		var target = eventData.target;
		var step = eventData.stepData;
		var tf = ( target.transform = [] );
		target.perspectiveScale = 1;

		for ( var i = eventData.current.maxNestedDepth; i > ( eventData.parents.length || 0 ); i-- ) {
			tf.push( [ 'scale' ], [ 'rotate' ], [ 'translate' ] );
		}

		tf.push( [
			'scale',
			1 / ( step.scaleX || step.scale ),
			1 / ( step.scaleY || step.scale ),
			1 / step.scaleZ,
		] );
		tf.push( [ 'rotate', -step.rotateX, -step.rotateY, -( step.rotateZ || step.rotate ) ] );
		tf.push( [
			'translate',
			-( step.x || step.r * Math.sin( ( step.phi * Math.PI ) / 180 ) ),
			-( step.y || -step.r * Math.cos( ( step.phi * Math.PI ) / 180 ) ),
			-step.z,
		] );
		target.perspectiveScale *= step.scaleX || step.scale;

		$.each( eventData.parents, function ( idx, element ) {
			var step = $( element ).data( 'stepData' );
			tf.push( [
				'scale',
				1 / ( step.scaleX || step.scale ),
				1 / ( step.scaleY || step.scale ),
				1 / step.scaleZ,
			] );
			tf.push( [ 'rotate', -step.rotateX, -step.rotateY, -( step.rotateZ || step.rotate ) ] );
			tf.push( [
				'translate',
				-( step.x || step.r * Math.sin( ( step.phi * Math.PI ) / 180 ) ),
				-( step.y || -step.r * Math.cos( ( step.phi * Math.PI ) / 180 ) ),
				-step.z,
			] );
			target.perspectiveScale *= step.scaleX || step.scale;
		} );

		$.each( tf, function ( idx, item ) {
			if ( item[ 0 ] !== 'rotate' ) {
				return;
			}
			function lowRotate( name ) {
				if ( eventData.current[ 'rotate' + name + '-' + idx ] === undefined ) {
					eventData.current[ 'rotate' + name + '-' + idx ] = item[ name ] || 0;
				}
				var cur = eventData.current[ 'rotate' + name + '-' + idx ],
					tar = item[ name ] || 0,
					curmod = cur % 360,
					tarmod = tar % 360;
				if ( curmod < 0 ) {
					curmod += 360;
				}
				if ( tarmod < 0 ) {
					tarmod += 360;
				}
				var diff = tarmod - curmod;
				if ( diff < -180 ) {
					diff += 360;
				} else if ( diff > 180 ) {
					diff -= 360;
				}
				eventData.current[ 'rotate' + name + '-' + idx ] = item[ name ] = cur + diff;
			}
			lowRotate( 1 );
			lowRotate( 2 );
			lowRotate( 3 );
		} );
	} );
	$.jmpress( 'applyTarget', function ( active, eventData ) {
		var target = eventData.target,
			props,
			step = eventData.stepData,
			settings = eventData.settings,
			zoomin = target.perspectiveScale * 1.3 < eventData.current.perspectiveScale,
			zoomout = target.perspectiveScale > eventData.current.perspectiveScale * 1.3;

		// extract first scale from transform
		var lastScale = -1;
		$.each( target.transform, function ( idx, item ) {
			if ( item.length <= 1 ) {
				return;
			}
			if (
				item[ 0 ] === 'rotate' &&
				item[ 1 ] % 360 === 0 &&
				item[ 2 ] % 360 === 0 &&
				item[ 3 ] % 360 === 0
			) {
				return;
			}
			if ( item[ 0 ] === 'scale' ) {
				lastScale = idx;
			} else {
				return false;
			}
		} );

		if ( lastScale !== eventData.current.oldLastScale ) {
			zoomin = zoomout = false;
			eventData.current.oldLastScale = lastScale;
		}

		var extracted = [];
		if ( lastScale !== -1 ) {
			while ( lastScale >= 0 ) {
				if ( target.transform[ lastScale ][ 0 ] === 'scale' ) {
					extracted.push( target.transform[ lastScale ] );
					target.transform[ lastScale ] = [ 'scale' ];
				}
				lastScale--;
			}
		}

		var animation = settings.animation;
		if ( settings.reasonableAnimation[ eventData.reason ] ) {
			animation = $.extend( {}, animation, settings.reasonableAnimation[ eventData.reason ] );
		}

		props = {
			// to keep the perspective look similar for different scales
			// we need to 'scale' the perspective, too
			perspective: Math.round( target.perspectiveScale * 1000 ) + 'px',
		};
		props = $.extend( {}, animation, props );
		if ( ! zoomin ) {
			props.transitionDelay = '0s';
		}
		if ( ! eventData.beforeActive ) {
			props.transitionDuration = '0s';
			props.transitionDelay = '0s';
		}
		$.jmpress( 'css', eventData.area, props );
		engine.transform( eventData.area, extracted );

		props = $.extend( {}, animation );
		if ( ! zoomout ) {
			props.transitionDelay = '0s';
		}
		if ( ! eventData.beforeActive ) {
			props.transitionDuration = '0s';
			props.transitionDelay = '0s';
		}

		eventData.current.perspectiveScale = target.perspectiveScale;

		$.jmpress( 'css', eventData.canvas, props );
		engine.transform( eventData.canvas, target.transform );
	} );
} )( jQuery, document, window );
/*
 * active.js
 * Set the active classes on steps
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress;

	/* DEFINES */
	var activeClass = 'activeClass',
		nestedActiveClass = 'nestedActiveClass';

	/* DEFAULTS */
	var defaults = $jmpress( 'defaults' );
	defaults[ nestedActiveClass ] = 'nested-active';
	defaults[ activeClass ] = 'active';

	/* HOOKS */
	$jmpress( 'setInactive', function ( step, eventData ) {
		var settings = eventData.settings,
			activeClassSetting = settings[ activeClass ],
			nestedActiveClassSettings = settings[ nestedActiveClass ];
		if ( activeClassSetting ) {
			$( step ).removeClass( activeClassSetting );
		}
		if ( nestedActiveClassSettings ) {
			$.each( eventData.parents, function ( idx, element ) {
				$( element ).removeClass( nestedActiveClassSettings );
			} );
		}
	} );
	$jmpress( 'setActive', function ( step, eventData ) {
		var settings = eventData.settings,
			activeClassSetting = settings[ activeClass ],
			nestedActiveClassSettings = settings[ nestedActiveClass ];
		if ( activeClassSetting ) {
			$( step ).addClass( activeClassSetting );
		}
		if ( nestedActiveClassSettings ) {
			$.each( eventData.parents, function ( idx, element ) {
				$( element ).addClass( nestedActiveClassSettings );
			} );
		}
	} );
} )( jQuery, document, window );
/*
 * circular.js
 * Repeat from start after end
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress;

	/* FUNCTIONS */
	function firstSlide( step, eventData ) {
		return $( this ).find( eventData.settings.stepSelector ).first();
	}
	function prevOrNext( jmpress, step, eventData, prev ) {
		if ( ! step ) {
			return false;
		}
		var stepSelector = eventData.settings.stepSelector;
		step = $( step );
		do {
			var item = step.near( stepSelector, prev );
			if ( item.length === 0 || item.closest( jmpress ).length === 0 ) {
				item = $( jmpress ).find( stepSelector )[ prev ? 'last' : 'first' ](); // eslint-disable-line no-unexpected-multiline
			}
			if ( ! item.length ) {
				return false;
			}
			step = item;
		} while ( step.data( 'stepData' ).exclude );
		return step;
	}

	/* HOOKS */
	$jmpress( 'initStep', function ( step, eventData ) {
		eventData.stepData.exclude =
			eventData.data.exclude && [ 'false', 'no' ].indexOf( eventData.data.exclude ) === -1;
	} );
	$jmpress( 'selectInitialStep', firstSlide );
	$jmpress( 'selectHome', firstSlide );
	$jmpress( 'selectEnd', function ( step, eventData ) {
		return $( this ).find( eventData.settings.stepSelector ).last();
	} );
	$jmpress( 'selectPrev', function ( step, eventData ) {
		return prevOrNext( this, step, eventData, true );
	} );
	$jmpress( 'selectNext', function ( step, eventData ) {
		return prevOrNext( this, step, eventData );
	} );
} )( jQuery, document, window );
/*
 * start.js
 * Set the first step to start on
 */
( function ( $, document, window, undefined ) {
	'use strict';

	/* HOOKS */
	$.jmpress( 'selectInitialStep', function ( nil, eventData ) {
		return eventData.settings.start;
	} );
} )( jQuery, document, window );
/*
 * ways.js
 * Control the flow of the steps
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress;

	/* FUNCTIONS */
	function routeFunc( jmpress, route, type ) {
		for ( var i = 0; i < route.length - 1; i++ ) {
			var from = route[ i ];
			var to = route[ i + 1 ];
			if ( $( jmpress ).jmpress( 'initialized' ) ) {
				$( from, jmpress ).data( 'stepData' )[ type ] = to;
			} else {
				$( from, jmpress ).attr( 'data-' + type, to );
			}
		}
	}
	function selectPrevOrNext( step, eventData, attr, prev ) {
		var stepData = eventData.stepData;
		if ( stepData[ attr ] ) {
			var near = $( step ).near( stepData[ attr ], prev );
			if ( near && near.length ) {
				return near;
			}
			near = $( stepData[ attr ], this )[ prev ? 'last' : 'first' ]();
			if ( near && near.length ) {
				return near;
			}
		}
	}

	/* EXPORTED FUNCTIONS */
	$jmpress( 'register', 'route', function ( route, unidirectional, reversedRoute ) {
		if ( typeof route === 'string' ) {
			route = [ route, route ];
		}
		routeFunc( this, route, reversedRoute ? 'prev' : 'next' );
		if ( ! unidirectional ) {
			routeFunc( this, route.reverse(), reversedRoute ? 'next' : 'prev' );
		}
	} );

	/* HOOKS */
	$jmpress( 'initStep', function ( step, eventData ) {
		for ( var attr in { next: 1, prev: 1 } ) {
			eventData.stepData[ attr ] = eventData.data[ attr ];
		}
	} );
	$jmpress( 'selectNext', function ( step, eventData ) {
		return selectPrevOrNext.call( this, step, eventData, 'next' );
	} );
	$jmpress( 'selectPrev', function ( step, eventData ) {
		return selectPrevOrNext.call( this, step, eventData, 'prev', true );
	} );
} )( jQuery, document, window );
/*
 * ajax.js
 * Load steps via ajax
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress;

	/* DEFINES */
	var afterStepLoaded = 'ajax:afterStepLoaded',
		loadStep = 'ajax:loadStep';

	/* REGISTER EVENTS */
	$jmpress( 'register', loadStep );
	$jmpress( 'register', afterStepLoaded );

	/* DEFAULTS */
	$jmpress( 'defaults' ).ajaxLoadedClass = 'loaded';

	/* HOOKS */
	$jmpress( 'initStep', function ( step, eventData ) {
		eventData.stepData.src = $( step ).attr( 'href' ) || eventData.data.src || false;
		eventData.stepData.srcLoaded = false;
	} );
	$jmpress( loadStep, function ( step, eventData ) {
		var stepData = eventData.stepData,
			href = stepData && stepData.src,
			settings = eventData.settings;
		if ( href ) {
			$( step ).addClass( settings.ajaxLoadedClass );
			stepData.srcLoaded = true;
			$( step ).load( href, function ( response, status, xhr ) {
				$( eventData.jmpress ).jmpress(
					'fire',
					afterStepLoaded,
					step,
					$.extend( {}, eventData, {
						response: response,
						status: status,
						xhr: xhr,
					} )
				);
			} );
		}
	} );
	$jmpress( 'idle', function ( step, eventData ) {
		if ( ! step ) {
			return;
		}
		var settings = eventData.settings,
			jmpress = $( this ),
			stepData = eventData.stepData;
		var siblings = $( step )
			.add( $( step ).near( settings.stepSelector ) )
			.add( $( step ).near( settings.stepSelector, true ) )
			.add(
				jmpress.jmpress( 'fire', 'selectPrev', step, {
					stepData: $( step ).data( 'stepData' ),
				} )
			)
			.add(
				jmpress.jmpress( 'fire', 'selectNext', step, {
					stepData: $( step ).data( 'stepData' ),
				} )
			);
		siblings.each( function () {
			var step = this,
				stepData = $( step ).data( 'stepData' );
			if ( ! stepData.src || stepData.srcLoaded ) {
				return;
			}
			jmpress.jmpress( 'fire', loadStep, step, {
				stepData: $( step ).data( 'stepData' ),
			} );
		} );
	} );
	$jmpress( 'setActive', function ( step, eventData ) {
		var stepData = $( step ).data( 'stepData' );
		if ( ! stepData.src || stepData.srcLoaded ) {
			return;
		}
		$( this ).jmpress( 'fire', loadStep, step, {
			stepData: $( step ).data( 'stepData' ),
		} );
	} );
} )( jQuery, document, window );
/*
 * hash.js
 * Detect and set the URL hash
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress,
		hashLink = "a[href^='#']";

	/* FUNCTIONS */
	function randomString() {
		return '' + Math.round( Math.random() * 100000, 0 );
	}
	/**
	 * getElementFromUrl
	 *
	 * @return String or undefined
	 */
	function getElementFromUrl( settings ) {
		// get id from url # by removing `#` or `#/` from the beginning,
		// so both "fallback" `#slide-id` and "enhanced" `#/slide-id` will work
		// TODO SECURITY check user input to be valid!
		try {
			var el = $( '#' + window.location.hash.replace( /^#\/?/, '' ) );
			return el.length > 0 && el.is( settings.stepSelector ) ? el : undefined;
		} catch ( e ) {}
	}
	function setHash( stepid ) {
		var shouldBeHash = '#/' + stepid;
		if ( window.history && window.history.pushState ) {
			// shouldBeHash = "#" + stepid;
			// consider this for future versions
			//  it has currently issues, when startup with a link with hash (webkit)
			if ( window.location.hash !== shouldBeHash ) {
				window.history.pushState( {}, '', shouldBeHash );
			}
		} else {
			if ( window.location.hash !== shouldBeHash ) {
				window.location.hash = shouldBeHash;
			}
		}
	}

	/* DEFAULTS */
	$jmpress( 'defaults' ).hash = {
		use: true,
		update: true,
		bindChange: true,
		// NOTICE: {use: true, update: false, bindChange: true}
		// will cause a error after clicking on a link to the current step
	};

	/* HOOKS */
	$jmpress( 'selectInitialStep', function ( step, eventData ) {
		var settings = eventData.settings,
			hashSettings = settings.hash,
			current = eventData.current,
			jmpress = $( this );
		eventData.current.hashNamespace = '.jmpress-' + randomString();
		// HASH CHANGE EVENT
		if ( hashSettings.use ) {
			if ( hashSettings.bindChange ) {
				$( window ).bind( 'hashchange' + current.hashNamespace, function ( event ) {
					var urlItem = getElementFromUrl( settings );
					if ( jmpress.jmpress( 'initialized' ) ) {
						jmpress.jmpress( 'scrollFix' );
					}
					if ( urlItem && urlItem.length ) {
						if ( urlItem.attr( 'id' ) !== jmpress.jmpress( 'active' ).attr( 'id' ) ) {
							jmpress.jmpress( 'select', urlItem );
						}
						setHash( urlItem.attr( 'id' ) );
					}
					event.preventDefault();
				} );
				$( hashLink ).on( 'click' + current.hashNamespace, function ( event ) {
					var href = $( this ).attr( 'href' );
					try {
						if ( $( href ).is( settings.stepSelector ) ) {
							jmpress.jmpress( 'select', href );
							event.preventDefault();
							event.stopPropagation();
						}
					} catch ( e ) {}
				} );
			}
			return getElementFromUrl( settings );
		}
	} );
	$jmpress( 'afterDeinit', function ( nil, eventData ) {
		$( hashLink ).off( eventData.current.hashNamespace );
		$( window ).unbind( eventData.current.hashNamespace );
	} );
	$jmpress( 'setActive', function ( step, eventData ) {
		var settings = eventData.settings,
			current = eventData.current;
		// `#/step-id` is used instead of `#step-id` to prevent default browser
		// scrolling to element in hash
		if ( settings.hash.use && settings.hash.update ) {
			clearTimeout( current.hashtimeout );
			current.hashtimeout = setTimeout( function () {
				setHash( $( eventData.delegatedFrom ).attr( 'id' ) );
			}, settings.transitionDuration + 200 );
		}
	} );
} )( jQuery, document, window );
/*
 * keyboard.js
 * Keyboard event mapping and default keyboard actions
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress,
		jmpressNext = 'next',
		jmpressPrev = 'prev';

	/* FUNCTIONS */
	function randomString() {
		return '' + Math.round( Math.random() * 100000, 0 );
	}
	function stopEvent( event ) {
		event.preventDefault();
		event.stopPropagation();
	}

	/* DEFAULTS */
	$jmpress( 'defaults' ).keyboard = {
		use: true,
		keys: {
			33: jmpressPrev, // pg up
			37: jmpressPrev, // left
			38: jmpressPrev, // up

			9: jmpressNext + ':' + jmpressPrev, // tab
			32: jmpressNext, // space
			34: jmpressNext, // pg down
			39: jmpressNext, // right
			40: jmpressNext, // down

			36: 'home', // home

			35: 'end', // end
		},
		ignore: {
			INPUT: [
				32, // space
				37, // left
				38, // up
				39, // right
				40, // down
			],
			TEXTAREA: [
				32, // space
				37, // left
				38, // up
				39, // right
				40, // down
			],
			SELECT: [
				38, // up
				40, // down
			],
		},
		tabSelector: 'a[href]:visible, :input:visible',
	};

	/* HOOKS */
	$jmpress( 'afterInit', function ( nil, eventData ) {
		var settings = eventData.settings,
			keyboardSettings = settings.keyboard,
			ignoreKeyboardSettings = keyboardSettings.ignore,
			current = eventData.current,
			jmpress = $( this );

		// tabindex make it focusable so that it can receive key events
		if ( ! settings.fullscreen ) {
			jmpress.attr( 'tabindex', 0 );
		}

		current.keyboardNamespace = '.jmpress-' + randomString();

		// KEYPRESS EVENT: this fixes a Opera bug
		$( settings.fullscreen ? document : jmpress ).bind(
			'keypress' + current.keyboardNamespace,
			function ( event ) {
				for ( var nodeName in ignoreKeyboardSettings ) {
					if (
						event.target.nodeName === nodeName &&
						ignoreKeyboardSettings[ nodeName ].indexOf( event.which ) !== -1
					) {
						return;
					}
				}
				if ( ( event.which >= 37 && event.which <= 40 ) || event.which === 32 ) {
					stopEvent( event );
				}
			}
		);
		// KEYDOWN EVENT
		$( settings.fullscreen ? document : jmpress ).bind(
			'keydown' + current.keyboardNamespace,
			function ( event ) {
				var eventTarget = $( event.target );

				if (
					( ! settings.fullscreen && ! eventTarget.closest( jmpress ).length ) ||
					! keyboardSettings.use
				) {
					return;
				}

				for ( var nodeName in ignoreKeyboardSettings ) {
					if (
						eventTarget[ 0 ].nodeName === nodeName &&
						ignoreKeyboardSettings[ nodeName ].indexOf( event.which ) !== -1
					) {
						return;
					}
				}

				var reverseSelect = false;
				var nextFocus;
				if ( event.which === 9 ) {
					// tab
					if ( ! eventTarget.closest( jmpress.jmpress( 'active' ) ).length ) {
						if ( ! event.shiftKey ) {
							nextFocus = jmpress
								.jmpress( 'active' )
								.find( 'a[href], :input' )
								.filter( ':visible' )
								.first();
						} else {
							reverseSelect = true;
						}
					} else {
						nextFocus = eventTarget.near( keyboardSettings.tabSelector, event.shiftKey );
						if (
							! $( nextFocus ).closest( settings.stepSelector ).is( jmpress.jmpress( 'active' ) )
						) {
							nextFocus = undefined;
						}
					}
					if ( nextFocus && nextFocus.length > 0 ) {
						nextFocus.focus();
						jmpress.jmpress( 'scrollFix' );
						stopEvent( event );
						return;
					} else {
						if ( event.shiftKey ) {
							reverseSelect = true;
						}
					}
				}

				var action = keyboardSettings.keys[ event.which ];
				if ( typeof action === 'string' ) {
					if ( action.indexOf( ':' ) !== -1 ) {
						action = action.split( ':' );
						action = event.shiftKey ? action[ 1 ] : action[ 0 ];
					}
					jmpress.jmpress( action );
					stopEvent( event );
				} else if ( $.isFunction( action ) ) {
					action.call( jmpress, event );
				} else if ( action ) {
					jmpress.jmpress.apply( jmpress, action );
					stopEvent( event );
				}

				if ( reverseSelect ) {
					// tab
					nextFocus = jmpress
						.jmpress( 'active' )
						.find( 'a[href], :input' )
						.filter( ':visible' )
						.last();
					nextFocus.focus();
					jmpress.jmpress( 'scrollFix' );
				}
			}
		);
	} );
	$jmpress( 'afterDeinit', function ( nil, eventData ) {
		$( document ).unbind( eventData.current.keyboardNamespace );
	} );
} )( jQuery, document, window );
/*
 * viewport.js
 * Scale to fit a given viewport
 */
( function ( $, document, window, undefined ) {
	'use strict';

	function randomString() {
		return '' + Math.round( Math.random() * 100000, 0 );
	}

	var browser = ( function () {
		var ua = navigator.userAgent.toLowerCase();
		var match =
			/(chrome)[ \/]([\w.]+)/.exec( ua ) ||
			/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
			/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
			/(msie) ([\w.]+)/.exec( ua ) ||
			( ua.indexOf( 'compatible' ) < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ) ||
			[];
		return match[ 1 ] || '';
	} )();

	var defaults = $.jmpress( 'defaults' );
	defaults.viewPort = {
		width: false,
		height: false,
		maxScale: 0,
		minScale: 0,
		zoomable: 0,
		zoomBindMove: true,
		zoomBindWheel: true,
	};
	var keys = defaults.keyboard.keys;
	keys[ browser === 'mozilla' ? 107 : 187 ] = 'zoomIn'; // +
	keys[ browser === 'mozilla' ? 109 : 189 ] = 'zoomOut'; // -
	defaults.reasonableAnimation.resize = {
		transitionDuration: '0s',
		transitionDelay: '0ms',
	};
	defaults.reasonableAnimation.zoom = {
		transitionDuration: '0s',
		transitionDelay: '0ms',
	};
	$.jmpress( 'initStep', function ( step, eventData ) {
		for ( var variable in {
			viewPortHeight: 1,
			viewPortWidth: 1,
			viewPortMinScale: 1,
			viewPortMaxScale: 1,
			viewPortZoomable: 1,
		} ) {
			eventData.stepData[ variable ] =
				eventData.data[ variable ] && parseFloat( eventData.data[ variable ] );
		}
	} );
	$.jmpress( 'afterInit', function ( nil, eventData ) {
		var jmpress = this;
		eventData.current.viewPortNamespace = '.jmpress-' + randomString();
		$( window ).bind( 'resize' + eventData.current.viewPortNamespace, function ( event ) {
			$( jmpress ).jmpress( 'reselect', 'resize' );
		} );
		eventData.current.userZoom = 0;
		eventData.current.userTranslateX = 0;
		eventData.current.userTranslateY = 0;
		if ( eventData.settings.viewPort.zoomBindWheel ) {
			$( eventData.settings.fullscreen ? document : this ).bind(
				'mousewheel' +
					eventData.current.viewPortNamespace +
					' DOMMouseScroll' +
					eventData.current.viewPortNamespace,
				function ( event, delta ) {
					delta =
						delta || event.originalEvent.wheelDelta || -event.originalEvent.detail /* mozilla */;
					var direction = delta / Math.abs( delta );
					if ( direction < 0 ) {
						$( eventData.jmpress ).jmpress(
							'zoomOut',
							event.originalEvent.x,
							event.originalEvent.y
						);
					} else if ( direction > 0 ) {
						$( eventData.jmpress ).jmpress(
							'zoomIn',
							event.originalEvent.x,
							event.originalEvent.y
						);
					}
					return false;
				}
			);
		}
		if ( eventData.settings.viewPort.zoomBindMove ) {
			$( eventData.settings.fullscreen ? document : this )
				.bind( 'mousedown' + eventData.current.viewPortNamespace, function ( event ) {
					if ( eventData.current.userZoom ) {
						eventData.current.userTranslating = { x: event.clientX, y: event.clientY };
						event.preventDefault();
						event.stopImmediatePropagation();
					}
				} )
				.bind( 'mousemove' + eventData.current.viewPortNamespace, function ( event ) {
					var userTranslating = eventData.current.userTranslating;
					if ( userTranslating ) {
						$( jmpress ).jmpress(
							'zoomTranslate',
							event.clientX - userTranslating.x,
							event.clientY - userTranslating.y
						);
						userTranslating.x = event.clientX;
						userTranslating.y = event.clientY;
						event.preventDefault();
						event.stopImmediatePropagation();
					}
				} )
				.bind( 'mouseup' + eventData.current.viewPortNamespace, function ( event ) {
					if ( eventData.current.userTranslating ) {
						eventData.current.userTranslating = undefined;
						event.preventDefault();
						event.stopImmediatePropagation();
					}
				} );
		}
	} );
	function maxAbs( value, range ) {
		return Math.max( Math.min( value, range ), -range );
	}
	function zoom( x, y, direction ) {
		var current = $( this ).jmpress( 'current' ),
			settings = $( this ).jmpress( 'settings' ),
			stepData = $( this ).jmpress( 'active' ).data( 'stepData' ),
			container = $( this ).jmpress( 'container' );
		if ( current.userZoom === 0 && direction < 0 ) {
			return;
		}
		var zoomableSteps = stepData.viewPortZoomable || settings.viewPort.zoomable;
		if ( current.userZoom === zoomableSteps && direction > 0 ) {
			return;
		}
		current.userZoom += direction;

		var halfWidth = $( container ).innerWidth() / 2,
			halfHeight = $( container ).innerHeight() / 2;

		x = x ? x - halfWidth : x;
		y = y ? y - halfHeight : y;

		// TODO this is not perfect... too much math... :(
		current.userTranslateX = maxAbs(
			current.userTranslateX - ( direction * x ) / current.zoomOriginWindowScale / zoomableSteps,
			( halfWidth * current.userZoom * current.userZoom ) / zoomableSteps
		);
		current.userTranslateY = maxAbs(
			current.userTranslateY - ( direction * y ) / current.zoomOriginWindowScale / zoomableSteps,
			( halfHeight * current.userZoom * current.userZoom ) / zoomableSteps
		);

		$( this ).jmpress( 'reselect', 'zoom' );
	}
	$.jmpress( 'register', 'zoomIn', function ( x, y ) {
		zoom.call( this, x || 0, y || 0, 1 );
	} );
	$.jmpress( 'register', 'zoomOut', function ( x, y ) {
		zoom.call( this, x || 0, y || 0, -1 );
	} );
	$.jmpress( 'register', 'zoomTranslate', function ( x, y ) {
		var current = $( this ).jmpress( 'current' ),
			settings = $( this ).jmpress( 'settings' ),
			stepData = $( this ).jmpress( 'active' ).data( 'stepData' ),
			container = $( this ).jmpress( 'container' );
		var zoomableSteps = stepData.viewPortZoomable || settings.viewPort.zoomable;
		var halfWidth = $( container ).innerWidth(),
			halfHeight = $( container ).innerHeight();
		current.userTranslateX = maxAbs(
			current.userTranslateX + x / current.zoomOriginWindowScale,
			( halfWidth * current.userZoom * current.userZoom ) / zoomableSteps
		);
		current.userTranslateY = maxAbs(
			current.userTranslateY + y / current.zoomOriginWindowScale,
			( halfHeight * current.userZoom * current.userZoom ) / zoomableSteps
		);
		$( this ).jmpress( 'reselect', 'zoom' );
	} );
	$.jmpress( 'afterDeinit', function ( nil, eventData ) {
		$( eventData.settings.fullscreen ? document : this ).unbind(
			eventData.current.viewPortNamespace
		);
		$( window ).unbind( eventData.current.viewPortNamespace );
	} );
	$.jmpress( 'setActive', function ( step, eventData ) {
		var viewPort = eventData.settings.viewPort;
		var viewPortHeight = eventData.stepData.viewPortHeight || viewPort.height;
		var viewPortWidth = eventData.stepData.viewPortWidth || viewPort.width;
		var viewPortMaxScale = eventData.stepData.viewPortMaxScale || viewPort.maxScale;
		var viewPortMinScale = eventData.stepData.viewPortMinScale || viewPort.minScale;
		// Correct the scale based on the window's size
		var windowScaleY = viewPortHeight && $( eventData.container ).innerHeight() / viewPortHeight;
		var windowScaleX = viewPortWidth && $( eventData.container ).innerWidth() / viewPortWidth;
		var windowScale =
			( windowScaleX || windowScaleY ) &&
			Math.min( windowScaleX || windowScaleY, windowScaleY || windowScaleX );

		if ( windowScale ) {
			windowScale = windowScale || 1;
			if ( viewPortMaxScale ) {
				windowScale = Math.min( windowScale, viewPortMaxScale );
			}
			if ( viewPortMinScale ) {
				windowScale = Math.max( windowScale, viewPortMinScale );
			}

			var zoomableSteps =
				eventData.stepData.viewPortZoomable || eventData.settings.viewPort.zoomable;
			if ( zoomableSteps ) {
				var diff = 1 / windowScale - 1 / viewPortMaxScale;
				diff /= zoomableSteps;
				windowScale = 1 / ( 1 / windowScale - diff * eventData.current.userZoom );
			}

			eventData.target.transform.reverse();
			if ( eventData.current.userTranslateX && eventData.current.userTranslateY ) {
				eventData.target.transform.push( [
					'translate',
					eventData.current.userTranslateX,
					eventData.current.userTranslateY,
					0,
				] );
			} else {
				eventData.target.transform.push( [ 'translate' ] );
			}
			eventData.target.transform.push( [ 'scale', windowScale, windowScale, 1 ] );
			eventData.target.transform.reverse();
			eventData.target.perspectiveScale /= windowScale;
		}
		eventData.current.zoomOriginWindowScale = windowScale;
	} );
	$.jmpress( 'setInactive', function ( step, eventData ) {
		if (
			! eventData.nextStep ||
			! step ||
			$( eventData.nextStep ).attr( 'id' ) !== $( step ).attr( 'id' )
		) {
			eventData.current.userZoom = 0;
			eventData.current.userTranslateX = 0;
			eventData.current.userTranslateY = 0;
		}
	} );
} )( jQuery, document, window );

/*
 * mouse.js
 * Clicking to select a step
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress;

	/* FUNCTIONS */
	function randomString() {
		return '' + Math.round( Math.random() * 100000, 0 );
	}

	/* DEFAULTS */
	$jmpress( 'defaults' ).mouse = {
		clickSelects: true,
	};

	/* HOOKS */
	$jmpress( 'afterInit', function ( nil, eventData ) {
		var settings = eventData.settings,
			stepSelector = settings.stepSelector,
			current = eventData.current,
			jmpress = $( this );
		current.clickableStepsNamespace = '.jmpress-' + randomString();
		jmpress.bind( 'click' + current.clickableStepsNamespace, function ( event ) {
			if ( ! settings.mouse.clickSelects || current.userZoom ) {
				return;
			}

			// get clicked step
			var clickedStep = $( event.target ).closest( stepSelector );

			// clicks on the active step do default
			if ( clickedStep.is( jmpress.jmpress( 'active' ) ) ) {
				return;
			}

			if ( clickedStep.length ) {
				// select the clicked step
				jmpress.jmpress( 'select', clickedStep[ 0 ], 'click' );
				event.preventDefault();
				event.stopPropagation();
			}
		} );
	} );
	$jmpress( 'afterDeinit', function ( nil, eventData ) {
		$( this ).unbind( eventData.current.clickableStepsNamespace );
	} );
} )( jQuery, document, window );
/*
 * mobile.js
 * Adds support for swipe on touch supported browsers
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress;

	/* FUNCTIONS */
	function randomString() {
		return '' + Math.round( Math.random() * 100000, 0 );
	}

	/* HOOKS */
	$jmpress( 'afterInit', function ( step, eventData ) {
		var settings = eventData.settings,
			current = eventData.current,
			jmpress = eventData.jmpress;
		current.mobileNamespace = '.jmpress-' + randomString();
		var data,
			start = [ 0, 0 ];
		$( settings.fullscreen ? document : jmpress )
			.bind( 'touchstart' + current.mobileNamespace, function ( event ) {
				data = event.originalEvent.touches[ 0 ];
				start = [ data.pageX, data.pageY ];
			} )
			.bind( 'touchmove' + current.mobileNamespace, function ( event ) {
				data = event.originalEvent.touches[ 0 ];
				event.preventDefault();
				return false;
			} )
			.bind( 'touchend' + current.mobileNamespace, function ( event ) {
				var end = [ data.pageX, data.pageY ],
					diff = [ end[ 0 ] - start[ 0 ], end[ 1 ] - start[ 1 ] ];

				if ( Math.max( Math.abs( diff[ 0 ] ), Math.abs( diff[ 1 ] ) ) > 50 ) {
					diff = Math.abs( diff[ 0 ] ) > Math.abs( diff[ 1 ] ) ? diff[ 0 ] : diff[ 1 ];
					$( jmpress ).jmpress( diff > 0 ? 'prev' : 'next' );
					event.preventDefault();
					return false;
				}
			} );
	} );
	$jmpress( 'afterDeinit', function ( nil, eventData ) {
		var settings = eventData.settings,
			current = eventData.current,
			jmpress = eventData.jmpress;
		$( settings.fullscreen ? document : jmpress ).unbind( current.mobileNamespace );
	} );
} )( jQuery, document, window );
/*
 * templates.js
 * The amazing template engine
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress,
		templateFromParentIdent = '_template_',
		templateFromApplyIdent = '_applied_template_';

	/* STATIC VARS */
	var templates = {};

	/* FUNCTIONS */
	function addUndefined( target, values, prefix ) {
		for ( var name in values ) {
			var targetName = name;
			if ( prefix ) {
				targetName = prefix + targetName.substr( 0, 1 ).toUpperCase() + targetName.substr( 1 );
			}
			if ( $.isPlainObject( values[ name ] ) ) {
				addUndefined( target, values[ name ], targetName );
			} else if ( target[ targetName ] === undefined ) {
				target[ targetName ] = values[ name ];
			}
		}
	}
	function applyChildrenTemplates( children, templateChildren ) {
		if ( $.isArray( templateChildren ) ) {
			if ( templateChildren.length < children.length ) {
				$.error( 'more nested steps than children in template' );
			} else {
				children.each( function ( idx, child ) {
					child = $( child );
					var tmpl = child.data( templateFromParentIdent ) || {};
					addUndefined( tmpl, templateChildren[ idx ] );
					child.data( templateFromParentIdent, tmpl );
				} );
			}
		} else if ( $.isFunction( templateChildren ) ) {
			children.each( function ( idx, child ) {
				child = $( child );
				var tmpl = child.data( templateFromParentIdent ) || {};
				addUndefined( tmpl, templateChildren( idx, child, children ) );
				child.data( templateFromParentIdent, tmpl );
			} );
		} // TODO: else if(object)
	}
	function applyTemplate( data, element, template, eventData ) {
		if ( template.children ) {
			var children = element.children( eventData.settings.stepSelector );
			applyChildrenTemplates( children, template.children );
		}
		applyTemplateData( data, template );
	}
	function applyTemplateData( data, template ) {
		addUndefined( data, template );
	}

	/* HOOKS */
	$jmpress( 'beforeInitStep', function ( step, eventData ) {
		step = $( step );
		var data = eventData.data,
			templateFromAttr = data.template,
			templateFromApply = step.data( templateFromApplyIdent ),
			templateFromParent = step.data( templateFromParentIdent );
		if ( templateFromAttr ) {
			$.each( templateFromAttr.split( ' ' ), function ( idx, tmpl ) {
				var template = templates[ tmpl ];
				applyTemplate( data, step, template, eventData );
			} );
		}
		if ( templateFromApply ) {
			applyTemplate( data, step, templateFromApply, eventData );
		}
		if ( templateFromParent ) {
			applyTemplate( data, step, templateFromParent, eventData );
			step.data( templateFromParentIdent, null );
			if ( templateFromParent.template ) {
				$.each( templateFromParent.template.split( ' ' ), function ( idx, tmpl ) {
					var template = templates[ tmpl ];
					applyTemplate( data, step, template, eventData );
				} );
			}
		}
	} );
	$jmpress( 'beforeInit', function ( nil, eventData ) {
		var data = $jmpress( 'dataset', this ),
			dataTemplate = data.template,
			stepSelector = eventData.settings.stepSelector;
		if ( dataTemplate ) {
			var template = templates[ dataTemplate ];
			applyChildrenTemplates(
				$( this )
					.find( stepSelector )
					.filter( function () {
						return ! $( this ).parent().is( stepSelector );
					} ),
				template.children
			);
		}
	} );

	/* EXPORTED FUNCTIONS */
	$jmpress( 'register', 'template', function ( name, tmpl ) {
		if ( templates[ name ] ) {
			templates[ name ] = $.extend( true, {}, templates[ name ], tmpl );
		} else {
			templates[ name ] = $.extend( true, {}, tmpl );
		}
	} );
	$jmpress( 'register', 'apply', function ( selector, tmpl ) {
		if ( ! tmpl ) {
			// TODO ERROR because settings not found
			var stepSelector = $( this ).jmpress( 'settings' ).stepSelector;
			applyChildrenTemplates(
				$( this )
					.find( stepSelector )
					.filter( function () {
						return ! $( this ).parent().is( stepSelector );
					} ),
				selector
			);
		} else if ( $.isArray( tmpl ) ) {
			applyChildrenTemplates( $( selector ), tmpl );
		} else {
			var template;
			if ( typeof tmpl === 'string' ) {
				template = templates[ tmpl ];
			} else {
				template = $.extend( true, {}, tmpl );
			}
			$( selector ).each( function ( idx, element ) {
				element = $( element );
				var tmpl = element.data( templateFromApplyIdent ) || {};
				addUndefined( tmpl, template );
				element.data( templateFromApplyIdent, tmpl );
			} );
		}
	} );
} )( jQuery, document, window );
/*
 * jqevents.js
 * Fires jQuery events
 */
( function ( $, document, window, undefined ) {
	'use strict';

	/* HOOKS */
	// the events should not bubble up the tree
	// elsewise nested jmpress would cause buggy behavior
	$.jmpress( 'setActive', function ( step, eventData ) {
		if ( eventData.prevStep !== step ) {
			$( step ).triggerHandler( 'enterStep' );
		}
	} );
	$.jmpress( 'setInactive', function ( step, eventData ) {
		if ( eventData.nextStep !== step ) {
			$( step ).triggerHandler( 'leaveStep' );
		}
	} );
} )( jQuery, document, window );
/*
 * animation.js
 * Apply custom animations to steps
 */
( function ( $, document, window, undefined ) {
	'use strict';

	function parseSubstepInfo( str ) {
		var arr = str.split( ' ' );
		var className = arr[ 0 ];
		var config = {
			willClass: 'will-' + className,
			doClass: 'do-' + className,
			hasClass: 'has-' + className,
		};
		var state = '';
		for ( var i = 1; i < arr.length; i++ ) {
			var s = arr[ i ];
			switch ( state ) {
				case '':
					if ( s === 'after' ) {
						state = 'after';
					} else {
						$.warn( "unknown keyword in '" + str + "'. '" + s + "' unknown." );
					}
					break;
				case 'after':
					if ( s.match( /^[1-9][0-9]*m?s?/ ) ) {
						var value = parseFloat( s );
						if ( s.indexOf( 'ms' ) !== -1 ) {
							value *= 1;
						} else if ( s.indexOf( 's' ) !== -1 ) {
							value *= 1000;
						} else if ( s.indexOf( 'm' ) !== -1 ) {
							value *= 60000;
						}
						config.delay = value;
					} else {
						config.after = Array.prototype.slice.call( arr, i ).join( ' ' );
						i = arr.length;
					}
			}
		}
		return config;
	}
	function find( array, selector, start, end ) {
		end = end || array.length - 1;
		start = start || 0;
		for ( var i = start; i < end + 1; i++ ) {
			if ( $( array[ i ].element ).is( selector ) ) {
				return i;
			}
		}
	}
	function addOn( list, substep, delay ) {
		$.each( substep._on, function ( idx, child ) {
			list.push( { substep: child.substep, delay: child.delay + delay } );
			addOn( list, child.substep, child.delay + delay );
		} );
	}
	$.jmpress( 'defaults' ).customAnimationDataAttribute = 'jmpress';
	$.jmpress( 'afterInit', function ( nil, eventData ) {
		eventData.current.animationTimeouts = [];
		eventData.current.animationCleanupWaiting = [];
	} );
	$.jmpress( 'applyStep', function ( step, eventData ) {
		// read custom animation from elements
		var substepsData = {};
		var listOfSubsteps = [];
		$( step )
			.find( '[data-' + eventData.settings.customAnimationDataAttribute + ']' )
			.each( function ( idx, element ) {
				if ( $( element ).closest( eventData.settings.stepSelector ).is( step ) ) {
					listOfSubsteps.push( { element: element } );
				}
			} );
		if ( listOfSubsteps.length === 0 ) {
			return;
		}
		$.each( listOfSubsteps, function ( idx, substep ) {
			substep.info = parseSubstepInfo(
				$( substep.element ).data( eventData.settings.customAnimationDataAttribute )
			);
			$( substep.element ).addClass( substep.info.willClass );
			substep._on = [];
			substep._after = null;
		} );
		var current = { _after: undefined, _on: [], info: {} }; // virtual zero step
		$.each( listOfSubsteps, function ( idx, substep ) {
			var other = substep.info.after;
			if ( other ) {
				if ( other === 'step' ) {
					other = current;
				} else if ( other === 'prev' ) {
					other = listOfSubsteps[ idx - 1 ];
				} else {
					var index = find( listOfSubsteps, other, 0, idx - 1 );
					if ( index === undefined ) {
						index = find( listOfSubsteps, other );
					}
					other =
						index === undefined || index === idx
							? listOfSubsteps[ idx - 1 ]
							: listOfSubsteps[ index ];
				}
			} else {
				other = listOfSubsteps[ idx - 1 ];
			}
			if ( other ) {
				if ( ! substep.info.delay ) {
					if ( ! other._after ) {
						other._after = substep;
						return;
					}
					other = other._after;
				}
				other._on.push( { substep: substep, delay: substep.info.delay || 0 } );
			}
		} );
		if ( current._after === undefined && current._on.length === 0 ) {
			var startStep = find( listOfSubsteps, eventData.stepData.startSubstep ) || 0;
			current._after = listOfSubsteps[ startStep ];
		}
		var substepsInOrder = [];
		function findNextFunc( idx, item ) {
			if ( item.substep._after ) {
				current = item.substep._after;
				return false;
			}
		}
		do {
			var substepList = [ { substep: current, delay: 0 } ];
			addOn( substepList, current, 0 );
			substepsInOrder.push( substepList );
			current = null;
			$.each( substepList, findNextFunc );
		} while ( current );
		substepsData.list = substepsInOrder;
		$( step ).data( 'substepsData', substepsData );
	} );
	$.jmpress( 'unapplyStep', function ( step, eventData ) {
		var substepsData = $( step ).data( 'substepsData' );
		if ( substepsData ) {
			$.each( substepsData.list, function ( idx, activeSubsteps ) {
				$.each( activeSubsteps, function ( idx, substep ) {
					if ( substep.substep.info.willClass ) {
						$( substep.substep.element ).removeClass( substep.substep.info.willClass );
					}
					if ( substep.substep.info.hasClass ) {
						$( substep.substep.element ).removeClass( substep.substep.info.hasClass );
					}
					if ( substep.substep.info.doClass ) {
						$( substep.substep.element ).removeClass( substep.substep.info.doClass );
					}
				} );
			} );
		}
	} );
	$.jmpress( 'setActive', function ( step, eventData ) {
		var substepsData = $( step ).data( 'substepsData' );
		if ( ! substepsData ) {
			return;
		}
		if ( eventData.substep === undefined ) {
			eventData.substep = eventData.reason === 'prev' ? substepsData.list.length - 1 : 0;
		}
		var substep = eventData.substep;
		$.each( eventData.current.animationTimeouts, function ( idx, timeout ) {
			clearTimeout( timeout );
		} );
		eventData.current.animationTimeouts = [];
		$.each( substepsData.list, function ( idx, activeSubsteps ) {
			var applyHas = idx < substep;
			var applyDo = idx <= substep;
			$.each( activeSubsteps, function ( idx, substep ) {
				if ( substep.substep.info.hasClass ) {
					$( substep.substep.element )[ ( applyHas ? 'add' : 'remove' ) + 'Class' ](
						substep.substep.info.hasClass
					);
				}
				function applyIt() {
					$( substep.substep.element ).addClass( substep.substep.info.doClass );
				}
				if ( applyDo && ! applyHas && substep.delay && eventData.reason !== 'prev' ) {
					if ( substep.substep.info.doClass ) {
						$( substep.substep.element ).removeClass( substep.substep.info.doClass );
						eventData.current.animationTimeouts.push( setTimeout( applyIt, substep.delay ) );
					}
				} else {
					if ( substep.substep.info.doClass ) {
						$( substep.substep.element )[ ( applyDo ? 'add' : 'remove' ) + 'Class' ](
							substep.substep.info.doClass
						);
					}
				}
			} );
		} );
	} );
	$.jmpress( 'setInactive', function ( step, eventData ) {
		if ( eventData.nextStep === step ) {
			return;
		}
		function cleanupAnimation( substepsData ) {
			$.each( substepsData.list, function ( idx, activeSubsteps ) {
				$.each( activeSubsteps, function ( idx, substep ) {
					if ( substep.substep.info.hasClass ) {
						$( substep.substep.element ).removeClass( substep.substep.info.hasClass );
					}
					if ( substep.substep.info.doClass ) {
						$( substep.substep.element ).removeClass( substep.substep.info.doClass );
					}
				} );
			} );
		}
		$.each( eventData.current.animationCleanupWaiting, function ( idx, item ) {
			cleanupAnimation( item );
		} );
		eventData.current.animationCleanupWaiting = [];
		var substepsData = $( step ).data( 'substepsData' );
		if ( substepsData ) {
			eventData.current.animationCleanupWaiting.push( substepsData );
		}
	} );
	$.jmpress( 'selectNext', function ( step, eventData ) {
		if ( eventData.substep === undefined ) {
			return;
		}
		var substepsData = $( step ).data( 'substepsData' );
		if ( ! substepsData ) {
			return;
		}
		if ( eventData.substep < substepsData.list.length - 1 ) {
			return { step: step, substep: eventData.substep + 1 };
		}
	} );
	$.jmpress( 'selectPrev', function ( step, eventData ) {
		if ( eventData.substep === undefined ) {
			return;
		}
		var substepsData = $( step ).data( 'substepsData' );
		if ( ! substepsData ) {
			return;
		}
		if ( eventData.substep > 0 ) {
			return { step: step, substep: eventData.substep - 1 };
		}
	} );
} )( jQuery, document, window );
/*
 * jmpress.toggle plugin
 * For binding a key to toggle de/initialization of jmpress.js.
 */
/*!
 * plugin for jmpress.js v0.4.5
 *
 * Copyright 2013 Kyle Robinson Young @shama & Tobias Koppers @sokra
 * Licensed MIT
 * http://www.opensource.org/licenses/mit-license.php
 */ ( function ( $, document, window, undefined ) {
	'use strict';
	$.jmpress( 'register', 'toggle', function ( key, config, initial ) {
		var jmpress = this;
		$( document ).bind( 'keydown', function ( event ) {
			if ( event.keyCode === key ) {
				if ( $( jmpress ).jmpress( 'initialized' ) ) {
					$( jmpress ).jmpress( 'deinit' );
				} else {
					$( jmpress ).jmpress( config );
				}
			}
		} );
		if ( initial ) {
			$( jmpress ).jmpress( config );
		}
	} );
} )( jQuery, document, window );

/*
 * jmpress.secondary plugin
 * Apply a secondary animation when step is selected.
 */
( function ( $, document, window, undefined ) {
	'use strict';
	$.jmpress( 'initStep', function ( step, eventData ) {
		for ( var name in eventData.data ) {
			if ( name.indexOf( 'secondary' ) === 0 ) {
				eventData.stepData[ name ] = eventData.data[ name ];
			}
		}
	} );
	function exchangeIf( childStepData, condition, step ) {
		if (
			childStepData.secondary &&
			childStepData.secondary.split( ' ' ).indexOf( condition ) !== -1
		) {
			for ( var name in childStepData ) {
				if ( name.length > 9 && name.indexOf( 'secondary' ) === 0 ) {
					var tmp = childStepData[ name ];
					var normal = name.substr( 9 );
					normal = normal.substr( 0, 1 ).toLowerCase() + normal.substr( 1 );
					childStepData[ name ] = childStepData[ normal ];
					childStepData[ normal ] = tmp;
				}
			}
			$( this ).jmpress( 'reapply', $( step ) );
		}
	}
	$.jmpress( 'beforeActive', function ( step, eventData ) {
		exchangeIf.call( eventData.jmpress, $( step ).data( 'stepData' ), 'self', step );
		var parent = $( step ).parent();
		$( parent )
			.children( eventData.settings.stepSelector )
			.each( function ( idx, child ) {
				var childStepData = $( child ).data( 'stepData' );
				exchangeIf.call( eventData.jmpress, childStepData, 'siblings', child );
			} );
		function grandchildrenFunc( idx, child ) {
			var childStepData = $( child ).data( 'stepData' );
			exchangeIf.call( eventData.jmpress, childStepData, 'grandchildren', child );
		}
		for ( var i = 1; i < eventData.parents.length; i++ ) {
			$( eventData.parents[ i ] ).children( eventData.settings.stepSelector ).each();
		}
	} );
	$.jmpress( 'setInactive', function ( step, eventData ) {
		exchangeIf.call( eventData.jmpress, $( step ).data( 'stepData' ), 'self', step );
		var parent = $( step ).parent();
		$( parent )
			.children( eventData.settings.stepSelector )
			.each( function ( idx, child ) {
				var childStepData = $( child ).data( 'stepData' );
				exchangeIf.call( eventData.jmpress, childStepData, 'siblings', child );
			} );
		function grandchildrenFunc( idx, child ) {
			var childStepData = $( child ).data( 'stepData' );
			exchangeIf.call( eventData.jmpress, childStepData, 'grandchildren', child );
		}
		for ( var i = 1; i < eventData.parents.length; i++ ) {
			$( eventData.parents[ i ] )
				.children( eventData.settings.stepSelector )
				.each( grandchildrenFunc );
		}
	} );
} )( jQuery, document, window );

/*
 * jmpress.duration plugin
 * For auto advancing steps after a given duration and optionally displaying a
 * progress bar.
 */
( function ( $, document, window, undefined ) {
	'use strict';

	$.jmpress( 'defaults' ).duration = {
		defaultValue: -1,
		defaultAction: 'next',
		barSelector: undefined,
		barProperty: 'width',
		barPropertyStart: '0',
		barPropertyEnd: '100%',
	};
	$.jmpress( 'initStep', function ( step, eventData ) {
		eventData.stepData.duration =
			eventData.data.duration && parseInt( eventData.data.duration, 10 );
		eventData.stepData.durationAction = eventData.data.durationAction;
	} );
	$.jmpress( 'setInactive', function ( step, eventData ) {
		var settings = eventData.settings,
			durationSettings = settings.duration,
			current = eventData.current;
		var dur = eventData.stepData.duration || durationSettings.defaultValue;
		if ( current.durationTimeout ) {
			if ( durationSettings.barSelector ) {
				var css = {
					transitionProperty: durationSettings.barProperty,
					transitionDuration: '0',
					transitionDelay: '0',
					transitionTimingFunction: 'linear',
				};
				css[ durationSettings.barProperty ] = durationSettings.barPropertyStart;
				var bars = $( durationSettings.barSelector );
				$.jmpress( 'css', bars, css );
				bars.each( function ( idx, element ) {
					var next = $( element ).next();
					var parent = $( element ).parent();
					$( element ).detach();
					if ( next.length ) {
						next.insertBefore( element );
					} else {
						parent.append( element );
					}
				} );
			}
			clearTimeout( current.durationTimeout );
			delete current.durationTimeout;
		}
	} );
	$.jmpress( 'setActive', function ( step, eventData ) {
		var settings = eventData.settings,
			durationSettings = settings.duration,
			current = eventData.current;
		var dur = eventData.stepData.duration || durationSettings.defaultValue;
		if ( dur && dur > 0 ) {
			if ( durationSettings.barSelector ) {
				var css = {
					transitionProperty: durationSettings.barProperty,
					transitionDuration: dur - ( settings.transitionDuration * 2 ) / 3 - 100 + 'ms',
					transitionDelay: ( settings.transitionDuration * 2 ) / 3 + 'ms',
					transitionTimingFunction: 'linear',
				};
				css[ durationSettings.barProperty ] = durationSettings.barPropertyEnd;
				$.jmpress( 'css', $( durationSettings.barSelector ), css );
			}
			var jmpress = this;
			if ( current.durationTimeout ) {
				clearTimeout( current.durationTimeout );
				current.durationTimeout = undefined;
			}
			current.durationTimeout = setTimeout( function () {
				var action = eventData.stepData.durationAction || durationSettings.defaultAction;
				$( jmpress ).jmpress( action );
			}, dur );
		}
	} );
} )( jQuery, document, window );

/*
 * jmpress.presentation-mode plugin
 * Display a window for the presenter with notes and a control and view of the
 * presentation
 */
( function ( $, document, window, undefined ) {
	'use strict';
	var $jmpress = $.jmpress;

	var PREFIX = 'jmpress-presentation-';

	/* FUNCTIONS */
	function randomString() {
		return '' + Math.round( Math.random() * 100000, 0 );
	}

	/* DEFAULTS */
	$jmpress( 'defaults' ).presentationMode = {
		use: true,
		url: 'presentation-screen.html',
		notesUrl: false,
		transferredValues: [ 'userZoom', 'userTranslateX', 'userTranslateY' ],
	};
	$jmpress( 'defaults' ).keyboard.keys[ 80 ] = 'presentationPopup'; // p key

	/* HOOKS */
	$jmpress( 'afterInit', function ( nil, eventData ) {
		var current = eventData.current;

		current.selectMessageListeners = [];

		if ( eventData.settings.presentationMode.use ) {
			window.addEventListener( 'message', function ( event ) {
				// We do not test orgin, because we want to accept messages
				// from all orgins
				try {
					if ( typeof event.data !== 'string' || event.data.indexOf( PREFIX ) !== 0 ) {
						return;
					}
					var json = JSON.parse( event.data.slice( PREFIX.length ) );
					switch ( json.type ) {
						case 'select':
							$.each( eventData.settings.presentationMode.transferredValues, function (
								idx,
								name
							) {
								eventData.current[ name ] = json[ name ];
							} );
							if (
								/[a-z0-9\-]+/i.test( json.targetId ) &&
								typeof json.substep in { number: 1, undefined: 1 }
							) {
								$( eventData.jmpress ).jmpress(
									'select',
									{ step: '#' + json.targetId, substep: json.substep },
									json.reason
								);
							} else {
								$.error(
									'For security reasons the targetId must match /[a-z0-9\\-]+/i and substep must be a number.'
								);
							}
							break;
						case 'listen':
							current.selectMessageListeners.push( event.source );
							break;
						case 'ok':
							clearTimeout( current.presentationPopupTimeout );
							break;
						case 'read':
							try {
								event.source.postMessage(
									PREFIX +
										JSON.stringify( {
											type: 'url',
											url: window.location.href,
											notesUrl: eventData.settings.presentationMode.notesUrl,
										} ),
									'*'
								);
							} catch ( e ) {
								$.error( 'Cannot post message to source: ' + e );
							}
							break;
						default:
							throw 'Unknown message type: ' + json.type;
					}
				} catch ( e ) {
					$.error( 'Received message is malformed: ' + e );
				}
			} );
			try {
				if ( window.parent && window.parent !== window ) {
					window.parent.postMessage(
						PREFIX +
							JSON.stringify( {
								type: 'afterInit',
							} ),
						'*'
					);
				}
			} catch ( e ) {
				$.error( 'Cannot post message to parent: ' + e );
			}
		}
	} );
	$jmpress( 'afterDeinit', function ( nil, eventData ) {
		if ( eventData.settings.presentationMode.use ) {
			try {
				if ( window.parent && window.parent !== window ) {
					window.parent.postMessage(
						PREFIX +
							JSON.stringify( {
								type: 'afterDeinit',
							} ),
						'*'
					);
				}
			} catch ( e ) {
				$.error( 'Cannot post message to parent: ' + e );
			}
		}
	} );
	$jmpress( 'setActive', function ( step, eventData ) {
		var stepId = $( eventData.delegatedFrom ).attr( 'id' ),
			substep = eventData.substep,
			reason = eventData.reason;
		$.each( eventData.current.selectMessageListeners, function ( idx, listener ) {
			try {
				var msg = {
					type: 'select',
					targetId: stepId,
					substep: substep,
					reason: reason,
				};
				$.each( eventData.settings.presentationMode.transferredValues, function ( idx, name ) {
					msg[ name ] = eventData.current[ name ];
				} );
				listener.postMessage( PREFIX + JSON.stringify( msg ), '*' );
			} catch ( e ) {
				$.error( 'Cannot post message to listener: ' + e );
			}
		} );
	} );
	$jmpress( 'register', 'presentationPopup', function () {
		function trySend() {
			jmpress.jmpress( 'current' ).presentationPopupTimeout = setTimeout( trySend, 100 );
			try {
				popup.postMessage(
					PREFIX +
						JSON.stringify( {
							type: 'url',
							url: window.location.href,
							notesUrl: jmpress.jmpress( 'settings' ).presentationMode.notesUrl,
						} ),
					'*'
				);
			} catch ( e ) {}
		}
		var jmpress = $( this ),
			popup;
		if ( jmpress.jmpress( 'settings' ).presentationMode.use ) {
			popup = window.open( $( this ).jmpress( 'settings' ).presentationMode.url );
			jmpress.jmpress( 'current' ).presentationPopupTimeout = setTimeout( trySend, 100 );
		}
	} );
} )( jQuery, document, window );