MediaWiki: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 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]rena[Nn]et 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();
    
    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;  
    }
  }
}
$(UploadForm);
/*</nowiki>*/