├── README.md ├── assets ├── css │ └── checkbox3s.css └── js │ ├── checkbox3s.js │ ├── flashMessage.js │ └── pswd.js ├── bower.json ├── composer.json ├── lib └── Lohini │ ├── Application │ └── UI │ │ ├── Form.php │ │ └── Presenter.php │ ├── Bridges │ ├── Framework │ │ └── LohiniExtension.php │ └── Latte │ │ └── Extension.php │ ├── Forms │ └── Controls │ │ ├── Checkbox3S.php │ │ ├── PswdInput.php │ │ └── ResetButton.php │ ├── Framework.php │ ├── Latte │ ├── Filters.php │ └── Macros │ │ └── CoreMacros.php │ ├── Templating │ ├── ITemplateFilesFormatter.php │ └── TemplateFilesFormatter.php │ └── Utils │ └── Network.php └── license.md /README.md: -------------------------------------------------------------------------------- 1 | Lohini/framework [![Build Status](https://secure.travis-ci.org/Lohini/framework.png?branch=master)](http://travis-ci.org/Lohini/framework) 2 | ========================== 3 | The aim of this project is integration of interesting technologies and options to Nette Framework. 4 | 5 | Requirements 6 | ------------ 7 | - PHP 5.4.0 or later with PDO 8 | - [Nette Framework 2.1.x-dev](https://github.com/nette/nette) 9 | 10 | ----- 11 | repository: https://github.com/Lohini/framework 12 | homepage: http://www.lohini.net 13 | -------------------------------------------------------------------------------- /assets/css/checkbox3s.css: -------------------------------------------------------------------------------- 1 | .cb3s { 2 | width: 16px; 3 | height: 16px; 4 | display: block; 5 | text-indent: -99999px; 6 | overflow: hidden; 7 | background-repeat: no-repeat; 8 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfdDB0IORAY1wt0AAAA50lEQVRIx+2SsZHCMBBFn6RdiZAGKOAaIHYzFHCVUAAzCiiExL2QUMQS2IBvbNkW2Q38SF7Ne1rJ645GIb+OFRE4TG6cWBcBuAwKDiWyhxoB7J6finKFWgGAR4gIMiyuFXgCgYgieGKtQEgISkJwwKZWoCQiihLgHYGgCIGAx2FofQedwOMBV/+IiRuJSERwWH+RCsEP70fWD+03H5hmVNli5H6dMbbzuI0UhvWK3K9ncRsp8lPxUk02PY0PFQW8Q8r43y6KTc/h50EHbUmxjOclRVN42hfWlv5CM4N3c/A4tV2ag3+VO17xX0iAzcg2AAAAAElFTkSuQmCC); 9 | } 10 | .cb3s-cb { 11 | background-position: 2px 2px; 12 | } 13 | .cb3s-check { 14 | background-position: 0 -16px; 15 | } 16 | .cb3s-blank { 17 | background-position: 16px 16px; 18 | } 19 | .cb3s-close { 20 | background-position: -16px -16px; 21 | } 22 | .cb3s-disabled { 23 | opacity: .35; 24 | filter: Alpha(Opacity=35); 25 | background-image: none; 26 | } 27 | .cb3s-disabled .cb3s { 28 | filter:Alpha(Opacity=35); 29 | } 30 | -------------------------------------------------------------------------------- /assets/js/checkbox3s.js: -------------------------------------------------------------------------------- 1 | // vim: ts=4 sw=4 ai: 2 | /** 3 | * This file is part of Lohini (http://lohini.net) 4 | * 5 | * @copyright (c) 2010, 2014 Lopo 6 | */ 7 | (function($, undefined) { 8 | 9 | $.nette.ext('checkbox3s', { 10 | load: function() { 11 | $('body').off('change', 'input[type=checkbox].checkbox3s'); 12 | $('body').on('change', 'input[type=checkbox].checkbox3s', this.changeFn); 13 | $('input[type=checkbox].checkbox3s') 14 | .hide() 15 | .each(this.wrapFn); 16 | }, 17 | before: function(settings, ui, e) { 18 | var h, data={}; 19 | $(this.deserializeFn(ui.data)).each(function() { 20 | if (data[this.name]==undefined) { 21 | h=$('input[type=hidden][name="'+this.name+'"]'); 22 | data[this.name]= h[0]!=undefined 23 | ? h.val() 24 | : this.value; 25 | } 26 | }); 27 | ui.data=$.param(data); 28 | } 29 | }, { 30 | wrapFn: function() { 31 | var b=$(this), 32 | s=b.parent(), 33 | ext=$.nette.ext('checkbox3s'); 34 | if (s.data('wrapped')) { 35 | return true; 36 | } 37 | s.data('wrapped', true); 38 | s.addClass('cb3s-cb'); 39 | $('') 40 | .click(ext.clickFn) 41 | .on('contextmenu', ext.rClickFn) 42 | .prependTo(s); 43 | $('') 44 | .attr({ 45 | type: 'hidden', 46 | name: b.attr('name'), 47 | value: b.data('lohini-state') 48 | }) 49 | .appendTo(s); 50 | if (b.is(':disabled')) { 51 | s.addClass('cb3s-disabled'); 52 | } 53 | ext.updateFn(this); 54 | }, 55 | changeFn: function(e) { 56 | if ($(this).is(':disabled')) { 57 | $(this).children('input[type=checkbox].checkbox3s').addClass('cb3s-disabled'); 58 | } 59 | else { 60 | $(this).children('input[type=checkbox].checkbox3s').removeClass('cb3s-disabled'); 61 | } 62 | }, 63 | clickFn: function() { 64 | var p=$(this).parent(); 65 | if (p.children('input[type=checkbox]').is(':disabled')) { 66 | return; 67 | } 68 | var dh=p.children('input[type=hidden]'), 69 | state=parseInt(dh.val()); 70 | if (state==1) { 71 | state=-1; 72 | } 73 | else { 74 | state++; 75 | } 76 | dh.val(state); 77 | $.nette.ext('checkbox3s').updateFn(this); 78 | }, 79 | rClickFn: function(e) { 80 | e.stopImmediatePropagation(); 81 | e.preventDefault(); 82 | var p=$(this).parent(); 83 | if (p.children('input[type=checkbox]').is(':disabled')) { 84 | return; 85 | } 86 | var dh=p.children('input[type=hidden]'), 87 | state=parseInt(dh.val()); 88 | if (state==-1) { 89 | state=1; 90 | } 91 | else { 92 | state--; 93 | } 94 | dh.val(state); 95 | $.nette.ext('checkbox3s').updateFn(this); 96 | }, 97 | updateFn: function(el) { 98 | var p=$(el).parent(), 99 | nb=p.children('span'); 100 | switch (parseInt(p.children('input[type=hidden]').val())) { 101 | case -1: 102 | nb.removeClass('cb3s-check').removeClass('cb3s-blank').addClass('cb3s-close'); 103 | break; 104 | case 0: 105 | nb.removeClass('cb3s-close').removeClass('cb3s-check').addClass('cb3s-blank'); 106 | break; 107 | case 1: 108 | nb.removeClass('cb3s-close').removeClass('cb3s-blank').addClass('cb3s-check'); 109 | break; 110 | } 111 | }, 112 | deserializeFn: function(data) { // https://github.com/kflorence/jquery-deserialize 113 | if (data===undefined) { 114 | return []; 115 | } 116 | var parts, ret=[]; 117 | data=data.split('&'); 118 | for (var i=0, length=data.length; i 6 | * @author Lopo 7 | * @note based on part of datagrid.js from romansklenar/nette-datagrid 8 | */ 9 | (function($, undefined) { 10 | 11 | /** 12 | * Flash message fade-out effect 13 | */ 14 | $.nette.ext('flashMessage', { 15 | load: function() { 16 | setTimeout(this.timeoutFn, this.timeout, $(this.flashSelector)); 17 | } 18 | }, { 19 | flashSelector: 'div.flash', 20 | timeout: 5000, 21 | timeoutFn: function(el) { 22 | el 23 | .animate({opacity: 0}, 2000) 24 | .slideUp(); 25 | } 26 | }); 27 | 28 | })(jQuery); 29 | -------------------------------------------------------------------------------- /assets/js/pswd.js: -------------------------------------------------------------------------------- 1 | // vim: ts=4 sw=4 ai: 2 | /** 3 | * This file is part of Lohini (http://lohini.net) 4 | * 5 | * @copyright (c) 2010, 2014 Lopo 6 | */ 7 | (function($, undefined) { 8 | 9 | $.nette.ext('pswd', { 10 | load: function() { 11 | $('input[type=password].pswdinput').each(this.wrapFn); 12 | } 13 | }, { 14 | wrapFn: function() { 15 | var p=$(this); 16 | if (p.data('wrapped')) { 17 | return true; 18 | } 19 | var self=$.nette.ext('pswd'); 20 | p.data('wrapped', true); 21 | var data=$.extend({}, self.data, p.data('lohini-pswd')); 22 | if (data.useMasked) { 23 | p.attr('autocomplete', 'off').hide(); 24 | if (data.rstMasked) { 25 | p.val(''); 26 | } 27 | var t=$('') 28 | .attr({ 29 | type: 'text', 30 | autocomplete: 'off' 31 | }) 32 | .insertAfter(p); 33 | var h=$('') 34 | .attr('name', p.attr('name')) 35 | .insertAfter(p), 36 | _w=window, 37 | m=true, 38 | tr=null; 39 | 40 | t.focus(function() { 41 | if (tr===null) { 42 | if ($.browser.msie) { 43 | tr=_w.setInterval(function() { 44 | var t0=t.get(0), 45 | r=t0.createTextRange(), 46 | vl=t.val().length, 47 | ch='character'; 48 | r.moveEnd(ch, vl); 49 | r.moveStart(ch, vl); 50 | r.select(); 51 | }, 52 | 100); 53 | } 54 | else { 55 | tr=_w.setInterval(function() { 56 | var vl=t.val().length, 57 | t0=t.get(0); 58 | if (!(t0.selectionEnd===vl && t0.selectionStart<=vl)) { 59 | t0.selectionStart=vl; 60 | t0.selectionEnd=vl; 61 | } 62 | }, 63 | 100); 64 | } 65 | } 66 | }); 67 | 68 | t.bind('input change', function() { 69 | m=false; 70 | self.maskingFn(p, m); 71 | }); 72 | t.bind('propertychange', function() { self.maskingFn(p, m);}); 73 | t.keyup(function(e) { 74 | if (!/^(9|1[678]|224|3[789]|40)$/.test(e.keyCode.toString())) { 75 | m=false; 76 | self.maskingFn(p, m); 77 | } 78 | }); 79 | t.blur(function() { 80 | _w.clearInterval(tr); 81 | tr=null; 82 | m=true; 83 | self.maskingFn(p, m); 84 | }); 85 | if (data.rstMasked) { 86 | $('#'+data.fid).get(0).reset(); 87 | } 88 | } 89 | else { 90 | if (data.useWarning) { 91 | var wn=$('') 92 | .attr({ 93 | title: data.clWarning 94 | }) 95 | .css({ 96 | background: 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAsklEQVQ4y8WSPQ7CMAyFP1fcKAdghwV1YGXpCuIoCNQDsDLRARYmDtAzPZZUipxUFHXgjbbfTxybJOZg4Qu92QrYAjvXugK3ID3ToqUJerM9cP5iegjSJROIzo+JyddDkiop1n4qSBYkKwjUpQTyZLebYr8q5Su5jiTJfyF1G0jePUXFTKQC7Q+8tiTQlZ4yEr/LBIL0ApoJ7k2czS8xui6BDXB0xBNwD9J79JTnLvE/Ah+vrUwPO4xnIwAAAABJRU5ErkJggg==)', 97 | display: 'block', 98 | overflow: 'hidden', 99 | 'background-repeat': 'no-repeat', 100 | position: 'absolute', 101 | left: '100%', 102 | top: '50%', 103 | margin: '-8px 0 0 -16px', 104 | width: '16px', 105 | height: '16px', 106 | 'text-indent': '-100em' 107 | }) 108 | .hide() 109 | .insertAfter(p); 110 | p.keypress(function(e) { 111 | var cc=e.charCode, 112 | character; 113 | if (typeof cc===undefined) { 114 | cc=e.keyCode; 115 | } 116 | character=String.fromCharCode(cc); 117 | if ((/^[A-Z]$/.test(character) && !e.shiftKey) || (/^[a-z]$/.test(character) && e.shiftKey)) { 118 | wn.show(); 119 | } 120 | else if (wn.is(':visible')) { 121 | wn.hide(); 122 | } 123 | }); 124 | p.blur(function() { 125 | if (wn.is(':visible')) { 126 | wn.hide(); 127 | } 128 | }); 129 | p.keydown(function(e) { 130 | if (e.keyCode===20 && wn.is(':visible')) { 131 | wn.hide(); 132 | } 133 | }); 134 | } 135 | if (data.useShow) { 136 | var t=$('') 137 | .attr({ 138 | id: 'tf-'+p.attr('id'), 139 | type: 'text', 140 | autocomplete: 'off', 141 | 'class': p.attr('class') 142 | }) 143 | .hide() 144 | .insertAfter(p); 145 | var cb=$('') 146 | .attr({ 147 | type: 'checkbox', 148 | title: data.cbDesc 149 | }); 150 | $('