581 lines
16 KiB
JavaScript
581 lines
16 KiB
JavaScript
/**
|
|
* INVISION POWER BOARD v3
|
|
*
|
|
* Topics View Javascript File
|
|
* @author Matt Mecham, Brandon Farber, Josh Williams
|
|
* @since 2008
|
|
*/
|
|
|
|
/**
|
|
* "ACP" Class. Designed for ... ACP Templating Functions
|
|
* @author (v.1.0.0) Matt Mecham
|
|
*/
|
|
|
|
function IPBTemplates()
|
|
{
|
|
/**
|
|
* Template groups
|
|
*
|
|
* @var array
|
|
*/
|
|
this.templateGroups = {};
|
|
|
|
/**
|
|
* Current template group
|
|
*
|
|
* @var array
|
|
*/
|
|
this.currentTemplateGroup = '';
|
|
|
|
/**
|
|
* Current template bit
|
|
*
|
|
* @var array
|
|
*/
|
|
this.currentTemplateBit = '';
|
|
|
|
/**
|
|
* Current set ID
|
|
*
|
|
* @var array
|
|
*/
|
|
this.currentSetData = {};
|
|
|
|
/**
|
|
* CSS Names
|
|
*
|
|
* @var hash
|
|
*/
|
|
this.cssNames = { 'groupRowLit' : 'tplateLit',
|
|
'groupHover' : 'groupHover',
|
|
'groupRowLitMain' : 'row1',
|
|
'groupRow' : 'row2',
|
|
'templateRow' : 'row2',
|
|
'templateHover' : 'templateHover' };
|
|
|
|
|
|
/**
|
|
* INIT Applications
|
|
*/
|
|
this.init = function()
|
|
{
|
|
/* Build group list */
|
|
this.buildGroupsList();
|
|
|
|
/* fix template window to same height as group list and make it scrollable */
|
|
$('tplate_bitList').setStyle( { 'height' : $('tplate_groupList').getHeight() + 'px', 'overflow' : 'auto'} );
|
|
|
|
this.loadTemplateBits( this.currentTemplateGroup );
|
|
};
|
|
|
|
/**
|
|
* Load template groups
|
|
*/
|
|
this.loadTemplateGroups = function()
|
|
{
|
|
/* Grab the JSON for the template bits for the current template group */
|
|
url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=getTemplateGroupList&setID=" + this.currentSetData['set_id'] + '&secure_key=' + ipb.vars['md5_hash'];
|
|
|
|
new Ajax.Request( url.replace( /&/g, '&' ),
|
|
{
|
|
method: 'GET',
|
|
onSuccess: function (t )
|
|
{
|
|
if ( t.responseText.match( /^(\s+?)?\{/ ) )
|
|
{
|
|
$('tplate_debug').innerHTML += "\n" + t.responseText;
|
|
|
|
eval( "var json = " + t.responseText );
|
|
|
|
if ( json['error'] )
|
|
{
|
|
alert( json['error'] );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
IPB3Templates.templateGroups = json;
|
|
IPB3Templates.buildGroupsList();
|
|
|
|
/* Hilite */
|
|
IPB3Templates.hiliteGroup( IPB3Templates.currentTemplateGroup );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
alert( "Ошибка: " + t.responseText );
|
|
}
|
|
},
|
|
onException: function( f,e ){ alert( "Исключение: " + e ); },
|
|
onFailure: function( t ){ alert( "Ошибка: " + t.responseText ); }
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* Load template bits
|
|
*/
|
|
this.loadTemplateBits = function( groupName, force )
|
|
{
|
|
/* Grab the JSON for the template bits for the current template group */
|
|
url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=getTemplateBitList&setID=" + this.currentSetData['set_id'] + '&templateGroup=' + groupName + '&secure_key=' + ipb.vars['md5_hash'];
|
|
|
|
new Ajax.Request( url.replace( /&/g, '&' ),
|
|
{
|
|
method: 'GET',
|
|
onSuccess: function (t )
|
|
{
|
|
if ( t.responseText.match( /^(\s+?)?\{/ ) )
|
|
{
|
|
$('tplate_debug').innerHTML += "\n" + t.responseText;
|
|
|
|
eval( "var json = " + t.responseText );
|
|
|
|
if ( json['error'] )
|
|
{
|
|
alert( json['error'] );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
var _reload = 0;
|
|
|
|
/* New group? */
|
|
if ( ! IPB3Templates.templateGroups['groups'][ groupName ] )
|
|
{
|
|
IPB3Templates.templateGroups['groups'][ groupName ] = { '_modCount' : 0, 'template_group' : groupName };
|
|
_reload = 1;
|
|
}
|
|
|
|
/* Update group's template count */
|
|
if ( json['groupData'] )
|
|
{
|
|
if ( json['groupData']['_modCount'] != IPB3Templates.templateGroups['groups'][ groupName ]['_modCount'] )
|
|
{
|
|
IPB3Templates.templateGroups['groups'][ groupName ]['_modCount'] = json['groupData']['_modCount'];
|
|
_reload = 1;
|
|
}
|
|
}
|
|
|
|
/* Re-draw list */
|
|
if ( _reload )
|
|
{
|
|
IPB3Templates.buildGroupsList();
|
|
}
|
|
|
|
/* Hilite */
|
|
IPB3Templates.hiliteGroup( groupName );
|
|
IPB3Templates.buildTemplateList( json );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
alert( "Ошибка: " + t.responseText );
|
|
}
|
|
},
|
|
onException: function( f,e ){ alert( "Исключение: " + e ); },
|
|
onFailure: function( t ){ alert( "Ошибка: " + t.responseText ); }
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* Save template bit
|
|
*/
|
|
this.saveTemplateBit = function( template_id )
|
|
{
|
|
/* Grab the JSON for the template bits for the current template group */
|
|
url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=saveTemplateBit&setID=" + this.currentSetData['set_id'] + '&template_id=' + template_id + '&secure_key=' + ipb.vars['md5_hash'];
|
|
|
|
/* Set up params */
|
|
var params = { 'template_content' : $F('tplate_editBox_' + template_id ),
|
|
'template_data' : $F('tplate_dataBox_' + template_id ),
|
|
'template_set' : this.currentSetData['set_id'],
|
|
'template_group' : IPB3Templates.currentTemplateGroup,
|
|
'type' : IPB3Templates.currentTemplateBit['_type'] };
|
|
|
|
if ( IPB3Templates.currentTemplateBit['_type'] == 'add' )
|
|
{
|
|
params['_template_name'] = $F('tplate_addNameTextField_0');
|
|
params['_template_group'] = $F('tplate_addGroupTextField_0');
|
|
}
|
|
|
|
new Ajax.Request( url.replace( /&/g, '&' ),
|
|
{
|
|
method: 'POST',
|
|
parameters: params,
|
|
onSuccess: function (t )
|
|
{
|
|
if ( t.responseText.match( /^(\s+?)?\{/ ) )
|
|
{
|
|
eval( "var json = " + t.responseText );
|
|
|
|
if ( json['error'] )
|
|
{
|
|
alert( json['error'] );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
IPB3Templates.currentTemplateBit = json['templateData'];
|
|
IPB3Templates.showTemplateEditor( json );
|
|
IPB3Templates.loadTemplateBits( json['templateData']['template_group'] );
|
|
|
|
if ( json['errors'] )
|
|
{
|
|
/* Something inline would be very nice here.. rather than this ugly alert */
|
|
alert("Ошибка: " + json['errors'] );
|
|
}
|
|
else
|
|
{
|
|
alert("Сохранено!");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
alert( "Ошибка: " + t.responseText );
|
|
}
|
|
},
|
|
onException: function( f,e ){ alert( "Исключение: " + e ); },
|
|
onFailure: function( t ){ alert( "Ошибка: " + t.responseText ); }
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* Revert template bit
|
|
*/
|
|
this.revertTemplateBit = function( template_id )
|
|
{
|
|
/* Make sure we're mean it... */
|
|
if ( $('tplate_templaterow_' + template_id ).hasClassName( 'tplateRow_new') )
|
|
{
|
|
if ( ! confirm( "Удалить шаблон?\n Произойдет удаление шаблона из ВСЕХ стилей!" ) )
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( ! confirm( "Откатить изменения?\n Все изменения БУДУТ УТРАЧЕНЫ!" ) )
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/* Grab the JSON for the template bits for the current template group */
|
|
url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=revertTemplateBit&setID=" + this.currentSetData['set_id'] + '&template_id=' + template_id + '&secure_key=' + ipb.vars['md5_hash'];
|
|
|
|
new Ajax.Request( url.replace( /&/g, '&' ),
|
|
{
|
|
method: 'GET',
|
|
onSuccess: function (t )
|
|
{
|
|
if ( t.responseText.match( /^(\s+?)?\{/ ) )
|
|
{
|
|
eval( "var json = " + t.responseText );
|
|
|
|
if ( json['error'] )
|
|
{
|
|
alert( json['error'] );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if ( json['templateData'] )
|
|
{
|
|
IPB3Templates.currentTemplateBit = json['templateData'];
|
|
}
|
|
else
|
|
{
|
|
/* Reload the group */
|
|
IPB3Templates.loadTemplateGroups();
|
|
}
|
|
|
|
IPB3Templates.loadTemplateBits( IPB3Templates.currentTemplateBit['template_group'] );
|
|
|
|
if ( json['errors'] )
|
|
{
|
|
/* Something inline would be very nice here.. rather than this ugly alert */
|
|
alert("Ошибка: " + json['errors'] );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
alert( "Ошибка: " + t.responseText );
|
|
}
|
|
},
|
|
onException: function( f,e ){ alert( "Исключение: " + e ); },
|
|
onFailure: function( t ){ alert( "Ошибка: " + t.responseText ); }
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* Load template bits
|
|
*/
|
|
this.loadTemplateEditor = function( template_id )
|
|
{
|
|
/* Grab the JSON for the template bits for the current template group */
|
|
url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=getTemplateForEdit&setID=" + this.currentSetData['set_id'] + '&template_id=' + template_id + '&secure_key=' + ipb.vars['md5_hash'];
|
|
|
|
new Ajax.Request( url.replace( /&/g, '&' ),
|
|
{
|
|
method: 'GET',
|
|
onSuccess: function (t )
|
|
{
|
|
if ( t.responseText.match( /^(\s+?)?\{/ ) )
|
|
{
|
|
eval( "var json = " + t.responseText );
|
|
|
|
if ( json['error'] )
|
|
{
|
|
alert( json['error'] );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
IPB3Templates.showTemplateEditor( json );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
alert( "Ошибка: " + t.responseText );
|
|
}
|
|
},
|
|
onException: function( f,e ){ alert( "Исключение: " + e ); },
|
|
onFailure: function( t ){ alert( "Ошибка: " + t.responseText ); }
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* Shows the new template bit form
|
|
*/
|
|
this.addBitForm = function()
|
|
{
|
|
/* Close any open editors */
|
|
IPB3Templates.cancelTemplateBit( 0 );
|
|
|
|
var _tplate = new Template( $('tplate_templateEditorAdd').innerHTML );
|
|
var _data = { 'template_id' : 0,
|
|
'template_set_id' : IPB3Templates.currentSetData['set_id'],
|
|
'template_group' : IPB3Templates.currentTemplateGroup,
|
|
'template_content' : '',
|
|
'_type' : 'add' };
|
|
|
|
var _div = document.createElement( "DIV" );
|
|
_div.id = 'tplate_editorWrapper';
|
|
_div.update( _tplate.evaluate( _data ) );
|
|
document.body.appendChild( _div );
|
|
|
|
ipb.positionCenter( 'tplate_editor_0' );
|
|
|
|
IPB3Templates.currentTemplateBit = _data;
|
|
};
|
|
|
|
/**
|
|
* Shows the template editor
|
|
*/
|
|
this.showTemplateEditor = function( json )
|
|
{
|
|
/* Close any open editors */
|
|
IPB3Templates.cancelTemplateBit( json['templateData']['template_id'] );
|
|
|
|
var _tplate = new Template( $('tplate_templateEditor').innerHTML );
|
|
|
|
IPB3Templates.currentTemplateBit = json['templateData'];
|
|
|
|
var _div = document.createElement( "DIV" );
|
|
_div.id = 'tplate_editorWrapper';
|
|
_div.update( _tplate.evaluate( json['templateData'] ) );
|
|
document.body.appendChild( _div );
|
|
|
|
ipb.positionCenter( 'tplate_editor_' + json['templateData']['template_id'] );
|
|
};
|
|
|
|
/**
|
|
* Shows the template editor
|
|
*/
|
|
this.cancelTemplateBit = function( templateID )
|
|
{
|
|
/*if ( ! confirm( "All unsaved changes will be lost!" ) )
|
|
{
|
|
return false;
|
|
}*/
|
|
|
|
try
|
|
{
|
|
$('tplate_editorWrapper').remove();
|
|
}
|
|
catch(e)
|
|
{
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Shows a group entry as 'lit'
|
|
*/
|
|
this.hiliteGroup = function( templateGroup )
|
|
{
|
|
/* Un-hi-lite all groups */
|
|
var _groups = Object.keys( IPB3Templates.templateGroups['groups'] ).sort();
|
|
|
|
/* Format... */
|
|
_groups.each( function( i )
|
|
{
|
|
/* Fix up template */
|
|
$('tplate_grouprow_' + i ).removeClassName( IPB3Templates.cssNames['groupRowLitMain'] );
|
|
$('tplate_grouprow_' + i ).removeClassName( IPB3Templates.cssNames['groupRowLit'] );
|
|
$('tplate_grouprow_' + i ).addClassName( IPB3Templates.cssNames['groupRow'] );
|
|
} );
|
|
|
|
$('tplate_grouprow_' + templateGroup ).removeClassName( IPB3Templates.cssNames['groupRow'] );
|
|
$('tplate_grouprow_' + templateGroup ).addClassName( IPB3Templates.cssNames['groupRowLitMain'] );
|
|
$('tplate_grouprow_' + templateGroup ).addClassName( IPB3Templates.cssNames['groupRowLit'] );
|
|
};
|
|
|
|
/**
|
|
* Build a list of template groups
|
|
*/
|
|
this.buildGroupsList = function()
|
|
{
|
|
/* INIT */
|
|
var _output = '';
|
|
var _tplate = new Template( $('tplate_groupRow').innerHTML );
|
|
var json = IPB3Templates.templateGroups;
|
|
|
|
var _groups = Object.keys( json['groups'] ).sort();
|
|
|
|
/* Clear out any current listing */
|
|
$('tplate_groupList').update('');
|
|
|
|
/* Format... */
|
|
_groups.each( function( i )
|
|
{
|
|
_output += _tplate.evaluate( { 'groupName' : i, '_modCount' : json['groups'][i]['_modCount'] } );
|
|
} );
|
|
|
|
/* Write it out */
|
|
$('tplate_groupList').update( _output );
|
|
};
|
|
|
|
/**
|
|
* Build a list of template bits
|
|
*/
|
|
this.buildTemplateList = function( json )
|
|
{
|
|
/* INIT */
|
|
var _output = '';
|
|
var _tplate = new Template( $('tplate_templateRow').innerHTML );
|
|
|
|
/* Clear out any current listing */
|
|
$('tplate_bitList').update('');
|
|
|
|
/* Add in the new... */
|
|
for( i = 0 ; i < json['templates'].length; i++ )
|
|
{
|
|
/* Figure out if this in an inherited row, a changed row, a new row or a default row */
|
|
if ( json['templates'][i]['template_added_to'] == IPB3Templates.currentSetData['set_id'] )
|
|
{
|
|
/* This is a modified row */
|
|
json['templates'][i]['_templateState'] = 'new';
|
|
json['templates'][i]['_cssClass'] = 'tplateRow_new';
|
|
}
|
|
else if ( json['templates'][i]['template_set_id'] == IPB3Templates.currentSetData['set_id'] )
|
|
{
|
|
/* This is a modified row */
|
|
json['templates'][i]['_templateState'] = 'modified';
|
|
json['templates'][i]['_cssClass'] = 'tplateRow_mod';
|
|
}
|
|
else if ( IPB3Templates.currentSetData['_parentTree'].indexOf( json['templates'][i]['template_set_id'] ) != -1 )
|
|
{
|
|
/* Inherited */
|
|
json['templates'][i]['_templateState'] = 'inherit';
|
|
json['templates'][i]['_cssClass'] = 'tplateRow_inh';
|
|
}
|
|
else
|
|
{
|
|
/* This is a default row */
|
|
json['templates'][i]['_templateState'] = 'default';
|
|
json['templates'][i]['_cssClass'] = 'tplateRow_def';
|
|
}
|
|
|
|
_output += _tplate.evaluate( json['templates'][i] );
|
|
};
|
|
|
|
/* Write it out */
|
|
$('tplate_bitList').update( _output );
|
|
|
|
/* Post Process */
|
|
for( i = 0 ; i < json['templates'].length; i++ )
|
|
{
|
|
if ( json['templates'][i]['_templateState'] == 'new' )
|
|
{
|
|
$('tplate_templateRow_' + json['templates'][i]['template_id'] + '_revert').update('Remove');
|
|
}
|
|
else if ( json['templates'][i]['_templateState'] != 'default' )
|
|
{
|
|
$('tplate_templateRow_' + json['templates'][i]['template_id'] + '_revert').show();
|
|
}
|
|
else
|
|
{
|
|
$('tplate_templateRow_' + json['templates'][i]['template_id'] + '_revert').hide();
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Template Mouse Event
|
|
*/
|
|
this.templateMouseEvent = function( e )
|
|
{
|
|
if ( _div = $( Event.element( e ) ).up( '.' + IPB3Templates.cssNames['templateRow'] ) )
|
|
{
|
|
var _template_id = _div.id.replace( 'tplate_templaterow_', '' );
|
|
|
|
if ( e.type == 'mouseover' )
|
|
{
|
|
_div.addClassName( IPB3Templates.cssNames['templateHover'] );
|
|
}
|
|
else if ( e.type == 'mouseout' )
|
|
{
|
|
_div.removeClassName( IPB3Templates.cssNames['templateHover'] );
|
|
}
|
|
else if ( e.type == 'click' )
|
|
{
|
|
var _el = Event.findElement( e, 'div' ).id;
|
|
|
|
if ( _el.endsWith('_revert' ) )
|
|
{
|
|
IPB3Templates.revertTemplateBit( _template_id );
|
|
}
|
|
else
|
|
{
|
|
IPB3Templates.loadTemplateEditor( _template_id );
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Group Mouse Event
|
|
*/
|
|
this.groupMouseEvent = function( e )
|
|
{
|
|
var groupName = $( Event.findElement( e, 'div' ) ).id;
|
|
var _groupName = groupName.replace( 'tplate_grouprow_', '' );
|
|
|
|
if ( e.type == 'mouseover' )
|
|
{
|
|
$( groupName ).addClassName( IPB3Templates.cssNames['groupHover'] );
|
|
}
|
|
else if ( e.type == 'mouseout' )
|
|
{
|
|
$( groupName ).removeClassName( IPB3Templates.cssNames['groupHover'] );
|
|
}
|
|
else if ( e.type == 'click' )
|
|
{
|
|
IPB3Templates.currentTemplateGroup = _groupName;
|
|
|
|
IPB3Templates.loadTemplateBits( _groupName );
|
|
}
|
|
};
|
|
} |