MediaWiki:Gadget-twinklespeedy.js

Vikisöz, özgür söz dizini

Not: Yayımladıktan sonra değişiklikleri görmek için tarayıcınızın önbelleğini temizlemeniz gerekebilir.

  • Firefox / Safari: Shift tuşuna basılıyken Yeniden Yükle'ye tıklayın ya da Ctrl-F5 ya da Ctrl-R tıklayın (Mac için ⌘-R).
  • Google Chrome: Ctrl-Shift-R'ye basın. (Mac için ⌘-Shift-R)
  • Internet Explorer / Edge: Ctrl basılıyken Yenile'ye tıklayın ya da Ctrl-F5 yapın.
  • Opera: Ctrl-F5 tıklayın.
//<nowiki>


(function($){


/*
 ****************************************
 *** twinklespeedy.js: CSD module
 ****************************************
 * Mode of invocation:     Tab ("CSD")
 * Active on:              Non-special, existing pages
 * Config directives in:   TwinkleConfig
 *
 * NOTE FOR DEVELOPERS:
 *   If adding a new criterion, add it to the appropriate places at the top of
 *   twinkleconfig.js.  Also check out the default values of the CSD preferences
 *   in twinkle.js, and add your new criterion to those if you think it would be
 *   good.
 */

Twinkle.speedy = function twinklespeedy() {
	// Disable on:
	// * special pages
	// * non-existent pages
	if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
		return;
	}

	Twinkle.addPortletLink( Twinkle.speedy.callback, "Hızlı Silme", "tw-csd", Morebits.userIsInGroup('sysop') ? "VS:HS\'ye göre sayfayı hızlı sil" : "VS:HS\'ye göre sayfayı hızlı silinmesi için işaretle" );
};

// This function is run when the CSD tab/header link is clicked
Twinkle.speedy.callback = function twinklespeedyCallback() {
	Twinkle.speedy.initDialog(Morebits.userIsInGroup( 'sysop' ) ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
};

// Used by unlink feature
Twinkle.speedy.dialog = null;

// The speedy criteria list can be in one of several modes
Twinkle.speedy.mode = {
	sysopSubmit: 1,  // radio buttons, no subgroups, submit when "Submit" button is clicked
	sysopRadioClick: 2,  // radio buttons, no subgroups, submit when a radio button is clicked
	userMultipleSubmit: 3,  // check boxes, subgroups, "Submit" button already pressent
	userMultipleRadioClick: 4,  // check boxes, subgroups, need to add a "Submit" button
	userSingleSubmit: 5,  // radio buttons, subgroups, submit when "Submit" button is clicked
	userSingleRadioClick: 6,  // radio buttons, subgroups, submit when a radio button is clicked

	// are we in "delete page" mode?
	// (sysops can access both "delete page" [sysop] and "tag page only" [user] modes)
	isSysop: function twinklespeedyModeIsSysop(mode) {
		return mode === Twinkle.speedy.mode.sysopSubmit ||
			mode === Twinkle.speedy.mode.sysopRadioClick;
	},
	// do we have a "Submit" button once the form is created?
	hasSubmitButton: function twinklespeedyModeHasSubmitButton(mode) {
		return mode === Twinkle.speedy.mode.sysopSubmit ||
			mode === Twinkle.speedy.mode.userMultipleSubmit ||
			mode === Twinkle.speedy.mode.userMultipleRadioClick ||
			mode === Twinkle.speedy.mode.userSingleSubmit;
	},
	// is db-multiple the outcome here?
	isMultiple: function twinklespeedyModeIsMultiple(mode) {
		return mode === Twinkle.speedy.mode.userMultipleSubmit ||
			mode === Twinkle.speedy.mode.userMultipleRadioClick;
	},
	// do we want subgroups? (if not we have to use prompt())
	wantSubgroups: function twinklespeedyModeWantSubgroups(mode) {
		return !Twinkle.speedy.mode.isSysop(mode);
	}
};

// Prepares the speedy deletion dialog and displays it
Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
	var dialog;
	Twinkle.speedy.dialog = new Morebits.simpleWindow( Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight') );
	dialog = Twinkle.speedy.dialog;
	dialog.setTitle( "Hızlı silme kriteri seçin" );
	dialog.setScriptName( "Twinkle" );
	dialog.addFooterLink( "Hızlı silme politikası", "VS:HS" );
	dialog.addFooterLink( "Hata bildirimi", "Vikisöz tartışma:Twinkle" );

	var form = new Morebits.quickForm( callbackfunc, (Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null) );
	if( Morebits.userIsInGroup( 'sysop' ) ) {
		form.append( {
				type: 'checkbox',
				list: [
					{
						label: 'Sadece işaretle, Silme!',
						value: 'tag_only',
						name: 'tag_only',
						tooltip: 'Eğer sayfayı şimdi silmek yerine etiketlemek istiyorsanız',
						checked : Twinkle.getPref('deleteSysopDefaultToTag'),
						event: function( event ) {
							var cForm = event.target.form;
							var cChecked = event.target.checked;
							// enable/disable talk page checkbox
							if (cForm.talkpage) {
								cForm.talkpage.disabled = cChecked;
								cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
							}
							// enable/disable redirects checkbox
							cForm.redirects.disabled = cChecked;
							cForm.redirects.checked = !cChecked;

							// enable/disable notify checkbox
							cForm.notify.disabled = !cChecked;
							cForm.notify.checked = cChecked;
							// enable/disable multiple
							cForm.multiple.disabled = !cChecked;
							cForm.multiple.checked = false;

							Twinkle.speedy.callback.modeChanged(cForm);

							event.stopPropagation();
						}
					}
				]
			} );
		form.append( { type: 'header', label: 'Sil ile ilgili seçenekler' } );
		if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) {  // hide option for user pages, to avoid accidentally deleting user talk page
			form.append( {
				type: 'checkbox',
				list: [
					{
						label: 'Tartışma sayfasını da sil',
						value: 'talkpage',
						name: 'talkpage',
						tooltip: "Bu seçenek, sayfanın konuşma sayfasını ek olarak siler.",
						checked: Twinkle.getPref('deleteTalkPageOnDelete'),
						disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
						event: function( event ) {
							event.stopPropagation();
						}
					}
				]
			} );
		}
		form.append( {
				type: 'checkbox',
				list: [
					{
						label: 'Ayrıca tüm yönlendirmeleri sil',
						value: 'redirects',
						name: 'redirects',
						tooltip: "Bu seçenek, gelen tüm yönlendirmeleri ek olarak siler. Prosedürel (örneğin, taşıma / birleştirme) silme işlemleri için bu seçenekten kaçının.",
						checked: Twinkle.getPref('deleteRedirectsOnDelete'),
						disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
						event: function( event ) {
							event.stopPropagation();
						}
					}
				]
			} );
		form.append( { type: 'header', label: 'Etiketle ilgili seçenekler' } );
	}

	form.append( {
			type: 'checkbox',
			list: [
				{
					label: 'Eğer mümkün ise sayfayı oluşturan kullanıcıyı bilgilendir',
					value: 'notify',
					name: 'notify',
					tooltip: "Eğer Twinkle seçeneklerinden birimleri aktif etmişseniz, Sayfayı oluşturan kullanıcının mesaj sayfasına bildirim şablonu yerleştirilecek" +
						"Bu kutu işaretli ise ve seçtiğiniz HS kriterine göre kullanıcıya HG şablonu da gönderilebilir.",
					checked: !Morebits.userIsInGroup( 'sysop' ) || Twinkle.getPref('deleteSysopDefaultToTag'),
					disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'),
					event: function( event ) {
						event.stopPropagation();
					}
				}
			]
		} );
	form.append( {
			type: 'checkbox',
			list: [
				{
					label: 'Birçok kriteri işaretle',
					value: 'multiple',
					name: 'multiple',
					tooltip: "Seçildiğine, birçok HS kritererini aynı anda işaretleyebilirsiniz.",
					disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'),
					event: function( event ) {
						Twinkle.speedy.callback.modeChanged( event.target.form );
						event.stopPropagation();
					}
				}
			]
		} );

	form.append( {
			type: 'div',
			name: 'work_area',
			label: 'Failed to initialize the CSD module. Please try again, or tell the Twinkle developers about the issue.'
		} );

	if( Twinkle.getPref( 'speedySelectionStyle' ) !== 'radioClick' ) {
		form.append( { type: 'submit' } );
	}

	var result = form.render();
	dialog.setContent( result );
	dialog.display();

	Twinkle.speedy.callback.modeChanged( result );
};

Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) {
	var namespace = mw.config.get('wgNamespaceNumber');

	// first figure out what mode we're in
	var mode = Twinkle.speedy.mode.userSingleSubmit;
	if (form.tag_only && !form.tag_only.checked) {
		mode = Twinkle.speedy.mode.sysopSubmit;
	} else {
		if (form.multiple.checked) {
			mode = Twinkle.speedy.mode.userMultipleSubmit;
		} else {
			mode = Twinkle.speedy.mode.userSingleSubmit;
		}
	}
	if (Twinkle.getPref('speedySelectionStyle') === 'radioClick') {
		mode++;
	}

	var work_area = new Morebits.quickForm.element( {
			type: 'div',
			name: 'work_area'
		} );

	if (mode === Twinkle.speedy.mode.userMultipleRadioClick) {
		work_area.append( {
				type: 'div',
				label: 'When finished choosing criteria, click:'
			} );
		work_area.append( {
				type: 'button',
				name: 'submit-multiple',
				label: 'İsteği Gönder',
				event: function( event ) {
					Twinkle.speedy.callback.evaluateUser( event );
					event.stopPropagation();
				}
			} );
	}

	var radioOrCheckbox = (Twinkle.speedy.mode.isMultiple(mode) ? 'checkbox' : 'radio');

	switch (namespace) {
		case 0:  // article
		case 1:  // talk
			work_area.append( { type: 'header', label: 'Maddeler' } );
			work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.articleList, mode) } );
			break;

		case 2:  // user
		case 3:  // user talk
			work_area.append( { type: 'header', label: 'Kullanıcı sayfaları' } );
			work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.userList, mode) } );
			break;

		case 6:  // file
		case 7:  // file talk
			work_area.append( { type: 'header', label: 'Dosyalar' } );
			work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.fileList, mode) } );
			if (!Twinkle.speedy.mode.isSysop(mode)) {
				work_area.append( { type: 'div', label: 'Tagging for CSD F4 (no license), F5 (orphaned fair use), F6 (no fair use rationale), and F11 (no permission) can be done using Twinkle\'s "DI" tab.' } );
			}
			break;

		case 10:  // template
		case 11:  // template talk
			work_area.append( { type: 'header', label: 'Şablonlar' } );
			work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.templateList, mode) } );
			break;

		case 14:  // category
		case 15:  // category talk
			work_area.append( { type: 'header', label: 'Kategoriler' } );
			work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.categoryList, mode) } );
			break;

		case 100:  // portal
		case 101:  // portal talk
			work_area.append( { type: 'header', label: 'Portaller' } );
			work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.portalList, mode) } );
			break;

		default:
			break;
	}

	work_area.append( { type: 'header', label: 'Genel kriterler' } );
	work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.generalList, mode) });

	work_area.append( { type: 'header', label: 'Yönlendirmeler' } );
	work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.redirectList, mode) } );

	var old_area = Morebits.quickForm.getElements(form, "work_area")[0];
	form.replaceChild(work_area.render(), old_area);
};

Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) {
	// mode switches
	var isSysop = Twinkle.speedy.mode.isSysop(mode);
	var multiple = Twinkle.speedy.mode.isMultiple(mode);
	var wantSubgroups = Twinkle.speedy.mode.wantSubgroups(mode);
	var hasSubmitButton = Twinkle.speedy.mode.hasSubmitButton(mode);

	var openSubgroupHandler = function(e) { 
		$(e.target.form).find('input').prop('disabled', true);
		$(e.target.form).children().css('color', 'gray');
		$(e.target).parent().css('color', 'black').find('input').prop('disabled', false);
		$(e.target).parent().find('input:text')[0].focus();
		e.stopPropagation();
	};
	var submitSubgroupHandler = function(e) {
		Twinkle.speedy.callback.evaluateUser(e);
		e.stopPropagation();
	};

	return $.map(list, function(critElement) {
		var criterion = $.extend({}, critElement);

		if (!wantSubgroups) {
			criterion.subgroup = null;
		}

		if (multiple) {
			if (criterion.hideWhenMultiple) {
				return null;
			}
			if (criterion.hideSubgroupWhenMultiple) {
				criterion.subgroup = null;
			}
		} else {
			if (criterion.hideWhenSingle) {
				return null;
			}
			if (criterion.hideSubgroupWhenSingle) {
				criterion.subgroup = null;
			}
		}

		if (isSysop) {
			if (criterion.hideWhenSysop) {
				return null;
			}
			if (criterion.hideSubgroupWhenSysop) {
				criterion.subgroup = null;
			}
		} else {
			if (criterion.hideWhenUser) {
				return null;
			}
			if (criterion.hideSubgroupWhenUser) {
				criterion.subgroup = null;
			}
		}

		if (criterion.subgroup && !hasSubmitButton) {
			if ($.isArray(criterion.subgroup)) {
				criterion.subgroup.push({ 
					type: 'button',
					name: 'submit',
					label: 'İsteği gönder',
					event: submitSubgroupHandler
				});
			} else {
				criterion.subgroup = [
					criterion.subgroup,
					{
						type: 'button',
						name: 'submit',  // ends up being called "csd.submit" so this is OK
						label: 'İsteği gönder',
						event: submitSubgroupHandler
					}
				];
			}
			criterion.event = openSubgroupHandler;
		}

		return criterion;
	});
};

Twinkle.speedy.fileList = [//Dosya silme nedenleri
	{
		label: 'D1: Çift kopya dosyalardan birisi silinebilir.',
		value: 'D1: Çift kopya dosya',
		tooltip: 'Dosya, Vikisöz\'de veya Wikimedia Commons\'ta hâli hazırda bulunan bir dosyanın aynısı/kopyası ise, dosya formatı aynı, çözünürlüğü ise aynı veya daha düşükse, bu kopya silinir. Commons üzerinden yüklenen dosyaların Vikisöz üzerinde açılan sayfaları, dosyalar seçkin statüsüne sahip değilse silinebilir.',
		subgroup: {
			name: 'redundantimage_filename',
			type: 'input',
			label: 'Bu dosya ile aynı: ',
			tooltip: '"Dosya:" eki yazılmayabilir.'
		}
	},
	{
		label: 'D2: Bozuk, boş veya taşınmış dosyalar silinebilir.',
		value: 'D2: Bozuk/boş dosya',
		tooltip: 'Bozuk, boş veya taşınmış dosyalar silinebilir.'
	},
	{
		label: 'D3: Uygunsuz lisanslı dosyalar silinebilir.',
		value: 'D3: Uygunsuz lisanslı dosya',
		tooltip: 'Adil kullanım politikası dâhilinde kullanılabilecekler hariç "sadece ticari olmayan kullanıma açık", "izne tabi" veya "resmin değiştirilmesi sınırlandırılmış" dosyalar Vikisöz\'ün telif politikaları açısından uygunsuzdur.'
	},
	{
		label: 'D4: Lisans ve kaynak bilgisi eksik olan dosyalar silinebilir.',
		value: 'D4: Lisans ve kaynak bilgisi eksik olan dosya',
		tooltip: 'Yüklenen her dosyanın lisans ve kaynak bilgisi olmalıdır. Lisansı veya kaynağı belirtilmemiş dosyalar, belirsizliği işaretlendikten sonra, 7 gün içinde netliğe kavuşmadığı takdirde silinir. Lisansı belirsiz olan dosyalar için {{yk:Lisanssız dosya}}, kaynağı olmayan dosyalar için {{kopyala:Kaynaksız dosya}} şablonlarını kullanınız.'
	},
	{
		label: 'D5: Kullanılmayan adil kullanım dosyaları silinebilir.',
		value: 'D5: Kullanılmayan adil kullanım dosya',
		tooltip: 'Serbest bir lisans veya kamu malı kapsamında olmayan telif hakkı saklı (adil kullanım vb.) dosyalar, herhangi bir maddede kullanılmadığı takdirde işaretlendikten 7 gün sonra silinebilir. Bu dosyalar için {{yk:Kullanılmayan dosya}} şablonunu kullanınız.'
	},
	{
		label: 'D6: Adil kullanımı hatalı belirtilmiş dosyalar silinebilir.',
		value: 'D6: Adil kullanımı hatalı belirtilmiş dosya',
		tooltip: 'Yanlış adil kullanım etiketine sahip (herhangi bir maskot resmi için {{Logo}} etiketi gibi) dosyalar ile içerikte kullanımı adil kullanım politikasına uymayan dosyalar, yükleyen kullanıcıya haber verildikten 48 saat sonra silinebilir.'
	},
	{
		label: 'D7: Kullanımı gerekçelendirilmemiş dosyalar silinebilir.',
		value: 'D7: Kullanımı gerekçelendirilmemiş dosya',
		tooltip: '1 Ekim 2008 tarihinden sonra yüklenen özgür olmayan dosyalar adil kullanıma giriyor olmasına rağmen kullanım gerekçelendirilmesi yapılmamışsa, işaretlendikten bir hafta sonra silinirler. Bu dosyalar için {{yk:Gerekçesiz dosya}} şablonunu kullanabilirsiniz.'
	},
	{
		label: 'D8: Herhangi bir sayfada kullanılmayan söz dizini kullanımı açıdan değersiz dosyalar silinebilir.',
		value: 'D8: Söz dizini sitesi için değersiz dosya',
		tooltip: 'Özgür lisanslı olmalarına rağmen ansiklopedik değer taşımayan ve (kullanıcı sayfaları da dâhil olmak üzere) herhangi bir sayfada kullanılmayan her türlü dosya silinebilir. Eğer dosyanın ansiklopedik değeri tartışmalıysa hızlı sil ile silinemez.'
	},
	{
		label: 'D9: Kullanışsız dosyalar silinebilir.',
		value: 'D9: Kullanışsız dosya',
		tooltip: 'Resim, video ve ses dosyaları dışında kalan dosyalar (Örn: .doc, .pdf veya .xls dosyaları) herhangi bir maddede kullanılmıyor ve ansiklopedik kullanımı olmadığı düşünülüyorsa silinebilirler.'
	},
	{
		label: 'D10: SVG ya da diğer vektörel dosyalar silinebilir.',
		value: 'D10: Vektörel dosya',
		tooltip: 'SVG gibi vektörel dosyalar VS:AKP#SVG ve diğer vektörel formatlar gereği eğer serbest kullanıma izin vermiyorlarsa silinebilirler.'
	},
	{
		label: 'D11: Şüpheli dosyalar silinebilir.',
		value: 'D11: Şüpheli dosya',
		tooltip: 'Şüpheli olarak işaretlenmiş bir dosya bir telif inceleme elemanı tarafından incelendikten sonra, sonuçsuz etiketiyle etiketlenirse, görüntünün durumunun netleştirilmesi için 7 gün beklenilir. Eğer 7 gün sonunda herhangi bir ek bilgi veya kanıt gelmezse, görüntü silinebilir.'
	},
	{
		label: 'D12: Tanımlanamayan dosyalar silinebilir.',
		value: 'D12: Tanımlanamayan dosya',
		tooltip: 'Bir görüntü herhangi bir tanım bilgisi içermiyorsa ve görüntünün kendisinden de konusu ve tanımı net olarak belli olmuyorsa, {{yk:Tanımsız dosya}} etiketi ile işaretlenir. Eğer bu etiket eklendikten sonra 7 gün içerisinde gerekli tanım bilgisi eklenmezse, görüntü silinebilir.'
	},
	{
		label: 'D13: İçeriği kaynaklandırılmamış dosyalar silinebilir.',
		value: 'D13: İçeriği kaynaklandırılamayan dosya',
		tooltip: 'Bir görüntü içeriği kaynaksız bir grafikse (basit grafikler hariç) {{yk:İçeriği kaynaksız dosya}} etiketi ile etiketlenir. Etiket eklendikten sonra 7 gün içerisinde gerekli kaynak bilgisi verilmezse, görüntü silinebilir.'
	}
];

Twinkle.speedy.articleList = [//Madde silme nedenleri
	{
		label: 'M1: Çok az bilgi taşıyan ya da hiç bilgi taşımayan kısa içerikli sayfalar silinebilir.',
		value: 'M1: Taslak kriterlerini sağlamayan madde',
		tooltip: 'Örneğin: “Fabrikası olan garip bir adamdı.” Maddenin taslak madde kriterlerini sağlayan, bütünsel anlatımlı bir içeriğe sahip olması durumunda, madde yetersiz içerik gerekçesiyle silinemez.'
	},
	{
		label: 'M2: Bir başka Wikimedia projesinde mevcut olan, yabancı dildeki maddeler silinebilir.',
		value: 'M2: Farklı bir dildeki madde',
		tooltip: 'Eğer madde yabancı dilde olmasına rağmen bir başka Wikimedia projesinde bulunmuyorsa, {{Türkçe değil}} şablonu konur, madde silinmez.'
	},
	{
		label: 'M3: İçeriğe sahip olmayan maddeler silinebilir.',
		value: 'M3: İçeriksiz madde',
		tooltip: 'İçerik olarak sadece dış bağlantı, Göz at, Ayrıca bakınız, şablon veya başlığın tekrarını içeren maddeler.'
	},
	{
		label: 'M4: Başka bir Wikimedia projesine aktarılmış maddeler silinebilir.',
		value: ' M4: Başka bir Wikimedia projesine aktarılan madde',
		tooltip: 'Başka bir Wikimedia projesine aktarıma dair şablonlardan birini içeren veya silmeye aday olduktan sonra, oylama ile başka bir projeye aktarılmasına karar verilen ve aktarılan maddeler, işlem başarıyla yapıldıktan ve maddenin yazarı aktarımdan haberdar edildikten sonra silinebilir.'
	},
	{
		label: 'M6: Kayda değer olmayan kurgusal veya gerçek kişi, grup, kurum, ürün, eser veya internet içerikleri ile ilgili sayfalar silinebilir.',
		value: 'M6: Kayda değer olmayan konulu madde',
		tooltip: 'Genel olarak kayda değerlik ana yönergesi ve alt-yönergelerinin sunduğu kıstaslara bariz bir şekilde uymayan maddeler için bu kural kullanılabilir. Bununla birlikte dikkatli bir şekilde kullanılmalı; kayda değerlik kıstasları ile uyumsuzluğun bariz olmadığı, tartışmalı olduğu durumlarda hızlı silme uygulanmamalıdır. Bunun yerine kayda değerlik tartışması açılabilir veya kayda değerlik sorunu nedeniyle {{kopyala:Bekletmeli sil}} şablonu konulabilir.'
	},
	{
		label: 'M8: Düzen ve ansiklopediklik açısından uygunsuz maddeler, aşağıda belirtilen kriterlere uyuyorsa silinebilir.',
		value: 'M8: Düzen ve ansiklopediklik açısından uygunsuz madde',
		tooltip: 'Eğer bir madde,Çalışma var şablonu barındırmıyorsa, ve,İçeriğinin büyük bir kısmında viki işaret dili kodu bulundurmuyorsa, ve,Taraflı veya yanlış bir içerik barındırıyorsa veya içeriğinin en az % 30\'luk kısmı Türkçe dışındaki bir dilde ise,hızlı sil ile silinebilir. Bununla birlikte, eğer madde kayıtlı bir kullanıcı tarafından yaratılmışsa, silme işleminden önce veya sonra, kullanıcı ilgili Hızlı Silme kriterinden haberdar edilmelidir. IP numarasıyla katılan anonim bir kullanıcı tarafından yaratılmışsa, maddenin ilgili yazarına haber verilmesine gerek yoktur.'
	}
];

Twinkle.speedy.categoryList = [//Kategori silme nedenleri
	{
		label: 'K1: Boş kategoriler silinebilir.',
		value: 'K1: Boş kategori',
		tooltip: 'En azından 4 gün süresince sayfa veya alt kategori içermeyen, tek içeriği üst kategoriye bağlantı olan kategoriler hızlı silme ile silinebilir. Eğer söz konusu kategori silmeye aday ise, hızlı silme uygulanamaz.<BR>Kategorinin bir kategori tartışması sonucunda silinmesine karar verilmesi durumunda o kategori hızlı silinebilir. (Örneğin; Kategori:Bruce Willis)'
	},
	{
		label: 'K2: İsmi düzeltilen kategoriler silinebilir.',
		value: 'K2: Yeniden isimlendirme kategorisi',
		tooltip: 'Yeniden adlandırılıp, içeriği boşaltılmış hızlı silinebilecek kategoriler için örnekler:<BR>Yazım hatası düzeltmeleri: Kitpalar -> Kitaplar.<BR>Büyük harf düzeltmeleri: orta Dünya karakterleri -> Orta Dünya karakterleri<BR>Tekil kelimelerin çoğul yapılması: Roman -> Romanlar<BR>Ülke ismi kısaltmalarının açılması: ABD -> Amerika Birleşik Devletleri<BR>İsmin kategori tartışması sonucu düzeltilmesi: Kategori:Nazi karşıtı hareketleri'
	},
	{
		label: 'K3: Şablon kategorileri silinebilir.',
		value: 'K3: Şablon kategorisi',
		tooltip: 'Şablon silindikten veya kategorileri değiştirildikten sonra kalan kategoriler.'
	}
];

Twinkle.speedy.userList = [//Kullanıcı sayfaları silme nedenleri
	{
		label: 'KS2: Var olmayan kullanıcıların kullanıcı sayfaları silinebilir.',
		value: 'KS2: Var olmayan kullanıcı',
		tooltip: 'Oturum açmamış olan anonim kullanıcıların tartışma sayfaları, yazılmış mesajlar geçerli olmadığı zaman silinir. Böylece aynı IP numarasıyla değişiklik yapan yeni anonim kullanıcıların aklı karışmaz.'
	},
	{
		label: 'KS3: Adil kullanım galerileri silinebilir.',
		value: 'KS3: Adil kullanım galerisi',
		tooltip: 'Kullanıcı alanlarında bulunan ve çoğunlukla adil kullanım kaynaklı resimler barındıran galeriler silinebilir.'
	}
];

Twinkle.speedy.templateList = [//Şablon silme nedenleri
	{
		label: 'Ş1: Bölücü ve kışkırtıcı şablonlar silinebilir.',
		value: 'Ş1: Kışkırtıcı/bölücü şablon',
		tooltip: 'Bölücü ve kışkırtıcı şablonlar silinebilir.'
	},
	{
		label: 'Ş2: Kullanılmayan şablonlar silinebilir.',
		value: 'Ş2: Kullanılmayan şablon',
		tooltip: '"kopyala:" komutuyla kullanılması gereken şablonlar da kullanılmayan şablonlar arasında listelenebileceği için, bu tür şablonlar sadece ihtiyaç duyulmaması durumunda silinmelidir.'
	},
];

Twinkle.speedy.portalList = [//Portal silme nedenleri
	{
		label: 'P1: Madde kriterlerine uymayan portal sayfaları silinebilir.',
		value: 'P1: Madde olarak silinebilecek portal',
		tooltip: 'Madde kriterlerine uymayan portal sayfaları silinebilir.'
	},
	{
		label: 'P2: Sadece Taslak hâlinde bulunan bir maddeye dayanan veya portalın başlığı altında gösterilmeye uygun, konuyu detaylandıran, taslaklar hariç en az üç maddeye sahip olmayan portaller silinebilir.',
		value: 'P2: Kriterleri sağlamayan portal',
		tooltip: 'Sadece Taslak hâlinde bulunan bir maddeye dayanan veya portalın başlığı altında gösterilmeye uygun, konuyu detaylandıran, taslaklar hariç en az üç maddeye sahip olmayan portaller silinebilir.'
	}
];

Twinkle.speedy.generalList = [//Genel silme nedenleri
	{
		label: 'Sil şablonu için özel silme nedeni' + (Morebits.userIsInGroup('sysop') ? ' (custom deletion reason)' : ''),
		value: 'G:Özel',
		tooltip: 'Aşağıdaki nedenlerden hiçbirini uygun bulmadınız ise kendi nedeninizi belirtebilirsiniz.',
		subgroup: {
			name: 'reason_1',
			type: 'input',
			label: 'Neden: ',
			size: 60
		},
		hideWhenMultiple: true,
		hideSubgroupWhenSysop: true
	},
	{
		label: 'G1: Hiçbir anlam içermeyen içerikli sayfalar silinebilir.',
		value: 'G1: Anlamsız',
		tooltip: 'Örneğin: “nafnşew359cşs.ndc30” veya “traa laa laaa”. Buna: Vandalizm, kısa veya kaynaksız içerik, kötü yazım, partizan nutuklar, imkansız teoriler ve kötü bir tercümeye sahip içerikler dâhil değildir.'
	},
	{
		label: 'G2: Deneme yapılmış sayfalar silinebilir.',
		value: 'G2: Deneme',
		tooltip: 'Örneğin: “Gerçekten bir sayfada değişiklik yapabilir miyim?!” \'\'\'Kalın yazı\'\'\'[[Dosya:]]'
	},
	{
		label: 'G3: Vandalizm yapılmış sayfalar silinebilir.',
		value: 'G3: Vandalizm',
		tooltip: 'Ad değiştirme vandalizmi sonucu oluşan yönlendirme sayfaları da buna dâhildir.'
	},
	{
		label: 'G4: Daha önce silinmiş içeriğin büyük ölçüde aynısına sahip sayfalar silinebilir.',
		value: 'G4: Önceden silinmiş metin',
		tooltip: 'SAS tartışması sonucunda veya hızlı silme ile silinen herhangi bir sayfayla büyük ölçüde benzerlik taşıyan herhangi bir isimdeki sayfalar, SAS kararı emsal kabul edilerek silinebilir. Tekrar silinmeden önce, hizmetlinin, içeriğin büyük ölçüde aynı olduğundan ve aynı konuda yeni bir madde olmadığından emin olması gerekmektedir.',
		subgroup: {
			name: 'repost_1',
			type: 'input',
			label: 'SAS tartışmasının bulunduğu sayfa: ',
			tooltip: '"Vikisöz:" ile başlamak zorunda.',
			size: 60
		}
	},
	{
		label: 'G6: Kullanıcının isteğiyle silinebilir.',
		value: 'G6: Kullanıcı talebi',
		tooltip: 'Eğer bir sayfayı oluşturan kişi, yazdığı sayfa başka hiçbir kişi tarafından değişikliğe uğramamışsa ve/veya kullanıcı tarafından yanlışlıkla açılmışsa, sayfanın silinmesini isteyebilir. Bu istek sebebiyle söz konusu sayfa silinir.'
	},
	{
		label: 'G7: Silinen sayfaların tartışma sayfaları da silinebilir.',
		value: 'G7: Silinmiş sayfanın tartışması',
		tooltip: 'Eğer sayfanın niçin silindiğine dair bir tartışma içermiyorsa hızlı silme ile silinebilir.',
		hideWhenMultiple: true
	},
	{
		label: 'G8: Temizlik amacıyla silinebilir.',
		value: 'G8: Temizlik amacıyla',
		tooltip: 'Tartışma yaratmayacak bakım ve temizlik işlemleri, sayfa geçmişlerini birleştirme, bir isim değişikliği işlemini geri alma ve sadece tek bir maddeye bağlantı veren bir anlam ayrımı sayfasını silme amacıyla sayfalar silinebilir.'
	},
	{
		label: 'G9: Telif hakkı ihlali oluşturan sayfalar silinebilir.',
		value: 'G9: Telif',
		tooltip: 'Telif hakları saklı bir kaynaktan alındığı kesin olarak belirlenen ya da bu konuda ciddi şüpheler bulunan her türlü içerik için hızlı silme işlemi uygulanabilir. Eğer telif hakkı ihlali taşıyan içerik küçük bir kısımsa veya sayfanın belirli bir kısmına eklenmişse, sayfanın hızlı sil ile silinmesinden ziyade ilgili kısımların çıkarılması tavsiye edilebilir.',
		subgroup: [
				{
					name: 'copyvio_url',
					type: 'input',
					label: 'Link (mümkünse): ',
					tooltip: 'Eğer içerik internet üzerinden bir yerden kopyalandı ise içeriğin linkini burada belirtiriz. Eğer link karalistede ise boş bırakabilirsiniz.',
					size: 60
				}
			]
	},
	{
		label: 'G10: Saldırı içeren sayfalar ve dosyalar silinebilir.',
		value: 'G10: Saldırı',
		tooltip: 'Saldırı, hakaret dışında bir amaca hizmet etmeyen içeriğe sahip sayfa ve dosyalar (örneğin "... bir salaktır" benzeri bir içerik barındıran bir madde) silinebilir. Herhangi bir şahsa, topluluğa, kuruma ya da fikre yoğun biçimde saldırı niteliği taşıyan ve geri alınacak tarafsız bir sürümü bulunmayan sayfalar buna dâhildir. Parodi amaçlı resim veya medya bu kapsama girmez.'
	},
	{
		label: 'G11: Yoğun reklam içeren sayfalar silinebilir.',
		value: 'G11: Reklam',
		tooltip: 'Yalnızca bir şirketin, ürünün, grubun veya hizmetin reklamını yapan ve ansiklopedik olabilmesi için baştan yazılması gereken sayfalar silinebilir. Unutmayınız ki herhangi bir madde, konusu sırf bir şirket, ürün, grup veya hizmeti içeriyor diye bu kriterin uygulanabileceği bir durum yaratmaz: Yoğun şekilde reklam içeren bir maddenin uygunsuz içerik de barındırması gerekmektedir. Eğer herhangi bir madde daha önce silinme prosedürüne dâhil edilmiş, fakat sonuç olarak silinmemiş ise, bu kriter ile hızlı silinmesi mümkün değildir.'
	},
	{
		label: 'G12: İçeriği geliştirmeye yönelik olmayan tartışma sayfaları silinebilir.',
		value: 'G12: İlgisiz tartışma',
		tooltip: 'Tartışma sayfası tamamen bu tür yorumlardan oluşmadıkça silme işlemi yapılamaz. Geliştirme amaçlı yorumlar mevcutsa sayfa silinmez, sadece ilgisiz yorumlar çıkartılır.'
	}
];

Twinkle.speedy.redirectList = [//Yönlendirme sayfaları için
	{
		label: 'Y1: Var olmayan sayfalara olan yönlendirmeler silinebilir.',
		value: 'Y1: Boşa yönlendirme',
		tooltip: 'Eğer mümkünse söz konusu yönlendirme, uygun ve var olan bir başka maddeye yönlendirilmeli, yoksa hızlı sil ile silinebilir.'
	},
	{
		label: 'Y2: Büyük bir yazım hatası içeren veya uygunluk açısından hatalı oluşturulmuş yönlendirmeler silinebilir.',
		value: 'Y2: Kötü yönlendirme',
		tooltip: 'Eğer söz konusu yazım hatası sıklıkla yapılan bir hataysa, kalmasında sakınca da yoktur.'
	},
	{
		label: 'Y3: Farklı isim alanları arasındaki yönlendirmeler silinebilir.',
		value: 'Y3: Farklı isim alanları arasında yönlendirme',
		tooltip: ''
	}
];

Twinkle.speedy.normalizeHash = {//Değişilik özetine yazılacak silme nedeni kodları --Mavrikant 23 Şubat
	'G:Özel': ' ',
	'G1: Anlamsız': 'G1',
	'G2: Deneme': 'G2',
	'G3: Vandalizm': 'G3',
	'G4: Önceden silinmiş metin': 'G4',
	'G6: Kullanıcı talebi': 'G6',
	'G7: Silinmiş sayfanın tartışması': 'G7',
	'G8: Temizlik amacıyla': 'G8',
	'G9: Telif': 'G9',
	'G10: Saldırı': 'G10',
	'G11: Reklam': 'G11',
	'G12: İlgisiz tartışma': 'G12',
	'KS2: Var olmayan kullanıcı': 'KS2',
	'KS3: Adil kullanım galerisi': 'KS3',
	'M1: Taslak kriterlerini sağlamayan madde': 'M1',
	'M2: Farklı bir dildeki madde': 'M2',
	'M3: İçeriksiz madde': 'M3',
	'M4: Başka bir Wikimedia projesine aktarılan madde': 'M4',
	'M6: Kayda değer olmayan konulu madde': 'M6',
	'M8: Düzen ve ansiklopediklik açısından uygunsuz madde': 'M8',
	'Y1: Boşa yönlendirme': 'Y1',
	'Y2: Kötü yönlendirme': 'Y2',
	'Y3: Farklı isimalanları arasında yönlendirme': 'Y3',
	'D1: Çift kopya dosya': 'D1',
	'D2: Bozuk/boş dosya': 'D2',
	'D3: Uygunsuz lisanslı dosya': 'D3',
	'D6: Adil kullanımı hatalı belirtilmiş dosya': 'D6',
	'D8: Ansiklopedik açıdan değersiz dosya': 'D8',
	'D9: Kullanışsız dosya': 'D9',
	'D10: Vektörel dosya': 'D10',
	'D11: Şüpheli dosya': 'D11',
	'D12: Tanımlanamayan dosya': 'D12',
	'D13: İçeriği kaynaklandırılamayan dosya': 'D13',
	'K1: Boş kategori': 'K1',
	'K2: Yeniden isimlendirme kategorisi': 'K2',
	'K3: Şablon kategorisi': 'K3',
	'KS2: Var olmayan kullanıcı': 'KS2',
	'KS3: Adil kullanım galerisi': 'KS3',
	'Ş1: Kışkırtıcı/bölücü şablon': 'Ş1',
	'Ş2: Kullanılmayan şablon': 'Ş2',
	'P1: Madde olarak silinebilecek portal': 'P1',
	'P2: Kriterleri sağlamayan portal': 'P2'
};

// keep this synched with [[MediaWiki:Deletereason-dropdown]]
Twinkle.speedy.reasonHash = { //Hizmetliler için direk silme nedenleri olduğunu tahmin ediyorum --Mavrikant 23 Şubat
	'G:Özel': ' ',
	'G1: Anlamsız': 'G1: Anlamsız',
	'G2: Deneme': 'G2: Deneme',
	'G3: Vandalizm': 'G3: Vandalizm',
	'G4: Önceden silinmiş metin': 'G4: Önceden silinmiş metin',
	'G6: Kullanıcı talebi': 'G6: Kullanıcı talebi',
	'G7: Silinmiş sayfanın tartışması': 'G7: Silinmiş sayfanın tartışması',
	'G8: Temizlik amacıyla': 'G8: Temizlik amacıyla',
	'G9: Telif': 'G9: Telif',
	'G10: Saldırı': 'G10: Saldırı',
	'G11: Reklam': 'G11: Reklam',
	'G12: İlgisiz tartışma': 'G12: İlgisiz tartışma',
	'M1: Taslak kriterlerini sağlamayan madde': 'M1: Taslak kriterlerini sağlamayan madde',
	'M2: Farklı bir dildeki madde': 'M2: Farklı bir dildeki madde',
	'M3: İçeriksiz madde': 'M3: İçeriksiz madde',
	'M4: Başka bir Wikimedia projesine aktarılan madde': 'M4: Başka bir Wikimedia projesine aktarılan madde',
	'M6: Kayda değer olmayan konulu madde': 'M6: Kayda değer olmayan konulu madde',
	'M8: Düzen ve ansiklopediklik açısından uygunsuz madde': 'M8: Düzen ve ansiklopediklik açısından uygunsuz madde',
	'Y1: Boşa yönlendirme': 'Y1: Boşa yönlendirme',
	'Y2: Kötü yönlendirme': 'Y2: Kötü yönlendirme',
	'Y3: Farklı isimalanları arasında yönlendirme': 'Y3: Farklı isimalanları arasında yönlendirme',
	'D1: Çift kopya dosya': 'D1: Çift kopya dosya',
	'D2: Bozuk/boş dosya': 'D2: Bozuk/boş dosya',
	'D3: Uygunsuz lisanslı dosya': 'D3: Uygunsuz lisanslı dosya',
	'D4: Lisans ve kaynak bilgisi eksik olan dosya': 'D4: Lisans ve kaynak bilgisi eksik olan dosya',
	'D5: Kullanılmayan adil kullanım dosya': 'D5: Kullanılmayan adil kullanım dosya',
	'D6: Adil kullanımı hatalı belirtilmiş dosya ': 'D6: Adil kullanımı hatalı belirtilmiş dosya',
	'D7: Kullanımı gerekçelendirilmemiş dosya': 'D7: Kullanımı gerekçelendirilmemiş dosya',
	'D8: Ansiklopedik açıdan değersiz dosya': 'D8: Ansiklopedik açıdan değersiz dosya',
	'D9: Kullanışsız dosya': 'D9: Kullanışsız dosya',
	'D10: Vektörel dosya': 'D10: Vektörel dosya',
	'D11: Şüpheli dosya': 'D11: Şüpheli dosya',
	'D12: Tanımlanamayan dosya': 'D12: Tanımlanamayan dosya',
	'D13: İçeriği kaynaklandırılamayan dosya': 'D13: İçeriği kaynaklandırılamayan dosya',
	'K1: Boş kategori': 'K1: Boş kategori',
	'K2: Yeniden isimlendirme kategorisi': 'K2: Yeniden isimlendirme kategorisi',
	'K3: Şablon kategorisi': 'K3: Şablon kategorisi',
	'KS2: Var olmayan kullanıcı': 'KS2: Var olmayan kullanıcı',
	'KS3: Adil kullanım galerisi': 'KS3: Adil kullanım galerisi',
	'Ş1: Kışkırtıcı/bölücü şablon': 'Ş1: Kışkırtıcı/bölücü şablon',
	'Ş2: Kullanılmayan şablon': 'Ş2: Kullanılmayan şablon',
	'P1: Madde olarak silinebilecek portal': 'P1: Madde olarak silinebilecek portal',
	'P2: Kriterleri sağlamayan portal': 'P2: Kriterleri sağlamayan portal'
};

Twinkle.speedy.callbacks = {
	sysop: {
		main: function( params ) {
			var thispage;

			Morebits.wiki.addCheckpoint();  // prevent actionCompleted from kicking in until user interaction is done

			// look up initial contributor. If prompting user for deletion reason, just display a link.
			// Otherwise open the talk page directly
			if( params.openusertalk ) {
				thispage = new Morebits.wiki.page( mw.config.get('wgPageName') );  // a necessary evil, in order to clear incorrect status text
				thispage.setCallbackParameters( params );
				thispage.lookupCreator( Twinkle.speedy.callbacks.sysop.openUserTalkPage );
			}

			// delete page
			var reason;
			thispage = new Morebits.wiki.page( mw.config.get('wgPageName'), "Deleting page" );
			if (params.normalized === 'db') {
				reason = prompt("Enter the deletion summary to use, which will be entered into the deletion log:", "");
			} else {
				var presetReason = "[[VS:HS#" + params.normalized.toUpperCase() + "|" + params.normalized.toUpperCase() + "]]: " + params.reason;
				if (Twinkle.getPref("promptForSpeedyDeletionSummary").indexOf(params.normalized) !== -1) {
					reason = prompt("Enter the deletion summary to use, or press OK to accept the automatically generated one.", presetReason);
				} else {
					reason = presetReason;
				}
			}
			if (reason === null) {
				Morebits.status.error("Asking for reason", "User cancelled");
				Morebits.wiki.removeCheckpoint();
				return;
			} else if (!reason || !reason.replace(/^\s*/, "").replace(/\s*$/, "")) {
				Morebits.status.error("Asking for reason", "you didn't give one.  I don't know... what with admins and their apathetic antics... I give up...");
				Morebits.wiki.removeCheckpoint();
				return;
			}
			thispage.setEditSummary( reason + Twinkle.getPref('deletionSummaryAd') );
			thispage.deletePage(function() {
				thispage.getStatusElement().info("done");
				Twinkle.speedy.callbacks.sysop.deleteTalk( params );
			});
			Morebits.wiki.removeCheckpoint();
		},
		deleteTalk: function( params ) {
			// delete talk page
			if (params.deleteTalkPage &&
					params.normalized !== 'f8' &&
					document.getElementById( 'ca-talk' ).className !== 'new') {
				var talkpage = new Morebits.wiki.page( Morebits.wikipedia.namespaces[ mw.config.get('wgNamespaceNumber') + 1 ] + ':' + mw.config.get('wgTitle'), "Deleting talk page" );
				talkpage.setEditSummary('[[VS:HS#G8|G8]]: Talk page of deleted page "' + Morebits.pageNameNorm + '"' + Twinkle.getPref('deletionSummaryAd'));
				talkpage.deletePage();
				// this is ugly, but because of the architecture of wiki.api, it is needed
				// (otherwise success/failure messages for the previous action would be suppressed)
				window.setTimeout(function() { Twinkle.speedy.callbacks.sysop.deleteRedirects( params ); }, 1800);
			} else {
				Twinkle.speedy.callbacks.sysop.deleteRedirects( params );
			}
		},
		deleteRedirects: function( params ) {
			// delete redirects
			if (params.deleteRedirects) {
				var query = {
					'action': 'query',
					'list': 'backlinks',
					'blfilterredir': 'redirects',
					'bltitle': mw.config.get('wgPageName'),
					'bllimit': 5000  // 500 is max for normal users, 5000 for bots and sysops
				};
				var wikipedia_api = new Morebits.wiki.api( 'getting list of redirects...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
					new Morebits.status( 'Deleting redirects' ) );
				wikipedia_api.params = params;
				wikipedia_api.post();
			}

			// promote Unlink tool
			var $link, $bigtext;
			if( mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8' ) {
				$link = $('<a/>', {
					'href': '#',
					'text': 'click here to go to the Unlink tool',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' },
					'click': function(){
						Morebits.wiki.actionCompleted.redirect = null;
						Twinkle.speedy.dialog.close();
						Twinkle.unlink.callback("Removing usages of and/or links to deleted file " + Morebits.pageNameNorm);
					}
				});
				$bigtext = $('<span/>', {
					'text': 'To orphan backlinks and remove instances of file usage',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
				});
				Morebits.status.info($bigtext[0], $link[0]);
			} else if (params.normalized !== 'f8') {
				$link = $('<a/>', {
					'href': '#',
					'text': 'click here to go to the Unlink tool',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' },
					'click': function(){
						Morebits.wiki.actionCompleted.redirect = null;
						Twinkle.speedy.dialog.close();
						Twinkle.unlink.callback("Removing links to deleted page " + Morebits.pageNameNorm);
					}
				});
				$bigtext = $('<span/>', {
					'text': 'To orphan backlinks',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
				});
				Morebits.status.info($bigtext[0], $link[0]);
			}
		},
		openUserTalkPage: function( pageobj ) {
			pageobj.getStatusElement().unlink();  // don't need it anymore
			var user = pageobj.getCreator();
			var params = pageobj.getCallbackParameters();

			var query = {
				'title': 'User talk:' + user,
				'action': 'edit',
				'preview': 'yes',
				'vanarticle': Morebits.pageNameNorm
			};

			if (params.normalized === 'db' || Twinkle.getPref("promptForSpeedyDeletionSummary").indexOf(params.normalized) !== -1) {
				// provide a link to the user talk page
				var $link, $bigtext;
				$link = $('<a/>', {
					'href': mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ),
					'text': 'click here to open User talk:' + user,
					'target': '_blank',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
				});
				$bigtext = $('<span/>', {
					'text': 'To notify the page creator',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
				});
				Morebits.status.info($bigtext[0], $link[0]);
			} else {
				// open the initial contributor's talk page
				var statusIndicator = new Morebits.status('Opening user talk page edit form for ' + user, 'opening...');

				switch( Twinkle.getPref('userTalkPageMode') ) {
				case 'tab':
					window.open( mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ), '_blank' );
					break;
				case 'blank':
					window.open( mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ), '_blank', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
					break;
				case 'window':
					/* falls through */
				default:
					window.open( mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ),
						( window.name === 'twinklewarnwindow' ? '_blank' : 'twinklewarnwindow' ),
						'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
					break;
				}

				statusIndicator.info( 'complete' );
			}
		},
		deleteRedirectsMain: function( apiobj ) {
			var xmlDoc = apiobj.getXML();
			var $snapshot = $(xmlDoc).find('backlinks bl');
			var total = $snapshot.length;
			var statusIndicator = apiobj.statelem;

			if( !total ) {
				statusIndicator.status("no redirects found");
				return;
			}

			statusIndicator.status("0%");

			var current = 0;
			var onsuccess = function( apiobjInner ) {
				var now = parseInt( 100 * (++current)/total, 10 ) + '%';
				statusIndicator.update( now );
				apiobjInner.statelem.unlink();
				if( current >= total ) {
					statusIndicator.info( now + ' (completed)' );
					Morebits.wiki.removeCheckpoint();
				}
			};

			Morebits.wiki.addCheckpoint();

			$snapshot.each(function(key, value) {
				var title = $(value).attr('title');
				var page = new Morebits.wiki.page(title, 'Deleting redirect "' + title + '"');
				page.setEditSummary('[[VS:HS#G8|G8]]: Temizlik, silinen sayfaya yönlendirme "' + Morebits.pageNameNorm + '"' + Twinkle.getPref('deletionSummaryAd'));
				page.deletePage(onsuccess);
			});
		}
	},

	user: {
		main: function(pageobj) {
			var statelem = pageobj.getStatusElement();

			if (!pageobj.exists()) {
				statelem.error( "It seems that the page doesn't exist; perhaps it has already been deleted" );
				return;
			}

			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

			statelem.status( 'Checking for tags on the page...' );

			// check for existing deletion tags
			var tag = /(?:\{\{\s*(db|delete|[Ss]il|db-.*?|speedy deletion-.*?)(?:\s*\||\s*\}\}))/.exec( text );
			if( tag ) {
				statelem.error( [ Morebits.htmlNode( 'strong', tag[1] ) , " is already placed on the page." ] );
				return;
			}

			var xfd = /(?:\{\{([rsaiftcm]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec( text );
			if( xfd && !confirm( "The deletion-related template {{" + xfd[1] + "}} was found on the page. Do you still want to add a CSD template?" ) ) {
				return;
			}

			var code, parameters, i;
			if (params.normalizeds.length > 1) {
				code = "{{Sil|";
				params.utparams = {};
				$.each(params.normalizeds, function(index, norm) {
					code += "+" + norm.toUpperCase();
					parameters = params.templateParams[index] || [];
					for (var i in parameters) {
						if (typeof parameters[i] === 'string' && !parseInt(i, 10)) {  // skip numeric parameters - {{db-multiple}} doesn't understand them
							code += "|" + i + "=" + parameters[i];
						}
					}
					$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters));
				});
				code += "}}";
			} else {
				parameters = params.templateParams[0] || [];
				code = "{{Sil|" + params.values[0];
				for (i in parameters) {
					if (typeof parameters[i] === 'string') {
						code += "|" + i + "=" + parameters[i];
					}
				}
				code += "}}";
				params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
			}

			var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
			// patrol the page, if reached from Special:NewPages
			if( Twinkle.getPref('markSpeedyPagesAsPatrolled') ) {
				thispage.patrol();
			}

			// Wrap SD template in noinclude tags if we are in template space.
			// Won't work with userboxes in userspace, or any other transcluded page outside template space
			if (mw.config.get('wgNamespaceNumber') === 10) {  // Template:
				code = "<noinclude>" + code + "</noinclude>";
			}

			// Remove tags that become superfluous with this action
			text = text.replace(/\{\{\s*([Nn]ew unreviewed article|[Uu]nreviewed|[Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
			if (mw.config.get('wgNamespaceNumber') === 6) {
				// remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons
				text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, "");
			}

			// Generate edit summary for edit
			var editsummary = "Hızlı Silme talep ediliyor ([[VS:HS|VS:HS#" + params.normalizeds[0].toUpperCase() + "]])";
			

			pageobj.setPageText(code + ((params.normalizeds.indexOf('g10') !== -1) ? '' : ("\n" + text) )); // cause attack pages to be blanked
			pageobj.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
			pageobj.setWatchlist(params.watch);
			pageobj.setCreateOption('nocreate');
			pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
		},

		tagComplete: function(pageobj) {
			var params = pageobj.getCallbackParameters();

			// Notification to first contributor
			if (params.usertalk) {
				var callback = function(pageobj) {
					var initialContrib = pageobj.getCreator();

					// disallow warning yourself
					if (initialContrib === mw.config.get('wgUserName')) {
						Morebits.status.warn("You (" + initialContrib + ") created this page; skipping user notification");

					// don't notify users when their user talk page is nominated
					} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
						Morebits.status.warn("Notifying initial contributor: this user created their own user talk page; skipping notification");

					// quick hack to prevent excessive unwanted notifications, per request. Should actually be configurable on recipient page...
					} else if ((initialContrib === "Cyberbot I" || initialContrib === "SoxBot") && params.normalizeds[0] === "f2") {
						Morebits.status.warn("Notifying initial contributor: page created procedurally by bot; skipping notification");

					} else {
						var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "Notifying initial contributor (" + initialContrib + ")"),
							notifytext, i;

						notifytext = "\n{{subst:HS-Bildirim|1=" + Morebits.pageNameNorm + "|2=" + params.values[0] + "}}";

						var editsummary = "Bildirim:" + Morebits.pageNameNorm + "]] sayfasının hızlı silinmesi.";

						usertalkpage.setAppendText(notifytext);
						usertalkpage.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
						usertalkpage.setCreateOption('recreate');
						usertalkpage.setFollowRedirect(true);
						usertalkpage.append();
					}

					// add this nomination to the user's userspace log, if the user has enabled it
					if (params.lognomination) {
						Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
					}
				};
				var thispage = new Morebits.wiki.page(Morebits.pageNameNorm);
				thispage.lookupCreator(callback);
			}
			// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
			else if (params.lognomination) {
				Twinkle.speedy.callbacks.user.addToLog(params, null);
			}
		},

		// note: this code is also invoked from twinkleimage
		// the params used are:
		//   for CSD: params.values, params.normalizeds  (note: normalizeds is an array)
		//   for DI: params.fromDI = true, params.type, params.normalized  (note: normalized is a string)
		addToLog: function(params, initialContrib) {
			var wikipedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('speedyLogPageName'), "Adding entry to userspace log");
			params.logInitialContrib = initialContrib;
			wikipedia_page.setCallbackParameters(params);
			wikipedia_page.load(Twinkle.speedy.callbacks.user.saveLog);
		},

		saveLog: function(pageobj) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

			var appendText = "";

			// add blurb if log page doesn't exist
			if (!pageobj.exists()) {
				appendText +=
					"This is a log of all [[VS:HS|speedy deletion]] nominations made by this user using [[VS:TW|Twinkle]]'s CSD module.\n\n" +
					"If you no longer wish to keep this log, you can turn it off using the [[Vikisöz:Twinkle/Tercihler|preferences panel]], and " +
					"nominate this page for speedy deletion under [[VS:HS#U1|CSD U1]].";
				if (Morebits.userIsInGroup("sysop")) {
					appendText += "\n\nThis log does not track outright speedy deletions made using Twinkle.";
				}
			}

			// create monthly header
			var date = new Date();
			var headerRe = new RegExp("^==+\\s*" + date.getUTCMonthName() + "\\s+" + date.getUTCFullYear() + "\\s*==+", "m");
			if (!headerRe.exec(text)) {
				appendText += "\n\n=== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ===";
			}

			appendText += "\n# [[:" + Morebits.pageNameNorm + "]]: ";
			if (params.fromDI) {
				appendText += "DI [[VS:HS#" + params.normalized.toUpperCase() + "|CSD " + params.normalized.toUpperCase() + "]] (" + params.type + ")";
			} else {
				if (params.normalizeds.length > 1) {
					appendText += "multiple criteria (";
					$.each(params.normalizeds, function(index, norm) {
						appendText += "[[VS:HS#" + norm.toUpperCase() + "|" + norm.toUpperCase() + ']], ';
					});
					appendText = appendText.substr(0, appendText.length - 2);  // remove trailing comma
					appendText += ')';
				} else if (params.normalizeds[0] === "db") {
					appendText += "{{tl|db-reason}}";
				} else {
					appendText += "[[VS:HS#" + params.normalizeds[0].toUpperCase() + "|CSD " + params.normalizeds[0].toUpperCase() + "]] ({{tl|db-" + params.values[0] + "}})";
				}
			}

			if (params.logInitialContrib) {
				appendText += "; notified {{user|1=" + params.logInitialContrib + "}}";
			}
			appendText += " ~~~~~\n";

			pageobj.setAppendText(appendText);
			pageobj.setEditSummary("[[" + Morebits.pageNameNorm + "]] sayfasının hızlı silme adaylığının günlük kaydı tutuluyor." + Twinkle.getPref('summaryAd'));
			pageobj.setCreateOption("recreate");
			pageobj.append();
		}
	}
};

// validate subgroups in the form passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) {
	var parameters = [];

	$.each(values, function(index, value) {
		var currentParams = [];
		switch (value) {
			case 'G:Özel':
				if (form["csd.reason_1"]) {
					var dbrationale = form["csd.reason_1"].value;
					if (!dbrationale || !dbrationale.trim()) {
						alert( 'Özel neden: Lütfen Hızlı silme nedeni belirtin.' );
						parameters = null;
						return false;
					}
					currentParams["1"] = dbrationale;
				}
				break;

			case 'G9: Telif':
				if (form["csd.copyvio_url"] && form["csd.copyvio_url"].value) {
					currentParams.url = form["csd.copyvio_url"].value;
				}
				break;
				
			default:
				break;
		}
		parameters.push(currentParams);
	});
	return parameters;
};

// function for processing talk page notification template parameters
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
	var utparams = [];
	switch (normalized) {
		case 'db':
			utparams["2"] = parameters["1"];
			break;
		case 'g12':
			utparams.key1 = "url";
			utparams.value1 = utparams.url = parameters.url;
			break;
		case 'a10':
			utparams.key1 = "article";
			utparams.value1 = utparams.article = parameters.article;
			break;
		default:
			break;
	}
	return utparams;
};


Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
	var values = (e.target.form ? e.target.form : e.target).getChecked('csd');
	if (values.length === 0) {
		alert( "Lütfen bir kriter seçin!" );
		return null;
	}
	return values;
};

Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
	var form = (e.target.form ? e.target.form : e.target);

	var tag_only = form.tag_only;
	if( tag_only && tag_only.checked ) {
		Twinkle.speedy.callback.evaluateUser(e);
		return;
	}

	var value = Twinkle.speedy.resolveCsdValues(e)[0];
	if (!value) {
		return;
	}
	var normalized = Twinkle.speedy.normalizeHash[ value ];

	var params = {
		value: value,
		normalized: normalized,
		watch: Twinkle.getPref('watchSpeedyPages').indexOf( normalized ) !== -1,
		reason: Twinkle.speedy.reasonHash[ value ],
		openusertalk: Twinkle.getPref('openUserTalkPageOnSpeedyDelete').indexOf( normalized ) !== -1,
		deleteTalkPage: form.talkpage && form.talkpage.checked,
		deleteRedirects: form.redirects.checked
	};

	Morebits.simpleWindow.setButtonsEnabled( false );
	Morebits.status.init( form );

	Twinkle.speedy.callbacks.sysop.main( params );
};

Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
	var form = (e.target.form ? e.target.form : e.target);

	if (e.target.type === "checkbox" || e.target.type === "text" || 
			e.target.type === "select") {
		return;
	}

	var values = Twinkle.speedy.resolveCsdValues(e);
	if (!values) {
		return;
	}
	//var multiple = form.multiple.checked;
	var normalizeds = [];
	$.each(values, function(index, value) {
		var norm = Twinkle.speedy.normalizeHash[ value ];

		normalizeds.push(norm);
	});

	// analyse each criterion to determine whether to watch the page/notify the creator
	var watchPage = false;
	$.each(normalizeds, function(index, norm) {
		if (Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1) {
			watchPage = true;
			return false;  // break
		}
	});

	var notifyuser = false;
	if (form.notify.checked) {
		$.each(normalizeds, function(index, norm) {
			if (Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(norm) !== -1) {
				if (norm === 'g6' && ['disambig', 'copypaste'].indexOf(values[index]) === -1) {
					return true;
				}
				notifyuser = true;
				return false;  // break
			}
		});
	}

	var welcomeuser = false;
	if (notifyuser) {
		$.each(normalizeds, function(index, norm) {
			if (Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1) {
				welcomeuser = true;
				return false;  // break
			}
		});
	}

	var csdlog = false;
	if (Twinkle.getPref('logSpeedyNominations')) {
		$.each(normalizeds, function(index, norm) {
			if (Twinkle.getPref('noLogOnSpeedyNomination').indexOf(norm) === -1) {
				csdlog = true;
				return false;  // break
			}
		});
	}

	var params = {
		values: values,
		normalizeds: normalizeds,
		watch: watchPage,
		usertalk: notifyuser,
		welcomeuser: welcomeuser,
		lognomination: csdlog,
		templateParams: Twinkle.speedy.getParameters( form, values )
	};
	if (!params.templateParams) {
		return;
	}

	Morebits.simpleWindow.setButtonsEnabled( false );
	Morebits.status.init( form );

	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
	Morebits.wiki.actionCompleted.notice = "Etiketleme tamamlandı.";

	var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "Sayfa etiketleniyor.");
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
};
})(jQuery);


//</nowiki>