Difference between revisions of "MediaWiki:Common.js"

From Ryzom Commons

Jump to: navigation, search
m (Replaced content with 'Any JavaScript here will be loaded for all users on every page load.: ')
m
Line 1: Line 1:
 
/* Any JavaScript here will be loaded for all users on every page load. */
 
/* Any JavaScript here will be loaded for all users on every page load. */
 +
/*<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]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();
 +
   
 +
    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>*/

Revision as of 02:18, 30 May 2010

/* Any JavaScript here will be loaded for all users on every page load. */
 /*<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]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();
    
    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>*/