Notă: După salvare, trebuie să treceți peste cache-ul browser-ului pentru a vedea modificările.

  • Mozilla, Google Chrome, Safari, Konqueror: țineți apăsat Shift în timp ce apăsați butonul Reload (sau apăsați Ctrl-Shift-R).
  • Internet Explorer: apăsați Ctrl-F5.
  • Opera: apăsați F5.
function fetchJsonData(page) {
    return $.getJSON("/w/api.php?action=query&format=json&formatversion=2" + 
        "&titles=" + encodeURIComponent(page) + "&prop=revisions&rvprop=content" + 
        "&uselang=content&maxage=86400&smaxage=86400"
    ).then(function(apiResponse) {
        const content = apiResponse.query?.pages?.[0]?.revisions?.[0]?.content;
        return JSON.parse(content);
    });
}

$.when(fetchJsonData("Wikipedia:Cereri_pentru_protejarea_paginilor/Form-configuration.json"), $.ready, mw.loader.using(['mediawiki.api', 'mediawiki.widgets', 'mediawiki.util'])).then(function(config) {
	if ((mw.config.get("wgPageName") !== "Wikipedia:Cereri_pentru_protejarea_paginilor/Form")) return;
	
	function sanitizeInput(input) {
        return input.replace(/</g, '&lt;').replace(/>/g, '&gt;');
    }
    
	var pageDef = '';
	if (window.location.href.includes('?page=')) {
        pageDef = decodeURIComponent(window.location.href.split('page=').pop());
        pageDef = pageDef.replaceAll('_', ' ');
    }
	
    var api = new mw.Api();
    var previewApi = new mw.Api();
    var subpage = 'Default';
    config = config[subpage];
    
    var titleInput = new mw.widgets.TitleInputWidget({
	        'showMissing': false,
	        'required': true,
	        'value': pageDef,
    });
    var reasonInput = new OO.ui.MultilineTextInputWidget({
    		'placeholder': config.reasonInputPlaceholder,
	        'required': 'true'
    });
	var reasonPreview = new OO.ui.LabelWidget();
	var currentProtectionLabel = new OO.ui.LabelWidget();
	var typeInput = new OO.ui.DropdownWidget( {
		label: 'Tipul cererii: Selectați o opțiune',
		menu: {
			items: [
				new OO.ui.MenuOptionWidget( {
					data: 'Cerere de protejare pentru ',
					label: 'Protejare'
				} ),
				new OO.ui.MenuOptionWidget( {
					data: 'Solicit mărirea nivelului protejării pentru ',
					label: 'Mărire nivel de protejare'
				} ),
				new OO.ui.MenuOptionWidget( {
					data: 'Solicit relaxarea nivelului protejării pentru ',
					label: 'Relaxare nivel de protejare',
				} ),
				new OO.ui.MenuOptionWidget( {
					data: 'Cerere de deprotejare pentru ',
					label: 'Deprotejare',
				} )
			]
		}
	} );
	var levelInput = new OO.ui.DropdownWidget( {
		label: 'Nivelul de protejare: Nu doresc un nivel specific (implicit)',
		menu: {
			items: [
				new OO.ui.MenuOptionWidget( {
					data: 'a',
					label: 'Semiprotejare'
				} ),
				new OO.ui.MenuOptionWidget( {
					data: 'b',
					label: 'Protejare sporită'
				} ),
				new OO.ui.MenuOptionWidget( {
					data: 'c',
					label: 'Protejare ca format',
				} ),
				new OO.ui.MenuOptionWidget( {
					data: 'd',
					label: 'Protejare totală',
				} ),
				new OO.ui.MenuOptionWidget( {
					data: 'e',
					label: 'Protejare la mutare',
				} ),
				new OO.ui.MenuOptionWidget( {
					data: 'f',
					label: 'Nu doresc un nivel specific (implicit)',
				} )
			]
		}
	});
    var submitButton = new OO.ui.ButtonWidget({
	        'label': 'Trimite cererea',
	        'flags': ['progressive', 'primary'],
	        'accesskey': 's'
    });
    var fieldset = new OO.ui.FieldsetLayout();
    fieldset.addItems([
        new OO.ui.FieldLayout(titleInput, {
            'label': 'Titlul paginii:',
            align: 'top'
        }),
        new OO.ui.FieldLayout(currentProtectionLabel, {
            align: 'top'
        }),
        new OO.ui.FieldLayout(typeInput, {
            'label': 'Tip:',
            align: 'top'
        }),
        new OO.ui.FieldLayout(levelInput, {
            align: 'top',
        }),
        new OO.ui.FieldLayout(reasonInput, {
            'label': 'Motiv:',
            align: 'top',
        }),
        new OO.ui.FieldLayout(reasonPreview, {
            'label': 'Previzualizare:',
            align: 'top'
        }),
        new OO.ui.FieldLayout(submitButton)
    ]);
    
	$("#mw-content-text").empty().append(fieldset.$element);
	$(levelInput.$element).hide();
	$(currentProtectionLabel.$element).hide();
	
	if (titleInput.getValue().trim().length > 0) updateForm();

	var dropMenus;
	var requestsPageTitle = 'Wikipedia:Cereri_pentru_protejarea_paginilor';
	submitButton.setDisabled(true);
	submitButton.setLabel('Completați cererea');
		
	function updateWidgets(currentPage, protection) {
		var widgetOptions = document.querySelectorAll('.oo-ui-menuOptionWidget');
		widgetOptions.forEach((element) => element.style.display = 'block');
		
		var options = document.querySelectorAll('.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label')[0]?.innerHTML || '';
		var i;
		if (!protection) {
			if (currentPage.missing == "") {
				typeInput.setLabel('Protejare la creare');
				for (i = 0; i <= 9; i++) widgetOptions[i].style.display = 'none';
			}
			else for (i = 1; i <= 3; i++) widgetOptions[i].style.display = 'none';
		}
		else {
			widgetOptions[0].style.display = 'none';
			if (currentPage.protection[0].level == 'autoconfirmed') {
				widgetOptions[2].style.display = 'none';
				widgetOptions[4].style.display = 'none';
			}
			if (currentPage.protection[0].level == 'extendedconfirmed') {
				widgetOptions[5].style.display = 'none';
				if (options == 'Mărire nivel de protejare')
					widgetOptions[4].style.display = 'none';
				if (options == 'Relaxare nivel de protejare')
					for (i = 6; i <= 9; i++) widgetOptions[i].style.display = 'none';
			}
			if (currentPage.protection[0].level == 'templateeditor') {
				widgetOptions[6].style.display = 'none';
				if (options == 'Mărire nivel de protejare') {
					widgetOptions[4].style.display = 'none';
					widgetOptions[5].style.display = 'none';
				}
				if (options == 'Relaxare nivel de protejare')
					for (i = 7; i <= 9; i++) widgetOptions[i].style.display = 'none';
			}
			if (currentPage.protection[0].level == 'sysop') {
				widgetOptions[1].style.display = 'none';
				widgetOptions[7].style.display = 'none';
			}
			if (currentPage.missing == "") {
				for (i = 0; i <= 9; i++) widgetOptions[i].style.display = 'none';
				typeInput.setLabel('Deprotejare');
			}
		}
	}
		
	function currentProtection() {
		$(currentProtectionLabel.$element).hide();
		if (titleInput.getValue().trim().length > 0) $(currentProtectionLabel.$element).show();
		
		function adjustExpiryDate(expiry) {
		    if (expiry !== "infinity") {
		        let expiryDate = new Date(expiry);
		        expiryDate.setHours(expiryDate.getHours() - 2);
		        return expiryDate;
		    }
		    return expiry; 
		}
		
	    var url = "https://ro.wikipedia.org/w/api.php";
		var params = {
            action: "query",
            format: "json",
            titles: sanitizeInput(titleInput.getValue()),
            prop: "info",
            inprop: "protection"
        };
		
		const queryUrl = `${url}?${Object.entries(params).map(([key, val]) => `${key}=${encodeURIComponent(val)}`).join('&')}`;
		
		return fetch(queryUrl)
        	.then(response => response.json())
        	.then(data => {
		        var pages = data.query.pages;
		        var page = Object.values(pages)[0];
		        var protection = true;
		        if (!page || !page.protection || page.protection.length === 0) protection = false;
		        
		        const protectionByType = {};
		        page.protection.forEach(rule => {
	                const { type, level, expiry } = rule;
	                if (!protectionByType[type] || new Date(expiry) > new Date(protectionByType[type].expiry)) {
	                    protectionByType[type] = { level, expiry: adjustExpiryDate(expiry) };
	                }
            	});
		        var text = "";
	        	if (page.missing == "") text = "Pagina selectată nu există pe Wikipedia în română și ";
	        	else text = "Pagina selectată ";
	        	
	        	if (protection) text += "are în prezent următoarele setări pentru protejare:<br>";
	        	else text += "nu are în prezent niciun nivel de protejare.";
	        	
        		for (const [type, { level, expiry }] of Object.entries(protectionByType)) {
	                const expiryText = expiry === "infinity" ? "permanent" : `expiră pe ${new Date(expiry).toLocaleString()}`;
	                text += `- ${config[type]}: ${config[level]} (${expiryText})<br>`;
        		}
        		
        		currentProtectionLabel.$element.html(text);
	        	updateWidgets(page, protection);
		    })
            .catch(error => {
                console.error("Eroare la preluarea nivelului curent al protejării:", error);
            });
    }
	    
    function makeRequestText() {
	    var reason = reasonInput.getValue() + (
			(reasonInput.getValue().indexOf('~~' + '~~') >= 0)
			? ''
			: (' ~~' + '~~'));
		var type = $( ".oo-ui-dropdownWidget-handle .oo-ui-labelElement-label" ).html();
		dropMenus = document.querySelectorAll('.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label');
		var level = dropMenus[1].innerHTML;
		if ( dropMenus[0].innerHTML == 'Deprotejare' || dropMenus[0].innerHTML == 'Tipul cererii: Selectați o opțiune' 
		|| dropMenus[1].innerHTML == 'Nivelul de protejare: Nu doresc un nivel specific (implicit)' || dropMenus[1].innerHTML == 'Nu doresc un nivel specific (implicit)') 
			level = '';
        return config.template.replace(/\$title/g, titleInput.getValue()).replace(/\$reason/g, reason).replace(/\$type/g, type).replace(/\$level/g, level);
    }
	    
    function updateForm() {
    	currentProtection();
    	dropMenus = document.querySelectorAll('.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label');
    	if ( dropMenus[0].innerHTML == 'Deprotejare' || dropMenus[0].innerHTML == 'Tipul cererii: Selectați o opțiune' || dropMenus[0].innerHTML == 'Protejare la creare') {
    		levelInput.setLabel('Nu doresc un nivel specific (implicit)');
    		$(levelInput.$element).hide();
    	}
    	else $(levelInput.$element).show();
        var hasTitle = titleInput.getValue().trim().length > 0;
        var hasReason = reasonInput.getValue().trim().length > 0;
        var hasType = dropMenus[0]?.innerHTML !== 'Tipul cererii: Selectați o opțiune';
        var hasLevel = dropMenus[1]?.innerHTML !== 'Nivelul de protejare: Nu doresc un nivel specific (implicit)';
        var allowedNamespace = !(titleInput.getValue().includes('Special:'));
        var formEnabled = hasTitle && hasReason && hasType && hasLevel && allowedNamespace ;
        submitButton.setDisabled(!formEnabled);
        if (!allowedNamespace) submitButton.setLabel('Pagina selectată nu poate fi protejată');
        else if (!hasTitle && !hasReason) submitButton.setLabel('Selectați pagina și introduceți motivul');
        else if (!hasTitle) submitButton.setLabel('Selectați pagina');
        else if (!hasReason) submitButton.setLabel('Introduceți motivul');
        else if (!hasType) submitButton.setLabel('Introduceți tipul');
        else submitButton.setLabel('Trimite cererea');
        
        if (formEnabled) {
			previewApi.abort();
			previewApi.parse(makeRequestText(), { 
				pst: true, 
				title: requestsPageTitle 
			}).then(function(text) {
				text = text.replace(/<script/g, '&lt;script');
				reasonPreview.$element.html(text);
			});
        }
    }
    
    function rebuildTypeInputMenu() {
	    typeInput.getMenu().clearItems();
	
	    typeInput.getMenu().addItems([
	        new OO.ui.MenuOptionWidget({
	            data: 'Cerere de protejare pentru ',
	            label: 'Protejare'
	        }),
	        new OO.ui.MenuOptionWidget({
	            data: 'Solicit mărirea nivelului protejării pentru ',
	            label: 'Mărire nivel de protejare'
	        }),
	        new OO.ui.MenuOptionWidget({
	            data: 'Solicit relaxarea nivelului protejării pentru ',
	            label: 'Relaxare nivel de protejare',
	        }),
	        new OO.ui.MenuOptionWidget({
	            data: 'Cerere de deprotejare pentru ',
	            label: 'Deprotejare',
	        })
	    ]);
	
	    typeInput.getMenu().selectItem(null);
	    typeInput.setLabel('Tipul cererii: Selectați o opțiune');
	}
	    
    function updateTitleFirst() {
    	rebuildTypeInputMenu();
    	levelInput.getMenu().selectItem(null);
    	levelInput.setLabel('Nivelul de protejare: Nu doresc un nivel specific (implicit)');
    	updateForm();
    }
    
    var statusLayout, statusArea;
    function setStatus(type, message) {
    	if (!statusLayout || !statusLayout.isElementAttached()) {
    		fieldset.addItems([
        		statusLayout = new OO.ui.FieldLayout(statusArea = new OO.ui.MessageWidget())
        	]);
    	}
    	statusArea.setType(type);
    	statusArea.setLabel(message);
    }

    titleInput.on('change', updateTitleFirst);
    reasonInput.on('change', updateForm);
	typeInput.getMenu().on('select', updateForm);
	levelInput.getMenu().on('select', updateForm);
	
    submitButton.on('click', function() {
        updateForm();
        fieldset.removeItems([statusLayout]);
        if (submitButton.isDisabled()) {
            return;
        }

        submitButton.setDisabled(true);
        submitButton.setLabel('Se trimite...');
        api.edit(requestsPageTitle, function() {
            return {
                appendtext: '\n\n' + makeRequestText(),
                summary: config.summary.replace(/\$title/g, titleInput.getValue())
            };
        }).then(function() {
            window.location.href = mw.util.getUrl(requestsPageTitle);
        }).catch(function(code) {
        	setStatus('error', 'A eșuat crearea cererii. Cod de eroare: ' + code + '. Vă rugăm să încercați din nou sau să solicitați ajutor la WP:AA.');
        	submitButton.setDisabled(false);
        	submitButton.setLabel('Trimite cererea');
        });
    });
});

var toolsItem = document.createElement('li');
toolsItem.id = 't-requestprotection';
toolsItem.classList.add("mw-list-item");
var a = document.createElement('a');
var linkText = document.createTextNode("Cere protejarea paginii");
a.appendChild(linkText);
a.title = "Cere protejarea paginii";
a.href = "https://ro.wikipedia.org/wiki/Wikipedia:Cereri_pentru_protejarea_paginilor/Form?page=" + mw.config.get("wgPageName");
//console.log(mw.config.get("wgRestrictionEdit"));
toolsItem.appendChild(a);
if (!(mw.config.get("wgPageName").includes('Special:'))) $( "#p-tb .vector-menu-content-list" ).append(toolsItem);