Jump to content

MediaWiki:Gadget-formWizard-core.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/*  ______________________________________________________________________________________
 * |                                                                                     |
 * |                    === WARNING: GADGET FILE ===                                     |
 * |                  Changes to this page affect many users.                            |
 * | Please discuss changes on the talk page or on [[MediaWiki_talk:Gadgets-definition]] |
 * |	 before editing.                                                                 |
 * |_____________________________________________________________________________________|
 *
 * See https://meta.wikimedia.org/wiki/Meta:FormWizard for usage and description.
*/
//<nowiki>
var formsGadget = {
	'createDialog' : function(){
		var that = this;
		var dialogDict = {
							dialogClass: 'formsGadget',
							autoOpen: false,
							//title: that.formDict.config['dialog-title'],
							width: '495px',
							modal: true,
							closeOnEscape: true,
							resizable: false,

							draggable: false,
					};
		var dialog = $('#formsDialogExpand');
		if(dialog.length){
			this.dialog = dialog.dialog(dialogDict);
		}
		else{
			this.dialog = $('<div id="formsDialogExpand"></div>').dialog(dialogDict);
		}
		dialog.append('<div class="loading"></div>');

	},
	'dialog' : null,
	'openPanel': function(){
		this.dialog.dialog('open');
	},
	'openDialog' : function () {
		if (this.dialog === null){
			this.createDialog();
		}
		else{
			this.dialog.dialog('open');
		}
	},
	'cleanupDialog': function (){
		if (this.dialog){
			this.dialog.dialog('destroy');
		}
		this.dialog = null;
		$('#formsDialogExpand').text('');
	},
	'utilities' : {
		/*
		 * Path to the gadget config file
		 */
		'configPath' : 'MediaWiki:Gadget-formWizard',
		'apiUrl' : '//en.wikipedia.org/w/api.php?callback=?',
		'gadgetNamespace' : function(){
			var grant = mw.config.get('wgTitle').replace(/ /g,'_');
			return grant;
		},
		/*
	 	 * To detect the users default language
		 */
		'userLanguage' : function(){
			return mw.config.get('wgUserLanguage');
		},
		/*
		 * To detect the language of the page
		 */
		'contentLanguage' : function(){
			return mw.config.get('wgContentLanguage');
		},
		/*
		 * Removes leading/trailing spaces & user signature
		 * ( It is added through the code)
		 */
		'cleanupText' : function(text){
				text = $.trim(text)+' ';
				var indexOf = text.indexOf('~~~~');
				if ( indexOf == -1 ){
					return text;
				}
				else{
					return text.slice(0,indexOf)+text.slice(indexOf+4);
				}
		},
		/*
		 * The config files which can be translated with the help of the
		 * translation tool generates the dict with the values having a
		 * lot of space in the key value pairs. This function strips the
		 * whitespace.
		 */
		'stripWhiteSpace' : function(dict){
			for (key in dict){
				dict[key] = typeof(dict[key]) == 'object' ? this.stripWhiteSpace(dict[key]) : $.trim(dict[key]);
			}
			return dict;
		},
	},
	'formElement' : {
		/*
		 * Elements being supported
		 * Small textbox
		 * Large textbox
		 * Checkbox list
		 * Radio button list
		 * Stepper list
		 * Image/s
		 * Dropdown
		 * Link
		 * Text
		 */
		'hiddenInfoboxFields' : [],
		'found' : false,
		'timestamp' : 0,
		'defaultTextBoxConfig': {
			'type': 'smallTextBox',
			'placeholder': 'Enter the text',
			'title': 'Textbox',
			'characterLength':100,
			'mandatory':false,
			'error-messageLength': 'Max length reached',
			'error-notFilled': 'Mandatory field',
			'value': '',
			'parent': '',
			'id': null,
			'comment': ''
		},
		'elementContainer' : function(){
			var div = document.createElement('div');
			div.className = 'elementContainer';
			return div;
		},
		'addDescription': function(dict,div){
			for (key in dict){
				if(key.indexOf('text') != -1){
					this.addText(div,dict[key],'text');
					delete dict[key];
				}
			}
			return div;
		},
		'checkTitle' : function(string,exists,titleStem,type){
			var that = this;
			//Url to the api
			var apiUrl = formsGadget.utilities.apiUrl;
			var title = titleStem + string;
			var searchDict = {
					'action':'query',
					'format':'json',
					'titles':title,
					'prop':'imageinfo'
				};
				var timestamp = Date.now();
				//console.log('String before ajax', string);
				return $.getJSON(apiUrl,searchDict,function(data){
					var query = data['query'];
					var pages = data['query']['pages'];
					var pageId = Object.keys(pages);
					var pageExists = pageId != -1 ? true : false;
					var imageExists = pages[pageId]['imagerepository'] ? true : false;
					var value = 0;
					if (type == 'image'){
						value = imageExists;
					}
					else{
						value = pageExists;
					}

					if(that.timestamp < timestamp){
						that.timestamp = timestamp;
						that.found =  !(value ^ exists) ;
						//console.log('String ',string, 'found ',that.found);
					}

				});
		},
		'inputList': function(type,list,title,dict,role){
		 	var div = this.elementContainer();
			div = this.addText(div,title,'title');
			this.addDescription(dict,div);
			for (elem in list){
				var label = document.createElement('div');
				var input = document.createElement('input');
				var key = list[elem]['key'];
				var value = list[elem]['value'];
				input.type = type;
				if (type == 'number'){
					input.min = dict['min'];
					input.max = dict['max'];
				}
				input.value = value;
				input.setAttribute('data-add-to',dict['add-to']);
				if(role){
					input.setAttribute('data-role',true);
				}
				input.className = 'inputListItem';

				input.setAttribute('data-add-to-attribute',key);
				var descriptionText = key.replace(/_/g,' ');
				descriptionText = descriptionText.slice(0,1).toUpperCase() + descriptionText.slice(1);
				var description = document.createElement('span');
				description.className = 'inputListItemDescription';
				description.textContent = descriptionText;
				label.appendChild(input);
				label.appendChild(description);
				div.appendChild(label);
			}
			return div;
		},
		'createTextBoxConfig':function(defaultConfig,actualConfig){
			var config = {};
			for (key in defaultConfig){
				actualConfig[key] = key in actualConfig? actualConfig[key] : defaultConfig[key];
				if (key == 'mandatory' && (typeof(actualConfig[key]) == 'string')){
					if (actualConfig[key] == 'true'){
						actualConfig[key] = true;
					}
					else{
						actualConfig[key] = false;
					}
				}
			}
			return actualConfig;
		},
		'textBox': function(dict,type,callback,element){
			var config = this.createTextBoxConfig(this.defaultTextBoxConfig,dict);
	 		var className  = type == 'small'? 'smallTextBox': 'largeTextBox';
	 		var div = this.elementContainer();

	 		div = this.addText(div,config['title'],'title');
	 		this.addDescription(dict,div);
	 		if (type == 'large'){
	 			var input = document.createElement('textarea');
	 		}
	 		else{
	 			var input = document.createElement('input');
	 		}
	 		//cleanup
	 		if(dict['visibility'] == 'hidden'){
	 			div.style['display'] = 'none';
	 			input.value = dict['value'];
	 		}
	 		//Cleanup
	 		if('page-title' in dict){
	 			input.setAttribute('page-title',true);
	 		}
	 		if (dict['id']){
	 			input.id = dict['id'];
	 		}
	 		input.setAttribute('type','text');
	 		input.setAttribute('class',className);
	 		input.setAttribute('placeholder',config['placeholder']);
	 		input.setAttribute('maxlength',config['characterLength']);
	 		input.setAttribute('data-mandatory',config['mandatory']);
	 		input.setAttribute('data-comment',config['comment']);
	 		input.setAttribute('data-add-to',config['add-to']);
	 		var conditionalAttr = config['add-to'] == 'infobox' ? config['infobox-param'] : config['section-header'];
	 		input.setAttribute('data-add-to-attribute',conditionalAttr);
			var that = this;
	 		/* Word limit */
	 		$(input).on('change keyup paste',function(){
	 			/* Checking if link/file/page exists */
	 			var inputTextBox = this;
	 			var enteredString = $(this).val();
	 			if(!enteredString && !dict['mandatory']){
	 				$('#formsDialogExpand [elemType="button"]').trigger('enableButtons');
	 				$(inputTextBox).parent().removeClass('entrySatisfying entryNotSatisfying');
	 				that.timestamp = Date.now();
	 				that.found = true;
	 			}
	 			else{
	 				if( 'validate' in dict && enteredString){
		 				var exists = dict['validate'] == 'exists' ? 1:0;
		 				var titleStem = 'image' in dict ? '' : that.formDict.config['page-home'];
		 				$.when(that.checkTitle(enteredString,exists,titleStem,dict['type'])).then(function(){
		 					//Cleanup & remove redundant code
		 					$(inputTextBox).removeClass('entrySatisfying entryNotSatisfying');
		 					$(inputTextBox).addClass(that.found ? 'entrySatisfying' : 'entryNotSatisfying');
		 					$(inputTextBox).parent().removeClass('entrySatisfying entryNotSatisfying');
		 					$(inputTextBox).parent().addClass(that.found ? 'entrySatisfying' : 'entryNotSatisfying');
		 					if (that.found){
		 						$('#formsDialogExpand [elemType="button"]').trigger('enableButtons');
			 					if(typeof(callback) === 'function' && that.found){
			 						//Api url
			 						var apiUrl = formsGadget.utilities.apiUrl;
			 						$.getJSON(apiUrl,{'action':'parse',
			 									'format':'json',
			 									'text':'[['+enteredString+']]'
			 								},function(data){
			 									//console.log(data['parse']['text']['*']);
			 									var src = $('<div>').html(data['parse']['text']['*']).find('img').attr('src');
			 									if(src){
			 										callback(element, src);
			 									}
			 								});
			 					}
		 					}
		 					else{
		 						$('#formsDialogExpand [elemType="button"]').trigger('disableButtons');
		 					}
		 				});
	 				}
	 			}
	 		});
	 		//To show validation

	 			inputElementWrapper = document.createElement('span');
	 			$(inputElementWrapper).addClass('inputElementWrapper');
	 			if('validate' in dict){
	 				$(inputElementWrapper).addClass('validationContainer');
	 			}
	 			if(dict['mandatory']){
	 				$(inputElementWrapper).addClass('mandatoryContainer');
	 			}
	 			inputElementWrapper.appendChild(input);
	 			div.appendChild(inputElementWrapper);

			return div;
		},
		'smallTextBox': function (dict,callback,element) {
			return this.textBox(dict,'small',callback,element);
		},
		'largeTextBox': function (dict,callback,element) {
			return this.textBox(dict,'large',callback,element);
		},
		'checkboxList': function (dict) {
			var list = dict['choiceList'];
			var hidden = dict['hidden'];
			if('hidden' in dict){
				this.hiddenInfoboxFields = this.hiddenInfoboxFields.concat(dict['hidden']);
			}
			return this.inputList('checkbox',list,dict['title'],dict);
		},

		'addText': function(container,text,type){
			var textHolder = $('<p>');
			textHolder.text(text);
			if (type == 'title'){
				textHolder.addClass('title');
			}
			else if (type == 'text'){
				textHolder.addClass('text');
			}
			else{
				textHolder.addClass(type);
			}
			container.appendChild(textHolder[0]);
			return container;
		},
		'text': function(dict){
			var textHolder = $('<p>');
			return textHolder.text(dict['string'])[0];
		},
		'stepperList': function (dict) {
			var list = dict['choiceList'];
			if('hidden' in dict){
				this.hiddenInfoboxFields = this.hiddenInfoboxFields.concat(dict['hidden']);
			}
			dict['min'] = 0;
			if(!('max' in dict)){
				dict['max'] = 9;
			}
			return this.inputList('number',list,dict['title'],dict,true);
		},
		'dropdownList': function(dict){
			var div = this.elementContainer();
			div = this.addText(div,dict['title'],'title');
			this.addDescription(dict,div);
			var values = dict['values'];
			var select = document.createElement('select');
	 		select.setAttribute('class','dropdown');
	 		select.setAttribute('data-placeholder',dict['placeholder']);
	 		select.setAttribute('data-add-to',dict['add-to']);
	 		select.setAttribute('data-add-to-attribute',dict['infobox-param']);
			var option;
			for (elem in values){
				option = $('<option>').attr('value',values[elem]).text(values[elem]);
				select.appendChild(option[0]);
			}
			div.appendChild(select);
			return div;
		},
		'link': function(dict){
			var link = document.createElement('a');
			link.href = 'href' in dict? dict['href'] : '//commons.wikimedia.org/wiki/Main_Page';
			link.target = '_blank';
			var innerText = 'link' in dict? dict['link'] : 'Search Wikimedia Commons for an image';
			$(link).text(innerText);
			return link;
		},
		'image': function (dict) {
			var url = dict['url'];
			var text = dict['title'];
			dict['add-to'] = 'infobox';
	  		dict['infobox-param'] = 'image';
	  		dict['validate'] = 'exists';
	  		//cleanup
	  		dict['placeholder'] = 'placeholder' in dict ? dict['placeholder'] : 'File:Test.png';
			var div = this.elementContainer();
			this.addText(div,dict['title'],'title');
			this.addDescription(dict,div);
			var img = document.createElement('img');
			img.src = url;
			dict['title'] = 'imageTitleBox' in dict ? dict['imageTitleBox'] : 'Enter the file name';
			//cleanup
			dict['image'] = true;
			var textbox = this.smallTextBox(dict,function(elem,src){
					img.src = src;
				},img);
			div.appendChild(img);
			div.appendChild(textbox);
			var commonsLink = this.link(dict);
			div.appendChild(commonsLink);
			return div;
		},
		'button': function(type,text){
			var a = document.createElement('input');
			a.type='submit';
			a.setAttribute('elemType','button');
			if(type == 'cancel' || type == 'back'){
				a.className = 'mw-ui-button cancel mw-ui-quiet';
			}
			else {
				a.className = 'mw-ui-button mw-ui-constructive';
			}
			a.value = text;
			$(a).on('disableButtons',function(){
				$(this).attr('disabled',true);
			});
			$(a).on('enableButtons',function(){
				$(this).attr('disabled',false);
			});
			return a;
		},
		'cancelButton': function(dict){
			var button = this.button('cancel',dict['title']);
			button.onclick = function(){
				formsGadget.dialog.dialog('close');
			};
			return button;
		},
		'doneButton': function(dict){
			var that = this;
			var button = this.button('done',dict['title']);
			button.onclick = function(){
				that.validateForm();
			};
			return button;
		},
		'nextButton': function(dict){
			var button = this.button('next',dict['title']);
			var that = this;
			button.onclick = function(){
				$('#formsDialogExpand [step]').hide();
				$('#formsDialogExpand'+' #'+dict['step']).next().show();
			};
			return button;
		},
		'backButton': function(dict){
			var button = this.button('back',dict['title']);
			var that = this;
			button.onclick = function(){
				$('#formsDialogExpand [step]').hide();
				$('#formsDialogExpand'+' #'+dict['step']).prev().show();
			};
			return button;
		},
		'validateForm': function(){
			var counter = 0;
			var firstElem;
			$('#formsDialogExpand [data-mandatory="true"]').each(function(){
				var elem = $(this);
				if(!elem.val()){
					if (counter == 0){
						firstElem = elem;
					}
					counter++;
					elem.addClass('mandatoryInput');
				}
			});
			//Add mandatory filed Event & styling
			if(firstElem){
				$('#formsDialogExpand [step]').hide();
				while(true){
					if (firstElem.attr('step')){
						firstElem.show();
						break;
					}
					firstElem = firstElem.parent();
				}
			}
			else{
				if (formsGadget.type == 'create'){
					this.createWikiPage();
				}
				else{
					this.modifyWikiPage();
				}
			}
		},
		'infoboxString': '',
		'remainingSectionString': '',
		'extractInfobox' : function(markup, infoboxTemplate){
			var startIndex = markup.indexOf('{{' + infoboxTemplate);
			var counter = 0;
			var endIndex = 0;
			for (i=startIndex;i<markup.length;i++){
				if(markup[i] == '}' && markup[i+1] == '}'){
						counter++;
				}
				if(markup[i] == '{' && markup[i+1] == '{'){
					counter--;
				}
				if(counter == 0){
					var endIndex = i+2;
					break;
				}
			}
			if (counter != 0){
				return '';
			}
			var infobox = {
				'infobox' : markup.slice(startIndex,endIndex),
			    'before' : markup.slice(0,startIndex),
				'after' : markup.slice(endIndex),
			};
			return infobox;
		},
		'infoboxObjectify': function(infoboxString){
			var paramRe = /( )*\|( )*[A-Za-z0-9_]+( )*=/gi;
			var units = infoboxString.split('\n');
			var infobox = [];
			var infoboxParams = {};
			var parts,line,param,value;
			for (unit in units){
				line = units[unit];
				if(line.search(paramRe) != -1){
					parts = line.split('=');
					param = $.trim(parts[0].replace('|',''));
					value = $.trim(parts[1]);
					//infoboxParams[param] = value;
					infobox.push({'param': param, 'value': value});
				}
				else{
					infobox.push($.trim(line));
				}
			}
			return infobox;
		},
		'modifyInfoboxParam': function(infobox,param,newValue){
			var flag = true;
			for (elem in infobox){
				if(typeof(infobox[elem]) == 'object' && infobox[elem]['param'] == param){
					infobox[elem]['value'] = newValue;
					flag = false;
				}
			}
			if (flag){
				infobox.splice(-1,0,{'param':param, 'value':newValue});
			}
			return infobox;
		},
		'stringifyInfobox' : function(infobox){
			var infoboxString = '';
			for (elem in infobox){
				if (typeof(infobox[elem]) == 'object'){
					if(infobox[elem]['value']){
						infoboxString = infoboxString + '|' + infobox[elem]['param'] + '=' + infobox[elem]['value'] + '\n';
					}
					else{
						infoboxString = infoboxString + '|' + infobox[elem]['param'] + '=' + '\n';
					}
				}
				else{
					infoboxString = infoboxString + infobox[elem] +'\n';
				}
			}
			return infoboxString;
		},
		'createEditSummary' : function(title,subcomment){
			var summary = '';
			var formsConfig = formsGadget.formDict['config'];
			if (formsConfig['edit-comment-prefix']){
				summary = formsConfig['edit-comment-prefix'] + ' ';
			}
			else{
				summary = formsConfig['edit-comment-default'] + ' ';
			}
			if(subcomment){
				summary = summary + title + ' (' + subcomment + ') ';
			}
			else{
				summary = summary + title + ' ';
			}
			if (formsConfig['edit-comment-suffix']){
				summary = summary + formsConfig['edit-comment-suffix'];
			}
			return summary;
		},
		'modifyWikiPage' : function(){
			var that = this;
			var infobox = '';
			var infoboxString = '';
			var sections = '';
			var api = new mw.Api();

			var roots = this.wikiSectionTree.roots;

			for (elem in roots){
				//console.log('---------');
				this.wikiSectionTree.traverse([roots[elem]],1,function(id){
					var elem = $('#formsDialogExpand #'+id);
					value = elem.val() ? elem.val() : '';
					var heading = elem.attr('data-add-to-attribute');
					return { 'heading': heading, 'value': value};
				});
			}
			//Disabling buttons on ajax post
			$('#formsDialogExpand [elemType="button"]').trigger('disableButtons');

			//refractor hardcoding '/Toolkit'
			var title = mw.config.get('wgPageName').replace('/Toolkit','');
			//Getting the infobox
			var gettingInfobox = api.get({
						'format':'json',
						'action':'query',
						'prop':'revisions',
						'rvprop': 'content',
						'rvsection':0,
						'titles': title,
					}).then(function(result){
						var pages = result.query.pages;
						var key = Object.keys(result.query.pages)[0];
						var content = pages[key]['revisions'][0]['*'];
						var infoboxTemplate = formsGadget.formDict.config['infobox'] ? formsGadget.formDict.config['infobox'] : 'Probox/Idealab';
						var elements = that.extractInfobox(content, infoboxTemplate);
						var infobox = that.infoboxObjectify(elements['infobox']);
						var before = elements['before'];
						var after = elements['after'];
						$('#formsDialogExpand [data-add-to]').each(function(index,elem){
							var elem = $(elem);
							if(elem.attr('data-add-to') == 'infobox' ){
								if(elem.attr('type') == 'checkbox'){
									if (elem.is(':checked')){
										infobox = that.modifyInfoboxParam(infobox,elem.attr('data-add-to-attribute'),elem.val());
									}
									else{
										infobox = that.modifyInfoboxParam(infobox,elem.attr('data-add-to-attribute'),null);
									}
								}
								else if(elem.attr('data-role')){
									for (var i=0;i<elem.val(); i++){
										infobox = that.modifyInfoboxParam(infobox,elem.attr('data-add-to-attribute')+(i+1), null);
									}
								}
								else{
									infobox = that.modifyInfoboxParam(infobox,elem.attr('data-add-to-attribute'),elem.val());
								}
							}
						});
						/*
						* infobox entries
						*/
						var hiddenFields = that.hiddenInfoboxFields;
						for(entry in hiddenFields){
							infobox = infobox.push({'param':hiddenFields[entry]['key'],'value':hiddenFields[entry]['value']});
						}
						modifiedSection = before + $.trim(that.stringifyInfobox(infobox)) + after;
						var formsConfig = formsGadget.formDict['config'];
						api.post({
							'action' : 'edit',
							'title' : title,
							'text' : modifiedSection,
							'summary' : that.createEditSummary(title,'editing infobox parameters'),
							'section': 0,
							'watchlist':'watch',
							'token' : mw.user.tokens.get('csrfToken')
						}).then(function(){
							var newSections = '\n' + that.wikiSectionTree.sections;
							api.post({
								'action' : 'edit',
								'title' : title,
								'summary' : that.createEditSummary(title,'editing section'),
								'appendtext':newSections,
								'watchlist':'watch',
								'token' : mw.user.tokens.get('csrfToken')
							}).then(function(){
								// Redirecting to idea page
								//console.log('Successfully Added new sections & modified the infobox');
								var postEditMessage = formsGadget.formDict['config']['post-edit'];
								//Cleanup
								formsGadget.dialog.dialog('close');
								mw.cookie.set('formsGadgetNotify',postEditMessage);
								window.location.href = location.origin + '/wiki/' + title;
							});
						});
					});
		},
		'createWikiPage' :  function(){
			var that = this;
			var infobox = '';
			var page = '';
			var api = new mw.Api();
			var pageTitle = $('#formsDialogExpand [page-title]').val();

			var roots = this.wikiSectionTree.roots;

			for (elem in roots){
				//console.log('---------');
				this.wikiSectionTree.traverse([roots[elem]],1,function(id){
					var elem = $('#formsDialogExpand #'+id);
					value = elem.val() ? elem.val() : '';
					var heading = elem.attr('data-add-to-attribute');
					var comment = elem.attr('data-comment');
					return { 'heading': heading, 'value': value, 'comment': comment };
				});
			}

			$('#formsDialogExpand [data-add-to]').each(function(index,elem){
				var elem = $(elem);
				if(elem.attr('data-add-to') == 'section' ){
					//var value = elem.val() ? elem.val() : '';
					//var section = '==' + elem.attr('data-add-to-attribute') + '==' + '\n' + elem.val() + '\n';
					//page = page + section;
				}
				else{
					//Cleanup & Simplify
					if (elem.attr('data-role')){
						for (var i=0;i<elem.val(); i++){
							infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + (i+1) + '=\n';
						}
					}
					else if(elem.attr('type') == 'checkbox'){
						if (elem.is(':checked')){
							infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + '=' + elem.val() + '\n';
						}
						else{
							infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + '=\n';
						}
					}
					//Fix this hardcoding more elegantly
					else if(elem.attr('data-add-to-attribute') == 'image'){
						var image = elem.val() ? elem.val() : elem.attr('placeholder');
						infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + '=' + image + '\n';
					}
					else{
						infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + '=' + elem.val() + '\n';
					}
				}
			});
			/*
			* infobox entries
			*/
			var hiddenFields = this.hiddenInfoboxFields;
			for(entry in hiddenFields){
				infobox = infobox + '|' + hiddenFields[entry]['key'] + '=' + hiddenFields[entry]['value'] + '\n';
			}

			//Hardcoding creator/timestamp
			infobox = infobox + '|' + 'timestamp = ~~~~~' + '\n' ;
			infobox = infobox + '|' + 'creator = ' + mw.user.getName() + '\n' ;

			var probox = this.formDict.config['infobox'] ? this.formDict.config['infobox'] : 'Probox/Idealab';
			infobox = '{{' + probox + '\n' + infobox + '}} \n';
			page = infobox + this.wikiSectionTree.sections;

			/*
			 * Creating a new page
			 *
			 */

			var title = formsGadget.formDict['config']['page-home'] + pageTitle;
			//Disabling buttons on ajax post
			$('#formsDialogExpand [elemType="button"]').trigger('disableButtons');
						api.post({
						'action': 'edit',
						//Cleanup
						'title': title,
						'summary': that.createEditSummary(title),
						'text': page,
						'watchlist':'watch',
						token: mw.user.tokens.get('csrfToken')
					}).then(function () {
						//Creating Idea Toolkit
						var formsConfig = formsGadget.formDict['config'];
						var toolkit = formsConfig['toolkit-name'];
						var toolkitContent = '{{' + formsConfig['toolkit-template'] + '}}';
						var createToolkit = true;
						if (toolkit && toolkitContent){
							var toolkitTitle = title + '/' + toolkit;
							var summary = 'Adding the toolkit for ' + title;
							createToolkit = api.post({
								'action': 'edit',
								//Cleanup
								'title': toolkitTitle,
								'summary': summary,
								'text': toolkitContent,
								'watchlist':'watch',
								token: mw.user.tokens.get('csrfToken')
							});
						}

						// Redirecting to idea page
						//console.log('Successfully created new page');
						$.when(createToolkit).then(function(){
							formsGadget.dialog.dialog('close');
							var postEditMessage = formsGadget.formDict['config']['post-edit'];
							mw.cookie.set('formsGadgetNotify',postEditMessage);
							window.location.href = location.origin + '/wiki/' + title;
						},function(){
							$('#formsDialogExpand [elemType="button"]').trigger('enableButtons');
						});
					},function(){
						$('#formsDialogExpand [elemType="button"]').trigger('enableButtons');
					});

			//console.log(title,page);
		}
	},
	'createForm' : function(formDict){
		//cleanup fixing the fallbacks
		if( !formDict.config['page-home'].match(/\/$/) ){
			formDict.config['page-home'] = formDict.config['page-home'] + '/';
		}
		this.formDict = formDict;
		this.formElement.formDict = formDict;
		this.formElement.wikiSectionTree = this.wikiSectionTree;
		var dialogInternal = document.createElement('div');
		//User not logged in
		if (! mw.user.getName()){
			var errorMessage = formDict['config']['error-not-logged-in'];
			var errorDiv = document.createElement('div');
			errorDiv.className = 'mw-ui-vform';
			this.formElement.addText(errorDiv,errorMessage,'error');
			dialogInternal.appendChild(errorDiv);
		}
		var counter = 0;
		for (step in formDict){
			if (step != 'config'){
				counter++;
				var stepDict = formDict[step];
				var panel = document.createElement('div');
				panel.id = step;
				if(counter != 1){
					panel.style['display'] = 'none';
				}
				panel.setAttribute('step',step);
				for (elem in stepDict){
					elemDict = stepDict[elem];
					elemDict['elem'] = elem;
					elemDict['step'] = step;
					elemDict['id'] = elem;
					panel.appendChild(this.formElement[elemDict.type](elemDict));
					//Creating the hierarchial structure of the sections & subsections
					if (elemDict['add-to'] == 'section' ){
						var parent = 'parent' in elemDict ? elemDict['parent'] : null;
						var node = elem;
						if(parent){
							this.wikiSectionTree.addLink(parent,node);
						}
						else{
							this.wikiSectionTree.addLink(node);
						}

					}
				}
				dialogInternal.appendChild(panel);
			}
		}
		$('#formsDialogExpand').append(dialogInternal);
		$('.formsGadget .dropdown').chosen({
								disable_search: true,
								width: '50%',
						});
		return true;
	},
	'Tree' : function(){
		var rootList = {};
		var nodeList = {};
		this.sections = '';
		this.roots = rootList;
		var Node = function(parent,child,id){
			this.parent = parent;
			this.id = id;
			this.child = child;
		};
		var getNode = function(id){
			if (id in nodeList){
				return nodeList[id];
			}
			else{
				var node = new Node(null,null,id);
				nodeList[id] = node;
				rootList[id] = node;
				return node;
			}
		};
		this.addLink = function(startId,endId){
			if (endId){
				var startNode = getNode(startId);
				var endNode = getNode(endId);
				endNode.parent = startNode;
				if (startNode.child){
					startNode.child.push(endNode);
				}
				else{
					startNode.child = [endNode];
				}
				delete rootList[endNode.id];
			}
			else{
				getNode(startId);
			}
		};
		var sectionLevel = function(indent){
			var string = '';
			for (var i=0;i<indent;i++){
				string = string + '=';
				}
			return string;
		};
		this.traverse = function(rootList,level,callback){
			if(!rootList){
				return;
			}
			level++;
			var wikiSectionHeaderMarkup = sectionLevel(level);
			for (elem in rootList){
				var root = rootList[elem];
				var sectionValues = callback(root.id);
				var section = wikiSectionHeaderMarkup + sectionValues['heading'] + wikiSectionHeaderMarkup + '\n' ;
				var section = section + ( sectionValues['comment'] ? sectionValues['comment'] + '\n' : '' ) + sectionValues['value'] + '\n';
				this.sections = this.sections + section;
				root = root.child;
				this.traverse(root,level,callback);
			}
		};
	}
};

$(function() {
	(function(){
			var api = new mw.Api();
			var utility = formsGadget.utilities;

			//Retrieving the post edit feedback if any
			var postEditMessage = mw.cookie.get('formsGadgetNotify');
			if (postEditMessage){
				//clearing the cookie
				mw.cookie.set('formsGadgetNotify', null);

           		//displaying the post edit message
				mw.notify(postEditMessage,{autoHide:false});
           	}

			$('.wp-formsGadget').click(function(e){
				e.preventDefault();

				formsGadgetNamespace = utility.gadgetNamespace();
				formsGadgetType = $(this).attr('data-type') || 'Idea';
				formsGadgetMode = $(this).attr('data-mode') || 'create';

				formsGadget.cleanupDialog();
				formsGadget.openDialog();
				formsGadget.openPanel();

				$('#formsDialogExpand .loading').show();

				var configFullPath = utility.configPath+'/'+formsGadgetNamespace+'/'+formsGadgetType;
				var configUrl = '//en.wikipedia.org/w/index.php?title='+encodeURIComponent(configFullPath)+'&action=raw&ctype=text/javascript';
				var api = new mw.Api();
				var promise = api.get({
					'format':'json',
					'formatversion': 2,
					'action':'query',
					'prop':'revisions',
					'rvprop': 'contentmodel',
					'rvslot': 0,
					'rvsection':0,
					'titles': configFullPath,
				});
				//Get the config for the language above
				$.when(jQuery.getScript(configUrl), promise).then(function(text, result){
					if ( result[0].query.pages[0].revisions[0].contentmodel == 'javascript' ) {
						var config = utility.stripWhiteSpace(formsGadgetConfig[formsGadgetMode]);
						formsGadget['formDict'] = config;
						//Cleanup
						$('.formsGadget .ui-dialog-title').text(config.config['dialog-title']);
						formsGadget['wikiSectionTree'] = new formsGadget.Tree();
						formsGadget.openDialog();
						formsGadget.createForm(config);
						formsGadget.type = formsGadgetMode;
						formsGadget.openDialog();
						$('#formsDialogExpand .loading').hide();
					}
				});
			});
	})();
});
// </nowiki>
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy