a1bb719a383e61708aaccd6a9e237bfbc55a870c
[acontent.git] / docs / include / jscripts / tiny_mce / plugins / fullpage / js / fullpage.js
1 /**\r
2  * fullpage.js\r
3  *\r
4  * Copyright 2009, Moxiecode Systems AB\r
5  * Released under LGPL License.\r
6  *\r
7  * License: http://tinymce.moxiecode.com/license\r
8  * Contributing: http://tinymce.moxiecode.com/contributing\r
9  */\r
10 \r
11 tinyMCEPopup.requireLangPack();\r
12 \r
13 var doc;\r
14 \r
15 var defaultDocTypes = \r
16         'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' +\r
17         'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' +\r
18         'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' +\r
19         'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' +\r
20         'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' +\r
21         'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' +\r
22         'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';\r
23 \r
24 var defaultEncodings = \r
25         'Western european (iso-8859-1)=iso-8859-1,' +\r
26         'Central European (iso-8859-2)=iso-8859-2,' +\r
27         'Unicode (UTF-8)=utf-8,' +\r
28         'Chinese traditional (Big5)=big5,' +\r
29         'Cyrillic (iso-8859-5)=iso-8859-5,' +\r
30         'Japanese (iso-2022-jp)=iso-2022-jp,' +\r
31         'Greek (iso-8859-7)=iso-8859-7,' +\r
32         'Korean (iso-2022-kr)=iso-2022-kr,' +\r
33         'ASCII (us-ascii)=us-ascii';\r
34 \r
35 var defaultMediaTypes = \r
36         'all=all,' +\r
37         'screen=screen,' +\r
38         'print=print,' +\r
39         'tty=tty,' +\r
40         'tv=tv,' +\r
41         'projection=projection,' +\r
42         'handheld=handheld,' +\r
43         'braille=braille,' +\r
44         'aural=aural';\r
45 \r
46 var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';\r
47 var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px';\r
48 \r
49 function init() {\r
50         var f = document.forms['fullpage'], el = f.elements, e, i, p, doctypes, encodings, mediaTypes, fonts, ed = tinyMCEPopup.editor, dom = tinyMCEPopup.dom, style;\r
51 \r
52         // Setup doctype select box\r
53         doctypes = ed.getParam("fullpage_doctypes", defaultDocTypes).split(',');\r
54         for (i=0; i<doctypes.length; i++) {\r
55                 p = doctypes[i].split('=');\r
56 \r
57                 if (p.length > 1)\r
58                         addSelectValue(f, 'doctypes', p[0], p[1]);\r
59         }\r
60 \r
61         // Setup fonts select box\r
62         fonts = ed.getParam("fullpage_fonts", defaultFontNames).split(';');\r
63         for (i=0; i<fonts.length; i++) {\r
64                 p = fonts[i].split('=');\r
65 \r
66                 if (p.length > 1)\r
67                         addSelectValue(f, 'fontface', p[0], p[1]);\r
68         }\r
69 \r
70         // Setup fontsize select box\r
71         fonts = ed.getParam("fullpage_fontsizes", defaultFontSizes).split(',');\r
72         for (i=0; i<fonts.length; i++)\r
73                 addSelectValue(f, 'fontsize', fonts[i], fonts[i]);\r
74 \r
75         // Setup mediatype select boxs\r
76         mediaTypes = ed.getParam("fullpage_media_types", defaultMediaTypes).split(',');\r
77         for (i=0; i<mediaTypes.length; i++) {\r
78                 p = mediaTypes[i].split('=');\r
79 \r
80                 if (p.length > 1) {\r
81                         addSelectValue(f, 'element_style_media', p[0], p[1]);\r
82                         addSelectValue(f, 'element_link_media', p[0], p[1]);\r
83                 }\r
84         }\r
85 \r
86         // Setup encodings select box\r
87         encodings = ed.getParam("fullpage_encodings", defaultEncodings).split(',');\r
88         for (i=0; i<encodings.length; i++) {\r
89                 p = encodings[i].split('=');\r
90 \r
91                 if (p.length > 1) {\r
92                         addSelectValue(f, 'docencoding', p[0], p[1]);\r
93                         addSelectValue(f, 'element_script_charset', p[0], p[1]);\r
94                         addSelectValue(f, 'element_link_charset', p[0], p[1]);\r
95                 }\r
96         }\r
97 \r
98         document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
99         document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');\r
100         //document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color');\r
101         document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');\r
102         document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');\r
103         document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');\r
104         document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');\r
105         document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage');\r
106         document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage');\r
107         document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');\r
108 \r
109         // Resize some elements\r
110         if (isVisible('stylesheetbrowser'))\r
111                 document.getElementById('stylesheet').style.width = '220px';\r
112 \r
113         if (isVisible('link_href_browser'))\r
114                 document.getElementById('element_link_href').style.width = '230px';\r
115 \r
116         if (isVisible('bgimage_browser'))\r
117                 document.getElementById('bgimage').style.width = '210px';\r
118 \r
119         // Add iframe\r
120         dom.add(document.body, 'iframe', {id : 'documentIframe', src : 'javascript:""', style : {display : 'none'}});\r
121         doc = dom.get('documentIframe').contentWindow.document;\r
122         h = tinyMCEPopup.getWindowArg('head_html');\r
123 \r
124         // Preprocess the HTML disable scripts and urls\r
125         h = h.replace(/<script>/gi, '<script type="text/javascript">');\r
126         h = h.replace(/type=([\"\'])?/gi, 'type=$1-mce-');\r
127         h = h.replace(/(src=|href=)/g, '_mce_$1');\r
128 \r
129         // Write in the content in the iframe\r
130         doc.write(h + '</body></html>');\r
131         doc.close();\r
132 \r
133         // Parse xml and doctype\r
134         xmlVer = getReItem(/<\?\s*?xml.*?version\s*?=\s*?"(.*?)".*?\?>/gi, h, 1);\r
135         xmlEnc = getReItem(/<\?\s*?xml.*?encoding\s*?=\s*?"(.*?)".*?\?>/gi, h, 1);\r
136         docType = getReItem(/<\!DOCTYPE.*?>/gi, h.replace(/\n/g, ''), 0).replace(/ +/g, ' ');\r
137         f.langcode.value = getReItem(/lang="(.*?)"/gi, h, 1);\r
138 \r
139         // Parse title\r
140         if (e = doc.getElementsByTagName('title')[0])\r
141                 el.metatitle.value = e.textContent || e.text;\r
142 \r
143         // Parse meta\r
144         tinymce.each(doc.getElementsByTagName('meta'), function(n) {\r
145                 var na = (n.getAttribute('name', 2) || '').toLowerCase(), va = n.getAttribute('content', 2), eq = n.getAttribute('httpEquiv', 2) || '';\r
146 \r
147                 e = el['meta' + na];\r
148 \r
149                 if (na == 'robots') {\r
150                         selectByValue(f, 'metarobots', tinymce.trim(va), true, true);\r
151                         return;\r
152                 }\r
153 \r
154                 switch (eq.toLowerCase()) {\r
155                         case "content-type":\r
156                                 tmp = getReItem(/charset\s*=\s*(.*)\s*/gi, va, 1);\r
157 \r
158                                 // Override XML encoding\r
159                                 if (tmp != "")\r
160                                         xmlEnc = tmp;\r
161 \r
162                                 return;\r
163                 }\r
164 \r
165                 if (e)\r
166                         e.value = va;\r
167         });\r
168 \r
169         selectByValue(f, 'doctypes', docType, true, true);\r
170         selectByValue(f, 'docencoding', xmlEnc, true, true);\r
171         selectByValue(f, 'langdir', doc.body.getAttribute('dir', 2) || '', true, true);\r
172 \r
173         if (xmlVer != '')\r
174                 el.xml_pi.checked = true;\r
175 \r
176         // Parse appearance\r
177 \r
178         // Parse primary stylesheet\r
179         tinymce.each(doc.getElementsByTagName("link"), function(l) {\r
180                 var m = l.getAttribute('media', 2) || '', t = l.getAttribute('type', 2) || '';\r
181 \r
182                 if (t == "-mce-text/css" && (m == "" || m == "screen" || m == "all") && (l.getAttribute('rel', 2) || '') == "stylesheet") {\r
183                         f.stylesheet.value = l.getAttribute('_mce_href', 2) || '';\r
184                         return false;\r
185                 }\r
186         });\r
187 \r
188         // Get from style elements\r
189         tinymce.each(doc.getElementsByTagName("style"), function(st) {\r
190                 var tmp = parseStyleElement(st);\r
191 \r
192                 for (x=0; x<tmp.length; x++) {\r
193                         if (tmp[x].rule.indexOf('a:visited') != -1 && tmp[x].data['color'])\r
194                                 f.visited_color.value = tmp[x].data['color'];\r
195 \r
196                         if (tmp[x].rule.indexOf('a:link') != -1 && tmp[x].data['color'])\r
197                                 f.link_color.value = tmp[x].data['color'];\r
198 \r
199                         if (tmp[x].rule.indexOf('a:active') != -1 && tmp[x].data['color'])\r
200                                 f.active_color.value = tmp[x].data['color'];\r
201                 }\r
202         });\r
203 \r
204         f.textcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "text");\r
205         f.active_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "alink");\r
206         f.link_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "link");\r
207         f.visited_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "vlink");\r
208         f.bgcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "bgcolor");\r
209         f.bgimage.value = tinyMCEPopup.dom.getAttrib(doc.body, "background");\r
210 \r
211         // Get from style info\r
212         style = tinyMCEPopup.dom.parseStyle(tinyMCEPopup.dom.getAttrib(doc.body, 'style'));\r
213 \r
214         if (style['font-family'])\r
215                 selectByValue(f, 'fontface', style['font-family'], true, true);\r
216         else\r
217                 selectByValue(f, 'fontface', ed.getParam("fullpage_default_fontface", ""), true, true);\r
218 \r
219         if (style['font-size'])\r
220                 selectByValue(f, 'fontsize', style['font-size'], true, true);\r
221         else\r
222                 selectByValue(f, 'fontsize', ed.getParam("fullpage_default_fontsize", ""), true, true);\r
223 \r
224         if (style['color'])\r
225                 f.textcolor.value = convertRGBToHex(style['color']);\r
226 \r
227         if (style['background-image'])\r
228                 f.bgimage.value = style['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
229 \r
230         if (style['background-color'])\r
231                 f.bgcolor.value = style['background-color'];\r
232 \r
233         if (style['margin']) {\r
234                 tmp = style['margin'].replace(/[^0-9 ]/g, '');\r
235                 tmp = tmp.split(/ +/);\r
236                 f.topmargin.value = tmp.length > 0 ? tmp[0] : '';\r
237                 f.rightmargin.value = tmp.length > 1 ? tmp[1] : tmp[0];\r
238                 f.bottommargin.value = tmp.length > 2 ? tmp[2] : tmp[0];\r
239                 f.leftmargin.value = tmp.length > 3 ? tmp[3] : tmp[0];\r
240         }\r
241 \r
242         if (style['margin-left'])\r
243                 f.leftmargin.value = style['margin-left'].replace(/[^0-9]/g, '');\r
244 \r
245         if (style['margin-right'])\r
246                 f.rightmargin.value = style['margin-right'].replace(/[^0-9]/g, '');\r
247 \r
248         if (style['margin-top'])\r
249                 f.topmargin.value = style['margin-top'].replace(/[^0-9]/g, '');\r
250 \r
251         if (style['margin-bottom'])\r
252                 f.bottommargin.value = style['margin-bottom'].replace(/[^0-9]/g, '');\r
253 \r
254         f.style.value = tinyMCEPopup.dom.serializeStyle(style);\r
255 \r
256         // Update colors\r
257         updateColor('textcolor_pick', 'textcolor');\r
258         updateColor('bgcolor_pick', 'bgcolor');\r
259         updateColor('visited_color_pick', 'visited_color');\r
260         updateColor('active_color_pick', 'active_color');\r
261         updateColor('link_color_pick', 'link_color');\r
262 }\r
263 \r
264 function getReItem(r, s, i) {\r
265         var c = r.exec(s);\r
266 \r
267         if (c && c.length > i)\r
268                 return c[i];\r
269 \r
270         return '';\r
271 }\r
272 \r
273 function updateAction() {\r
274         var f = document.forms[0], nl, i, h, v, s, head, html, l, tmp, addlink = true, ser;\r
275 \r
276         head = doc.getElementsByTagName('head')[0];\r
277 \r
278         // Fix scripts without a type\r
279         nl = doc.getElementsByTagName('script');\r
280         for (i=0; i<nl.length; i++) {\r
281                 if (tinyMCEPopup.dom.getAttrib(nl[i], '_mce_type') == '')\r
282                         nl[i].setAttribute('_mce_type', 'text/javascript');\r
283         }\r
284 \r
285         // Get primary stylesheet\r
286         nl = doc.getElementsByTagName("link");\r
287         for (i=0; i<nl.length; i++) {\r
288                 l = nl[i];\r
289 \r
290                 tmp = tinyMCEPopup.dom.getAttrib(l, 'media');\r
291 \r
292                 if (tinyMCEPopup.dom.getAttrib(l, '_mce_type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCEPopup.dom.getAttrib(l, 'rel') == "stylesheet") {\r
293                         addlink = false;\r
294 \r
295                         if (f.stylesheet.value == '')\r
296                                 l.parentNode.removeChild(l);\r
297                         else\r
298                                 l.setAttribute('_mce_href', f.stylesheet.value);\r
299 \r
300                         break;\r
301                 }\r
302         }\r
303 \r
304         // Add new link\r
305         if (f.stylesheet.value != '') {\r
306                 l = doc.createElement('link');\r
307 \r
308                 l.setAttribute('type', 'text/css');\r
309                 l.setAttribute('_mce_href', f.stylesheet.value);\r
310                 l.setAttribute('rel', 'stylesheet');\r
311 \r
312                 head.appendChild(l);\r
313         }\r
314 \r
315         setMeta(head, 'keywords', f.metakeywords.value);\r
316         setMeta(head, 'description', f.metadescription.value);\r
317         setMeta(head, 'author', f.metaauthor.value);\r
318         setMeta(head, 'copyright', f.metacopyright.value);\r
319         setMeta(head, 'robots', getSelectValue(f, 'metarobots'));\r
320         setMeta(head, 'Content-Type', getSelectValue(f, 'docencoding'));\r
321 \r
322         doc.body.dir = getSelectValue(f, 'langdir');\r
323         doc.body.style.cssText = f.style.value;\r
324 \r
325         doc.body.setAttribute('vLink', f.visited_color.value);\r
326         doc.body.setAttribute('link', f.link_color.value);\r
327         doc.body.setAttribute('text', f.textcolor.value);\r
328         doc.body.setAttribute('aLink', f.active_color.value);\r
329 \r
330         doc.body.style.fontFamily = getSelectValue(f, 'fontface');\r
331         doc.body.style.fontSize = getSelectValue(f, 'fontsize');\r
332         doc.body.style.backgroundColor = f.bgcolor.value;\r
333 \r
334         if (f.leftmargin.value != '')\r
335                 doc.body.style.marginLeft = f.leftmargin.value + 'px';\r
336 \r
337         if (f.rightmargin.value != '')\r
338                 doc.body.style.marginRight = f.rightmargin.value + 'px';\r
339 \r
340         if (f.bottommargin.value != '')\r
341                 doc.body.style.marginBottom = f.bottommargin.value + 'px';\r
342 \r
343         if (f.topmargin.value != '')\r
344                 doc.body.style.marginTop = f.topmargin.value + 'px';\r
345 \r
346         html = doc.getElementsByTagName('html')[0];\r
347         html.setAttribute('lang', f.langcode.value);\r
348         html.setAttribute('xml:lang', f.langcode.value);\r
349 \r
350         if (f.bgimage.value != '')\r
351                 doc.body.style.backgroundImage = "url('" + f.bgimage.value + "')";\r
352         else\r
353                 doc.body.style.backgroundImage = '';\r
354 \r
355         ser = tinyMCEPopup.editor.plugins.fullpage._createSerializer();\r
356         ser.setRules('-title,meta[http-equiv|name|content],base[href|target],link[href|rel|type|title|media],style[type],script[type|language|src],html[lang|xml::lang|xmlns],body[style|dir|vlink|link|text|alink],head');\r
357 \r
358         h = ser.serialize(doc.documentElement);\r
359         h = h.substring(0, h.lastIndexOf('</body>'));\r
360 \r
361         if (h.indexOf('<title>') == -1)\r
362                 h = h.replace(/<head.*?>/, '$&\n' + '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>');\r
363         else\r
364                 h = h.replace(/<title>(.*?)<\/title>/, '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>');\r
365 \r
366         if ((v = getSelectValue(f, 'doctypes')) != '')\r
367                 h = v + '\n' + h;\r
368 \r
369         if (f.xml_pi.checked) {\r
370                 s = '<?xml version="1.0"';\r
371 \r
372                 if ((v = getSelectValue(f, 'docencoding')) != '')\r
373                         s += ' encoding="' + v + '"';\r
374 \r
375                 s += '?>\n';\r
376                 h = s + h;\r
377         }\r
378 \r
379         h = h.replace(/type=\"\-mce\-/gi, 'type="');\r
380 \r
381         tinyMCEPopup.editor.plugins.fullpage.head = h;\r
382         tinyMCEPopup.editor.plugins.fullpage._setBodyAttribs(tinyMCEPopup.editor, {});\r
383         tinyMCEPopup.close();\r
384 }\r
385 \r
386 function changedStyleField(field) {\r
387 }\r
388 \r
389 function setMeta(he, k, v) {\r
390         var nl, i, m;\r
391 \r
392         nl = he.getElementsByTagName('meta');\r
393         for (i=0; i<nl.length; i++) {\r
394                 if (k == 'Content-Type' && tinyMCEPopup.dom.getAttrib(nl[i], 'http-equiv') == k) {\r
395                         if (v == '')\r
396                                 nl[i].parentNode.removeChild(nl[i]);\r
397                         else\r
398                                 nl[i].setAttribute('content', "text/html; charset=" + v);\r
399 \r
400                         return;\r
401                 }\r
402 \r
403                 if (tinyMCEPopup.dom.getAttrib(nl[i], 'name') == k) {\r
404                         if (v == '')\r
405                                 nl[i].parentNode.removeChild(nl[i]);\r
406                         else\r
407                                 nl[i].setAttribute('content', v);\r
408                         return;\r
409                 }\r
410         }\r
411 \r
412         if (v == '')\r
413                 return;\r
414 \r
415         m = doc.createElement('meta');\r
416 \r
417         if (k == 'Content-Type')\r
418                 m.httpEquiv = k;\r
419         else\r
420                 m.setAttribute('name', k);\r
421 \r
422         m.setAttribute('content', v);\r
423         he.appendChild(m);\r
424 }\r
425 \r
426 function parseStyleElement(e) {\r
427         var v = e.innerHTML;\r
428         var p, i, r;\r
429 \r
430         v = v.replace(/<!--/gi, '');\r
431         v = v.replace(/-->/gi, '');\r
432         v = v.replace(/[\n\r]/gi, '');\r
433         v = v.replace(/\s+/gi, ' ');\r
434 \r
435         r = [];\r
436         p = v.split(/{|}/);\r
437 \r
438         for (i=0; i<p.length; i+=2) {\r
439                 if (p[i] != "")\r
440                         r[r.length] = {rule : tinymce.trim(p[i]), data : tinyMCEPopup.dom.parseStyle(p[i+1])};\r
441         }\r
442 \r
443         return r;\r
444 }\r
445 \r
446 function serializeStyleElement(d) {\r
447         var i, s, st;\r
448 \r
449         s = '<!--\n';\r
450 \r
451         for (i=0; i<d.length; i++) {\r
452                 s += d[i].rule + ' {\n';\r
453 \r
454                 st = tinyMCE.serializeStyle(d[i].data);\r
455 \r
456                 if (st != '')\r
457                         st += ';';\r
458 \r
459                 s += st.replace(/;/g, ';\n');\r
460                 s += '}\n';\r
461 \r
462                 if (i != d.length - 1)\r
463                         s += '\n';\r
464         }\r
465 \r
466         s += '\n-->';\r
467 \r
468         return s;\r
469 }\r
470 \r
471 tinyMCEPopup.onInit.add(init);\r