2007-07-19 12:40:05 +02:00
CMSForm = Class . extend ( 'ChangeTracker' ) . extend ( 'Observable' ) ;
CMSForm . prototype = {
initialize : function ( fn ) {
this . ChangeTracker . initialize ( ) ;
this . formName = fn ;
this . prepareForm ( ) ;
} ,
2008-07-04 01:17:55 +02:00
/ * *
* Trigger normal save event , helpful e . g . when enter key is pressed in
* single line input fields .
* /
onsubmit : function ( e ) {
this . save ( ) ;
Event . stop ( e ) ;
return false ;
} ,
2007-07-19 12:40:05 +02:00
/ * *
* Processing called whenever a page is loaded in the right - including the initial one
* /
prepareForm : function ( ) {
ajaxActionsAtTop ( this . id , 'form_actions_' + this . formName , this . formName ) ;
} ,
/ * *
* Load actions from a string containing the HTML content
* /
loadActionsFromString : function ( actionHTML ) {
var actionHolder = $ ( 'form_actions_' + this . formName ) ;
actionHolder . innerHTML = actionHTML ;
prepareAjaxActions ( actionHolder , this . id , this . formName ) ;
} ,
/ * *
* Close the form down without any corrective action , after its been deleted .
* /
closeIfSetTo : function ( id ) {
if ( this . elements . ID && this . elements . ID . value == id ) {
this . innerHTML = "<p>This page was deleted. To edit a page, select it from the left.</p>" ;
if ( typeof tinyMCE != 'undefined' ) tinyMCE . instances = [ ] ;
}
} ,
/ * *
* Reload lose the form if the current page is open .
* /
reloadIfSetTo : function ( id ) {
if ( this . elements . ID && this . elements . ID . value == id ) {
this . getPageFromServer ( id ) ;
}
} ,
close : function ( ) {
this . innerHTML = "<p> </p>" ;
var actions ;
if ( actions = $ ( 'form_actions_' + this . formName ) ) {
actions . parentNode . removeChild ( actions ) ;
}
} ,
updateStatus : function ( newStatus ) {
if ( $ ( 'Form_EditForm_Status' ) )
$ ( 'Form_EditForm_Status' ) . innerHTML = "STATUS: " + newStatus ;
} ,
/ * *
* Load a new page into the right - hand form .
*
* @ param formContent string
* @ param response object ( optional )
* @ param evalResponse boolean ( optional )
* /
loadNewPage : function ( formContent , response , evalResponse ) {
//alert('here: ' + formContent);
var rightHTML = formContent ;
// Rewrite # links
2008-04-26 08:36:52 +02:00
rightHTML = rightHTML . replace ( /(<a[^>]+href *= *")#/g , '$1' + window . location . href . replace ( /#.*$/ , '' ) + '#' ) ;
2007-07-19 12:40:05 +02:00
// Rewrite iframe links (for IE)
rightHTML = rightHTML . replace ( /(<iframe[^>]*src=")([^"]+)("[^>]*>)/g , '$1' + baseHref ( ) + '$2$3' ) ;
// Prepare iframes for removal, otherwise we get loading bugs
var i , allIframes = this . getElementsByTagName ( 'iframe' ) ;
if ( allIframes ) for ( i = 0 ; i < allIframes . length ; i ++ ) {
allIframes [ i ] . contentWindow . location . href = 'about:blank' ;
allIframes [ i ] . parentNode . removeChild ( allIframes [ i ] ) ;
}
if ( response && evalResponse ) {
Ajax . Evaluator ( response ) ;
} else {
this . innerHTML = rightHTML ;
}
// Get the form attributes from embedded fields
var attr ;
for ( attr in { 'action' : true , 'method' : true , 'enctype' : true , 'name' : true } ) {
if ( this . elements [ '_form_' + attr ] ) {
this [ attr ] = this . elements [ '_form_' + attr ] . value ;
this . elements [ '_form_' + attr ] . parentNode . removeChild ( this . elements [ '_form_' + attr ] ) ;
}
}
allIframes = this . getElementsByTagName ( 'iframe' ) ;
if ( allIframes ) for ( i = 0 ; i < allIframes . length ; i ++ ) {
try {
allIframes [ i ] . contentWindow . location . href = allIframes [ i ] . src ;
2007-09-15 23:59:34 +02:00
} catch ( er ) { alert ( 'Error in LeftAndMain_right.js CMSForm.loadNewPage: ' + er . message ) ; }
2007-07-19 12:40:05 +02:00
}
_TAB _DIVS _ON _PAGE = [ ] ;
try {
var tabs = document . getElementsBySelector ( '#' + this . id + ' ul.tabstrip' ) ;
} catch ( er ) { /*alert('a: '+ er.message + '\n' + er.line);*/ }
try {
for ( var i = 0 ; i < tabs . length ; i ++ ) if ( tabs [ i ] . tagName ) initTabstrip ( tabs [ i ] ) ;
} catch ( er ) { /*alert('b: '+ er.message + '\n' + er.line);*/ }
if ( ( typeof tinyMCE != 'undefined' ) && tinyMCE . instances ) {
tinyMCE . instances = [ ] ;
tinyMCE . isLoaded = false ;
tinyMCE . onLoad ( ) ;
}
if ( this . prepareForm ) this . prepareForm ( ) ;
Behaviour . apply ( this ) ;
if ( this . resetElements ) this . resetElements ( ) ;
window . ontabschanged ( ) ;
2008-10-02 12:11:08 +02:00
// If there's a title field and it's got a "new XX" value, focus/select that first
// This is really a little too CMS-specific (as opposed to LeftAndMain), but the cleanup can happen after jQuery refactoring
if ( $ ( 'Form_EditForm_Title' ) && $ ( 'Form_EditForm_Title' ) . value . match ( /^new/i ) ) {
$ ( 'Form_EditForm_Title' ) . select ( ) ;
}
2007-07-19 12:40:05 +02:00
} ,
/ * *
* Save the contens of the form , by submitting it and resetting is changed checker
* on success .
2007-09-15 03:00:03 +02:00
*
* @ param publish boolean ( optional ) whether to publish in addition to saving
2007-07-19 12:40:05 +02:00
* /
2007-09-15 03:00:03 +02:00
save : function ( ifChanged , callAfter , action , publish ) {
2007-07-19 12:40:05 +02:00
_AJAX _LOADING = true ;
if ( typeof tinyMCE != 'undefined' ) tinyMCE . triggerSave ( ) ;
if ( ! action ) action = "save" ;
var _ _callAfter = callAfter ;
var _ _form = this ;
if ( _ _form . notify ) _ _form . notify ( 'BeforeSave' , _ _form . elements . ID . value ) ;
// validate if required
if ( this . validate && ! this . validate ( ) ) {
// TODO Automatically switch to the tab/position of the first error
statusMessage ( "Validation failed." , "bad" ) ;
return false ;
}
var success = function ( response ) {
Ajax . Evaluator ( response ) ;
_ _form . resetElements ( ) ;
if ( _ _callAfter ) _ _callAfter ( ) ;
if ( _ _form . notify ) _ _form . notify ( 'PageSaved' , _ _form . elements . ID . value ) ;
_AJAX _LOADING = false ;
}
if ( ifChanged ) {
var data = this . serializeChangedFields ( 'ID' ) + '&ajax=1&action_' + action + '=1' ;
} else {
var data = this . serializeAllFields ( ) + '&ajax=1&action_' + action + '=1' ;
}
2007-09-15 03:00:03 +02:00
if ( publish )
{
data += '&publish=1' ;
}
2007-07-19 12:40:05 +02:00
2008-10-03 02:48:34 +02:00
statusMessage ( ss . i18n . _t ( 'CMSMAIN.SAVING' ) , null , true ) ;
2007-07-19 12:40:05 +02:00
new Ajax . Request ( this . action , {
method : this . method ,
postBody : data ,
onSuccess : success ,
onFailure : function ( response ) {
errorMessage ( 'Error saving content' , response ) ;
_AJAX _LOADING = false ;
}
} ) ;
} ,
loadPage _url : 'admin/getpage'
}
CMSRightForm = Class . extend ( 'CMSForm' ) ;
CMSRightForm . prototype = {
intialize : function ( ) {
this . CMSForm . initialize ( 'right' ) ;
} ,
/ * *
* Load the given URL ( with & ajax = 1 ) into this form
* /
loadURLFromServer : function ( url ) {
var urlParts = url . match ( /ID=(\d+)/ ) ;
var id = urlParts ? urlParts [ 1 ] : null ;
if ( ! url . match ( /^https?:\/\/.*/ ) )
url = document . getElementsByTagName ( 'base' ) [ 0 ] . href + url ;
new Ajax . Request ( url + '&ajax=1' , {
asynchronous : true ,
onSuccess : function ( response ) {
$ ( 'Form_EditForm' ) . successfullyReceivedPage ( response , id ) ;
} ,
onFailure : function ( response ) {
alert ( response . responseText ) ;
errorMessage ( 'error loading page' , response ) ;
}
} ) ;
} ,
successfullyReceivedPage : function ( response , pageID ) {
var loadingNode = $ ( 'sitetree' ) . loadingNode ;
if ( loadingNode && pageID && parseInt ( $ ( 'sitetree' ) . getIdxOf ( loadingNode ) ) != pageID ) {
return ;
}
// must wait until the javascript has finished
document . body . style . cursor = 'wait' ;
this . loadNewPage ( response . responseText ) ;
var subform ;
if ( subform = $ ( 'Form_MemberForm' ) ) subform . close ( ) ;
if ( subform = $ ( 'Form_SubForm' ) ) subform . close ( ) ;
if ( this . elements . ID ) {
this . notify ( 'PageLoaded' , this . elements . ID . value ) ;
}
if ( this . receivingID ) {
// Treenode might not exist if that part of the tree is closed
var treeNode = loadingNode ? loadingNode : $ ( 'sitetree' ) . getTreeNodeByIdx ( this . receivingID ) ;
if ( treeNode ) {
$ ( 'sitetree' ) . setCurrentByIdx ( treeNode . getIdx ( ) ) ;
treeNode . removeNodeClass ( 'loading' ) ;
}
statusMessage ( '' ) ;
}
// must wait until the javascript has finished
document . body . style . cursor = 'default' ;
} ,
didntReceivePage : function ( response ) {
errorMessage ( 'error loading page' , response ) ;
$ ( 'sitetree' ) . getTreeNodeByIdx ( this . elements . ID . value ) . removeNodeClass ( 'loading' ) ;
} ,
/ * *
* Request a page from the server via Ajax
* /
getPageFromServer : function ( id , treeNode ) {
// if(id && id.match(/^[A-Za-z0-9_]+$/)) {
if ( id && ( id == 'root' || parseInt ( id ) == id || ( id . substr && id . substr ( 0 , 3 ) == 'new' ) ) ) {
this . receivingID = id ;
// Treenode might not exist if that part of the tree is closed
if ( ! treeNode ) treeNode = $ ( 'sitetree' ) . getTreeNodeByIdx ( id ) ;
if ( treeNode ) {
$ ( 'sitetree' ) . loadingNode = treeNode ;
treeNode . addNodeClass ( 'loading' ) ;
url = treeNode . aTag . href + ( treeNode . aTag . href . indexOf ( '?' ) == - 1 ? '?' : '&' ) + 'ajax=1' ;
}
if ( SiteTreeHandlers . loadPage _url ) {
var sep = ( SiteTreeHandlers . loadPage _url . indexOf ( '?' ) == - 1 ) ? '?' : '&' ;
url = SiteTreeHandlers . loadPage _url + sep + 'ID=' + id ;
}
statusMessage ( "loading..." ) ;
this . loadURLFromServer ( url ) ;
} else {
throw ( "getPageFromServer: Bad page ID: " + id ) ;
}
2007-11-01 23:39:25 +01:00
}
2007-07-19 12:40:05 +02:00
/ * *
* Set the status field
* /
2007-11-01 23:31:27 +01:00
/ * s e t S t a t u s : f u n c t i o n ( n e w S t a t u s ) {
2007-07-19 12:40:05 +02:00
var statusLabel = document . getElementsBySelector ( 'label.pageStatusMessage' ) [ 0 ] ;
if ( statusLabel ) statusLabel . innerHTML = "STATUS: " + newStatus ;
2007-11-01 23:31:27 +01:00
} * /
2007-07-19 12:40:05 +02:00
}
CMSForm . applyTo ( '#Form_SubForm' , 'rightbottom' ) ;
CMSRightForm . applyTo ( '#Form_EditForm' , 'right' ) ;
function action _save _right ( ) {
_AJAX _LOADING = true ;
2008-10-03 02:48:34 +02:00
$ ( 'Form_EditForm_action_save' ) . value = ss . i18n . _t ( 'CMSMAIN.SAVING' ) ;
2007-09-15 03:11:50 +02:00
$ ( 'Form_EditForm_action_save' ) . className = 'action loading' ;
2007-07-19 12:40:05 +02:00
$ ( 'Form_EditForm' ) . save ( false ) ;
}
ActionPropertiesForm = Class . create ( ) ;
ActionPropertiesForm . prototype = {
/ * *
* Open the form
* /
open : function ( ) {
var allInputs = this . getElementsByTagName ( 'input' ) ;
this . submitButton = allInputs [ allInputs . length - 1 ] ;
this . submitButton . onclick = this . send . bind ( this ) ;
this . style . display = '' ;
// This detects whether we've opened a new page
if ( $ ( 'Form_EditForm' ) . elements . ID . value != this . elements . ID . value ) {
this . elements . ID . value = $ ( 'Form_EditForm' ) . elements . ID . value ;
new Ajax . Updater (
'action_submit_options_recipient' ,
'admin/getpagemembers/' + this . elements . ID . value + '?SecurityLevel=' + this . securityLevel
) ;
}
} ,
close : function ( ) {
this . style . display = 'none' ;
} ,
toggle : function ( ) {
if ( this . style . display == '' ) this . close ( ) ;
else this . open ( ) ;
} ,
/ * *
* Submit the option form and carry out the action
* /
send : function ( ) {
// Show a "submitting..." box
if ( ! this . sendingText ) {
this . sendingText = document . createElement ( 'div' ) ;
this . sendingText . innerHTML = 'Submitting...' ;
this . sendingText . className = 'sendingText' ;
Element . setOpacity ( this . sendingText , 0.9 ) ;
this . appendChild ( this . sendingText ) ;
}
this . sendingText . style . display = '' ;
// Send the request
2007-10-18 03:07:35 +02:00
var buttons = document . getElementsBySelector ( '#' + this . id + ' .Actions input' ) ;
2007-07-19 12:40:05 +02:00
var actionButton = null ;
if ( buttons )
actionButton = buttons [ 0 ] ;
ajaxSubmitForm ( false , this . onComplete . bind ( this ) , this , actionButton ? actionButton . name : '' , 'submit' ) ;
return false ;
} ,
/ * *
* Process the action ' s Ajax response
* /
onComplete : function ( ) {
this . sendingText . style . display = 'none' ;
if ( this . elements . Message ) this . elements . Message . value = '' ;
this . close ( ) ;
$ ( 'Form_EditForm' ) . getPageFromServer ( $ ( 'Form_EditForm_ID' ) . value ) ;
}
}
/ * *
* Handle auto - saving . Detects if changes have been made , and if so save everything on the page .
* If confirmation is true it will ask for confirmation .
* /
function autoSave ( confirmation , callAfter ) {
if ( typeof tinyMCE != 'undefined' ) tinyMCE . triggerSave ( ) ;
var _ _forms = [ ]
if ( $ ( 'Form_EditForm' ) ) _ _forms . push ( $ ( 'Form_EditForm' ) ) ;
if ( $ ( 'Form_SubForm' ) ) _ _forms . push ( $ ( 'Form_SubForm' ) ) ;
if ( $ ( 'Form_MemberForm' ) ) _ _forms . push ( $ ( 'Form_MemberForm' ) ) ;
var _ _somethingHasChanged = false ;
var _ _callAfter = callAfter ;
_ _forms . each ( function ( form ) {
if ( form . isChanged && form . isChanged ( ) ) {
_ _somethingHasChanged = true ;
}
} ) ;
if ( _ _somethingHasChanged ) {
2007-09-14 21:29:12 +02:00
// Note: discard and cancel options are no longer used since switching to confirm dialog.
// save is still used if confirmation = false
var options = {
save : function ( ) {
2008-10-03 02:48:34 +02:00
statusMessage ( ss . i18n . _t ( 'CMSMAIN.SAVING' ) , '' , true ) ;
2007-09-14 21:29:12 +02:00
var i ;
for ( i = 0 ; i < _ _forms . length ; i ++ ) {
if ( _ _forms [ i ] . isChanged && _ _forms [ i ] . isChanged ( ) ) {
if ( i == 0 ) _ _forms [ i ] . save ( true , _ _callAfter ) ;
else _ _forms [ i ] . save ( true ) ;
}
}
} ,
discard : function ( ) {
_ _forms . each ( function ( form ) { form . resetElements ( false ) ; } ) ;
if ( _ _callAfter ) _ _callAfter ( ) ;
} ,
cancel : function ( ) {
}
}
2007-09-14 21:28:41 +02:00
if ( confirmation ) {
if ( confirm ( "Are you sure you want to navigate away from this page?\n\nWARNING: Your changes have not been saved.\n\nPress OK to continue, or Cancel to stay on the current page." ) )
{
// OK was pressed, call function for what was clicked on
2007-07-19 12:40:05 +02:00
if ( _ _callAfter ) _ _callAfter ( ) ;
2007-09-14 21:28:41 +02:00
} else {
2007-09-14 21:29:12 +02:00
// Cancel was pressed, stay on the current page
2007-09-14 21:30:11 +02:00
return false ;
2007-07-19 12:40:05 +02:00
}
2007-09-14 21:28:41 +02:00
} else {
options . save ( ) ;
2007-07-19 12:40:05 +02:00
}
} else {
if ( _ _callAfter ) _ _callAfter ( ) ;
}
}
StageLink = Class . create ( ) ;
StageLink . prototype = {
initialize : function ( getVars , urlField ) {
this . getVars = getVars ;
this . urlField = urlField ;
var boundNewPage = this . newPage . bind ( this ) ;
$ ( 'Form_EditForm' ) . observeMethod ( 'PageLoaded' , boundNewPage ) ;
$ ( 'Form_EditForm' ) . observeMethod ( 'PageSaved' , boundNewPage ) ;
$ ( 'Form_EditForm' ) . observeMethod ( 'PagePublished' , boundNewPage ) ;
$ ( 'Form_EditForm' ) . observeMethod ( 'PageUnpublished' , boundNewPage ) ;
this . newPage ( ) ;
} ,
newPage : function ( ) {
var linkField = $ ( 'Form_EditForm' ) . elements [ this . urlField ] ;
var linkVal = linkField ? linkField . value : null ;
if ( linkVal ) {
if ( this . id != 'viewArchivedSite' ) this . style . display = '' ;
2007-09-05 08:42:26 +02:00
this . href = linkVal + this . getVars ;
2007-07-19 12:40:05 +02:00
} else {
if ( this . id != 'viewArchivedSite' ) this . style . display = 'none' ;
}
} ,
onclick : function ( ) {
var w = window . open ( this . href , windowName ( 'site' ) ) ;
w . focus ( ) ;
return false ;
} ,
baseURL : function ( ) {
return document . getElementsByTagName ( 'base' ) [ 0 ] . href ;
}
}
StageLink . applyTo ( '#viewStageSite' , '?stage=Stage' , 'StageURLSegment' ) ;
StageLink . applyTo ( '#viewLiveSite' , '?stage=Live' , 'LiveURLSegment' ) ;
StageLink . applyTo ( '#viewArchivedSite' , '' , 'URLSegment' ) ;
window . name = windowName ( 'cms' ) ;
/ * *
* Return a unique window name that contains the URL
* /
function windowName ( suffix ) {
var base = document . getElementsByTagName ( 'base' ) [ 0 ] . href . replace ( 'http://' , '' ) . replace ( /\//g , '_' ) . replace ( /\./g , '_' ) ;
return base + suffix ;
}