Several bug fixes to cookie_daemon.py
[uzbl-mobile] / examples / data / uzbl / scripts / follow_Numbers_Strings.js
1 var uzblid = 'uzbl_link_hint';
2 var uzbldivid = uzblid + '_div_container';
3 var doc = document;
4 var win = window;
5 var links = document.links;
6 var forms = document.forms;
7 try {
8     HTMLElement.prototype.click = function() {
9         if (typeof this.onclick == 'function') {
10             this.onclick({
11                 type: 'click'
12             });
13         }
14     };
15 } catch(e) {}
16 function keyPressHandler(e) {
17     var kC = window.event ? event.keyCode: e.keyCode;
18     var Esc = window.event ? 27 : e.DOM_VK_ESCAPE;
19     if (kC == Esc) {
20         removeAllHints();
21     }
22 }
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) {
29         el = el.offsetParent;
30         up += el.offsetTop;
31         left += el.offsetLeft;
32     }
33     return [up, left, width, height];
34 }
35 function isVisible(el) {
36     if (el == doc) {
37         return true;
38     }
39     if (!el) {
40         return false;
41     }
42     if (!el.parentNode) {
43         return false;
44     }
45     if (el.style) {
46         if (el.style.display == 'none') {
47             return false;
48         }
49         if (el.style.visibility == 'hidden') {
50             return false;
51         }
52     }
53     return isVisible(el.parentNode);
54 }
55 function elementInViewport(el) {
56     offset = elementPosition(el);
57     var up = offset[0];
58     var left = offset[1];
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;
62 }
63 function removeAllHints() {
64     var elements = doc.getElementById(uzbldivid);
65     if (elements) {
66         elements.parentNode.removeChild(elements);
67     }
68 }
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');
88     if (img.length > 0) {
89         hint.style.left = pos[1] + img[0].width / 2 + 'px';
90     }
91     hint.style.textDecoration = 'none';
92     hint.style.webkitBorderRadius = '6px';
93     hint.style.webkitTransform = 'scale(1) rotate(0deg) translate(-6px,-5px)';
94     return hint;
95 }
96 function clickElem(item) {
97     removeAllHints();
98     if (item) {
99         var name = item.tagName;
100         if (name == 'A') {
101             item.click();
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') {
106                 item.focus();
107                 item.select();
108             } else {
109                 item.click();
110             }
111         } else if (name == 'TEXTAREA' || name == 'SELECT') {
112             item.focus();
113             item.select();
114         } else {
115             item.click();
116             window.location = item.href;
117         }
118     }
119 }
120 function addLinks() {
121     res = [[], []];
122     for (var l = 0; l < links.length; l++) {
123         var li = links[l];
124         if (isVisible(li) && elementInViewport(li)) {
125             res[0].push(li);
126             res[1].push(li.innerText.toLowerCase());
127         }
128     }
129     return res;
130 }
131 function addFormElems() {
132     res = [[], []];
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)) {
137                 res[0].push(el);
138                 if (el.getAttribute('value')) {
139                     res[1].push(el.getAttribute('value').toLowerCase());
140                 } else {
141                     res[1].push(el.getAttribute('name').toLowerCase());
142                 }
143             }
144         }
145     }
146     return res;
147 }
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++) {
153         var label = i + '';
154         var n = label.length;
155         for (n; n < len; n++) {
156             label = '0' + label;
157         }
158         if (elems[0][i]) {
159             var h = generateHint(elems[0][i], label);
160             hintdiv.appendChild(h);
161         }
162     }
163     if (document.body) {
164         document.body.appendChild(hintdiv);
165         hintdiv.style.opacity = '0.7'
166     }
167 }
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]);
180     } else {
181         for (var j = 0; j < elems[0].length; j++) {
182             var b = true;
183             for (var k = 0; k < s.length; k++) {
184                 b = b && elems[1][j].charAt(k) == s[k];
185             }
186             if (!b) {
187                 elems[0][j] = null;
188                 elems[1][j] = null;
189             } else {
190                 leftover[0].push(elems[0][j]);
191                 leftover[1].push(elems[1][j]);
192             }
193         }
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);
199             } else {
200                 reDrawHints(leftover, len);
201             }
202         }
203     }
204 }
205 followLinks('%s');