AJS.log("page-editor starting");AJS.Editor=(function($){return{lastEditMode:null,lastKnownGoodContent:null,contentHasChangedSinceLastAutoSave:false,isDraftSaved:false,originalWikiContent:"",syncTitleFieldWithForm:function(){var hiddenContentTitle=AJS.$("#hidden-content-title");if(hiddenContentTitle.length){var title="";var titleWrittenField=AJS.$("#titleWritten");if(!titleWrittenField.length||titleWrittenField.val()!="false"){title=AJS.$("#content-title").val()}hiddenContentTitle.val(title)}},isSubmitting:false,isUnloaded:false,hasContentChanged:function(){var rte=AJS.params.useWysiwyg&&this.inRichTextMode();if(!rte&&!this.contentHasChangedSinceLastAutoSave){return false}return this.editorHasContentChanged(rte)},editorHasContentChanged:function(isRTEMode){if(isRTEMode){return this.Adapter.editorHasContentChanged()}return this.originalWikiContent!=this.getCurrentFormContent()},saveDraft:function(options){var defaults={async:true};if(typeof options=="boolean"){options={async:options}}else{if(typeof options=="number"){options=defaults}else{options=AJS.$.extend({},defaults,options)}}if(!AJS.params.saveDrafts||AJS.Editor.isSubmitting||(!options.forceSave&&!AJS.Editor.hasContentChanged())){return}AJS.Editor.syncTitleFieldWithForm();var form=AJS.Editor.getCurrentForm();var draftData={pageId:AJS.params.pageId,type:AJS.params.draftType,title:AJS.$("#hidden-content-title").val(),content:AJS.Editor.getCurrentFormContent()};var newSpaceKey=AJS.$("#newSpaceKey");if(newSpaceKey.length){draftData.spaceKey=newSpaceKey.val()}else{draftData.spaceKey=encodeURIComponent(AJS.params.spaceKey)}var originalVersion=AJS.$("#originalVersion");if(originalVersion.length){draftData.pageVersion=parseInt(originalVersion.val(),10)}var draftStatus=AJS.$("#draft-status");var resetWysiwygContent=AJS.params.useWysiwyg&&AJS.Editor.inRichTextMode();var jsTime=function(date){var h=date.getHours();var m=date.getMinutes();var ampm=h>11?"PM":"AM";h=h%12;return(h==0?"12":h)+":"+(m<10?"0":"")+m+" "+ampm};var saveDraftCallback=function(response){AJS.Editor.contentHasChangedSinceLastAutoSave=false;if(resetWysiwygContent){AJS.Editor.Adapter.editorResetContentChanged()}if(response.success){AJS.Editor.isDraftSaved=true;var detail={};try{detail=eval("("+response.response+")")}catch(e){}var time=detail.time||jsTime(new Date());draftStatus.removeClass("error");if(AJS.params.newPage){draftStatus.html(AJS.format("Draft saved at {0}",time))}else{draftStatus.html(AJS.format("Draft saved at {0} ({1}view change{2})",time,"<a id='view-diff-link-heartbeat' class='view-diff-link' href=#>","</a>"))}if(!AJS.params.contentId||AJS.params.contentId==="0"){AJS.params.contentId=detail.draftId}if(AJS.$.isFunction(options.onSuccessHandler)){options.onSuccessHandler(detail,AJS.params.newPage)}}else{draftStatus.addClass("error");draftStatus.html(response.response);if(AJS.$.isFunction(options.onErrorHandler)){options.onErrorHandler(response.response)}}};draftStatus.html("Saving draft&hellip;");draftData.xhtml=(form.xhtml.value=="true");AJS.safe.ajax({type:"POST",url:AJS.params.contextPath+"/json/savedraft.action",data:draftData,success:saveDraftCallback,error:function(){saveDraftCallback({success:false,response:"Draft saving timed out"})},dataType:"json",timeout:30000})},sendFormDraft:function(flagName){this.handleBeforeUnload=function(){};var form=this.getCurrentForm();this.addHiddenElement(form,flagName,"true");this.addHiddenElement(form,"contentChanged",""+this.hasContentChanged());this.addHiddenElement(form,"pageId",AJS.params.pageId);if(!form.spaceKey){this.addHiddenElement(form,"spaceKey",AJS.params.spaceKey)}form.action=(AJS.params.newPage?"create":"edit")+AJS.params.draftType+".action";form.submit()},getResumeDraftUrl:function(){var urlParts=[];urlParts.push(contextPath);urlParts.push("/pages/"+(AJS.params.newPage?"create":"edit")+AJS.params.draftType+".action");urlParts.push("?useDraft=true");urlParts.push("&pageId="+AJS.params.pageId);urlParts.push("&contentChanged="+this.hasContentChanged());this.getCurrentForm().spaceKey&&urlParts.push("&spaceKey="+AJS.params.spaceKey);return urlParts.join("")},addHiddenElement:function(form,name,value){var el=document.createElement("input");el.type="hidden";el.name=name;el.value=value;form.appendChild(el)},getCurrentFormContent:function(){var form=this.getCurrentForm();if(AJS.params.useWysiwyg&&form.xhtml.value=="true"){return this.Adapter.getEditorHTML()}if(form.markupTextarea){return form.markupTextarea.value}},getCurrentTitle:function(){return $("#content-title")&&$("#content-title").val()},contentFormSubmit:function(e){this.handleBeforeUnload=function(){};this.syncTitleFieldWithForm();AJS.$("#locationShowing").val(""+AJS.isVisible("#location_div"));AJS.$("#labelsShowing").val(""+AJS.isVisible("#labels_div"));AJS.$(".editable-title #content-title").attr("disabled","disabled");this.isSubmitting=this.checkCaptchaResponse(e);return this.isSubmitting},checkCaptchaResponse:function(e){if(e.target.name=="cancel"){return true}var captchaTextField=AJS.$("#captchaResponse");if(captchaTextField.val()==""){AJS.$("#captchaError").css("display","block");window.scroll(0,0);e.stopPropagation();return false}return true},heartbeat:function(){var data={dataType:"json",contentId:AJS.params.pageId,draftType:AJS.params.draftType};if(AJS.params.pageId=="0"||AJS.params.contentType=="comment"){AJS.safe.post(AJS.params.contextPath+"/json/heartbeat.action",{})}else{AJS.safe.post(AJS.params.contextPath+"/json/startheartbeatactivity.action",data,function(activityResponses){var otherUsersAreEditing=activityResponses.length;if(otherUsersAreEditing){var outerSpan=AJS.$("#other-users-span");outerSpan.empty();for(var i=0;i<otherUsersAreEditing;++i){if(i>0){outerSpan.append(", ")}var activityResponse=activityResponses[i];outerSpan.append(AJS("a").attr("href",AJS.params.contextPath+"/display/~"+encodeURIComponent(activityResponse.userName)).text(activityResponse.fullName));if(activityResponse.lastEditMessage!=null){outerSpan.append(" ").append(AJS("span").addClass("smalltext").text(activityResponse.lastEditMessage))}}}AJS.setVisible("#heartbeat-div",!!otherUsersAreEditing)},"json")}},disableFrame:function(body){AJS.$("form",body).each(function(){AJS.$(this).unbind();this.onsubmit=function(){return false}});AJS.$("a",body).each(function(){AJS.$(this).attr("target","_top").unbind()});AJS.$("input",body).each(function(){AJS.$(this).unbind()})},previewFrameOnload:function(body,iframe){AJS.Editor.disableFrame(body);var $iframe=AJS.$(iframe||"#previewArea iframe"),prevHeight=0,counter=0,content=AJS.$("#main",body)[0],originalHeight=$iframe.height();content&&(function(){var height=content.scrollHeight;if(prevHeight!=height){if(height!=$iframe.height()){$iframe.height(Math.max(height,originalHeight))}prevHeight=height;counter=0}else{counter++}if(counter<500){setTimeout(arguments.callee,500)}})()},showRichText:function(show){if(!AJS.params.useWysiwyg){return}AJS.setVisible("#wysiwyg",show);AJS.setCurrent("#wysiwygTab",show);if(show){this.Adapter.onShowEditor();this.lastKnownGoodContent=null;AJS.$("#main").addClass("active-richtext")}else{this.Adapter.onHideEditor();AJS.$("#main").removeClass("active-richtext")}},showMarkup:function(show){var form=this.getCurrentForm(),fname1=(show?"removeClass":"addClass"),fname2=(show?"addClass":"removeClass");AJS.$("#markup")[fname1]("hidden");AJS.$("#markupTab")[fname2]("current");AJS.$("#sidebar")[fname1]("hidden");AJS.$("#addcomment-sidebar")[fname1]("hidden");AJS.$(form)[fname2]("markup");AJS.$("#linkinserters")[fname1]("hidden");AJS.$("#main")[fname2]("active-wikimarkup")},showPreview:function(show){var fname1=(show?"removeClass":"addClass"),fname2=(show?"addClass":"removeClass");AJS.$("#preview")[fname1]("hidden");AJS.$("#previewTab")[fname2]("current");AJS.$("#main")[fname2]("active-preview")},setMode:function(mode){var wasRichText=this.inRichTextMode();var form=this.getCurrentForm();if(mode!=AJS.params.actionPreview){AJS.$("input[name=xhtml]",this.getCurrentForm()).val(mode==AJS.params.actionRichtext)}if(AJS.params.remoteUser&&AJS.params.useWysiwyg){this.showDefaultEditorLinks(mode)}if(mode==AJS.params.actionRichtext){this.showMarkup(false);this.showRichText(true);this.showPreview(false)}else{if(mode==AJS.params.actionMarkup){this.showMarkup(true);this.showRichText(false);this.showPreview(false);if($.browser.msie&&$.browser.version.charAt()==8){var wikiMarkupElement=AJS.$("#markup");AJS.$("#markupTextarea").width(wikiMarkupElement.width()).height(wikiMarkupElement.height())}}else{if(mode==AJS.params.actionPreview){if(wasRichText){this.lastKnownGoodContent=this.Adapter.getEditorHTML()}this.showPreview(true);this.showRichText(false);this.showMarkup(false)}}}AJS.$("input[name=mode]",form).val(mode)},getContentId:function(){if(+AJS.params.contentId){return AJS.params.contentId}if(+AJS.params.pageId){return AJS.params.pageId}return"0"},changeMode:function(newMode){if(AJS.params.useWysiwyg&&this.inRichTextMode()&&!AJS.Editor.Adapter.allowModeChange()){return false}var oldMode=AJS.$("input[name=mode]",this.getCurrentForm()).val();if(oldMode==newMode){return false}this.showWaitImage(true);if(AJS.params.saveDrafts){var async=(AJS.params.contentId==="0"?false:true);this.saveDraft(async)}var contentId=this.getContentId();if(newMode==AJS.params.actionMarkup){if(oldMode==AJS.params.actionPreview){if(AJS.Editor.lastEditMode==AJS.params.actionMarkup){this.replysetTextArea(null)}else{AJS.safe.post(AJS.params.contextPath+"/json/convertxhtmltowikimarkupwithoutpage.action",{pageId:contentId,xhtml:AJS.Editor.lastKnownGoodContent},this.replysetTextArea,"json")}}else{AJS.safe.post(AJS.params.contextPath+"/json/convertxhtmltowikimarkupwithoutpage.action",{pageId:contentId,xhtml:AJS.Editor.Adapter.getEditorHTML()},this.replysetTextArea,"json")}}else{if(newMode==AJS.params.actionRichtext){if(oldMode==AJS.params.actionPreview&&AJS.Editor.lastEditMode==AJS.params.actionRichtext){this.replysetEditorValue(null)}else{AJS.safe.post(AJS.params.contextPath+"/json/convertwikimarkuptoxhtmlwithoutpagewithspacekey.action",{pageId:contentId,spaceKey:AJS.params.spaceKey,wikiMarkup:AJS.$("#markupTextarea").val()},this.replysetEditorValue,"json")}}else{var queryParams={contentId:contentId,contentType:AJS.params.contentType,spaceKey:AJS.params.spaceKey};if(oldMode==AJS.params.actionRichtext){AJS.Editor.lastEditMode=AJS.params.actionRichtext;AJS.Editor.lastKnownGoodContent=queryParams.xHtml=AJS.Editor.Adapter.getEditorHTML()}else{AJS.Editor.lastEditMode=AJS.params.actionMarkup;queryParams.wikiMarkup=AJS.$("#markupTextarea").val()}AJS.$.post(AJS.params.contextPath+"/pages/rendercontent.action",queryParams,AJS.Editor.replysetPreviewArea)}}return false},showWaitImage:function(flag){AJS.$("#wysiwygWaitImage").css("visibility",(flag?"visible":"hidden"))},replysetTextArea:function(s){if(s!=null){AJS.$("#markupTextarea").val(s);if(AJS.params.saveDrafts){AJS.Editor.originalWikiContent=s}}AJS.Editor.setMode(AJS.params.actionMarkup);AJS.Editor.showWaitImage(false)},replysetEditorValue:function(s){AJS.Editor.showWaitImage(false);AJS.Editor.setMode(AJS.params.actionRichtext);AJS.Editor.Adapter.setEditorValue(s)},replysetPreviewArea:function(html){AJS.Editor.showWaitImage(false);AJS.Editor.setMode(AJS.params.actionPreview);var src=AJS.params.staticResourceUrlPrefix+"/blank.html";AJS.$("#previewArea").html('<iframe src="'+src+'" scrolling="no" frameborder="0"></iframe>');var iframe=AJS.$("#previewArea iframe")[0];var doc=iframe.contentDocument||iframe.contentWindow.document;doc.write(html);doc.close()},inRichTextMode:function(){return AJS.$("input[name=mode]",this.getCurrentForm()).val()==AJS.params.actionRichtext},onInit:function(){AJS.Editor.setMode(AJS.params.editorMode)},handleUnload:function(){if(AJS.Editor.isUnloaded){return}AJS.Editor.isUnloaded=true;if(AJS.params.saveDrafts){AJS.Editor.saveDraft(false)}},handleBeforeUnload:function(){if(typeof seleniumAlert!="undefined"){return}if(AJS.Editor.hasContentChanged()){if(AJS.params.saveDrafts){return "A draft will be saved and will be accessible from the \'Drafts\' page."}return "Your comment will be lost."}else{if(AJS.Editor.isDraftSaved){return "A draft will be saved and will be accessible from the \'Drafts\' page."}}},storeTextareaBits:function(doNotFocus){return AJS.Editor.Markup.storeTextareaBits(this.getCurrentForm(),AJS.$("#markupTextarea")[0],doNotFocus)},setRichTextDefault:function(value){AJS.safe.post(AJS.params.contextPath+"/json/setpreferenceusereditwysiwyg.action",{useWysiwyg:value},function(){},"json");AJS.Editor.editorPreference=(value?AJS.params.actionRichtext:AJS.params.actionMarkup);AJS.$("#makeRichTextDefault").addClass("hidden");AJS.$("#makeMarkupDefault").addClass("hidden")},showDefaultEditorLinks:function(currentMode){var defaultIsWysiwyg=(AJS.Editor.editorPreference==AJS.params.actionRichtext);var showRichTextDefault,showMarkupDefault=false;if(defaultIsWysiwyg&&currentMode==AJS.params.actionMarkup){showMarkupDefault=true}else{if(!defaultIsWysiwyg&&currentMode==AJS.params.actionRichtext){showRichTextDefault=true}}AJS.$("#makeRichTextDefault")[showRichTextDefault?"removeClass":"addClass"]("hidden");AJS.$("#makeMarkupDefault")[showMarkupDefault?"removeClass":"addClass"]("hidden")},contentChangeHandler:function(){this.contentHasChangedSinceLastAutoSave=true},getCurrentForm:function(){return AJS.$("form[name="+AJS.params.formName+"]")[0]},openMacroBrowser:function(e){var t=AJS.Editor,mb=AJS.MacroBrowser,textarea=$("#markupTextarea");var range=t.Markup.selection=textarea.selectionRange();t.Markup.scrollTop=textarea.scrollTop();var selectedMacro=mb.getSelectedMacro(range.textBefore,textarea.val());mb.open({markupMode:true,selectedMacro:selectedMacro,selectedMarkup:range.text,onComplete:AJS.Editor.macroBrowserComplete,onCancel:AJS.Editor.macroBrowserCancel});return AJS.stopEvent(e)},macroBrowserComplete:function(macro){var t=AJS.Editor,textarea=$("#markupTextarea"),m=AJS.MacroBrowser.settings.selectedMacro;if(m){textarea.selectionRange(m.startIndex,m.startIndex+m.markup.length)}else{if(t.Markup.selection){textarea.selectionRange(t.Markup.selection.start,t.Markup.selection.end)}}textarea.selection(macro.markup);textarea.scrollTop(t.Markup.scrollTop)},macroBrowserCancel:function(){var t=AJS.Editor,textarea=$("#markupTextarea");if(t.Markup.selection){textarea.selectionRange(t.Markup.selection.start,t.Markup.selection.end)}textarea.scrollTop(t.Markup.scrollTop)}}})(AJS.$);AJS.toInit(function(f){AJS.log("page-editor initialising");AJS.Editor.editorPreference=AJS.params.editorMode;f("#wysiwygTab a:first").click(function(k){AJS.Editor.changeMode(AJS.params.actionRichtext);k.preventDefault()});f("#markupTab a:first").click(function(k){AJS.Editor.changeMode(AJS.params.actionMarkup);k.preventDefault()});f("#previewTab a:first").click(function(k){AJS.Editor.changeMode(AJS.params.actionPreview);k.preventDefault()});f("#makeRichTextDefault").click(function(k){AJS.Editor.setRichTextDefault(true);k.preventDefault()});f("#makeMarkupDefault").click(function(k){AJS.Editor.setRichTextDefault(false);k.preventDefault()});f("#editor-insert-macro").click(AJS.Editor.openMacroBrowser);f("#markupTextarea").select(function(){AJS.Editor.storeTextareaBits(true)}).keyup(function(k){AJS.Editor.contentChangeHandler();if(k.ctrlKey){if(k.keyCode==77){f("#editor-insert-image").click();return false}if(k.shiftKey&&k.keyCode==65){f("#editor-insert-macro").click();return false}}}).change(function(){AJS.Editor.contentChangeHandler()});f(".submit-buttons").click(function(k){AJS.Editor.contentFormSubmit(k)});f(".editor-template-link").click(function(l){var k=AJS.$("#createpageform")[0];if((AJS.Editor.hasContentChanged()||AJS.Editor.isDraftSaved)&&!confirm("Selecting a template will overwrite your existing changes.")){return}k.action="createpage-choosetemplate.action";AJS.Editor.contentFormSubmit(l);k.submit()});if(AJS.params.useWysiwyg){var i=function(k){AJS.Editor.showWaitImage(false)};AJS.Editor.Adapter.addOnInitCallback(AJS.Editor.onInit);AJS.Editor.Adapter.editorOnLoad()}f(window).bind("render-content-loaded",function(m,k){var l=f("#previewArea iframe");if(l.contents().find("body")[0]==k){AJS.Editor.previewFrameOnload(k,l)}});window.onbeforeunload=function(){return AJS.Editor.handleBeforeUnload()};if(AJS.params.saveDrafts){f(window).unload(AJS.Editor.handleUnload);f.getJSON(AJS.params.contextPath+"/json/getdraftsaveinterval.action",{},function(k){setInterval(AJS.Editor.saveDraft,k)})}if(AJS.params.heartbeat){AJS.Editor.heartbeat();f.getJSON(AJS.params.contextPath+"/json/getheartbeatinterval.action",{},function(k){setInterval(AJS.Editor.heartbeat,k)})}var j=f("#title-text");var h=f("#content-title");var g=f("#content-title-label");if(j.length&&h.length){var b=document.createElement("div");f(b).addClass("editable-title").append(g).append(h);if(!f.browser.msie){f(window).load(function(){var k=f("#title-heading img.logo");if(k.length&&k.css("display")!="none"){f(b).css("marginLeft",f("#title-heading img.logo").width()+10+"px")}else{f(b).css("marginLeft",0)}})}j.replaceWith(b);var d=f("#hidden-content-title");if(!d.length){var e=document.createElement("input");e.id="hidden-content-title";e.type="hidden";e.name="title";e=f(e);var a=f("#titleWritten");if(!a.length||a.val()!="false"){e.val(h.val())}var c=f("#wiki-editor");c.before(e)}}AJS.Editor.originalWikiContent=AJS.Editor.getCurrentFormContent()});
(function(b){b.fn.ajaxSubmit=function(s){if(!this.length){a("ajaxSubmit: skipping submit process - no element selected");return this}if(typeof s=="function"){s={success:s}}var e=b.trim(this.attr("action"));if(e){e=(e.match(/^([^#]+)/)||[])[1]}e=e||window.location.href||"";s=b.extend({url:e,type:this.attr("method")||"GET"},s||{});var u={};this.trigger("form-pre-serialize",[this,s,u]);if(u.veto){a("ajaxSubmit: submit vetoed via form-pre-serialize trigger");return this}if(s.beforeSerialize&&s.beforeSerialize(this,s)===false){a("ajaxSubmit: submit aborted via beforeSerialize callback");return this}var m=this.formToArray(s.semantic);if(s.data){s.extraData=s.data;for(var f in s.data){if(s.data[f] instanceof Array){for(var g in s.data[f]){m.push({name:f,value:s.data[f][g]})}}else{m.push({name:f,value:s.data[f]})}}}if(s.beforeSubmit&&s.beforeSubmit(m,this,s)===false){a("ajaxSubmit: submit aborted via beforeSubmit callback");return this}this.trigger("form-submit-validate",[m,this,s,u]);if(u.veto){a("ajaxSubmit: submit vetoed via form-submit-validate trigger");return this}var d=b.param(m);if(s.type.toUpperCase()=="GET"){s.url+=(s.url.indexOf("?")>=0?"&":"?")+d;s.data=null}else{s.data=d}var t=this,l=[];if(s.resetForm){l.push(function(){t.resetForm()})}if(s.clearForm){l.push(function(){t.clearForm()})}if(!s.dataType&&s.target){var p=s.success||function(){};l.push(function(j){b(s.target).html(j).each(p,arguments)})}else{if(s.success){l.push(s.success)}}s.success=function(q,k){for(var n=0,j=l.length;n<j;n++){l[n].apply(s,[q,k,t])}};var c=b("input:file",this).fieldValue();var r=false;for(var i=0;i<c.length;i++){if(c[i]){r=true}}var h=false;if(s.iframe||r||h){if(s.closeKeepAlive){b.get(s.closeKeepAlive,o)}else{o()}}else{b.ajax(s)}this.trigger("form-submit-notify",[this,s]);return this;function o(){var w=t[0];if(b(":input[name=submit]",w).length){alert('Error: Form elements must not be named "submit".');return}var q=b.extend({},b.ajaxSettings,s);var G=b.extend(true,{},b.extend(true,{},b.ajaxSettings),q);var v="jqFormIO"+(new Date().getTime());var C=b('<iframe id="'+v+'" name="'+v+'" src="about:blank" />');var E=C[0];C.css({position:"absolute",top:"-1000px",left:"-1000px"});var F={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(){this.aborted=1;C.attr("src","about:blank")}};var D=q.global;if(D&&!b.active++){b.event.trigger("ajaxStart")}if(D){b.event.trigger("ajaxSend",[F,q])}if(G.beforeSend&&G.beforeSend(F,G)===false){G.global&&b.active--;return}if(F.aborted){return}var k=0;var z=0;var j=w.clk;if(j){var x=j.name;if(x&&!j.disabled){s.extraData=s.extraData||{};s.extraData[x]=j.value;if(j.type=="image"){s.extraData[name+".x"]=w.clk_x;s.extraData[name+".y"]=w.clk_y}}}setTimeout(function(){var J=t.attr("target"),H=t.attr("action");w.setAttribute("target",v);if(w.getAttribute("method")!="POST"){w.setAttribute("method","POST")}if(w.getAttribute("action")!=q.url){w.setAttribute("action",q.url)}if(!s.skipEncodingOverride){t.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"})}if(q.timeout){setTimeout(function(){z=true;A()},q.timeout)}var I=[];try{if(s.extraData){for(var K in s.extraData){I.push(b('<input type="hidden" name="'+K+'" value="'+s.extraData[K]+'" />').appendTo(w)[0])}}C.appendTo("body");E.attachEvent?E.attachEvent("onload",A):E.addEventListener("load",A,false);w.submit()}finally{w.setAttribute("action",H);J?w.setAttribute("target",J):t.removeAttr("target");b(I).remove()}},10);var y=50;function A(){if(k++){return}E.detachEvent?E.detachEvent("onload",A):E.removeEventListener("load",A,false);var H=true;try{if(z){throw"timeout"}var I,L;L=E.contentWindow?E.contentWindow.document:E.contentDocument?E.contentDocument:E.document;var M=q.dataType=="xml"||L.XMLDocument||b.isXMLDoc(L);a("isXml="+M);if(!M&&(L.body==null||L.body.innerHTML=="")){if(--y){k=0;setTimeout(A,100);return}a("Could not access iframe DOM after 50 tries.");return}F.responseText=L.body?L.body.innerHTML:null;F.responseXML=L.XMLDocument?L.XMLDocument:L;F.getResponseHeader=function(O){var N={"content-type":q.dataType};return N[O]};if(q.dataType=="json"||q.dataType=="script"){var n=L.getElementsByTagName("textarea")[0];if(n){F.responseText=n.value}else{var K=L.getElementsByTagName("pre")[0];if(K){F.responseText=K.innerHTML}}}else{if(q.dataType=="xml"&&!F.responseXML&&F.responseText!=null){F.responseXML=B(F.responseText)}}I=b.httpData(F,q.dataType)}catch(J){H=false;b.handleError(q,F,"error",J)}if(H){q.success(I,"success");if(D){b.event.trigger("ajaxSuccess",[F,q])}}if(D){b.event.trigger("ajaxComplete",[F,q])}if(D&&!--b.active){b.event.trigger("ajaxStop")}if(q.complete){q.complete(F,H?"success":"error")}setTimeout(function(){C.remove();F.responseXML=null},100)}function B(n,H){if(window.ActiveXObject){H=new ActiveXObject("Microsoft.XMLDOM");H.async="false";H.loadXML(n)}else{H=(new DOMParser()).parseFromString(n,"text/xml")}return(H&&H.documentElement&&H.documentElement.tagName!="parsererror")?H:null}}};b.fn.ajaxForm=function(c){return this.ajaxFormUnbind().bind("submit.form-plugin",function(){b(this).ajaxSubmit(c);return false}).bind("click.form-plugin",function(g){var d=b(g.target);if(!(d.is(":submit,input:image"))){return}var f=this;f.clk=g.target;if(g.target.type=="image"){if(g.offsetX!=undefined){f.clk_x=g.offsetX;f.clk_y=g.offsetY}else{if(typeof b.fn.offset=="function"){var h=d.offset();f.clk_x=g.pageX-h.left;f.clk_y=g.pageY-h.top}else{f.clk_x=g.pageX-g.target.offsetLeft;f.clk_y=g.pageY-g.target.offsetTop}}}setTimeout(function(){f.clk=f.clk_x=f.clk_y=null},10)})};b.fn.ajaxFormUnbind=function(){return this.unbind("submit.form-plugin click.form-plugin")};b.fn.formToArray=function(q){var p=[];if(this.length==0){return p}var d=this[0];var h=q?d.getElementsByTagName("*"):d.elements;if(!h){return p}for(var k=0,m=h.length;k<m;k++){var e=h[k];var f=e.name;if(!f){continue}if(q&&d.clk&&e.type=="image"){if(!e.disabled&&d.clk==e){p.push({name:f,value:b(e).val()});p.push({name:f+".x",value:d.clk_x},{name:f+".y",value:d.clk_y})}continue}var r=b.fieldValue(e,true);if(r&&r.constructor==Array){for(var g=0,c=r.length;g<c;g++){p.push({name:f,value:r[g]})}}else{if(r!==null&&typeof r!="undefined"){p.push({name:f,value:r})}}}if(!q&&d.clk){var l=b(d.clk),o=l[0],f=o.name;if(f&&!o.disabled&&o.type=="image"){p.push({name:f,value:l.val()});p.push({name:f+".x",value:d.clk_x},{name:f+".y",value:d.clk_y})}}return p};b.fn.formSerialize=function(c){return b.param(this.formToArray(c))};b.fn.fieldSerialize=function(d){var c=[];this.each(function(){var h=this.name;if(!h){return}var f=b.fieldValue(this,d);if(f&&f.constructor==Array){for(var g=0,e=f.length;g<e;g++){c.push({name:h,value:f[g]})}}else{if(f!==null&&typeof f!="undefined"){c.push({name:this.name,value:f})}}});return b.param(c)};b.fn.fieldValue=function(h){for(var g=[],e=0,c=this.length;e<c;e++){var f=this[e];var d=b.fieldValue(f,h);if(d===null||typeof d=="undefined"||(d.constructor==Array&&!d.length)){continue}d.constructor==Array?b.merge(g,d):g.push(d)}return g};b.fieldValue=function(c,j){var e=c.name,p=c.type,q=c.tagName.toLowerCase();if(typeof j=="undefined"){j=true}if(j&&(!e||c.disabled||p=="reset"||p=="button"||(p=="checkbox"||p=="radio")&&!c.checked||(p=="submit"||p=="image")&&c.form&&c.form.clk!=c||q=="select"&&c.selectedIndex==-1)){return null}if(q=="select"){var k=c.selectedIndex;if(k<0){return null}var m=[],d=c.options;var g=(p=="select-one");var l=(g?k+1:d.length);for(var f=(g?k:0);f<l;f++){var h=d[f];if(h.selected){var o=h.value;if(!o){o=(h.attributes&&h.attributes.value&&!(h.attributes.value.specified))?h.text:h.value}if(g){return o}m.push(o)}}return m}return c.value};b.fn.clearForm=function(){return this.each(function(){b("input,select,textarea",this).clearFields()})};b.fn.clearFields=b.fn.clearInputs=function(){return this.each(function(){var d=this.type,c=this.tagName.toLowerCase();if(d=="text"||d=="password"||c=="textarea"){this.value=""}else{if(d=="checkbox"||d=="radio"){this.checked=false}else{if(c=="select"){this.selectedIndex=-1}}}})};b.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=="function"||(typeof this.reset=="object"&&!this.reset.nodeType)){this.reset()}})};b.fn.enable=function(c){if(c==undefined){c=true}return this.each(function(){this.disabled=!c})};b.fn.selected=function(c){if(c==undefined){c=true}return this.each(function(){var d=this.type;if(d=="checkbox"||d=="radio"){this.checked=c}else{if(this.tagName.toLowerCase()=="option"){var e=b(this).parent("select");if(c&&e[0]&&e[0].type=="select-one"){e.find("option").selected(false)}this.selected=c}}})};function a(){if(b.fn.ajaxSubmit.debug&&window.console&&window.console.log){window.console.log("[jquery.form] "+Array.prototype.join.call(arguments,""))}}})(jQuery);
jQuery.fn.sizeToFit=function(){var a=jQuery;this.each(function(){var d=this;var b=a(this).parent();var e=b.height();b.children().each(function(){if(this!=d){e-=a(this).outerHeight()}});var c=a(this).outerHeight()-a(this).height();a(this).css("height",Math.max(0,e-c)+"px")});return this};AJS.Editor.ImageDialog=AJS.Editor.ImageDialog||{beforeShowListeners:[],afterThumbnailsDisplayedListeners:[]};AJS.toInit(function(a){AJS.wikiAttrToString=function(b){var c=[];for(var d in b){if(b.hasOwnProperty(d)){c.push(typeof b[d]=="boolean"?b[d]?d:"":d+"="+b[d])}}return c.length?"|"+c.join(","):""};AJS.Editor.insertImageDialog=function(c,b){this.openImageDialog({submitCallback:c,cancelCallback:b})};AJS.Editor.openImageDialog=function(q){q=q||{};var l=100,g=97;var i="",c=new AJS.Dialog(800,590,"insert-image-dialog");var d=AJS.params.attachmentSourceContentId;var h=function(u){var t={},v=a(".img-align",u).val(),r=!!a(".img-thumbnail",u).attr("checked"),s=!!a(".img-border",u).attr("checked");v!="none"&&(t.align=v);r&&(t.thumbnail=true);s&&(t.border="1");return t};function m(){c.hide().remove();a(document).unbind(".insert-image");q.cancelCallback&&q.cancelCallback()}a(document).bind("keydown.insert-image",function(r){if(r.which==27&&!a("#fancy_overlay").is(":visible")){m();return AJS.stopEvent(r)}});var b="Insert Image";var p="Insert";if(q.imageProperties){b="Edit Image";p="Save"}c.addHeader(b);c.addPanel("Attached Images",AJS.renderTemplate("attachedImages",AJS.getTemplate("imagePropertiesForm")),"attachments-panel");c.addPanel("From the Web",AJS.renderTemplate("webImage",AJS.getTemplate("imagePropertiesForm")),"web-image-panel");c.addButton(p,function(r){var s=h(r.getCurrentPanel().body);r.remove();a(document).unbind(".insert-image");q.submitCallback&&q.submitCallback(i,s,d)});c.addCancel("Cancel",m);c.get("panel:0").setPadding(0);c.get("panel:1").setPadding(0);c.get("panel:0").select();var f=c.get("button:0")[0].item;f.attr("disabled","disabled");a("input.image-url",c.popup.element).bind("keyup click",function(r){var s=a(this).val();i=s;f.attr("disabled",(s!=""&&s!="http://"?"":"disabled"));if(r.which==13){a("input.image-preview",c.popup.element).click();c.get("button:0")[0].item.focus()}});a("input.image-preview",c.popup.element).click(function(){var r=a(this).closest("div");var w=r.find("input.image-url").val();var v=r.find(".image-preview-area");var u=r.find(".image-preview-throbber");u.removeClass("hidden");var t=Raphael.spinner(u[0],60,"#666");var s=r.find(".image-preview-error");v.addClass("faraway");s.addClass("hidden");v.html("");a("<img>").load(function(){t();u.addClass("hidden");v.removeClass("faraway")}).error(function(){t();u.addClass("hidden");s.removeClass("hidden")}).appendTo(v).attr("src",w)});if(q.imageProperties){a(".img-align",c.popup.element).val(q.imageProperties.align||"none");a(".img-thumbnail",c.popup.element).attr("checked",q.imageProperties.thumbnail||"");a(".img-border",c.popup.element).attr("checked",!!q.imageProperties.border||"");if(q.imageProperties.url){c.get("panel:1").select();a("input.image-url",c.popup.element).val(q.imageProperties.url).click();a("input.image-preview",c.popup.element).click()}}AJS.log(AJS.Editor.ImageDialog.beforeShowListeners.length+" beforeShow listeners registered.");a.each(AJS.Editor.ImageDialog.beforeShowListeners,function(){this()});c.show();c.popup.element.find(".dialog-button-panel").append(AJS.template.load("insert-image-did-you-know"));a("select.img-align").focus();var o=a("#upload-attachment form");var k=a("#upload-attachment .image-uploading");var j=a("#upload-attachment .warning");var n=a("#attached-images");AJS.Editor.ImageDialog.clearErrors=function(){j.addClass("hidden");j.empty();n.sizeToFit()};AJS.Editor.ImageDialog.displayErrors=function(s){if(!s||!s.length){return}j.removeClass("hidden");var r=a("ul",j);if(!r.length){r=a("<ul></ul>");r.appendTo(j)}a.each(s,function(t,u){if(!u){return}a("<li>"+u.substring(0,Math.min(g,u.length))+(u.length>g?"&hellip;":"")+"</li>").attr("title",u).appendTo(r)});a("#attached-images").sizeToFit()};AJS.Editor.ImageDialog.imagesContainerSelector="#attached-images .image-list";o.ajaxForm({dataType:"json",data:{contentId:d,responseFormat:"html"},resetForm:true,beforeSubmit:function(){AJS.Editor.ImageDialog.setUploadInProgress(true);AJS.Editor.ImageDialog.clearErrors()},error:function(r){AJS.Editor.ImageDialog.setUploadInProgress(false);AJS.Editor.ImageDialog.displayErrors(["Could not upload the file to Confluence. The server may be unavailable."]);AJS.log("Response from server was: "+r.responseText)},success:function(r){AJS.Editor.ImageDialog.setUploadInProgress(false);var s=[].concat(r.validationErrors||[]).concat(r.actionErrors||[]).concat(r.errorMessage||[]);if(s.length>0){AJS.Editor.ImageDialog.displayErrors(s);return}AJS.Editor.ImageDialog.refreshWithLatestImages(a.map(r.attachmentsAdded||[],function(t){return t.name}))}});o.find("input:file").change(function(){o.submit()});function e(s){if(Math.max(s.thumbnailWidth,s.thumbnailHeight)>l){if(s.thumbnailHeight>s.thumbnailWidth){s.thumbnailWidth=s.thumbnailWidth*l/s.thumbnailHeight;s.thumbnailHeight=l}else{s.thumbnailHeight=s.thumbnailHeight*l/s.thumbnailWidth;s.thumbnailWidth=l}}var t=s.thumbnailUrl+(s.thumbnailUrl.indexOf("?")+1?"&":"?")+"nonce="+(+new Date);var r=a(AJS.renderTemplate("imageDialogImage",t,s.thumbnailWidth,s.thumbnailHeight,(100-s.thumbnailHeight)/2,s.downloadUrl,s.name));r.find(".image-container").andSelf().hover(function(){a(this).addClass("hover")},function(){a(this).removeClass("hover")});r.find("img").load(function(){r.find(".image-container").removeClass("loading")});r.click(function(u){a("#attached-images .selected").removeClass("selected");r.addClass("selected").focus();i=this.name=this.name||a(".caption",this).text();f.attr("disabled","");return AJS.stopEvent(u)});r.dblclick(function(){a(this).click();f.click()});a(".zoom",r).fancybox({padding:0,zoomSpeedIn:500,zoomSpeedOut:500,overlayShow:true,overlayOpacity:0.5});return r}a(document).bind("keydown.insert-image",function(s){if(!n.is(":visible")){return}if(a("#fancy_overlay").is(":visible")){if(s.which==32){a("#fancy_close").click();s.preventDefault();s.stopPropagation();return false}}else{function r(x){var u=a(".attached-image",n);var w=a(".attached-image.selected",n);var t=u.index(w)+x;if(t<0){t=u.length-1}if(t>=u.length){t=0}var v=u.eq(t);v.click().focus();n.simpleScrollTo(v)}if(s.which==37){r(-1);return AJS.stopEvent(s)}else{if(s.which==38){r(-4);return AJS.stopEvent(s)}else{if(s.which==39){r(1);return AJS.stopEvent(s)}else{if(s.which==40){r(4);return AJS.stopEvent(s)}else{if(s.which==32&&a(".attached-image.selected").length>0){a(".attached-image.selected .zoom").click();return AJS.stopEvent(s)}else{if(s.which==13&&!f.is(":disabled")){f.click();return AJS.stopEvent(s)}}}}}}}});AJS.Editor.ImageDialog.setUploadInProgress=function(r,s){if(r){o.addClass("hidden");k.removeClass("hidden");s?k.html(s):k.html("Image uploading&hellip;")}else{o.removeClass("hidden");k.addClass("hidden")}};AJS.Editor.ImageDialog.refreshWithLatestImages=function(r){r=a.map(r||[],function(s){return s&&s.toLowerCase()});a.ajax({type:"GET",url:AJS.params.contextPath+"/pages/attachedimages.action",dataType:"json",data:{contentId:d},error:function(){n.find(".loading-message").remove();n.append(AJS.renderTemplate("imageDialogErrorRetrievingAttachments"))},success:function(s){n.find(".loading-message").remove();n.find(".image-list").empty();n.find(".no-attachments").remove();a(s.images||[]).each(function(){if(this.name&&a.inArray(this.name.toLowerCase(),r)!=-1){n.find(".image-list").prepend(e(this))}else{n.find(".image-list").append(e(this))}});if(n.find(".image-list li").length==0){n.append(AJS.renderTemplate("imageDialogNoAttachments"))}n.sizeToFit().click(function(){i=null;f.attr("disabled","disabled");a(this).find(".selected").removeClass("selected")});if(r.length){n.find(".image-list li:first").click()}else{if(q.imageProperties&&q.imageProperties.imageFileName){n.find("img[src*=/"+q.imageProperties.imageFileName+"?]").click()}}AJS.log(AJS.Editor.ImageDialog.afterThumbnailsDisplayedListeners.length+" afterThumbnailsDisplayed listeners registered.");a.each(AJS.Editor.ImageDialog.afterThumbnailsDisplayedListeners,function(){this()});var u=[];var t=a.map(s.images||[],function(v){return v.name&&v.name.toLowerCase()});a.each(r,function(v,w){a.inArray(w,t)==-1&&u.push(AJS.renderTemplate("imageNotThumbnailable",w))});u&&AJS.Editor.ImageDialog.displayErrors(u)}})};AJS.Editor.ImageDialog.refreshWithLatestImages()};a("#editor-insert-image").click(function(c){AJS.Editor.storeTextareaBits();var b=document.getElementById("markupTextarea");AJS.Editor.insertImageDialog(function(d,e){AJS.Editor.Markup.insertOrUpdateText(AJS.format("\n!{0}{1}!\n",d,AJS.wikiAttrToString(e)),b)});return AJS.stopEvent(c)})});
AJS.Editor.Markup={storeTextareaBits:function(b,a,f){if(a.selectionStart!=null){a.sel=a.value.substr(a.selectionStart,a.selectionEnd-a.selectionStart);a.sel1=a.value.substr(0,a.selectionStart);a.sel2=a.value.substr(a.selectionEnd);b.selectedText.value=a.sel}else{if(document.selection&&document.selection.createRange){try{!f&&b.elements[AJS.params.parametersName].focus()}catch(d){}var c=document.selection.createRange();a.caretPos=c.duplicate();b.selectedText.value=c.text}}return b.selectedText.value},insertOrUpdateText:function(c,a){if(window.getSelection&&a.selectionStart&&a.selectionStart!=null){a.value=a.sel1+c+a.sel2;a.focus();a.selectionStart=a.selectionEnd=a.sel1.length+c.length}else{if(a.createTextRange&&a.caretPos){var b=a.caretPos;b.text=b.text.charAt(b.text.length-1)==" "?c+" ":c}else{a.value+=c}}}};
AJS.MacroBrowser=(function(b){var a={};return{hasInit:false,metadataList:[],aliasMap:{},fields:{},Macros:a,getMacroJsOverride:function(c){return a[c]},setMacroJsOverride:function(d,c){return a[d]=c},parseMacro:function(g){var e=g.match(/(\{(.+?)(?::(.*?(?=[^\\]\}).)?)?\})(?:((?:\n|.)*?)\{\2\})?/);var f={markup:e[0],startTag:e[1],name:e[2],paramStr:e[3],bodyMarkup:e[4],params:{}};if(f.markup){var c=g.split(f.markup);f.beforeTag=c[0];f.afterTag=c[1]}if(f.paramStr){var d=f.paramStr.split("|");b(d).each(function(j,k){var h=k.indexOf("=");if(h<0&&!f.params[""]){f.params[""]=k}else{f.params[k.substring(0,h)]=k.substring(h+1)}})}return f},getSelectedMacro:function(d,e){var c=/^(?:.|\n)*[^\\](?={(?:\\}|[^}])+$)/m.exec(" "+d+" ");if(!c){return null}var g=c[0].substring(1).length;var f=AJS.MacroBrowser.parseMacro(e.substring(g));f.startIndex=g;f.params={};if(f.paramStr){f.paramStr.replace(/(?=(?:^|\|)(.*?)(?:=(.*?))?(?:\||$))/g,function(h,i,j){if((!j||j=="")&&!f.params[""]){f.params[""]=i}else{f.params[i]=j}})}return f},makeParameterDiv:function(k,f,c){var n=this,m;var i=f.type.name;if(c){var h=c.fields&&c.fields[i];if(h&&typeof h!="function"){h=h[f.name]}if(typeof h=="function"){m=h.call(c,f)}}if(!m){if(!(i in n.ParameterFields&&typeof n.ParameterFields[i]=="function")){i="string"}m=n.ParameterFields[i](f)}n.fields[f.name]=m;var j=m.paramDiv;var l=m.input;var d="macro-param-"+f.name;j.attr("id","macro-param-div-"+f.name);l.addClass("macro-param-input").attr("id",d);if(f.hidden){j.hide()}var g=k.pluginKey;if(f.displayName==n.makeDefaultKey(g,k.macroName,"param",f.name,"label")){f.displayName=f.name}if(f.description==n.makeDefaultKey(g,k.macroName,"param",f.name,"desc")){f.description=""}var e=f.displayName;if(f.required){e+=" *";j.addClass("required")}b("label",j).attr("for",d).text(e);if(f.description){j.append(AJS.clone("#macro-param-desc-template").html(f.description))}return j},makeBodyDiv:function(c,d){var e=AJS.MacroBrowser;var f=AJS.clone("#macro-body-template");b("textarea",f).val((d&&d.bodyMarkup)||e.settings.selectedMarkup||"");if(c.label){b("label",f).text(c.label)}if(c.description){f.append(AJS.clone("#macro-param-desc-template").html(c.description))}if(c.hidden){f.hide()}return f},processRequiredParameters:function(){var c=b("#macro-insert-container .macro-param-div.required .macro-param-input").filter(function(){var g=b(this).val();return(g==null||g=="")});var f=(c.length==0);var e=f?"":"disabled";var d=e?"addClass":"removeClass";AJS.$("#macro-browser-dialog button.ok").attr("disabled",e);AJS.$("#macro-browser-dialog .macro-preview-header .refresh-link").attr("disabled",e)[d]("disabled");return f},paramChanged:function(){AJS.MacroBrowser.processRequiredParameters()},loadMacroInBrowser:function(m,p){if(!m||!m.formDetails){alert("Could not load unknown macro in the macro browser.");return}var o=AJS.MacroBrowser,x=m.formDetails,d=x.macroName,c=a[d],s=o.settings.selectedMacro,u=p=="edit"?o.editTitle:o.insertTitle;b("#save-warning-span").addClass("hidden");AJS.MacroBrowser.dialog.gotoPage(1).addHeader(u.replace(/\{0\}/,m.title));var z=AJS.$("#macro-browser-dialog .dialog-button-panel .ok");if(p=="edit"){z.text("Save")}else{z.text("Insert")}AJS.$("#macro-insert-container .macro-name").val(d);var k=m.extendedDescription?m.extendedDescription:m.description;var A=AJS.clone("#macro-summary-template .macro-desc").prepend(k),n=b("#macro-insert-container .macro-input-fields").html(A);if(x.documentationUrl){var q=AJS.clone("#macro-doco-link-template");AJS.$("a",q).attr("href",x.documentationUrl);A.append(q)}else{if(!A.text()){A.remove()}}if(x.body){var h=m.pluginKey;if(x.body.label==o.makeDefaultKey(h,d,"body","label")){x.body.label=""}if(x.body.description==o.makeDefaultKey(h,d,"body","desc")){x.body.description=""}var l=o.makeBodyDiv(x.body,s)}if(x.freeform){var e=(s&&s.paramStr)||"",j=AJS.clone("#macro-freeform-template");b(".macro-name-display",j).text(d+": ");b(".macro-text",j).val(e);if(l){l=l.append("{"+d+"}");AJS.$(".macro-freeform-input",j).after(l)}if(x.notationHelp){var y=AJS.$(x.notationHelp).children();if(y[0]){if(!s){var v=AJS.$(y[0]).html().replace(/<br>/gi,"\n").replace(/<[^>]+>/gi,"");var i=v.indexOf("{"+d);if(i>-1){var w=o.parseMacro(v.substring(i));if(w.paramStr){b(".macro-freeform-input input",j).val(w.paramStr)}if(w.bodyMarkup){b(".macro-body-div textarea",j).val(w.bodyMarkup.replace(/^\n|\n$/g,"").replace(/^\s+|\s+$/gm,""))}}}b(".macro-example",j).append(y[0].innerHTML).removeClass("hidden")}if(y[1]){b(".macro-help",j).append(y[1].innerHTML).removeClass("hidden")}}n.append(j)}else{if(l){n.append(l)}b(x.parameters).each(function(){n.append(o.makeParameterDiv(m,this,c))});var r=s?b.extend({},s.params):{};if(c&&typeof c.beforeParamsSet=="function"){r=c.beforeParamsSet(r,!s)}var g={};if(c&&typeof c.populateBodyParams=="function"){g=c.populateBodyParams(l)}b(x.parameters).each(function(){var B=this,t=r[B.name];if(t!=null){delete r[B.name]}else{b(B.aliases).each(function(){if(r[this]){t=r[this];delete r[this]}})}if(t==null){if(g[B.name]){t=g[B.name]}else{t=B.defaultValue}}if(t!=null){o.fields[B.name].setValue(t)}});o.unknownParams=r}b("a",n).click(function(){window.open(this.href,"_blank").focus();return false});if(!b("#macro-browser-dialog:visible").length){o.showBrowserDialog()}var f=b(":input:visible:first",n);if(f.length){f.focus();if(!s&&f.val()!=""&&f[0].select){f[0].select()}}o.previewMacro(m)},makeParamStringFromMap:function(c){var d=[];if(c[""]){d.push(c[""]);delete c[""]}for(var e in c){d.push(e+"="+c[e])}return d.join("|")},getMacroMarkupFromForm:function(j){var d=b("#macro-insert-container .macro-name").val(),l="{"+d,m=b("#macro-insert-container .macro-text"),e,n=AJS.MacroBrowser;if(m.length){e=m.val()}else{var i={},f={},h=j.formDetails.parameters;b(h).each(function(){var o=AJS.$("#macro-param-"+this.name);var p=o.val();if(o.attr("type")=="checkbox"){p=""+o.attr("checked")}if(this.forBody){if(p){f[this.name]=p}}else{if(p&&(this.hidden||(!this.defaultValue||this.defaultValue!=p))){i[this.name]=p}}});if(n.unknownParams){b.each(n.unknownParams,function(o,p){i[o]=p})}var c=a[d];if(c&&typeof c.beforeParamsRetrieved=="function"){i=c.beforeParamsRetrieved(i)}e=n.makeParamStringFromMap(i)}if(e){l+=":"+e}l+="}";var g={name:d,startTag:l,markup:l,bodyMarkup:"",hasBody:AJS.$("#macro-insert-container .macro-body-div").length>0};if(g.hasBody){var k=AJS.$("#macro-insert-container .macro-body-div textarea").val();c=a[d];if(c&&c.applySpecialBodyHandling){k=c.applySpecialBodyHandling(j,k,f)}g.bodyMarkup=k;g.markup+=g.bodyMarkup;g.markup+="{"+d+"}"}return g},previewMacro:function(e){var d=AJS.MacroBrowser;b("#macro-insert-container .macro-preview").html("");if(!d.processRequiredParameters()){AJS.log("previewMacro: missing required params");return}AJS.log("previewMacro: required params ok");d.showPreviewWaitImage(true);var g=d.getMacroMarkupFromForm(e).markup,c=a[e.macroName];if(c&&c.prepareMacroForPreview){g=c.prepareMacroForPreview(g)}var f={contentId:AJS.Editor.getContentId(),contentType:AJS.params.contentType,spaceKey:AJS.params.spaceKey,wikiMarkup:g};b.post(AJS.params.contextPath+"/pages/rendercontent.action",f,function(h){AJS.MacroBrowser.showPreviewWaitImage(false);var m=AJS.params.staticResourceUrlPrefix+"/blank.html";var l=AJS.$("#macro-insert-container .macro-preview");l.html('<iframe src="'+m+'" frameborder="0" name="macro-browser-preview-frame" id="macro-preview-iframe"></iframe>');AJS.log("previewMacro: Created iframe");var i=AJS.$("#macro-insert-container .macro-preview iframe")[0];var k=i.contentDocument||i.contentWindow.document;k.write(h);k.close();var j=b("div.error span.error",k);if(j.length){AJS.log("Error rendering markup : "+g)}AJS.log("previewMacro: rendered")})},showPreviewWaitImage:function(c){if(c){b("#macro-browser-preview-link").attr("disabled",true).addClass("disabled");var d=AJS("div").addClass("macro-loading");b("#macro-browser-preview").append(d);AJS.MacroBrowser.previewSpinner=Raphael.spinner(d[0],60,"#666");AJS.MacroBrowser.previewSpinner.throbber=d}else{if(AJS.MacroBrowser.previewSpinner){b("#macro-browser-preview").removeClass("macro-loading");AJS.MacroBrowser.previewSpinner();AJS.MacroBrowser.previewSpinner.throbber.remove();delete AJS.MacroBrowser.previewSpinner;b("#macro-browser-preview-link").attr("disabled",false).removeClass("disabled")}}},previewOnload:function(c){var e=AJS.MacroBrowser.dialog.activeMetadata.macroName;var d=a[e];if(d&&d.postPreview){d.postPreview(AJS.$("#macro-preview-iframe")[0],AJS.MacroBrowser.dialog.activeMetadata)}AJS.Editor.disableFrame(c);b(c).click(function(h){if(h.target.tagName.toLowerCase()==="a"){var f=h.target;var g=b(f).attr("href");if(g&&g.indexOf("#")!=0&&g.indexOf(window.location)==-1){window.open(g,"_blank").focus()}return false}})},getMacroMetadata:function(f){for(var e=0,c=this.metadataList.length;e<c;e++){var d=this.metadataList[e];if(d.macroName==f){return d}}return null},open:function(e){if(!e){e={};AJS.log("No settings to open the macro browser.")}var d=AJS.MacroBrowser;var f=e.selectedMacro;if(f&&f.name){var c=d.getMacroJsOverride(f.name);if(c&&typeof c.opener=="function"){c.opener(f);return}}if(!d.hasInit){AJS.log("init macro browser");d.showBrowserSpinner(true);if(d.initData){d.initBrowser()}else{d.initMacroBrowserAfterRequest=e;return}}d.openMacroBrowser(e)},openMacroBrowser:function(d){var k=AJS.MacroBrowser;k.settings=d;if(d.presetMacroName){d.presetMacroMetadata=k.getMacroMetadata(d.presetMacroName)}var f=d.presetMacroMetadata;if(!f){var l=d.selectedMacro;if(l){var e=l.name.toLowerCase();e=k.aliasMap[e]||e;var c=a[e];if(c){if(typeof c.updateSelectedMacro=="function"){c.updateSelectedMacro(l)}var j=c.getMacroDetailsFromSelectedMacro;if(j){f=j(k.metadataList,l)}}if(!f){f=AJS.MacroBrowser.getMacroMetadata(e)}}}if(f){AJS.log("Open macro browser to edit macro: "+f.macroName);b("#macro-browser-dialog button.back").hide();k.replicateSelectMacro(f,d.mode||"edit")}else{b("#macro-browser-dialog button.back").show();k.showBrowserDialog();if(d.selectedCategory){var g=b("#select-macro-page .dialog-page-menu button").index(b("#category-button-"+d.selectedCategory));if(g<0){g=0}k.dialog.gotoPanel(0,g)}else{k.dialog.gotoPanel(0,0)}var i=b.trim(d.searchText);var h=b("#macro-browser-search");h.val(i).keyup();i&&h.removeClass("blank-search");h.focus()}},showBrowserDialog:function(){AJS.MacroBrowser.dialog.show();AJS.MacroBrowser.showBrowserSpinner(false)},complete:function(g){if(!b("#macro-browser-dialog .dialog-button-panel .ok").is(":visible:not(:disabled)")){return}var f=AJS.MacroBrowser;var e=f.dialog.activeMetadata;var c=a[e.macroName];if(c&&c.manipulateMarkup){c.manipulateMarkup(e)}var d=f.getMacroMarkupFromForm(e);f.close();if(f.settings.onComplete){f.settings.onComplete(d)}},cancel:function(){var c=AJS.MacroBrowser;c.close();if(typeof c.settings.onCancel=="function"){c.settings.onCancel()}},close:function(){var c=this;c.unknownParams={};c.fields={};c.dialog.hide()},replicateSelectMacro:function(c,d){AJS.MacroBrowser.dialog.activeMetadata=c;AJS.MacroBrowser.loadMacroInBrowser(c,d)},makeDefaultKey:function(){return b.makeArray(arguments).join(".")},showBrowserSpinner:function(c){var d=AJS.Editor.inRichTextMode()?".defaultSkin span.mce_conf_macro_browser":"#editor-insert-macro";if(c){b(d).addClass("wait")}else{b(d).removeClass("wait")}},initBrowser:function(){var q=AJS.MacroBrowser,z=q.initData;if(!z.categories||!AJS.MacroBrowser.metadataList.length){alert("There has been an error loading the macro browser. Please try again or see your system administrator.");AJS.MacroBrowser.showBrowserSpinner(false);return false}var s=new Date();var x=q.dialog=AJS.ConfluenceDialog({width:865,height:530,id:"macro-browser-dialog",onSubmit:q.complete,onCancel:q.cancel});x.getPage(0).element.attr("id","select-macro-page");x.addHeader(z.title);q.editTitle=z.editTitle;q.insertTitle=z.insertTitle;var r;z.categories=b.map(z.categories,function(i){if(i.name=="hidden-macros"){r=i;return null}return i});z.categories.sort(function(j,i){return(j.displayName.toLowerCase()>i.displayName.toLowerCase()?1:-1)});if(r&&AJS.params.showHiddenUserMacros){z.categories.push(r)}var d=function(i){return b("#macro-summaries-template").clone().attr("id","category-"+i)};var l=function(A){var B=AJS.clone("#macro-summary-template").click(function(i){if(q.settings.nestingMacros&&(b.inArray(A.macroName,q.settings.nestingMacros)>-1)){alert("Macros with the same name cannot be nested inside each other.");return AJS.stopEvent(i)}x.activeMetadata=A;AJS.MacroBrowser.loadMacroInBrowser(A,"insert")});if(A.icon){var C=(A.icon.relative?AJS.params.staticResourceUrlPrefix:"")+A.icon.location;if(!A.icon.relative&&AJS.$.browser.msie&&!window.location.href.indexOf("https")&&C.indexOf("https")){B.prepend("<span class='macro-icon-holder icon-"+A.macroName+"'></span>")}else{B.prepend("<img src='"+C+"' alt='icon' width='"+A.icon.width+"' height='"+A.icon.height+"' title='"+A.title+"'/>")}}else{B.prepend("<span class='macro-icon-holder icon-"+A.macroName+"'></span>")}b(".macro-title",B).text(A.title);b(".macro-desc",B).prepend(A.description);if(A.macroName=="gadget"){var j;for(var t=0;t<A.formDetails.parameters.length;t++){if(A.formDetails.parameters[t].name=="url"){j=encodeURI(A.formDetails.parameters[t].defaultValue);break}}if(j){if(!j.match("^https?://.*")){j=AJS.params.contextPath+"/"+j}b(".macro-title",B).after(AJS.template.load("macro-browser-gadget-url").fill({url:j}))}}return B};var e={all:d("all")},w,m,v,y;for(w=0,m=q.metadataList.length;w<m;w++){var n=q.metadataList[w];if(n.hidden){if(!AJS.params.showHiddenUserMacros){continue}if(n.pluginKey!="_-user-macro-_"){continue}n.categories.push("hidden-macros")}var p=l(n).attr("id",n.id);e.all.append(p);for(v=0,y=n.categories.length;v<y;v++){var o=n.categories[v];e[o]=e[o]||d(o);e[o].append(l(n).attr("id",o+"-"+n.id))}}x.addPanel("All",e.all,"all","category-button-all");for(w=0,m=z.categories.length;w<m;w++){var u=z.categories[w];x.addPanel(u.displayName,e[u.name]||d(u.name),u.name,"category-button-"+u.name).getPanel(w).setPadding(0)}x.addCancel("Cancel",AJS.MacroBrowser.cancel);x.popup.element.find(".dialog-title").append(AJS.template.load("macro-browser-help-link"));x.addHelpText("Hint: type \"\u003cstrong>{\u003c\/strong>\" in the rich text editor to insert macros on the page.");var g=AJS.$("#macro-insert-template").clone().attr("id","macro-insert-container");b(".macro-preview-container .macro-preview",g).attr("id","macro-browser-preview");b(".macro-preview-container .macro-preview-header .refresh-link",g).attr("id","macro-browser-preview-link").click(function(i){AJS.MacroBrowser.previewMacro(x.activeMetadata);return AJS.stopEvent(i)});x.addPage().addPanel("X",g,"macro-input-panel").addLink("Back",function(i){i.prevPage();b("#macro-browser-search").focus()},"dialog-back-link").addButton("http://10.20.160.198/wiki/s/en/2166/34/1.0/_/download/batch/confluence.web.resources:page-editor/insert.name",function(){AJS.MacroBrowser.complete()},"ok").addCancel("Cancel",function(){AJS.MacroBrowser.cancel()}).getPanel(0).setPadding(0);b("#macro-browser-dialog .dialog-button-panel .ok").before("<span id='save-warning-span' class='hidden'/>");var f=function(t){var j=null;if(t!=""){if(x.getCurrentPanel()!=x.getPanel(0)){x.gotoPanel(0)}var i=q.searchSummaries(t);j={};b.each(i,function(){j[this.id]=this})}b("#macro-browser-dialog .dialog-panel-body #category-all .macro-list-item").each(function(){(!j||this.id in j)?b(this).show():b(this).hide()})};var h=b("<form id='macro-browser-search-form'><input type='text'/></form>");var c=b("input",h).attr("id","macro-browser-search").keyup(function(i){f(b.trim(c.val()))}).focus(function(j){var i=b(j.target);if(i.hasClass("blank-search")){i.removeClass("blank-search").val("")}j.target.select()}).blur(function(j){var i=b(j.target);if(b.trim(i.val())==""){i.addClass("blank-search").val("Search")}}).blur();h.submit(function(j){var i=b("#macro-browser-dialog .dialog-panel-body #category-all .macro-list-item:visible");if(b.trim(c.val())!=""&&i.length==1){i.click()}return AJS.stopEvent(j)});x.page[0].header.append(h);x.page[0].ontabchange=function(i,j){if(i!=x.getPanel(0,0)){if(!c.hasClass("blank-search")){c.val("").blur()}f("")}};x.gotoPanel(0,0);x.ready=true;q.hasInit=true;var k=(new Date()).getTime()-s.getTime();AJS.log("loading macro browser took "+k+"ms");return true},loadModel:function(c){if(!c){AJS.log("AJS.MacroBrowser.loadModel - no macro data, aborting");return}AJS.log("AJS.MacroBrowser.loadModel - starting");var m=AJS.MacroBrowser;m.metadataList=[];m.aliasMap={};for(var e=0,l=c.length;e<l;e++){var k=c[e];if(k.aliases){for(var d=0,f=k.aliases.length;d<f;d++){k.aliases[d]=k.aliases[d].toLowerCase();m.aliasMap[k.aliases[d]]=k.macroName.toLowerCase()}}if(k.title==m.makeDefaultKey(k.pluginKey,k.macroName,"label")){k.title=k.macroName.charAt(0).toUpperCase()+k.macroName.substring(1).replace(/-/g," ")}if(k.description==m.makeDefaultKey(k.pluginKey,k.macroName,"desc")){k.description=""}k.id="macro-"+(k.alternateId||k.macroName);var g=[k.macroName,k.title].concat(k.aliases);k.keywordsNoDesc=g.join(",");var h=(k.description&&k.description.replace(/,/g," "))||"";g.push(h);k.keywords=g.join(",");m.metadataList.push(k)}m.metadataList.sort(function(j,i){return(j.title.toLowerCase()>i.title.toLowerCase()?1:-1)});AJS.log("AJS.MacroBrowser.loadModel - complete, "+m.metadataList.length+" macros loaded")},searchSummaries:function(d,c){c=b.extend({splitRegex:/[\s\-]+/},c);return AJS.filterBySearch(this.metadataList,d,c)}}})(AJS.$);AJS.toInit(function(a){a(window).bind("render-content-loaded",function(d,b){var c=a("#macro-preview-iframe");if(c.contents().find("body")[0]==b){AJS.MacroBrowser.previewOnload(b)}});setTimeout(function(){var b=AJS.MacroBrowser;AJS.$.ajax({type:"GET",dataType:"json",url:AJS.params.contextPath+"/plugins/macrobrowser/browse-macros.action",success:function(c){b.initData=c;b.loadModel(c.macros);if(b.initMacroBrowserAfterRequest){b.initBrowser();b.openMacroBrowser(b.initMacroBrowserAfterRequest)}},error:function(c){AJS.log("Error requesting macro browser metadata:");AJS.log(c);b.initData={}}})},500)});
AJS.MacroBrowser.Field=function(d,b,c){c=c||{};var e=c.setValue||function(f){b.val(f)};var a=c.getValue||function(){return b.val()};b.change(c.onchange||AJS.MacroBrowser.paramChanged);return{paramDiv:d,input:b,setValue:e,getValue:a}};AJS.MacroBrowser.ParameterFields=(function(a){var b=function(g,f,e){if(f&&f.length){for(var c=0,d=f.length;c<d;c++){AJS.MacroBrowser.fields[f[c]]&&AJS.MacroBrowser.fields[f[c]].dependencyUpdated(g,e)}}};return{updateDependencies:b,username:function(f,d){if(f.multiple){return AJS.MacroBrowser.ParameterFields.string(f,d)}d=d||{};var e=AJS.clone("#macro-param-template");var c=AJS.$("input[type='text']",e);c.addClass("autocomplete-user").attr("data-none-message","Not Found");if(f.required){c.keyup(AJS.MacroBrowser.processRequiredParameters)}c.bind("selected.autocomplete-content",function(h,g){if(d.onselect){d.onselect(g.selection)}else{if(d.setValue){d.setValue(g.content.username)}else{b(f.name,d.dependencies,c.val());(typeof d.onchange=="function")&&d.onchange.apply(c)}}});AJS.Confluence.Binder.autocompleteUser(e);return AJS.MacroBrowser.Field(e,c)},spacekey:function(f,d){if(f.multiple){return AJS.MacroBrowser.ParameterFields.string(f,d)}d=d||{};var e=AJS.clone("#macro-param-template");var c=AJS.$("input[type='text']",e);c.addClass("autocomplete-space").attr("data-template","{key}").attr("data-none-message","Not Found");if(f.required){c.keyup(AJS.MacroBrowser.processRequiredParameters)}c.bind("selected.autocomplete-content",function(h,g){if(d.onselect){d.onselect(g.selection)}else{if(d.setValue){d.setValue(g.content.key)}else{b(f.name,d.dependencies,c.val());(typeof d.onchange=="function")&&d.onchange.apply(c)}}});AJS.Confluence.Binder.autocompleteSpace(e);return AJS.MacroBrowser.Field(e,c)},attachment:function(g,d){if(g.multiple){return AJS.MacroBrowser.ParameterFields.string(g,d)}var e=AJS.clone("#macro-param-select-template");var c=AJS.$("select",e);d=d||{};d.setValue=d.setValue||function(j){var h=false;c.find("option").each(function(){if(this.value==j){h=true;return false}});if(!h){c.append(AJS.$("<option/>").attr("value",j).text(j+" ("+"Not Found"+")"));c.tempValue=j}else{delete c.tempValue}try{c.val(j)}catch(i){AJS.log(i)}c.change()};var f=AJS.MacroBrowser.Field(e,c,d);f.updateDependencies=b;f.getData=function(j){if(!((j.title&&j.spaceKey)||j.pageId||j.draftId)){AJS.log("Not enough parameters to send attachmentsearch request");return}var i=c.tempValue||c.val();if(d.fileTypes){j.fileTypes=d.fileTypes}var h=AJS.params.contextPath+(j.draftId?"/json/draftattachmentsearch.action":"/json/attachmentsearch.action");a.getJSON(h,j,function(n){if(n.error){return}a("option",c).remove();var k=n.attachments;if(!k||!k.length){c.append(AJS.$("<option/>").attr("value","").html("No appropriate attachments"));if(c.tempValue){d.setValue(c.tempValue)}}else{for(var l=0,m=k.length;l<m;l++){c.append(AJS.$("<option/>").attr("value",k[l].name).text(k[l].name))}i=i||c.tempValue;d.setValue(i||k[0].name)}})};return f},"confluence-content":function(g,d){if(g.multiple){return AJS.MacroBrowser.ParameterFields.string(g,d)}d=d||{};g.options=g.options||{};var f=AJS.clone("#macro-param-template"),c=AJS.$("input[type='text']",f).attr("data-none-message","Not Found").attr("data-template","");if(g.required){c.keyup(AJS.MacroBrowser.processRequiredParameters)}d.onchange=d.onchange||function(h){var i=c.val();b(g.name,d.dependencies,i)};d.setValue=d.setValue||function(h){c.val(h);(typeof d.onchange=="function")&&d.onchange.apply(c)};c.bind("selected.autocomplete-content",function(m,k){var h="";if(g.options.includeDatePath=="true"&&k.content.type=="blogpost"){var l=k.content.createdDate.date.split("-");h="/"+l[0]+"/"+l[1]+"/"+l[2].substring(0,2)+"/"}var j=k.content.space&&k.content.space.key,i=((j&&j!=AJS.params.spaceKey)?(j+":"):"")+h+k.content.title;c.val(i);if(d.onselect){d.onselect(k.selection)}else{d.setValue(i,c)}});if(g.options.spaceKey){if(g.options.spaceKey.toLowerCase()=="@self"){g.options.spaceKey=AJS.params.spaceKey}c.attr("data-spacekey",g.options.spaceKey)}var e=g.options.type;if(typeof e=="string"){if(e=="page"){c.addClass("autocomplete-page");AJS.Confluence.Binder.autocompletePage(f)}else{if(e=="blogpost"){c.addClass("autocomplete-blogpost");AJS.Confluence.Binder.autocompleteBlogpost(f)}else{if(e=="attachment"){c.addClass("autocomplete-attachment");AJS.Confluence.Binder.autocompleteAttachment(f)}}}}else{c.addClass("autocomplete-confluence-content");AJS.Confluence.Binder.autocompleteConfluenceContent(f)}return AJS.MacroBrowser.Field(f,c,d)},string:function(f,d){var e=AJS.clone("#macro-param-template");var c=a("input",e);if(f.required){c.keyup(AJS.MacroBrowser.processRequiredParameters)}return AJS.MacroBrowser.Field(e,c,d)},"boolean":function(f,d){var e=AJS.clone("#macro-param-checkbox-template");var c=a("input",e);d=d||{};d.setValue=d.setValue||function(g){if(/true/i.test(g)||(/true/i.test(f.defaultValue)&&!(/false/i).test(g))){c.attr("checked","checked")}};return AJS.MacroBrowser.Field(e,c,d)},"enum":function(f,d){if(f.multiple){return AJS.MacroBrowser.ParameterFields.string(f,d)}var e=AJS.clone("#macro-param-select-template");var c=a("select",e);if(!(f.required||f.defaultValue)){c.append(AJS.$("<option/>").attr("value",""))}a(f.enumValues).each(function(){c.append(AJS.$("<option/>").attr("value",this).html(""+this))});return AJS.MacroBrowser.Field(e,c,d)},_hidden:function(f,d){var e=AJS.clone("#macro-param-hidden-template").hide();var c=a("input",e);return AJS.MacroBrowser.Field(e,c,d)}}})(AJS.$);
(function(a){var b=function(c){this.fileTypes=c};b.prototype.beforeParamsSet=function(e,c){if(!e.page&&!(e.date||e.space)){if(AJS.params.contentType=="page"||AJS.params.contentType=="blogpost"){e.page=AJS.Editor.getCurrentTitle()}else{if(AJS.params.contentType=="comment"){e.page=AJS.params.pageTitle}}}if(e.date){var d=e.date.split("/");e.page=["",d[2],d[0],d[1],e.page].join("/")}if(e.space){e.page=e.space+":"+e.page}return e};b.prototype.beforeParamsRetrieved=function(e){if(e.page){var d=e.page.split(":");if(d.length>1){e.space=d[0];e.page=d[1]}var c=e.page.split("/");if(c.length>1){e.date=[c[2],c[3],c[1]].join("/");e.page=c[4]}if(((AJS.params.contentType=="page"||AJS.params.contentType=="blogpost")&&e.page==AJS.Editor.getCurrentTitle())||(AJS.params.contentType=="comment"&&e.page==AJS.params.pageTitle)){delete e.page}}return e};b.prototype.fields={attachment:function(f){var c=function(g){var i={};var h=g.split(":",2);i.spaceKey=((h.length==2)&&h[0])||AJS.params.spaceKey;i.title=h[h.length-1];if(i.title.indexOf("/")==0){i.postingDay=i.title.substr(1,10);i.title=i.title.substr(12)}if(i.title==AJS.Editor.getCurrentTitle()){i.title=""}if(!i.title){if(AJS.params.newPage){i.draftId=AJS.params.contentId}else{i.pageId=AJS.params.pageId}}return i};var d={fileTypes:this.fileTypes};var e=AJS.MacroBrowser.ParameterFields.attachment(f,d);e.dependencyUpdated=function(i,h){AJS.log("attachment:dependencyUpdated called: "+i+", "+h);var g=c(h);this.getData(g)};return e},"confluence-content":function(d){var c={dependencies:["name"]};return AJS.MacroBrowser.ParameterFields["confluence-content"](d,c)}};AJS.MacroBrowser.activateSmartFieldsAttachmentsOnPage=function(d,c){AJS.MacroBrowser.setMacroJsOverride(d,new b(c))}})(AJS.$);
