MediaWiki:Gadget-formWizard-core.js

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').split('/')[0].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 apivar 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';//cleanupdict['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 & stylingif(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 infoboxvar 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'];//CleanupformsGadget.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 & Simplifyif (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 elegantlyelse 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/timestampinfobox = 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 Toolkitvar 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 fallbacksif( !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 inif (! 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 & subsectionsif (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 anyvar postEditMessage = mw.cookie.get('formsGadgetNotify');if (postEditMessage){//clearing the cookiemw.cookie.set('formsGadgetNotify', null);           //displaying the post edit messagemw.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 = 'https://www.how.com.vn/wiki/index.php?lang=en&q='+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>