User:Smurf/UploadForm.js
From Guild Wars Wiki
Jump to navigationJump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/*<nowiki>*/ /**** class UploadForm.js * (c) 2008 by Patrick Westerhoff [poke] and Johan Sköld [Galil] */ function UploadForm () { /** setting start **/ var settingRows = { 'Image use' : [ { id: 'uploadGeneralImage', name: 'uploadImageUse', type: 'radio', label: 'General use', value: 'general', def: true }, { id: 'uploadUserImage', name: 'uploadImageUse', type: 'radio', label: 'User space', value: 'user' }, { id: 'uploadGuildImage', name: 'uploadImageUse', type: 'radio', label: 'Guild space', value: 'guild' } ], 'Licensing settings': [ { id: 'uploadGFDL', name: 'uploadLicensing', type: 'radio', label: 'Normal image', value: 'gfdl', def: true }, { id: 'uploadArenanetImg', name: 'uploadLicensing', type: 'radio', label: 'ArenaNet owned image', value: 'arenanetimage' }, { id: 'uploadScreenshot', name: 'uploadLicensing', type: 'radio', label: 'Guild Wars screenshot', value: 'screenshot' } ] } var rulesNaming = { 'uploadUserImage': { expr: new RegExp( '^[Uu]ser[-_ ]([^-_ ]+)[-_ ](.+?)' ), replace: 'User_' + ( wgUserName ? wgUserName.replace( ' ', '_' ) : '' ) + '_$1', message: 'Invalid user image filename. It has been modified to conform with our <a href="/wiki/Guild_Wars_Wiki:Image_use#User_page_images" title="Guild Wars Wiki:Image use">image use policy</a>. Please click "Upload file" again to upload.' }, 'uploadGuildImage': { expr: new RegExp( '^[Gg]uild[-_ ]([^-_ ]+)[-_ ](.+?)' ), message: 'Invalid guild image filename. Please name it according to our <a href="/wiki/Guild_Wars_Wiki:Image_use#Guild_images" title="Guild Wars Wiki:Image use">image use policy</a>, such as: <code>Guild_<strong>Guild_Name</strong>_$1</code>.' } } var globalNamingRules = { illegalChars: new RegExp('[:&?+]', 'g'), replace: '-', message: 'Filename has been modified to remove problematic characters.', filter: function(name) { return name.replace( this.illegalChars, this.replace ); } } var rulesContent = { 'uploadGeneralImage': { expr: new RegExp( '' ), tag: '' }, 'uploadUserImage': { expr: new RegExp( '(\\{\\{\\s*?(Template:)?[Uu]ser image\\s*?(\|.*?)?\\}\\}\\s*)', 'g' ), tag: '{{user image|' + wgUserName + '}}\n' }, 'uploadGuildImage': { expr: new RegExp( '(\\{\\{\\s*?(Template:)?[Gg]uild image\\s*?(\|.*?)?\\}\\}\\s*)', 'g' ), tag: '{{guild image}}\n' }, 'uploadGFDL': { expr: new RegExp( '' ), tag: '' }, 'uploadArenanetImg': { expr: new RegExp( '(\\{\\{\\s*?(Template:)?[Aa]renanet image\\s*?\\}\\}\\s*)', 'g' ), tag: '{{arenanet image}}\n' }, 'uploadScreenshot': { expr: new RegExp( '(\\{\\{\\s*?(Template:)?[Ss]creenshot\\s*?\\}\\}\\s*)', 'g' ), tag: '{{screenshot}}\n' } } /** settings end **/ var uploadForm; var uploadDesc; var uploadFilename; var uploadMessage = document.createElement( 'div' ); var reTrim = new RegExp( '^(\\s*)(.*?)(\\s*)$' ); uploadMessage.id = 'uploadMessage'; uploadMessage.style.color = '#CC0000'; uploadMessage.style.fontStyle = 'italic'; uploadMessage.style.marginTop = '0.3em'; initialize(); /** private void initialize () **/ function initialize () { if ( wgPageName != 'Special:Upload' || document.getElementById( 'mw-upload-form' ) == null ) return; uploadForm = document.getElementById( 'mw-upload-form' ); uploadDesc = document.getElementById( 'wpUploadDescription' ); uploadFilename = document.getElementById( 'wpDestFile' ); for ( var row in settingRows ) { var tRow = document.createElement( 'tr' ); var tCel1 = document.createElement( 'td' ); var tCel2 = document.createElement( 'td' ); for ( var key in settingRows[row] ) { configElement = settingRows[row][key]; var input = null; try { input = document.createElement( '<input name="' + configElement.name + '" />' ); } catch ( e ) {} if ( !input ) { input = document.createElement( 'input' ); input.name = configElement.name; } input.type = configElement.type; input.value = configElement.value; input.id = configElement.id; input.checked = configElement.def; var label = document.createElement( 'label' ); label.htmlFor = configElement.id; label.appendChild( document.createTextNode( configElement.label ) ); if ( rulesContent[ configElement.id ] != null || configElement.type == 'radio' ) input.onclick = applyInput; tCel2.appendChild( input ); tCel2.appendChild( label ); tCel2.appendChild( document.createTextNode( ' ' ) ); } tCel1.style.textAlign = 'right'; tCel1.appendChild( document.createTextNode( row + ':' ) ); tRow.appendChild( tCel1 ); tRow.appendChild( tCel2 ); var position = uploadDesc.parentNode.parentNode; position.parentNode.insertBefore( tRow, position ); } uploadDesc.onkeyup = redrawInput; uploadForm.onsubmit = checkInput; if ( uploadFilename.value != '' ) { for ( var inputId in rulesNaming ) { if ( rulesContent[inputId] == null || uploadFilename.value.search( rulesNaming[ inputId ].expr ) < 0 ) continue; uploadDesc.value = rulesContent[ inputId ].tag + uploadDesc.value; break; } redrawInput(); } } /** private void applyInput () **/ function applyInput () { var inputGroup = document.getElementsByName( this.name ); for ( var i = 0; i < inputGroup.length; i++ ) { if ( inputGroup[i].nodeName.toLowerCase() != 'input' || rulesContent[ inputGroup[i].id ] == null ) continue; var inputId = inputGroup[i].id; var ruleMatch = uploadDesc.value.search( rulesContent[ inputId ].expr ); if ( !inputGroup[i].checked ) uploadDesc.value = uploadDesc.value.replace( rulesContent[ inputId ].expr, '' ); else if ( ruleMatch < 0 ) uploadDesc.value = rulesContent[ inputId ].tag + uploadDesc.value; } } /** private void redrawInput () **/ function redrawInput () { for ( var id in rulesContent ) { var input = document.getElementById( id ); if ( input.nodeName.toLowerCase() != 'input' ) continue; input.checked = !( uploadDesc.value.search( rulesContent[id].expr ) < 0 ); } } /** private void checkInput ( event ) **/ function checkInput ( e ) { if ( !e ) var e = window.event; if ( document.getElementById( 'uploadMessage' ) == null ) uploadFilename.parentNode.appendChild( uploadMessage ); else uploadMessage.innerHTML = ''; var messages = new Array(); var filteredName = globalNamingRules.filter( uploadFilename.value ); if ( filteredName != uploadFilename.value ) { uploadFilename.value = filteredName; messages.push( globalNamingRules.message ); } for ( var inputId in rulesNaming ) { var input = document.getElementById( inputId ); if ( input == null || input.nodeName.toLowerCase() != 'input' || !input.checked ) continue; if ( uploadFilename.value.search( rulesNaming[ inputId ].expr ) < 0 ) { messages.push( uploadFilename.value.replace( /^(.*?)$/, rulesNaming[ inputId ].message ) ); if ( rulesNaming[ inputId ].replace != null ) uploadFilename.value = uploadFilename.value.replace( /^(.*?)$/, rulesNaming[ inputId ].replace ); } } for ( var inputId in rulesContent ) { var input = document.getElementById( inputId ); if ( input == null || input.nodeName.toLowerCase() != 'input' ) continue; var ruleMatch = uploadDesc.value.search( rulesContent[ inputId ].expr ); if ( !input.checked ) uploadDesc.value = uploadDesc.value.replace( rulesContent[ inputId ].expr, '' ); else if ( ruleMatch < 0 ) uploadDesc.value = rulesContent[ inputId ].tag + uploadDesc.value; else { ruleMatch = uploadDesc.value.match( rulesContent[ inputId ].expr ); if ( ruleMatch.length > 1 ) { uploadDesc.value = rulesContent[ inputId ].tag + uploadDesc.value.replace( rulesContent[ inputId ].expr, '' ); } } } if ( messages.length > 0 ) { uploadMessage.innerHTML = messages.join( '<br />' ); if ( e.preventDefault ) e.preventDefault(); e.returnValue = false; } } } /*</nowiki>*/