// Variables used as maps to store the original text and html of some fields whose values get replaced by // renderer previews. var origHtml = new Object(); var origText = new Object(); var origPreviewLink = new Object(); /* * Used to submit and restore a renderer preview. This relies of the DWR library and the generated * RendererPreviewAjaxUtil.js bean, which performs the server-side access. */ function toggleRenderPreview(fieldId, fieldName, rendererType, issueKey) { var pidElement = document.getElementById("pid"); var pid = (pidElement == null) ? null : pidElement.value; var issueTypeElement = document.getElementById("issuetype"); var issueType = (issueTypeElement == null) ? null : issueTypeElement.value; if(origHtml[fieldId] == null) { // this is a hack for Safari/dwr since safari does not seem to generate an XMLHTTPRequest correctly see JRA-8354 if(encodeURI(document.getElementById(fieldId).value).length > 2500 && navigator.userAgent.indexOf('Safari') >= 0) { // first open the new window window.open('', 'wiki_renderer_preview', 'width=780, height=575, resizable, scrollbars=yes'); // then form submit to the window, we have to form submit because the error we are trying to get around // is the max size limit for a GET param value var previewForm = document.createElement('form'); previewForm.action = '$contextPath/secure/WikiRendererPreviewAction.jspa?rendererType='+ rendererType + '&issueKey=' + issueKey + '&fieldName='+ encodeURI(fieldName) + '&pid=' + encodeURI(pid) + '&issueType=' + encodeURI(issueType); previewForm.method = 'POST'; previewForm.target = 'wiki_renderer_preview'; var unrenderedMarkup = document.createElement('input'); unrenderedMarkup.name = 'unrenderedMarkup'; unrenderedMarkup.type = 'hidden'; unrenderedMarkup.value= document.getElementById(fieldId).value; previewForm.appendChild(unrenderedMarkup); var bodys = document.getElementsByTagName('BODY'); bodys[0].appendChild(previewForm); previewForm.submit(); } else { showWaitImage(true, fieldId); RendererPreviewAjaxUtil.getPreviewHtml(rendererType, document.getElementById(fieldId).value, issueKey, pid, issueType, renderPreviewCallback(fieldId)); } } else { var scrollSaver = document.createElement("div"); scrollSaver.innerHTML = " "; scrollSaver.setAttribute("style", "height: " + "300px"); document.getElementById(fieldId + "-edit").parentNode.insertBefore(scrollSaver, document.getElementById(fieldId + "-edit")); document.getElementById(fieldId + "-temp").name = fieldId + "-temp"; // clear the height before we reset xHeight(fieldId + "-edit", null); document.getElementById(fieldId + "-edit").innerHTML = origHtml[fieldId]; document.getElementById(fieldId).value = origText[fieldId]; origHtml[fieldId] = null; document.getElementById(fieldId + "-edit").className = ""; document.getElementById(fieldId + "-preview_link").innerHTML = ""+ "$i18n.getText("; scrollSaver.parentNode.removeChild(scrollSaver); } return false; } /* * This is the call-back function for the AJAX call to the RendererPreviewAjaxUtil getPreviewHtml call. This * function replaces the input with the renderered content. */ var renderPreviewCallback = function(fieldId) { return function(data) { var scrollSaver = document.createElement("div"); scrollSaver.innerHTML = " "; scrollSaver.setAttribute("style", "height: " + "300px"); document.getElementById(fieldId + "-edit").parentNode.insertBefore(scrollSaver, document.getElementById(fieldId + "-edit")); var origHeight = xHeight(fieldId + "-edit", null); origHtml[fieldId] = document.getElementById(fieldId + "-edit").innerHTML; origText[fieldId] = document.getElementById(fieldId).value; document.getElementById(fieldId + "-temp").value = origText[fieldId]; document.getElementById(fieldId + "-temp").name = fieldId; showWaitImage(false, fieldId ); document.getElementById(fieldId + "-preview_link").innerHTML = ""+ "$i18n.getText("; document.getElementById(fieldId + "-edit").className = "previewClass"; document.getElementById(fieldId + "-edit").innerHTML = data; var newHeight = xHeight(fieldId + "-edit", null); if(newHeight < origHeight) { xHeight(fieldId + "-edit", origHeight); } scrollSaver.parentNode.removeChild(scrollSaver); } } function showWaitImage(flag, fieldId) { var waitImageHtml = "Wait Image"; if(flag) { origPreviewLink[fieldId] = document.getElementById(fieldId + "-preview_link_div").innerHTML; document.getElementById(fieldId + "-preview_link_div").innerHTML = waitImageHtml; } else { document.getElementById(fieldId + "-preview_link_div").innerHTML = origPreviewLink[fieldId]; origPreviewLink[fieldId] = null; } } // xHeight, Copyright 2001-2005 Michael Foster (Cross-Browser.com) // Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL function xHeight(e,h) { if(!(e=xGetElementById(e))) return 0; if (xNum(h)) { if (h<0) h = 0; else h=Math.round(h); } else h=-1; var css=xDef(e.style); if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') { h = xClientHeight(); } else if(css && xDef(e.offsetHeight) && xStr(e.style.height)) { if(h>=0) { var pt=0,pb=0,bt=0,bb=0; if (document.compatMode=='CSS1Compat') { var gcs = xGetComputedStyle; pt=gcs(e,'padding-top',1); if (pt !== null) { pb=gcs(e,'padding-bottom',1); bt=gcs(e,'border-top-width',1); bb=gcs(e,'border-bottom-width',1); } // Should we try this as a last resort? // At this point getComputedStyle and currentStyle do not exist. else if(xDef(e.offsetHeight,e.style.height)){ e.style.height=h+'px'; pt=e.offsetHeight-h; } } h-=(pt+pb+bt+bb); if(isNaN(h)||h<0) { return; } else { e.style.height=h+'px'; } } else { e.style.height=""; } h=e.offsetHeight; } else if(css && xDef(e.style.pixelHeight)) { if(h>=0) e.style.pixelHeight=h; if(h==-1) e.style.pixelHeight=""; h=e.style.pixelHeight; } return h; }