UTF-8 /** * Write a script to an external file. * name: common name of script (domloaded, windowload, custom) * fileParameter: the action-file that holds this file * content: string or array of strings containing the content * returns URL to generated file, for linking purposes */ var createExternalScript = function(name, fileParameter, content){ if(!content.join){ content = [content]; } var myFile = new FWFile(); if(fwParameters[fileParameter].fwHasFile){ myFile.fwOpenWrite(fwParameters[fileParameter].fwValue, true, 'TEXT'); myFile.fwSetEncoding('UTF-8'); }else{ var path = fwPage.fwHttpPath(); path = path.replace(/\//g, '_').split('.'); var filename = path.pop(); path = path.join('.') + '_' + name + '.js'; myFile.fwOpenWrite(path, true, 'TEXT'); myFile.fwSetEncoding('UTF-8'); } for (var i=0; i < content.length; i++) { myFile.fwWrite(content[i] + "\n"); }; myFile.fwClose(); fwParameters[fileParameter].fwSpecify(myFile); var filePath = fwParameters[fileParameter].toString(); fwParameters[fileParameter].fwClear(); return filePath; } /** * Create a CDN link to a JavaScript library. * name: common filename for the library (prototype, scriptaculous, jquery) * path: (optional) fully-qualified URL to the CDN-hosted file * (path is not needed if you are linking to prototype or scriptaculous) * WARNING! changes any existing link in the page to the library to the * one specified in path or defaults * returns reference to the script */ var findOrCreateScriptLink = function(name, path){ var head = fwDocument.fwTags.fwFind('head'); var script = pageHasLinkToScript(name), load = ''; var libs = { 'prototype': 'http://ajax.googleapis.com/ajax/libs/prototype/1.7/prototype.js', 'scriptaculous': 'http://ajax.googleapis.com/ajax/libs/scriptaculous/1.9/scriptaculous.js' }; if(!libs[name]){ if(!!path){ libs[name] = path; }else{ fwAbort('Please provide a URL for “' + name + '”. Publishing cannot continue.'); } } if(!script){ script = head.fwAdd('script', true); script.fwAddRawOpt(''); head.fwAddRawOpt(''); } //catch any load variables from scriptaculous if(name == 'scriptaculous' && script.src && script.src.toString().match(/\?load=/)){ load = script.src.toString().match(/(\?load=.+?)"/)[1]; //" } //overwrite the path to the script to make it current script.src = fwQuote(libs[name] + load); script.type = fwQuote('text/javascript'); script.charset = fwQuote('utf-8'); if(fwParameters['secure'].fwBoolValue && script.src.toString().match(/googleapis/)){ script.src = script.src.toString().replace(/^"http:/,'"https:'); } return script; } var pageHasLinkToScript = function(name){ var scripts = fwDocument.fwTags.fwFindAll('script'); for(i in scripts){ if(scripts[i].src && scripts[i].src.toString().match(new RegExp(name + '.js'))){ return scripts[i]; } } return false; } /** * Find a script tag on the page by its ID, or create one if missing. * name: ID of the script * returns script reference */ var findOrCreateScript = function(name){ var head = fwDocument.fwTags.fwFind('head'); var script = pageHasNamedScript(name); if(!script){ script = head.fwAdd('script', true); script.id = fwQuote(name); script.type = fwQuote('text/javascript'); if(fwMarkups[name]) script.fwAddRawln(fwMarkups[name]); head.fwAddRawOpt(''); } return script; } var pageHasNamedScript = function(name){ var scripts = fwDocument.fwTags.fwFindAll('script'); for(i in scripts){ if(scripts[i].id && scripts[i].id.toString().match(new RegExp(name))){ return scripts[i]; } } return false; } /** * Append code to a given script tag. * elm: reference to script tag * content: string or array of strings * If the script tag includes an anonymous function, content is added * _inside_ that function. Otherwise it is added after any other content. * returns reference to script tag */ var addToScript = function(elm, content){ var txt = elm.fwToHTML().toString(); var closer = false; if(txt.match(/\}\);[\r\n]+<\/script>/)){ txt = txt.split(/[\r\n]+/); txt.shift(); txt.pop(); txt.pop(); closer = true; }else if(txt.match(/<\/script>/)){ txt = txt.split(/[\r\n]+/); txt.shift(); txt.pop(); } if(!content.join){ content = content.split(/[\r\n]+/); } var contents = elm.fwFindAllContent(); for(i in contents){ contents[i].fwDelete(); } elm.fwAddRawln(); if(txt.length){ for(i in txt){ elm.fwAddRawln(txt[i]); } } if(content.length){ elm.fwIndent(); for(i in content){ elm.fwAddRawln(content[i]); } elm.fwOutdent(); } if(closer) elm.fwAddRawln("});"); return elm; } /** * Wrapper to simplify function call * returns nothing */ var addPrototype = function(){ findOrCreateScriptLink('prototype'); } /** * Add scriptaculous to the page, and load any modules needed if fewer than all. * modules: comma-separated string or array of scriptaculous modules * returns nothing */ var addScriptaculous = function(modules){ var scriptaculousLibs = ["builder", "effects", "dragdrop", "controls", "slider", "sound"]; var load = []; if(modules.join){ modules = modules.join(); } var script = findOrCreateScriptLink('scriptaculous'); if(script.src.toString().match(/\?load=/)){ modules += script.src.toString().split(/\?load=/)[1]; } for (var i=0; i < scriptaculousLibs.length; i++) { var re = new RegExp(scriptaculousLibs[i]); if(modules.match(re)) load.push(scriptaculousLibs[i]); }; if(load.length > 0 && load.length < 6){ load = '?load=' + load.join(','); script.src = script.src.toString().replace(/\?load=[^"]+/, '').replace(/"$/, load + '"'); //" } } function posixToMac(path){ return path.replace(/\//g, ':'); } function rootRelativePath(){ var posixPath = fwPage.fwHttpPath(null, true); return posixToMac(posixPath); } /** * Edit text stored in a fwParameter * Adapted from Source Code Snooper by Tim Plumb * codeName: name of the fwParameter * returns nothing */ function EditCode(codeName){ var mycustomcode = fwParameters[codeName].toString(); var myprompt = "Add your code here"; var mycustomcodeprompt = fwBigPrompt(myprompt, mycustomcode); if (mycustomcodeprompt != null) { if (mycustomcodeprompt != mycustomcode) { fwParameters[codeName].fwValue = mycustomcodeprompt; } } } Protaculous 2 Copyright 2012-13 Walter Lee Davis Link Prototype and Scriptaculous to your page. document.observe('dom:loaded', function(evt){ }); Event.observe(window, 'load', function(evt){ }); /** * clear the relevant external script name and URL when a clear button is pressed */ function clearParam(num){ var name = 'ext_' + num.toString() + '_name'; var path = 'ext_' + num.toString() + '_path'; fwParameters[name].fwValue = fwParameters[path].fwValue = ''; } function fwBeforeEndHead(){ addPrototype(); var libs = []; var scriptaculousLibs = ["builder", "effects", "dragdrop", "controls", "slider", "sound"]; for (var i = scriptaculousLibs.length - 1; i >= 0; i--){ if(fwParameters[scriptaculousLibs[i]].fwBoolValue) libs.push(scriptaculousLibs[i]); }; if((libs.length > 0 && fwParameters['scriptaculous'].fwBoolValue) || pageHasLinkToScript('scriptaculous')) addScriptaculous(libs); } function fwAfterEndHTML(){ //we always add Prototype, no reason to make it conditional addPrototype(); //add scriptaculous libs var libs = []; var scriptaculousLibs = ["builder", "effects", "dragdrop", "controls", "slider", "sound"]; for (var i = scriptaculousLibs.length - 1; i >= 0; i--){ if(fwParameters[scriptaculousLibs[i]].fwBoolValue) libs.push(scriptaculousLibs[i]); }; if((libs.length > 0 && fwParameters['scriptaculous'].fwBoolValue) || pageHasLinkToScript('scriptaculous')) addScriptaculous(libs); //add any custom external scripts if(fwParameters['external'].fwBoolValue){ for (var i=1; i < 11; i++) { var name = 'ext_' + i.toString() + '_name'; var path = 'ext_' + i.toString() + '_path'; if(fwParameters[name].fwValue){ if(fwParameters[path].fwValue.toString().toLowerCase().split('.').pop() != 'js') fwAbort('Please link “' + fwParameters[name] + '” to a JavaScript file'); findOrCreateScriptLink(fwParameters[name].fwValue, fwParameters[path].fwValue); //add jQuery#noconflict if needed if(fwParameters[name].fwValue.toString().match('jquery')){ addToScript(findOrCreateScript('noconflict'), '$.noConflict();'); } } } } //add dom:loaded listener if(fwParameters['domloaded'].fwValue){ if(fwParameters['external_observers'].fwBoolValue){ var path = createExternalScript('domloaded', 'domloaded_external_file', ['document.observe(\'dom:loaded\', function(evt){', fwParameters['domloaded'].fwValue, '});']); findOrCreateScriptLink('domloaded', path); }else{ addToScript(findOrCreateScript('domloaded'), fwParameters['domloaded'].fwValue); } } //add window.load listener if(fwParameters['windowload'].fwValue){ if(fwParameters['external_observers'].fwBoolValue){ var path = createExternalScript('windowload', 'windowload_external_file', ['Event.observe(window, \'load\', function(evt){', fwParameters['domloaded'].fwValue, '});']); findOrCreateScriptLink('windowload', path); }else{ addToScript(findOrCreateScript('windowload'), fwParameters['windowload'].fwValue); } } //add custom listenr if(fwParameters['custom'].fwValue){ if(fwParameters['external_observers'].fwBoolValue){ var path = createExternalScript('p2_custom', 'custom_external_file', fwParameters['custom'].fwValue); findOrCreateScriptLink('p2_custom', path); }else{ addToScript(findOrCreateScript('p2_custom'), fwParameters['custom'].fwValue); } } } function fwInterface(){ //scriptaculous library checkboxen var scriptaculousLibs = ["builder", "effects", "dragdrop", "controls", "slider", "sound"]; for (var i = scriptaculousLibs.length - 1; i >= 0; i--){ fwParameters[scriptaculousLibs[i]].fwVisible = fwParameters['scriptaculous'].fwBoolValue; }; //external libraries progressive disclosure for (var i=1; i < 11; i++) { var name = 'ext_' + i.toString() + '_name'; var path = 'ext_' + i.toString() + '_path'; var clear = 'ext_' + i.toString() + '_clear'; var prev = 'ext_' + (i - 1).toString() + '_name' fwParameters[name].fwVisible = fwParameters[path].fwVisible = fwParameters[clear].fwVisible = (i > 1) ? (fwParameters['external'].fwBoolValue && fwParameters[prev].fwValue.toString().length > 1) : fwParameters['external'].fwBoolValue; }; } function fwParameterChanged(){ //make the interface visibility "live" to parameter changes fwInterface(); }