/** * JavaScript main class that is going to be used throughout the application. * This should be the base class for Application's JavaScript */ var Application = { // Collection of functions that will be executed when this script loads init: [], // Define User Interface related functionalities Ui: {}, // Define general JavaScript utilities Util: { isDefined: function(obj) { return (typeof(obj) != 'undefined'); }, isFunction: function(obj) { return jQuery.isFunction(obj); }, isObject: function(o) { return (o && typeof o == 'object'); }, isArray: function(o) { return (isObject(o) && o.constructor == Array); }, submitPost: function(url, parameters) { Application.Util._submitRequest('post', url, parameters); }, submitGet: function(url, parameters) { Application.Util._submitRequest('get', url, parameters); }, _submitRequest: function(method, url, parameters) { var form = $('
' + Application.Util._createSubmitRequestData(parameters) + '
'); form.appendTo(document.body); form.get(0).submit(); }, _createSubmitRequestData: function(parameters, namePrefix) { if(Application.Util.isArray(parameters)) { var temp = ''; if(!namePrefix) namePrefix = 'array'; for(var i = 0, j = parameters.length; i < j; ++i) { temp += Application.Util._createSubmitRequestData(parameters[i], namePrefix + '[' + i + ']'); } return temp; } else if(Application.Util.isObject(parameters)) { var temp = ''; if(!namePrefix) namePrefix = ''; for(var i in parameters) { temp += Application.Util._createSubmitRequestData(parameters[i], (namePrefix == ''? i : (namePrefix + '[' + i + ']'))); } return temp; } else { if(!namePrefix) namePrefix = 'input'; return ''; } }, // Provides XOR encryption/decryption. encrypt: function(s, key) { var result = ''; while (key.length < s.length) { key += key; } for (var i=0; i temp) { $('.DropDownMenu', menu).css({ height: temp+'px', overflow: 'auto'}); } } if(event.data.minHeight != null) { var temp = parseInt(event.data.maxHeight); if(temp != 0 && menu.height() < temp) { $('.DropDownMenu', menu).css({ height: temp+'px'}); } } Application.Ui.Menu.topCurrentMenu = menu.get(0); Application.Ui.Menu.topCurrentButton = this; menu = null; $(document).one('click', {menuid: id}, Application.Ui.Menu._.PopDown.eventCloseMenu); event.stopPropagation(); event.preventDefault(); if(jQuery.isFunction(event.data.onClickEnd)) event.data.onClickEnd(event, this); }, eventCloseMenu: function(event) { $('#'+event.data.menuid).hide(); $(Application.Ui.Menu.topCurrentButton).removeClass('ActiveButton'); Application.Ui.Menu.topCurrentButton = null; if(Application.Info.Browser.ie6()) $('select').css('visibility', ''); } }; } // Interface $.extend(Application.Ui.Menu, { PopDown: function(selector, params) { var defaultParams = { maxHeight: null, minHeight: null, onClickStart: null, onClickEnd: null, topMarginPixel: -1}; $.extend(defaultParams, params || {}); $(selector).bind('click', defaultParams, Application.Ui.Menu._.PopDown.eventMenuClick); } }); // Add to initialization procedure to convert all elements that have "PopDownMenu" as one of their class to be converted Application.init.push(Application.Ui.Menu._.PopDown.eventDocumentReady); /** * ----- */ /** * Ui.HelpToolTip */ // Worker if (!Application.Ui._) Application.Ui._ = {}; if (!Application.Ui._.HelpToolTip) { Application.Ui._.HelpToolTip = { eventDOMReady: function(event) { var elm = $('span.HelpToolTip'); for (var i = 0, j = elm.size(); i < j; ++i) { var helpTitle = $('span.HelpToolTip_Title', elm.get(i)).html(); var helpContents = $('span.HelpToolTip_Contents', elm.get(i)).html(); $(elm.get(i)).bind('mouseover', {'title':helpTitle, 'contents':helpContents}, Application.Ui._.HelpToolTip.eventOnMouseOver); $(elm.get(i)).mouseout(Application.Ui._.HelpToolTip.eventOnMouseOut); } }, eventOnMouseOver: function(event) { $('
' + '' + event.data.title + '' + '
' + '
' + event.data.contents + '
' + '
').appendTo(this); }, eventOnMouseOut: function(event) { $('div.HelpToolTip_Placeholder', this).remove(); } }; } // Interface $.extend(Application.Ui, { HelpToolTip: function(selector, title, contents) { $(selector).bind('mouseover', {'title':title, 'contents':contents}, Application.Ui._.HelpToolTip.eventOnMouseOver); $(selector).mouseout(Application.Ui._.HelpToolTip.eventOnMouseOut); } }); // Add to initialization procedure to convert all span elements that have "HelpToolTip" as one of their class to be converted Application.init.push(Application.Ui._.HelpToolTip.eventDOMReady); /** * ----- */ /** * Ui.CheckboxSelection * Defines CheckboxSelection */ // Worker if(!Application.Ui._) Application.Ui._ = {}; Application.Ui._.CheckboxSelection = { eventClick: function(event) { if($(event.target).is(event.data.parentSelector)) { if($(event.target).attr('checked')) { $(event.data.childSelector).attr('checked', true); if(Application.Util.isFunction(event.data.onSelectAll)) event.data.onSelectAll(); } else { $(event.data.childSelector).attr('checked', false); if(Application.Util.isFunction(event.data.onSelectNone)) event.data.onSelectNone(); } } else if($(event.target).is(event.data.childSelector)) { var childrens = $(event.data.childSelector); var selected = childrens.filter(':checked'); $(event.data.parentSelector).attr('checked', childrens.size() == selected.size()); if(selected.size() == 0) { if(Application.Util.isFunction(event.data.onSelectNone)) event.data.onSelectNone(); return; } if(childrens.size() == selected.size()) { if(Application.Util.isFunction(event.data.onSelectAll)) event.data.onSelectAll(); return; } if(Application.Util.isFunction(event.data.onSelectPartial)) event.data.onSelectPartial(); } } }; // Interface Application.Ui.CheckboxSelection = function(container, allSelector, eachSelector, params) { var defaultParams = { parentSelector: allSelector, childSelector: eachSelector, onSelectAll: null, onSelectNone: null, onSelectPartial: null }; $.extend(defaultParams, params || {}); $(container).bind('click', defaultParams, Application.Ui._.CheckboxSelection.eventClick); } /** * ----- */ /** * Ui.Folders * Common JavaScript for Folder display and manipulation. */ Application.Ui.Folders = { lang: null, RemoveFolder: function(fid) { if (this.lang == null) { this.lang = Application.Modules.Language.Get(['folders.php'], ['Folders_DeleteConfirmation']); } var result = confirm(this.lang["Folders_DeleteConfirmation"]); if (!result) { return; } $.ajax({ cache: false, url: 'index.php?Page=Folders&Action=ajax', type: 'POST', dataType: 'json', data: {AjaxType: 'Remove', folder_id: fid}, success: function(response) { Application.Ui.Folders.ReloadTable(); }, error: function(response) { alert("An error occurred while performing this operation."); } }); }, ToggleFolder: function(id, type) { var folder = $('#folder-' + id); if ($('ul', folder).css('display') == 'none') { Application.Ui.Folders.ExpandFolder(folder, true, type); } else { Application.Ui.Folders.CollapseFolder(folder, true, type); } }, CollapseFolder: function(folder, remember, folder_type) { var params = { ajax_type: 'Collapse', expanded: 0, folder: folder, folder_type: folder_type, image: 'images/plus.gif', label: 'Expand', remember: remember }; Application.Ui.Folders.ChangeFolder(params); }, ExpandFolder: function(folder, remember, folder_type) { var params = { ajax_type: 'Expand', expanded: 1, folder: folder, folder_type: folder_type, image: 'images/minus.gif', label: 'Collapse', remember: remember }; Application.Ui.Folders.ChangeFolder(params); }, ChangeFolder: function(p) { var children = $('ul', p.folder); if (p.expanded) { children.show(); } else { children.hide(); } $('img.Toggle', p.folder).attr('src', p.image).attr('alt', p.label).attr('expanded', p.expanded); if (p.remember) { $.ajax({ cache: false, url: 'index.php?Page=Folders&Action=ajax', type: 'POST', dataType: 'json', data: {AjaxType: p.ajax_type, folder_id: (p.folder.attr('id')).match(/\d+$/)[0], folder_type: p.folder_type} }); } }, SetFolderVisibility: function(folder) { $("li.Folder").each(function(i) { var folder = $(this); if (folder.attr('expanded') != 0 || $('ul', folder).children().size() == 0) { Application.Ui.Folders.ExpandFolder(folder, false); } else { Application.Ui.Folders.CollapseFolder(folder, false); } }); }, ReloadTable: function() { var page = window.location.href.match(/index\.php.*$/)[0]; $('#PlaceholderParent').load(page + ' #PlaceholderSortable', {}, function() { $(function() { Application.Ui.Folders.CreateSortableList(); }); }); }, SetStyles: function() { $('.sort-handle').css('cursor', 'move'); }, CreateSortableList: function() { $('#PlaceholderSortable').NestedSortable({ accept: 'SortableRow', noNestingClass: 'no-nesting', notNestableClass: 'not-nestable', opacity: 0.8, helperclass: 'SortableRowHelper', onChange: function(serialized) { this.updatingSortables = true; if (this.updateTimeout != null) { window.clearTimeout(this.updateTimeout); } $.ajax({ cache: false, url: 'index.php?Page=Folders&Action=ajax', type: 'POST', dataType: 'json', data: serialized[0].hash, success: function(response) { if (response.status != 'OK') { // fail silently } /*if (document.all && typeof document.body.style.maxHeight == undefined) { // IE has problems here - it breaks on sortable lists so for now we just // refresh the current page window.location.reload(); }*/ } }); }, onStop: function() { /*if (document.all && typeof document.body.style.maxHeight == undefined && this.updatingSortables == false) { // IE has problems here - it breaks on sortable lists so for now we just // refresh the current page this.updateTimeout = window.setTimeout(function() { window.location.reload(); }, 100); }*/ }, autoScroll: true, handle: '.sort-handle' }); Application.Ui.Folders.SetFolderVisibility(); Application.Ui.Folders.SetStyles(); } }; /** * ----- */ /** * Modules.Langauge * Retrieves language tokens via AJAX. */ Application.Modules.Language = { tokens: {}, /** * MergeTokens * Merges a new token hash into the main one (this.tokens). * * @param Hash A hash of the form {token: value}. * * @return Void Does not return anything. */ MergeTokens: function(new_tokens) { $.extend(this.tokens, new_tokens); }, /** * Get * Retrives language token values from files. * If the call is asynchronous, then the tokens can only be accessed at Application.Modules.Language.tokens. * * @param Array files A list of files to look in (e.g. ['language.php', 'folders.php']) * @param Array tokens A list of tokens to get the values off, without the 'LNG_' part. * @param Boolean async Whether to make the AJAX call asynchronous or not. * * @return Object A mapping of tokens and their values. This is only reliably available if the call is synchronous. */ Get: function(files, tokens, async) { if (async == undefined) { async = false; } // Check the cache. for (var i=0; i

' + desc + '
'; } function ShowHelp(div, title, desc) { div = document.getElementById(div); div.style.display = 'inline'; div.style.position = 'absolute'; div.style.width = '240px'; div.style.backgroundColor = '#FEFCD5'; div.style.border = 'solid 1px #E7E3BE'; div.style.padding = '10px'; div.innerHTML = '' + title + '

' + desc + '
'; } function HideHelp(div) { div = document.getElementById(div); div.style.display = 'none'; } function doCustomDate(myObj, tab) { if (myObj.options[myObj.selectedIndex].value == "Custom") { document.getElementById("customDate"+tab).style.display = "" document.getElementById("showDate"+tab).style.display = "none" } else { document.getElementById("customDate"+tab).style.display = "none" document.getElementById("showDate"+tab).style.display = "" } } function inArray(id, arraylist, returnvalue) { for (alitem = 0; alitem < arraylist.length; alitem++) { val = arraylist[alitem].toString(); if (id == val) { if (returnvalue) { return alitem; } return true; } } if (returnvalue) { return -1; } return false; } function display(RowID) { Row = RowID + "_detail"; var table = document.getElementById(Row); var rowCount = table.rows.length; for (i = 1; i < rowCount; i++) { table.rows[i].style.display = ""; } document.getElementById(RowID + "plus").style.display = "none" document.getElementById(RowID + "minus").style.display = "" } function hide(RowID) { Row = RowID + "_detail"; var table = document.getElementById(Row); var rowCount = table.rows.length; for (i = 1; i < rowCount; i++) { table.rows[i].style.display = "none"; } document.getElementById(RowID + "plus").style.display = "" document.getElementById(RowID + "minus").style.display = "none" } function getIFrameDocument(aID){ // if contentDocument exists, W3C compliant (Mozilla) if (document.getElementById(aID).contentDocument){ return document.getElementById(aID).contentDocument; } else { // IE return document.frames[aID].document; } } function ShowCustomFields(contentarea, editorname, pagename) { /* In Firefox the full path to the admin/index.php file needs to be specified otherwise it tries to load /admin/de/index.php. This is because DevEdit runs in an iframe. */ if (location.href.indexOf('?') != -1) { var url_part = location.href.split(/\?/); var url_to_indexphp = url_part[0]; } else { var url_to_indexphp = location.href; } var title = Application.Modules.Language.Get(['language.php'], ['CustomFieldsInsert_Editor'])['CustomFieldsInsert_Editor']; var temp = url_to_indexphp + '?Page=ShowCustomFields&EditorName=' + editorname + '&ContentArea=' + contentarea + (pagename? ('&PageName=' + pagename) : ''); tb_show(title, temp + '&keepThis=true&height=500&width=500&modal=false', ''); } // Used in text areas to make sure text is inserted into the Text area function insertAtCursor(myField, myValue) { if (document.selection) { myField.focus(); sel = document.selection.createRange(); sel.text = myValue; } else { if (myField.selectionStart || myField.selectionStart == '0') { var startPos = myField.selectionStart; var endPos = myField.selectionEnd; myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length); } else { myField.value += myValue; } } } function InsertLink(placeholder, contentarea, editorname) { // set the default for the editor name. if (!editorname || editorname == undefined) { editorname = 'myDevEditControl'; } placeholder = '%%' + placeholder + '%%'; if (contentarea == 'TextContent' || !UsingWYSIWYG) { if (contentarea == 'html') { contentarea = editorname + '_html'; } id = document.getElementById(contentarea); insertAtCursor(id, placeholder); return; } if (placeholder == '%%unsubscribelink%%') { placeholder = "" + UnsubLinkPlaceholder + ""; } modcheck_regex = new RegExp("%%modifydetails_(.*?)%%", "i"); modcheck = modcheck_regex.exec(placeholder); if (modcheck) { placeholder = "" + placeholder + ""; } modcheck_regex = new RegExp("%%sendfriend_(.*?)%%", "i"); modcheck = modcheck_regex.exec(placeholder); if (modcheck) { placeholder = "" + placeholder + ""; } Application.WYSIWYGEditor.insertText(placeholder); } function InsertUnsubscribeLink(contentarea, editorname) { InsertLink('unsubscribelink', contentarea, editorname); } function enableDate_SubscribeDate(formElement, datefield) { if (formElement.checked) { document.getElementById(datefield).style.display = "" } else { document.getElementById(datefield).style.display = "none" } } function ChangeFilterOptionsSubscribeDate(formElement, datefield) { if (formElement.selectedIndex == 3) { document.getElementById(datefield+"date2").style.display = "" } else { document.getElementById(datefield+"date2").style.display = "none" } } var LinkSelectBox = ""; var LinksLoaded = false; function enable_ClickedLink(formElement, linkfield, linkselect, loadingmessage, chosen_link) { LinkSelectBox = linkselect; if (formElement.checked) { document.getElementById(linkfield).style.display = ""; if (!LinksLoaded) { linkselect = document.getElementById(linkselect); linkselect.options.length = 0; linkselect.options[0] = new Option(loadingmessage, '-2'); ajaxWhat = "LoadLinks(" + chosen_link + ")"; DoCallback('what=importlinks'); } } else { document.getElementById(linkfield).style.display = "none"; } } function LoadLinks(linkid) { LinksLoaded = true; mylinks = new Array(); eval(ajaxData); linkselect = document.getElementById(LinkSelectBox); linkselect.options[0] = null; for(lnk in mylinks) { // we need to do this because eval'ing an array also evals prototype functions etc that go with it. // and we use that (above)... if (isNaN(lnk)) { continue; } linkselect.options[linkselect.options.length] = new Option(mylinks[lnk], lnk); // do we need to preselect a link? if (linkid == lnk) { linkselect.options[linkselect.options.length-1].selected = true; } } } var NewsSelectBox = ""; var NewsLoaded = false; function enable_OpenedNewsletter(formElement, newsfield, newsselect, loadingmessage, chosen_news) { NewsSelectBox = newsselect; if (formElement.checked) { document.getElementById(newsfield).style.display = ""; if (!NewsLoaded) { newsselect = document.getElementById(newsselect); newsselect.options.length = 0; newsselect.options[0] = new Option(loadingmessage, '-2'); ajaxWhat = "LoadNewsletter(" + chosen_news + ")"; DoCallback('what=importnewsletters'); } } else { document.getElementById(newsfield).style.display = "none"; } } function LoadNewsletter(chosen_news) { NewsLoaded = true; mynews = new Array(); ajaxData = unescape(ajaxData); eval(ajaxData); newsselect = document.getElementById(NewsSelectBox); newsselect.options[0] = null; for(news in mynews) { // we need to do this because eval'ing an array also evals prototype functions etc that go with it. // and we use that (above)... if (isNaN(news)) { continue; } newsselect.options[newsselect.options.length] = new Option(mynews[news], news); // do we need to preselect a link? if (news == chosen_news) { newsselect.options[newsselect.options.length-1].selected = true; } } } function switchContentSource(HTMLOrText, Id) { // Toggle the WYSIWYG editor, file upload box, or web file import box if(HTMLOrText == 'html') { var htmlCF = document.getElementById('htmlCF'); var htmlNLFile = document.getElementById('htmlNLFile'); var htmlNLImport = document.getElementById('htmlNLImport'); var newsletterurl = document.getElementById('newsletterurl'); switch(Id) { case 1: { document.getElementById('hct1').checked = true; htmlCF.style.display = ''; htmlNLFile.style.display = 'none'; htmlNLImport.style.display = 'none'; break; } case 2: { document.getElementById('hct2').checked = true; htmlCF.style.display = 'none'; htmlNLFile.style.display = ''; htmlNLImport.style.display = 'none'; break; } case 3: { document.getElementById('hct3').checked = true; htmlCF.style.display = 'none'; htmlNLFile.style.display = 'none'; htmlNLImport.style.display = ''; newsletterurl.focus(); newsletterurl.select(); break; } } } else { var textCF = document.getElementById('textCF'); var textNLFile = document.getElementById('textNLFile'); var textNLImport = document.getElementById('textNLImport'); var newsletterurl = document.getElementById('textnewsletterurl'); switch(Id) { case 1: { document.getElementById('tct1').checked = true; textCF.style.display = ''; textNLFile.style.display = 'none'; textNLImport.style.display = 'none'; break; } case 2: { document.getElementById('tct2').checked = true; textCF.style.display = 'none'; textNLFile.style.display = ''; textNLImport.style.display = 'none'; break; } case 3: { document.getElementById('tct3').checked = true; textCF.style.display = 'none'; textNLFile.style.display = 'none'; textNLImport.style.display = ''; newsletterurl.focus(); newsletterurl.select(); break; } } } } function createCookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else { var expires = ""; } document.cookie = name+"="+value+expires+"; path=/"; } /** * Gets the value of the specified cookie. * * name Name of the desired cookie. * * Returns a string containing value of specified cookie, * or null if cookie does not exist. */ function getCookie(name) { var dc = document.cookie; var prefix = name + "="; var begin = dc.indexOf("; " + prefix); if (begin == -1) { begin = dc.indexOf(prefix); if (begin != 0) return null; } else { begin += 2; } var end = document.cookie.indexOf(";", begin); if (end == -1) { end = dc.length; } return unescape(dc.substring(begin + prefix.length, end)); } function ChangePaging(page, formAction, displayName, confMessage) { paging = document.getElementById('PerPageDisplay' + displayName); pagingId = paging.selectedIndex; pagingAmount = paging[pagingId].value; if (pagingAmount == 'all') { if (!confirm(confMessage)) { return false; } } document.location = 'index.php?Page=' + page + '&' + formAction + '&PerPageDisplay' + displayName + '=' + pagingAmount; } function toggleAllCheckboxes(check) { formObj = check.form; for (var i=0;i < formObj.length; i++) { fldObj = formObj.elements[i]; if (fldObj.type == 'checkbox') { fldObj.checked = check.checked; } } } function ImportWebsite(button, description, importtype, newButtonDesc, errorMsg) { check_form = ImportCheck(importtype); if (!check_form) { return; } var url = ""; if (importtype.toLowerCase() == 'text') { url = document.getElementById('textnewsletterurl').value; } else { url = document.getElementById('newsletterurl').value; } ajaxWhat = "DoImport('website', '" + importtype + "', '" + newButtonDesc + "', '" + errorMsg + "');"; DoCallback('what=importurl&url=' + url); ajaxButt = button; button.value = description; button.style.width = "170px"; button.disabled = true; } function DoImport(importtype, TextOrHTML, newButtonDesc, errorMsg) { if (ajaxButt) { ajaxButt.value = newButtonDesc; ajaxButt.style.width = "70px"; ajaxButt.disabled = false; ajaxButt = null; } if(ajaxData.length == 0) { alert(errorMsg); } else { if (TextOrHTML.toLowerCase() == 'text') { switchContentSource('text', 1); document.getElementById('TextContent').value = ajaxData; } else { // Everything was OK switchContentSource('html', 1); if (typeof(tinyMCE) == 'undefined' || typeof(tinyMCE) == null) { document.getElementById('myDevEditControl_html').value = ajaxData; return; } Application.WYSIWYGEditor.setContent(ajaxData); } } } function DoCallback(data) { var url = 'remote.php'; // branch for native XMLHttpRequest object if (window.XMLHttpRequest) { req = new XMLHttpRequest(); req.onreadystatechange = processReqChange; req.open('POST', url, true); req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); req.send(data); // branch for IE/Windows ActiveX version } else if (window.ActiveXObject) { req = new ActiveXObject('Microsoft.XMLHTTP') if (req) { req.onreadystatechange = processReqChange; req.open('POST', url, true); req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); req.send(data); } } } function processReqChange() { // only if req shows 'loaded' if (req.readyState == 4) { // only if 'OK' if (req.status == 200) { ajaxData = req.responseText; eval(ajaxWhat); } else { alert('There was a problem retrieving the XML data:\n' + req.responseText); } } } function CheckRadio(Id) { return ($('form input[id^=' + Id + ']:radio:checked').size() > 0); } function CheckMultiple(name, frm) { return ($("input[@name^='" + name + "']:checked", (frm || document)).size() != 0); } /** * Returns true if the d/m/y is a valid date. */ function isValidDate(d, m, y) { date = new Date(); m = m - 1; // months start at 0 date.setFullYear(y, m, d); return (m == date.getMonth()); } /** * Validates a custom date field. Returns true if it has a valid date or is left empty. */ function CheckDate(field) { date_fields = jQuery.map(["dd", "mm", "yy"], function(el, i) { return document.getElementById(field + "[" + el + "]"); } ); error = false; all_blank = true; for (i = date_fields.length-1; i >= 0; i--) { if (date_fields[i].value == "") { error = true date_fields[i].focus(); } else { all_blank = false; } } return all_blank || (!error && isValidDate(date_fields[0].value, date_fields[1].value, date_fields[2].value)); } /** * Returns true if str is a (roughly) valid email address. */ function isValidEmail(str) { // We use a simple pattern here because the server side check is complex // and we don't want to exclude stuff it will accept. if(str.indexOf('@') > -1 && str.indexOf('.') > -1) { return true; } return false; } var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function decode64(input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; // remove all characters that are not A-Z, a-z, 0-9, +, /, or = input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); do { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } while (i < input.length); return output; } /** * Convert a single file-input element into a 'multiple' input list * * Usage: * * 1. Create a file input element (no name) * eg. * * 2. Create a DIV for the output to be written to * eg.
* * 3. Instantiate a MultiSelector object, passing in the DIV and an (optional) maximum number of files * eg. var multi_selector = new MultiSelector( document.getElementById( 'files_list' ), 3 ); * * 4. Add the first element * eg. multi_selector.addElement( document.getElementById( 'first_file_element' ) ); * * 5. That's it. * * You might (will) want to play around with the addListRow() method to make the output prettier. * * You might also want to change the line * element.name = 'file_' + this.count; * ...to a naming convention that makes more sense to you. * * Licence: * Use this however/wherever you like, just don't blame me if it breaks anything. * * Credit: * If you're nice, you'll leave this bit: * * Class by Stickman -- http://www.the-stickman.com * with thanks to: * [for Safari fixes] * Luis Torrefranca -- http://www.law.pitt.edu * and * Shawn Parker & John Pennypacker -- http://www.fuzzycoconut.com * [for duplicate name bug] * 'neal' */ function MultiSelector( list_target, max ) { // Where to write the list this.list_target = list_target; // How many elements? this.count = 0; // How many elements? this.id = 0; // Is there a maximum? if( max ){ this.max = max; } else { this.max = -1; }; /** * Add a new file input element */ this.addElement = function( element ){ // Make sure it's a file input element if( element.tagName == 'INPUT' && element.type == 'file' ){ // Element name -- what number am I? // element.name = 'file_' + this.id++; element.name = 'attachments[]'; // Add reference to this object element.multi_selector = this; // What to do when a file is selected element.onchange = function(){ var start_pos = element.value.lastIndexOf("/"); if (start_pos < 0) start_pos = element.value.lastIndexOf("\\"); var end_pos = element.value.length - 1; var file_size = element.value.substring(start_pos, end_pos); if (file_size.length > 30) { alert("This file name is too large and could cause problems in some email clients such as Outlook. Please rename the file to be less than 30 characters and try again."); return false; } // New file input var new_element = document.createElement( 'input' ); new_element.type = 'file'; new_element.className = "field250"; // Add new element this.parentNode.insertBefore( new_element, this ); // Apply 'update' to element this.multi_selector.addElement( new_element ); // Update list this.multi_selector.addListRow( this ); // Hide this: we can't use display:none because Safari doesn't like it this.style.position = 'absolute'; this.style.left = '-1000px'; }; // If we've reached maximum number, disable input element if( this.max != -1 && this.count >= this.max ){ element.disabled = true; }; // File element counter this.count++; // Most recent element this.current_element = element; } else { // This can only be applied to file input elements! alert( 'Error: not a file input element' ); }; }; /** * Add a new row to the list of files */ this.addListRow = function( element ){ // Row div var new_row = document.createElement( 'div' ); // Delete button var new_div = document.createElement( 'div' ); new_div.innerHTML = "  " new_div.style.display = "inline"; var new_row_button = document.createElement( 'a' ); // new_row_button.type = 'button'; new_row_button.innerHTML = 'Remove'; new_row_button.href = "javascript:void()"; // References new_row.element = element; // Delete function new_row_button.onclick= function(){ // Remove element from form this.parentNode.element.parentNode.removeChild( this.parentNode.element ); // Remove this row from the list this.parentNode.parentNode.removeChild( this.parentNode ); // Decrement counter this.parentNode.element.multi_selector.count--; // Re-enable input element (if it's disabled) this.parentNode.element.multi_selector.current_element.disabled = false; // Appease Safari // without it Safari wants to reload the browser window // which nixes your already queued uploads return false; }; // Set row value new_row.innerHTML = element.value; // Add button new_row.appendChild( new_div ); new_row.appendChild( new_row_button ); // Add it to the list this.list_target.appendChild( new_row ); }; }; // we do this to get around the "click here to activate control" issue in internet explorer // we don't need to do this with firefox, but at least it will be done consistently across all browsers // for more info see http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/overview/activating_activex.asp function PrintChart(contents) { document.write(contents); } // used by autoresponders, templates & newsletters. function previewTemplate(selectedValue) { if (isNaN(selectedValue)) { document.getElementById("imgPreview").src = "resources/email_templates/" + selectedValue+ "/preview.gif"; } else { if (selectedValue > 0) { document.getElementById("imgPreview").src = "resources/user_template_previews/" + selectedValue + "_preview.gif"; } else { document.getElementById("imgPreview").src = "images/nopreview.gif"; } document.getElementById("imgPreview").onerror = function (evt) { document.getElementById("imgPreview").src = "images/nopreview.gif"; } } } function stripHTML(c) { var BodyContents = /([\s\S]*\]*\>)([\s\S]*)(\<\/body\>[\s\S]*)/i ; var h = c.match(BodyContents); if (h != null && h[2]) { c = h[2]; } c = c.replace(/\/\/--\>/gi, ""); c = c.replace(/(\n)/gi,""); c = c.replace(/(\r)/gi,""); c = c.replace(//gi,"\n"); c = c.replace(/(<\/h.>|<\/p>|<\/div>)/gi, "$1\n\n"); c = c.replace(/<[^>]+>/g,""); c = c.replace(/</g,"<"); c = c.replace(/>/g,">"); c = c.replace(/ /g," "); return c; } function stripHTMLWithLinks(c) { var BodyContents = /([\s\S]*\]*\>)([\s\S]*)(\<\/body\>[\s\S]*)/i ; var h = c.match(BodyContents); if (h != null && h[2]) { c = h[2]; } c = c.replace(/(.*?)<\/a>/gi, "$2 [$1]"); c = c.replace(/(.*?)<\/a>/gi, "$2 [$1]"); c = c.replace(/\/\/--\>/gi, ""); c = c.replace(/(\n)/gi,""); c = c.replace(/(\r)/gi,""); c = c.replace(/]*\>[\s\S]*\<\/title\>/gi,""); c = c.replace(//gi,"\n"); c = c.replace(/(<\/h.>|<\/p>|<\/div>)/gi, "$1\n\n"); c = c.replace(/<[^>]+>/g,""); c = c.replace(/</g,"<"); c = c.replace(/>/g,">"); c = c.replace(/ /g," "); return c; } /* function grabTextContent(textareaname, editorname) { try { eval("var editr = " + editorname); document.getElementById(textareaname).value = editr.getTextContent(); } catch (error) { document.getElementById(textareaname).value = stripHTML(document.getElementById(editorname+'_html').value); } } */ function grabTextContent(textareaname, editorname) { try { var strip = ''; if ( Application.WYSIWYGEditor.isWysiwygEditorActive() ) { strip = Application.WYSIWYGEditor.getContent(); } else { strip = document.getElementById(editorname + '_html').value; } strip = stripHTMLWithLinks(strip); document.getElementById(textareaname).value = strip; } catch (error) { } } /* Theme Change Javascript */ function getTids() { var allTids = new Array; // Since document.getElementsByName doesnt return body, td, div tags etc, we need to do this ourselves for I.E if (document.all) { allElements = document.getElementById('myDevEditControllevel0').contentWindow.document.getElementById('myDevEditControl_frame').contentWindow.document.all; x = 0; for (i=0; i" + allTids[i].getAttribute("description") + allTids[i].getAttribute("bgcolor"); } document.getElementById("themeChanger").innerHTML = html; } var flag = 0; var defaultcolors = new Array(); function switchTheme(color) { if (color=='null') return false; var allTids = new Array; allTids = getTids(); if (allTids.length==0) { alert('The file you are editing does support automated color theme changes.'); return false; } var allcolors = new Array; if ((color=='default') && (flag==1)) { for (grd=0; grd<5; grd++) { allcolors[grd] = defaultcolors[grd]; } } else { var grades = [0, 0.6, 0.25, 0.667, 0.333]; var basecolor = new Array(HexToR(color), HexToG(color), HexToB(color)); var onecolor = new Array; for (grd=0; grd<5; grd++) { for (bsc=0; bsc<3; bsc++) { onecolor[bsc] = Math.round(basecolor[bsc]+(255-basecolor[bsc])*grades[grd]); } allcolors[grd] = '#'+RGB2Hex(onecolor[0], onecolor[1], onecolor[2]); } } var description = ''; for (i=0; i-1) { if (flag == 0) defaultcolors[descgrade] = allTids[i].style.borderColor; allTids[i].style.borderColor = allcolors[descgrade]; } else if (description.search(/BorderBottomColor$/)>-1) { if (flag == 0) defaultcolors[descgrade] = allTids[i].style.borderBottomColor; allTids[i].style.borderColor = allcolors[descgrade]; } else if (description.search(/BackgroundColor$/)>-1) { if (flag == 0) defaultcolors[descgrade] = allTids[i].style.backgroundColor; allTids[i].style.backgroundColor = allcolors[descgrade]; } else if (description.search(/Bgcolor$/)>-1) { if (flag == 0) defaultcolors[descgrade] = allTids[i].bgColor; allTids[i].bgColor = allcolors[descgrade]; } else if (description.search(/Color$/)>-1) { if (flag == 0) defaultcolors[descgrade] = allTids[i].style.color; allTids[i].style.color = allcolors[descgrade]; } continue; } comm = description.substr(pt); eval("if (flag == 0) defaultcolors[descgrade] = allTids[i]"+comm+";"); eval("allTids[i]"+comm+" = allcolors[descgrade];"); } flag = 1; } function HexToR(h) {return parseInt((cutHex(h)).substring(0,2),16)} function HexToG(h) {return parseInt((cutHex(h)).substring(2,4),16)} function HexToB(h) {return parseInt((cutHex(h)).substring(4,6),16)} function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h} hexdig='0123456789ABCDEF'; function Dec2Hex(d) { return hexdig.charAt((d-(d%16))/16)+hexdig.charAt(d%16); } function RGB2Hex(r,g,b) { return Dec2Hex(r)+Dec2Hex(g)+Dec2Hex(b); } function Hex2Dec(h) { h=h.toUpperCase(); d=0; for (i=0;i