“MediaWiki:Gadget-twinklecopyvio.js”与“MediaWiki:Gadget-twinkledelimages.js”:页面之间的差异

H萌娘,万物皆可H的百科全书!
(页面间差异)
跳到导航 跳到搜索
MediaWiki>Jimmy Xu
(v2.0-1126-gf881a4a-dirty)
 
MediaWiki>Krenair
(Maintenance: mw:RL/MGU / mw:RL/JD - Replaced .size() (removed in jQuery 3.0) phab:T169385
 
第7行: 第7行:


/*
/*
****************************************
****************************************
*** twinklecopyvio.js: Copyvio module
*** twinkledelimages.js: Batch deletion of images (sysops only)
****************************************
****************************************
* Mode of invocation:   Tab ("Copyvio")
* Mode of invocation:   Tab ("Deli-batch")
* Active on:        Existing, non-special pages, except for file pages with no local (non-Commons) file which are not redirects
* Active on:        Existing non-special pages
* Config directives in:  TwinkleConfig
* Config directives in:  TwinkleConfig
*/
*/


Twinkle.copyvio = function twinklecopyvio() {
Twinkle.delimages = function twinkledeli() {
// Disable on:
if( mw.config.get( 'wgNamespaceNumber' ) < 0 || !mw.config.get( 'wgCurRevisionId' ) ) {
// * special pages
// * non-existent pages
// * files on Commons, whether there is a local page or not (unneeded local pages of files on Commons are eligible for CSD F2)
// * file pages without actual files (these are eligible for CSD G8)
if ( mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId') || (mw.config.get('wgNamespaceNumber') === 6 && (document.getElementById('mw-sharedupload') || (!document.getElementById('mw-imagepage-section-filehistory') && !Morebits.wiki.isPageRedirect()))) ) {
return;
return;
}
}
Twinkle.addPortletLink(Twinkle.copyvio.callback, " 侵权", "tw-copyvio", " 提报侵权 面", "");
if( Morebits.userIsInGroup( 'sysop' ) ) {
Twinkle.addPortletLink( Twinkle.delimages.callback, " 批图", "tw-deli", " 批量删除此 内的文件" );
}
};
};


Twinkle.copyvio.callback = function twinklecopyvioCallback() {
Twinkle.delimages.unlinkCache = {};
var Window = new Morebits.simpleWindow( 600, 350 );
Twinkle.delimages.callback = function twinkledeliCallback() {
Window.setTitle( " 提报侵权页面" );
var Window = new Morebits.simpleWindow( 800, 400 );
Window.setTitle( " 批量文件删除" );
Window.setScriptName( "Twinkle" );
Window.setScriptName( "Twinkle" );
Window.addFooterLink( "Twinkle帮助", "WP:TW/DOC#copyvio" );
Window.addFooterLink( "Twinkle帮助", "WP:TW/DOC#delimages" );


var form = new Morebits.quickForm( Twinkle.copyvio.callback.evaluate );
var form = new Morebits.quickForm( Twinkle.delimages.callback.evaluate );
form.append( {
form.append( {
type: 'textarea',
type: 'checkbox',
label:' 侵权来源:',
list: [
name: 'source'
{
}
label: ' 删除文件',
);
name: 'delete_image',
value: 'delete',
checked: true
},
{
label: '取消此文件的使用',
name: 'unlink_image',
value: 'unlink',
checked: true
}
]
} );
form.append( {
form.append( {
type: 'textarea',
name: 'reason',
label: '理由:'
} );
var query;
if( mw.config.get( 'wgNamespaceNumber' ) === 14 ) {  // Category:
query = {
'action': 'query',
'generator': 'categorymembers',
'gcmtitle': mw.config.get( 'wgPageName' ),
'gcmnamespace': 6,  // File:
'gcmlimit' : Twinkle.getPref('deliMax'),
'prop': [ 'imageinfo', 'categories', 'revisions' ],
'grvlimit': 1,
'grvprop': [ 'user' ]
};
} else {
// prepare for a possible merge with batchdelete
alert('致管理员:\n\n' +
'我们正在计划翻新“批量文件删除”模块,并在考虑对于分类以外的页面,此功能是否仍旧值得维护。\n\n' +
'既然您正于分类以外的页面调用“批量文件删除”,我们希望您能够于[[WT:TW]]告知Twinkle团队。如果没有人告诉我们他还在使用,我们就可能会移除或修改这个功能。\n\n' +
'谢谢,\nTwinkle团队');
//form.append({ type:'div', style:'color:red;font-weight:bold;font-size:larger', label: 'This module is going away. Please use "D-batch" (batch deletion) instead.' });
query = {
'action': 'query',
'generator': 'images',
'titles': mw.config.get( 'wgPageName' ),
'prop': [ 'imageinfo', 'categories', 'revisions' ],
'gimlimit': 'max'
};
}
var wikipedia_api = new Morebits.wiki.api( '抓取文件', query, function( self ) {
var xmlDoc = self.responseXML;
var images = $(xmlDoc).find('page[imagerepository="local"]');
var list = [];
$.each(images, function() {
var $self = $(this);
var image = $self.attr('title');
var user = $self.find('imageinfo ii').attr('user');
var last_edit = $self.find('revisions rev').attr('user');
var disputed = $self.find('categories cl[title="Category:快速删除候选"]').length > 0;
list.push( {
'label': image + '—作者:' + user + ',上次编辑:' + last_edit + ( disputed ? '(争议' : '' ),
'value': image,
'checked': !disputed
});
});
self.params.form.append({
type: 'checkbox',
type: 'checkbox',
list: [
name: 'images',
{
list: list
label: '通知页面创建者',
});
value: 'notify',
self.params.form.append( { type:'submit' } );
name: 'notify',
 
tooltip: "在页面创建者对话页上放置一通知模板。",
var result = self.params.form.render();
checked: true
self.params.Window.setContent( result );
}
});
]
}
);
form.append( { type:'submit' } );


var result = form.render();
wikipedia_api.params = { form:form, Window:Window };
Window.setContent( result );
wikipedia_api.post();
var root = document.createElement( 'div' );
Morebits.status.init( root );
Window.setContent( root );
Window.display();
Window.display();
};
};


Twinkle.copyvio.callbacks = {
Twinkle.delimages.currentDeleteCounter = 0;
tryTagging: function (pageobj) {
Twinkle.delimages.currentUnlinkCounter = 0;
// 先尝试标记页面,如果发现已经标记则停止提报
Twinkle.delimages.currentdeletor = 0;
var text = pageobj.getPageText();
Twinkle.delimages.callback.evaluate = function twinkledeliCallbackEvaluate(event) {
var images = event.target.getChecked( 'images' );
var reason = event.target.reason.value;
var delete_image = event.target.delete_image.checked;
var unlink_image = event.target.unlink_image.checked;
if( ! reason ) {
return;
}


if (text.indexOf('{{Copyvio|') === -1) {
Morebits.simpleWindow.setButtonsEnabled( false );
Twinkle.copyvio.callbacks.taggingArticle(pageobj);
Morebits.status.init( event.target );


// Contributor specific edits
function toCall( work ) {
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'));
if( work.length === 0 && Twinkle.delimages.currentDeleteCounter <= 0 && Twinkle.delimages.currentUnlinkCounter <= 0 ) {
wikipedia_page.setCallbackParameters(pageobj.getCallbackParameters());
window.clearInterval( Twinkle.delimages.currentdeletor );
wikipedia_page.lookupCreator(Twinkle.copyvio.callbacks.main);
Morebits.wiki.removeCheckpoint();
} else {
return;
Morebits.status.error( ' 错误', ' 页面已经标记侵权,请人工确认 是否 已经提报。' );
} else if( work.length !== 0 && Twinkle.delimages.currentDeleteCounter <= Twinkle.getPref('batchDeleteMinCutOff') && Twinkle.delimages.currentUnlinkCounter <= Twinkle.getPref('batchDeleteMinCutOff') ) {
Twinkle.delimages.unlinkCache = []; // Clear the cache
var images = work.shift();
Twinkle.delimages.currentDeleteCounter = images.length;
Twinkle.delimages.currentUnlinkCounter = images.length;
var i;
for( i = 0; i < images.length; ++i ) {
var image = images[i];
var query = {
'action': 'query',
'titles': image
};
var wikipedia_api = new Morebits.wiki.api( ' 检查文件 ' + image + ' 是否 存在', query, Twinkle.delimages.callbacks.main );
wikipedia_api.params = { image:image, reason:reason, unlink_image:unlink_image, delete_image:delete_image };
wikipedia_api.post();
}
}
}
},
}
main: function(pageobj) {
var work = Morebits.array.chunk( images, Twinkle.getPref('deliChunks') );
// this is coming in from lookupCreator...!
Morebits.wiki.addCheckpoint();
var params = pageobj.getCallbackParameters();
Twinkle.delimages.currentdeletor = window.setInterval( toCall, 1000, work );
var initialContrib = pageobj.getCreator();
};
Twinkle.delimages.callbacks = {
main: function( self ) {
var xmlDoc = self.responseXML;
var $data = $(xmlDoc);


// Adding discussion
var normal = $data.find('normalized n').attr('to');
var wikipedia_page = new Morebits.wiki.page(params.logpage, "添加侵权记录项");
wikipedia_page.setFollowRedirect(true);
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.copyvio.callbacks.copyvioList);


// Notification to first contributor
if( normal ) {
if(params.usertalk) {
self.params.image = normal;
var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "通知页面创建者(" + initialContrib + ")");
var notifytext = "\n{{subst:CopyvioNotice|" + mw.config.get('wgPageName') +  "}}";
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary("通知:页面[[" + mw.config.get('wgPageName') + "]]疑似侵犯版权" + Twinkle.getPref('summaryAd'));
usertalkpage.setCreateOption('recreate');
switch (Twinkle.getPref('copyvioWatchUser')) {
case 'yes':
usertalkpage.setWatchlist(true);
break;
case 'no':
usertalkpage.setWatchlistFromPreferences(false);
break;
default:
usertalkpage.setWatchlistFromPreferences(true);
break;
}
usertalkpage.setFollowRedirect(true);
usertalkpage.append();
}
}
},
 
taggingArticle: function(pageobj) {
var exists = $data.find('pages page[title="'+self.params.image.replace( /"/g, '\\"')+'"]:not([missing])').length > 0;
var params = pageobj.getCallbackParameters();
 
var tag = "{{subst:Copyvio/auto|url=" + params.source.replace(/http/g, '&#104;ttp').replace(/\n+/g, '\n').replace(/^\s*([^\*])/gm, '* $1').replace(/^\* $/m, '') + "}}";
if( ! exists ) {
if ( /\/temp$/i.test( mw.config.get('wgPageName') ) ) {
self.statelem.error( "文件不存在,可能已被删除" );
tag = "{{D|G16}}\n" + tag;
return;
}
}
 
if( self.params.unlink_image ) {
pageobj.setPageText(tag);
var query = {
pageobj.setEditSummary("本页面疑似侵犯版权" + Twinkle.getPref('summaryAd'));
'action': 'query',
switch (Twinkle.getPref('copyvioWatchPage')) {
'list': 'imageusage',
case 'yes':
'iutitle': self.params.image,
pageobj.setWatchlist(true);
'iulimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
break;
};
case 'no':
var wikipedia_api = new Morebits.wiki.api( ' 抓取文件链接', query, Twinkle.delimages.callbacks.unlinkImageInstancesMain );
pageobj.setWatchlistFromPreferences(false);
wikipedia_api.params = self.params;
break;
wikipedia_api.post();
default:
pageobj.setWatchlistFromPreferences(true);
break;
}
}
// pageobj.setCreateOption('recreate');
if( self.params.delete_image ) {
pageobj.save();


if( Twinkle.getPref('markCopyvioPagesAsPatrolled') ) {
var imagepage = new Morebits.wiki.page( self.params.image, '删除文件');
pageobj.patrol();
imagepage.setEditSummary( "文件被删除:" + self.params.reason + Twinkle.getPref('deletionSummaryAd'));
imagepage.deletePage();
}
}
},
},
copyvioList: function(pageobj) {
unlinkImageInstancesMain: function( self ) {
var text = pageobj.getPageText();
var xmlDoc = self.responseXML;
var params = pageobj.getCallbackParameters();
var instances = [];
var output = '';
$(xmlDoc).find('imageusage iu').each(function(){
var date = new Date();
instances.push($(this).attr('title'));
 
});
var dateHeaderRegex = new RegExp( "^===+\\s*" + (date.getUTCMonth() + 1) + "月" + date.getUTCDate() + "日" +
if( instances.length === 0 ) {
"\\s*===+", 'mg' );
--Twinkle.delimages.currentUnlinkCounter;
 
return;
if (!dateHeaderRegex.exec(text)) {
output = "\n\n===" + (date.getUTCMonth() + 1) + "月" + date.getUTCDate() + "日" + "===";
}
}


output += "\n{{subst:CopyvioVFDRecord|" + mw.config.get('wgPageName') + "}}";
$.each( instances, function(k,title) {
pageobj.setAppendText(output);
var page = new Morebits.wiki.page(title, " 取消文件在" + title + " 上的使用");
pageobj.setEditSummary("添加[[" + mw.config.get('wgPageName') + "]]" + Twinkle.getPref('summaryAd'));
page.setFollowRedirect(true);
pageobj.setCreateOption('recreate');
page.setCallbackParameters({'image': self.params.image, 'reason': self.params.reason});
pageobj.append();
page.load(Twinkle.delimages.callbacks.unlinkImageInstances);
}
};


});
},
unlinkImageInstances: function( self ) {
var params = self.getCallbackParameters();
var statelem = self.getStatusElement();


Twinkle.copyvio.callback.evaluate = function(e) {
var image = params.image.replace( /^(?:Image|File|文件):/, '' );
mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!
var old_text = self.getPageText();
var wikiPage = new Morebits.wikitext.page( old_text );
wikiPage.commentOutImage( image , ' 注释此文件因其已被删除' );
var text = wikiPage.getText();


var source = e.target.source.value;
if( text === old_text ) {
var usertalk = e.target.notify.checked;
statelem.error( '取消 ' + image + ' 在 ' + self.getPageName() + ' 上的使用失败' );
 
return;
Morebits.simpleWindow.setButtonsEnabled( false );
}
Morebits.status.init( e.target );
self.setPageText(text);
 
self.setEditSummary('移除文件 ' + image + " 因其已被删除,理由为“" + params.reason + "”。" + Twinkle.getPref('deletionSummaryAd'));
if( !source.trim() ) {
self.setCreateOption('nocreate');
Morebits.status.error( ' 错误', '未指定侵权来源' );
self.save();
return;
}
}
var query, wikipedia_page, wikipedia_api, logpage, params;
logpage = 'Wikipedia:頁面存廢討論/疑似侵權';
params = { source: source, logpage: logpage, usertalk: usertalk};
Morebits.wiki.addCheckpoint();
// Updating data for the action completed event
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = "提报完成,将在几秒内刷新";
// Tagging file
wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "添加侵权模板到页面");
wikipedia_page.setFollowRedirect(true);
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.copyvio.callbacks.tryTagging);
Morebits.wiki.removeCheckpoint();
};
};
})(jQuery);
})(jQuery);

2017年8月10日 (四) 13:36的版本

//<nowiki>
// vim: set noet sts=0 sw=8:


(function($){


/*
****************************************
*** twinkledelimages.js: Batch deletion of images (sysops only)
****************************************
* Mode of invocation:     Tab ("Deli-batch")
* Active on:              Existing non-special pages
* Config directives in:   TwinkleConfig
*/

Twinkle.delimages = function twinkledeli() {
	if( mw.config.get( 'wgNamespaceNumber' ) < 0 || !mw.config.get( 'wgCurRevisionId' ) ) {
		return;
	}
	if( Morebits.userIsInGroup( 'sysop' ) ) {
		Twinkle.addPortletLink( Twinkle.delimages.callback, "批图", "tw-deli", "批量删除此页内的文件" );
	}
};

Twinkle.delimages.unlinkCache = {};
Twinkle.delimages.callback = function twinkledeliCallback() {
	var Window = new Morebits.simpleWindow( 800, 400 );
	Window.setTitle( "批量文件删除" );
	Window.setScriptName( "Twinkle" );
	Window.addFooterLink( "Twinkle帮助", "WP:TW/DOC#delimages" );

	var form = new Morebits.quickForm( Twinkle.delimages.callback.evaluate );
	form.append( {
		type: 'checkbox',
		list: [
			{
				label: '删除文件',
				name: 'delete_image',
				value: 'delete',
				checked: true
			},
			{
				label: '取消此文件的使用',
				name: 'unlink_image',
				value: 'unlink',
				checked: true
			}
		]
	} );
	form.append( {
		type: 'textarea',
		name: 'reason',
		label: '理由:'
	} );
	var query;
	if( mw.config.get( 'wgNamespaceNumber' ) === 14 ) {  // Category:
		query = {
			'action': 'query',
			'generator': 'categorymembers',
			'gcmtitle': mw.config.get( 'wgPageName' ),
			'gcmnamespace': 6,  // File:
			'gcmlimit' : Twinkle.getPref('deliMax'), 
			'prop': [ 'imageinfo', 'categories', 'revisions' ],
			'grvlimit': 1,
			'grvprop': [ 'user' ]
		};
	} else {
		// prepare for a possible merge with batchdelete
		alert('致管理员:\n\n' +
			'我们正在计划翻新“批量文件删除”模块,并在考虑对于分类以外的页面,此功能是否仍旧值得维护。\n\n' +
			'既然您正于分类以外的页面调用“批量文件删除”,我们希望您能够于[[WT:TW]]告知Twinkle团队。如果没有人告诉我们他还在使用,我们就可能会移除或修改这个功能。\n\n' +
			'谢谢,\nTwinkle团队');
		//form.append({ type:'div', style:'color:red;font-weight:bold;font-size:larger', label: 'This module is going away. Please use "D-batch" (batch deletion) instead.' });
		query = {
			'action': 'query',
			'generator': 'images',
			'titles': mw.config.get( 'wgPageName' ),
			'prop': [ 'imageinfo', 'categories', 'revisions' ],
			'gimlimit': 'max'
		};
	}
	var wikipedia_api = new Morebits.wiki.api( '抓取文件', query, function( self ) {
		var xmlDoc = self.responseXML;
		var images = $(xmlDoc).find('page[imagerepository="local"]');
		var list = [];

		$.each(images, function() {
			var $self = $(this);
			var image = $self.attr('title');
			var user = $self.find('imageinfo ii').attr('user');
			var last_edit = $self.find('revisions rev').attr('user');
			var disputed = $self.find('categories cl[title="Category:快速删除候选"]').length > 0;
			list.push( {
				'label': image + '—作者:' + user + ',上次编辑:' + last_edit + ( disputed ? '(争议' : '' ),
				'value': image,
				'checked': !disputed
			});
		});

		self.params.form.append({
			type: 'checkbox',
			name: 'images',
			list: list
		});
		self.params.form.append( { type:'submit' } );

		var result = self.params.form.render();
		self.params.Window.setContent( result );
	});

	wikipedia_api.params = { form:form, Window:Window };
	wikipedia_api.post();
	var root = document.createElement( 'div' );
	Morebits.status.init( root );
	Window.setContent( root );
	Window.display();
};

Twinkle.delimages.currentDeleteCounter = 0;
Twinkle.delimages.currentUnlinkCounter = 0;
Twinkle.delimages.currentdeletor = 0;
Twinkle.delimages.callback.evaluate = function twinkledeliCallbackEvaluate(event) {
	var images = event.target.getChecked( 'images' );
	var reason = event.target.reason.value;
	var delete_image = event.target.delete_image.checked;
	var unlink_image = event.target.unlink_image.checked;
	if( ! reason ) {
		return;
	}

	Morebits.simpleWindow.setButtonsEnabled( false );
	Morebits.status.init( event.target );

	function toCall( work ) {
		if( work.length === 0 && Twinkle.delimages.currentDeleteCounter <= 0 && Twinkle.delimages.currentUnlinkCounter <= 0 ) {
			window.clearInterval( Twinkle.delimages.currentdeletor );
			Morebits.wiki.removeCheckpoint();
			return;
		} else if( work.length !== 0 && Twinkle.delimages.currentDeleteCounter <= Twinkle.getPref('batchDeleteMinCutOff') && Twinkle.delimages.currentUnlinkCounter <= Twinkle.getPref('batchDeleteMinCutOff') ) {
			Twinkle.delimages.unlinkCache = []; // Clear the cache
			var images = work.shift();
			Twinkle.delimages.currentDeleteCounter = images.length;
			Twinkle.delimages.currentUnlinkCounter = images.length;
			var i;
			for( i = 0; i < images.length; ++i ) {
				var image = images[i];
				var query = {
					'action': 'query',
					'titles': image
				};
				var wikipedia_api = new Morebits.wiki.api( '检查文件 ' + image + ' 是否存在', query, Twinkle.delimages.callbacks.main );
				wikipedia_api.params = { image:image, reason:reason, unlink_image:unlink_image, delete_image:delete_image };
				wikipedia_api.post();
			}
		}
	}
	var work = Morebits.array.chunk( images, Twinkle.getPref('deliChunks') );
	Morebits.wiki.addCheckpoint();
	Twinkle.delimages.currentdeletor = window.setInterval( toCall, 1000, work );
};
Twinkle.delimages.callbacks = {
	main: function( self ) {
		var xmlDoc = self.responseXML;
		var $data = $(xmlDoc);

		var normal = $data.find('normalized n').attr('to');

		if( normal ) {
			self.params.image = normal;
		}

		var exists = $data.find('pages page[title="'+self.params.image.replace( /"/g, '\\"')+'"]:not([missing])').length > 0;

		if( ! exists ) {
			self.statelem.error( "文件不存在,可能已被删除" );
			return;
		}
		if( self.params.unlink_image ) {
			var query = {
				'action': 'query',
				'list': 'imageusage',
				'iutitle': self.params.image,
				'iulimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
			};
			var wikipedia_api = new Morebits.wiki.api( '抓取文件链接', query, Twinkle.delimages.callbacks.unlinkImageInstancesMain );
			wikipedia_api.params = self.params;
			wikipedia_api.post();
		}
		if( self.params.delete_image ) {

			var imagepage = new Morebits.wiki.page( self.params.image, '删除文件');
			imagepage.setEditSummary( "文件被删除:" + self.params.reason + Twinkle.getPref('deletionSummaryAd'));
			imagepage.deletePage();
		}
	},
	unlinkImageInstancesMain: function( self ) {
		var xmlDoc = self.responseXML;
		var instances = [];
		$(xmlDoc).find('imageusage iu').each(function(){
			instances.push($(this).attr('title'));
		});
		if( instances.length === 0 ) {
			--Twinkle.delimages.currentUnlinkCounter;
			return;
		}

		$.each( instances, function(k,title) {
			var page = new Morebits.wiki.page(title, "取消文件在" + title + " 上的使用");
			page.setFollowRedirect(true);
			page.setCallbackParameters({'image': self.params.image, 'reason': self.params.reason});
			page.load(Twinkle.delimages.callbacks.unlinkImageInstances);

		});
	},
	unlinkImageInstances: function( self ) {
		var params = self.getCallbackParameters();
		var statelem = self.getStatusElement();

		var image = params.image.replace( /^(?:Image|File|文件):/, '' );
		var old_text = self.getPageText();
		var wikiPage = new Morebits.wikitext.page( old_text );
		wikiPage.commentOutImage( image , '注释此文件因其已被删除' );
		var text = wikiPage.getText();

		if( text === old_text ) {
			statelem.error( '取消 ' + image + ' 在 ' + self.getPageName() + ' 上的使用失败' );
			return;
		}
		self.setPageText(text);
		self.setEditSummary('移除文件 ' + image + " 因其已被删除,理由为“" + params.reason + "”。" + Twinkle.getPref('deletionSummaryAd'));
		self.setCreateOption('nocreate');
		self.save();
	}
};
})(jQuery);


//</nowiki>