1 var uzblid = 'uzbl_link_hint';
2 var uzbldivid = uzblid + '_div_container';
5 var links = document.links;
6 var forms = document.forms;
8 HTMLElement.prototype.click = function() {
9 if (typeof this.onclick == 'function') {
16 function keyPressHandler(e) {
17 var kC = window.event ? event.keyCode: e.keyCode;
18 var Esc = window.event ? 27 : e.DOM_VK_ESCAPE;
23 function elementPosition(el) {
24 var up = el.offsetTop;
25 var left = el.offsetLeft;
26 var width = el.offsetWidth;
27 var height = el.offsetHeight;
28 while (el.offsetParent) {
31 left += el.offsetLeft;
33 return [up, left, width, height];
35 function isVisible(el) {
46 if (el.style.display == 'none') {
49 if (el.style.visibility == 'hidden') {
53 return isVisible(el.parentNode);
55 function elementInViewport(el) {
56 offset = elementPosition(el);
59 var width = offset[2];
60 var height = offset[3];
61 return up < window.pageYOffset + window.innerHeight && left < window.pageXOffset + window.innerWidth && (up + height) > window.pageYOffset && (left + width) > window.pageXOffset;
63 function removeAllHints() {
64 var elements = doc.getElementById(uzbldivid);
66 elements.parentNode.removeChild(elements);
69 function generateHint(el, label) {
70 var pos = elementPosition(el);
71 var hint = doc.createElement('div');
72 hint.setAttribute('name', uzblid);
73 hint.innerText = label;
74 hint.style.display = 'inline';
75 hint.style.backgroundColor = '#B9FF00';
76 hint.style.border = '2px solid #4A6600';
77 hint.style.color = 'black';
78 hint.style.zIndex = '1000';
79 hint.style.fontSize = '9px';
80 hint.style.fontWeight = 'bold';
81 hint.style.lineHeight = '9px';
82 hint.style.margin = '0px';
83 hint.style.padding = '1px';
84 hint.style.position = 'absolute';
85 hint.style.left = pos[1] + 'px';
86 hint.style.top = pos[0] + 'px';
87 var img = el.getElementsByTagName('img');
89 hint.style.left = pos[1] + img[0].width / 2 + 'px';
91 hint.style.textDecoration = 'none';
92 hint.style.webkitBorderRadius = '6px';
93 hint.style.webkitTransform = 'scale(1) rotate(0deg) translate(-6px,-5px)';
96 function clickElem(item) {
99 var name = item.tagName;
102 window.location = item.href;
103 } else if (name == 'INPUT') {
104 var type = item.getAttribute('type').toUpperCase();
105 if (type == 'TEXT' || type == 'FILE' || type == 'PASSWORD') {
111 } else if (name == 'TEXTAREA' || name == 'SELECT') {
116 window.location = item.href;
120 function addLinks() {
122 for (var l = 0; l < links.length; l++) {
124 if (isVisible(li) && elementInViewport(li)) {
126 res[1].push(li.innerText.toLowerCase());
131 function addFormElems() {
133 for (var f = 0; f < forms.length; f++) {
134 for (var e = 0; e < forms[f].elements.length; e++) {
135 var el = forms[f].elements[e];
136 if (el && ['INPUT', 'TEXTAREA', 'SELECT'].indexOf(el.tagName) + 1 && isVisible(el) && elementInViewport(el)) {
138 if (el.getAttribute('value')) {
139 res[1].push(el.getAttribute('value').toLowerCase());
141 res[1].push(el.getAttribute('name').toLowerCase());
148 function reDrawHints(elems, len) {
149 var hintdiv = doc.createElement('div');
150 hintdiv.setAttribute('id', uzbldivid);
151 hintdiv.style.opacity = '0.0';
152 for (var i = 0; i < elems[0].length; i++) {
154 var n = label.length;
155 for (n; n < len; n++) {
159 var h = generateHint(elems[0][i], label);
160 hintdiv.appendChild(h);
164 document.body.appendChild(hintdiv);
165 hintdiv.style.opacity = '0.7'
168 function followLinks(follow) {
169 var s = follow.split('');
170 var linknr = parseInt(follow, 10);
171 if (document.body) document.body.setAttribute('onkeyup', 'keyPressHandler(event)');
172 var linkelems = addLinks();
173 var formelems = addFormElems();
174 var elems = [linkelems[0].concat(formelems[0]), linkelems[1].concat(formelems[1])];
175 var len = (elems[0].length + '').length;
176 var oldDiv = doc.getElementById(uzbldivid);
177 var leftover = [[], []];
178 if (linknr + 1 && s.length == len && linknr < elems[0].length && linknr >= 0) {
179 clickElem(elems[0][linknr]);
181 for (var j = 0; j < elems[0].length; j++) {
183 for (var k = 0; k < s.length; k++) {
184 b = b && elems[1][j].charAt(k) == s[k];
190 leftover[0].push(elems[0][j]);
191 leftover[1].push(elems[1][j]);
194 if (leftover[0].length == 1) {
195 clickElem(leftover[0][0]);
196 } else if (!oldDiv) {
197 if (linknr + 1 || s.length == 0) {
198 reDrawHints(elems, len);
200 reDrawHints(leftover, len);