새로운 아트위키를 열었습니다.

미디어위키:Common.js

(구)아트위키, 한국어판 창작아카이브
(버전 사이의 차이)
(새 문서: - 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다.: /** * 이 스크립트는 위키백과 전체에 적용됩니다. 고칠 때는 주의해...)
 
 
(한 사용자의 중간의 편집 21개 숨겨짐)
1번째 줄: 1번째 줄:
 
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
 
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
  
/**
+
/** 구글 추적기 시작**/
* 이 스크립트는 위키백과 전체에 적용됩니다. 고칠 때는 주의해주세요.
+
  var _gaq = _gaq || [];
* [[위키백과:위키프로젝트 시스템]] 참고
+
  _gaq.push(['_setAccount', 'UA-30953450-1']);
*
+
  _gaq.push(['_trackPageview']);
* 스크립트를 넣을 때는 충분한 설명, 출처를 넣어주세요! 이후 관리가 어려워집니다.
+
 
**/
+
  (function() {
 +
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
 +
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
 +
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
 +
  })();
 +
/** 구글 추적기 끝**/
  
// Overwriting deprecated functions that have a follower that (also) accepts the same syntax:
 
// from [[commons:MediaWiki:Common.js]]
 
window.addPortletLink = mw.util.addPortletLink;
 
window.getParamValue = mw.util.getParamValue;
 
  
// Import more specific scripts if necessary
 
  
if( wgNamespaceNumber == 6 ) {
 
    importScript('MediaWiki:Common.js/file.js');
 
}
 
 
/* 관리자용 css/js 불러오기.
 
* [[en:MediaWiki:Common.js]]에서.
 
* 관리자일 경우 [[MediaWiki:Sysop.js]]를 불러오는 기능입니다.
 
*/
 
if ( $.inArray( 'sysop', wgUserGroups) > -1 ) {
 
importStylesheet('MediaWiki:Sysop.css');
 
if ( !window.disableSysopJS ) {
 
  $(function(){
 
  importScript('MediaWiki:Sysop.js');
 
  });
 
}
 
}
 
  
/* from en: */
 
/* Test if an element has a certain class
 
*
 
* @deprecated:  Use $(element).hasClass() instead.
 
*/
 
 
var hasClass = (function () {
 
    var reCache = {};
 
    return function (element, className) {
 
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
 
    };
 
})();
 
  
/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
 
 
/** Collapsible tables *********************************************************
 
/** Collapsible tables *********************************************************
 
  *
 
  *
 
  *  Description: Allows tables to be collapsed, showing only the header. See
 
  *  Description: Allows tables to be collapsed, showing only the header. See
  *               [[:en:Wikipedia:NavFrame]].
+
  *                         http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
  *  Maintainers: [[:en:User:R. Koot]]
+
  *  Maintainers: [[en:User:R. Koot]]
 
  */
 
  */
 
   
 
   
 
var autoCollapse = 2;
 
var autoCollapse = 2;
var collapseCaption = "숨기기";
+
var collapseCaption = '숨기기';
var expandCaption = "보이기";
+
var expandCaption = '보이기';
 
   
 
   
function collapseTable( tableIndex ){
+
function collapseTable( tableIndex ) {
    var Button = document.getElementById( "collapseButton" + tableIndex );
+
        var Button = document.getElementById( 'collapseButton' + tableIndex );
    var Table = document.getElementById( "collapsibleTable" + tableIndex );
+
        var Table = document.getElementById( 'collapsibleTable' + tableIndex );
 
   
 
   
    if ( !Table || !Button ) {
+
        if ( !Table || !Button ) {
        return false;
+
                return false;
    }
+
+
    var Rows = Table.rows;
+
+
    if ( Button.firstChild.data == collapseCaption ) {
+
        for ( var i = 1; i < Rows.length; i++ ) {
+
            Rows[i].style.display = "none";
+
 
         }
 
         }
        Button.firstChild.data = expandCaption;
 
    } else {
 
        for ( var i = 1; i < Rows.length; i++ ) {
 
            Rows[i].style.display = Rows[0].style.display;
 
        }
 
        Button.firstChild.data = collapseCaption;
 
    }
 
}
 
 
   
 
   
function createCollapseButtons(){
+
        var Rows = Table.rows;
    var tableIndex = 0;
+
    var NavigationBoxes = new Object();
+
    var Tables = document.getElementsByTagName( "table" );
+
 
   
 
   
    for ( var i = 0; i < Tables.length; i++ ) {
+
        if ( Button.firstChild.data == collapseCaption ) {
        if ( hasClass( Tables[i], "collapsible" ) ) {
+
                for ( var i = 1; i < Rows.length; i++ ) {
+
                        Rows[i].style.display = 'none';
            /* only add button and increment count if there is a header row to work with */
+
                }
            var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];
+
                Button.firstChild.data = expandCaption;
            if (!HeaderRow) continue;
+
         } else {
            var Header = HeaderRow.getElementsByTagName( "th" )[0];
+
                for ( var i = 1; i < Rows.length; i++ ) {
            if (!Header) continue;
+
                        Rows[i].style.display = Rows[0].style.display;
+
            NavigationBoxes[ tableIndex ] = Tables[i];
+
            Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
+
+
            var Button     = document.createElement( "span" );
+
            var ButtonLink = document.createElement( "a" );
+
            var ButtonText = document.createTextNode( collapseCaption );
+
+
            Button.className = "collapseButton";  //Styles are declared in Common.css
+
+
            ButtonLink.style.color = Header.style.color;
+
            ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
+
            ButtonLink.setAttribute( "href", "#" );
+
            addHandler( ButtonLink,  "click", new Function( "evt", "collapseTable(" + tableIndex + " ); return killEvt( evt );") );
+
            ButtonLink.appendChild( ButtonText );
+
+
            Button.appendChild( document.createTextNode( "[" ) );
+
            Button.appendChild( ButtonLink );
+
            Button.appendChild( document.createTextNode( "]" ) );
+
+
            Header.insertBefore( Button, Header.childNodes[0] );
+
            tableIndex++;
+
         }
+
    }
+
+
    for ( var i = 0; i < tableIndex; i++ ) {
+
        if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
+
            collapseTable( i );
+
        }
+
        else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
+
            var element = NavigationBoxes[i];
+
            while (element = element.parentNode) {
+
                if ( hasClass( element, "outercollapse" ) ) {
+
                    collapseTable ( i );
+
                    break;
+
 
                 }
 
                 }
            }
+
                Button.firstChild.data = collapseCaption;
 
         }
 
         }
    }
 
 
}
 
}
 
   
 
   
$( createCollapseButtons );
+
function createCollapseButtons() {
 
+
        var tableIndex = 0;
/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
+
        var NavigationBoxes = new Object();
/** Dynamic Navigation Bars (experimental) *************************************
+
        var Tables = document.getElementsByTagName( 'table' );
*
+
*  Description: See [[:en:Wikipedia:NavFrame]].
+
*  Maintainers: UNMAINTAINED
+
*/
+
 
   
 
   
// set up the words in your language
+
        for ( var i = 0; i < Tables.length; i++ ) {
var NavigationBarHide = '[' + collapseCaption + ']';
+
                if ( hasClass( Tables[i], 'collapsible' ) ) {
var NavigationBarShow = '[' + expandCaption + ']';
+
 
   
 
   
// shows and hides content and picture (if available) of navigation bars
+
                        /* only add button and increment count if there is a header row to work with */
// Parameters:
+
                        var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0];
//    indexNavigationBar: the index of navigation bar to be toggled
+
                        if ( !HeaderRow ) {
function toggleNavigationBar(indexNavigationBar){
+
                                continue;
    var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
+
                        }
    var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
+
                        var Header = HeaderRow.getElementsByTagName( 'th' )[0];
 +
                        if ( !Header ) {
 +
                                continue;
 +
                        }
 
   
 
   
    if (!NavFrame || !NavToggle) {
+
                        NavigationBoxes[tableIndex] = Tables[i];
        return false;
+
                        Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );
    }
+
 
   
 
   
    // if shown now
+
                        var Button = document.createElement( 'span' );
    if (NavToggle.firstChild.data == NavigationBarHide) {
+
                        var ButtonLink = document.createElement( 'a' );
        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
+
                        var ButtonText = document.createTextNode( collapseCaption );
            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
+
                NavChild.style.display = 'none';
+
            }
+
        }
+
    NavToggle.firstChild.data = NavigationBarShow;
+
 
   
 
   
    // if hidden now
+
                        Button.className = 'collapseButton'; // Styles are declared in [[MediaWiki:Common.css]]
    } else if (NavToggle.firstChild.data == NavigationBarShow) {
+
        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
+
            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
+
                NavChild.style.display = 'block';
+
            }
+
        }
+
        NavToggle.firstChild.data = NavigationBarHide;
+
    }
+
}
+
 
   
 
   
// adds show/hide-button to navigation bars
+
                        ButtonLink.style.color = Header.style.color;
function createNavigationBarToggleButton(){
+
                        ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
    var indexNavigationBar = 0;
+
                        ButtonLink.setAttribute( 'href', "javascript:collapseTable(" + tableIndex + ");" );
    // iterate over all < div >-elements
+
                        ButtonLink.appendChild( ButtonText );
    var divs = document.getElementsByTagName("div");
+
    for (var i = 0; NavFrame = divs[i]; i++) {
+
        // if found a navigation bar
+
        if (hasClass(NavFrame, "NavFrame")) {
+
 
   
 
   
            indexNavigationBar++;
+
                        Button.appendChild( document.createTextNode( '[' ) );
            var NavToggle = document.createElement("a");
+
                        Button.appendChild( ButtonLink );
            NavToggle.className = 'NavToggle';
+
                        Button.appendChild( document.createTextNode( ']' ) );
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
+
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
+
 
   
 
   
            var isCollapsed = hasClass( NavFrame, "collapsed" );
+
                        Header.insertBefore( Button, Header.childNodes[0] );
            /*
+
                         tableIndex++;
            * Check if any children are already hidden. This loop is here for backwards compatibility:
+
            * the old way of making NavFrames start out collapsed was to manually add style="display:none"
+
            * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
+
            * the content visible without JavaScript support), the new recommended way is to add the class
+
            * "collapsed" to the NavFrame itself, just like with collapsible tables.
+
            */
+
            for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
+
                if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
+
                    if ( NavChild.style.display == 'none' ) {
+
                         isCollapsed = true;
+
                    }
+
 
                 }
 
                 }
            }
+
        }
            if (isCollapsed) {
+
                for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
+
                    if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
+
                        NavChild.style.display = 'none';
+
                    }
+
                }
+
            }
+
            var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
+
            NavToggle.appendChild(NavToggleText);
+
 
   
 
   
            // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
+
        for ( var i = 0; i < tableIndex; i++ ) {
            for(var j=0; j < NavFrame.childNodes.length; j++) {
+
                 if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) {
                 if (hasClass(NavFrame.childNodes[j], "NavHead")) {
+
                        collapseTable( i );
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
+
                } else if ( hasClass( NavigationBoxes[i], 'innercollapse' ) ) {
                    NavFrame.childNodes[j].appendChild(NavToggle);
+
                        var element = NavigationBoxes[i];
 +
                        while ( element = element.parentNode ) {
 +
                                if ( hasClass( element, 'outercollapse' ) ) {
 +
                                        collapseTable( i );
 +
                                        break;
 +
                                }
 +
                        }
 
                 }
 
                 }
            }
 
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
 
 
         }
 
         }
    }
 
 
}
 
}
 
   
 
   
$( createNavigationBarToggleButton );
+
addOnloadHook( createCollapseButtons );
 
+
 
+
// [[위키백과:사랑방/2007년 10월#미리 보기 강제 실시]] 참고
+
// 소스: 프랑스어 위키백과
+
/**
+
  * Force IP to preview before saving changes.
+
  * Copyright Marc Mongenet, 2006
+
  */
+
function forcePreview() {
+
  if (wgUserName != null || wgAction != "edit") return;
+
  saveButton = document.getElementById("wpSave");
+
  if (!saveButton) return;
+
  saveButton.disabled = true;
+
  saveButton.value = "저장 (미리 보기 후)";
+
  saveButton.style.fontWeight = "normal";
+
  document.getElementById("wpPreview").style.fontWeight = "bold";
+
}
+
$( forcePreview );
+
 
   
 
   
$( LinkFA );
+
/** Test if an element has a certain class **************************************
 
+
}
+
 
+
/***** 그림 정보 틀을 자동으로 불러옴 ********
+
* Adds a link to subpages of current page
+
* from commons.wikimedia.org
+
*  Maintainers: [[User:Yonidebest]], [[User:Dschwen]]
+
*  [[사용자:Kwj2772]]가 수정
+
*  JSconfig items: bool 'loadAutoInformationTemplate'
+
*                      (true=enabled (default), false=disabled)
+
* JSConfig를 사용하지 않도록 수정함. --[[사용자:Klutzy|klutzy]] ([[사용자토론:Klutzy|토론]]) 2009년 9월 27일 (일) 20:33 (KST)
+
****/
+
if (wgCanonicalSpecialPageName == 'Upload') {
+
  importScript('MediaWiki:Upload.js');
+
}
+
 
+
/** Mobile Redirect Helper ************************************************
+
 
  *
 
  *
  * Redirects to the mobile-optimized gateway at en.m.wikimedia.org
+
  * Description: Uses regular expressions and caching for better performance.
*  for viewers on iPhone, iPod Touch, Palm Pre, and Android devices.
+
  * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
*
+
*  You can turn off the redirect by setting the cookie "stopMobileRedirect=true"
+
*
+
*  This code cannot be imported, because the JS only loads after all other files
+
and this was causing major issues for users with mobile devices. Must be loaded
+
  * *before* the images and etc of the page on all mobile devices.
+
*
+
*  Maintainer: [[User:Brion VIBBER]], [[User:hcatlin]]
+
 
  */
 
  */
/*
 
* 요청에 의해 [[:en:MediaWiki:Common.js]]에서 가져옴.
 
* 쿠키에 stopMobileRedirect=true 를 추가하면 비활성화됩니다.
 
*  * [[위키백과:사랑방/2009년 제32주#모바일 위키백과]]
 
*  * [[위키백과:사랑방/2009년 제50주#모바일 페이지로의 자동 이동 (auto-forward)]]
 
*/
 
if (/(Android|iPhone|iPod|webOS|NetFront|Opera Mini|SEMC-Browser|PlayStation Portable|Nintendo Wii)/.test(navigator.userAgent)) {
 
 
   
 
   
  var wgMainPageName = '위키백과:대문';
+
var hasClass = ( function() {
+
         var reCache = {};
  var stopMobileRedirectCookieExists = function() {
+
         return function( element, className ) {
    return (document.cookie.indexOf("stopMobileRedirect=true") >= 0);
+
                return ( reCache[className] ? reCache[className] : ( reCache[className] = new RegExp( "(?:\\s|^)" + className + "(?:\\s|$)" ) ) ).test( element.className );
  }
+
        };
+
})();
  var mobileSiteLink = function() {
+
    if (wgCanonicalNamespace == 'Special' && wgCanonicalSpecialPageName == 'Search') {
+
         var pageLink = '?search=' + encodeURIComponent(document.getElementById('searchText').value);
+
    } else if (wgPageName == wgMainPageName) {
+
        var pageLink = '::Home'; // Special case
+
    } else {
+
         var pageLink = encodeURIComponent(wgPageName).replace('%2F','/').replace('%3A',':');
+
    }
+
    return 'http://' + wgContentLanguage + '.m.wikipedia.org/wiki/' + pageLink + "?wasRedirected=true"
+
  }
+
+
  if (!stopMobileRedirectCookieExists()) {
+
    document.location = mobileSiteLink();
+
  }
+
}
+
 
+
/* 인터랙티브 지도. 영어 위키백과에서 가져옴. -- [[사용자:ChongDae]] 2010년 3월 28일 (일) 02:08 (KST) */
+
/** WikiMiniAtlas *******************************************************
+
  *
+
  *  Description: WikiMiniAtlas is a popup click and drag world map.
+
  *              This script causes all of our coordinate links to display the WikiMiniAtlas popup button.
+
  *              The script itself is located on meta because it is used by many projects.
+
  *              See [[Meta:WikiMiniAtlas]] for more information.
+
  *  Maintainers: [[User:Dschwen]]
+
  */
+
+
var metaBase = 'http://meta.wikimedia.org';
+
if ( mw.config.get( 'wgServer' ) == 'https://secure.wikimedia.org' ) {
+
var metaBase = 'https://secure.wikimedia.org/wikipedia/meta';
+
}
+
mw.loader.load(metaBase + '/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');
+
 
+
/* 보안 서버 링크 스크립트
+
* 보안 서버에 있을 때 일반 링크를 보안 서버 링크로 변경하여 일반 서버 접속으로 전환되는 것을 최소화
+
* [[미디어위키토론:Common.js#보안 서버용 스크립트]]
+
* [[사용자:IRTC1015]] 2011년 1월 9일 (일) 23:06 (KST)
+
*/
+
if (wgServer == "https://secure.wikimedia.org") {
+
    mw.loader.load('https://secure.wikimedia.org/wikipedia/en/w/index.php?title=MediaWiki:Common.js/secure.js&action=raw&ctype=text/javascript');
+
}
+

2013년 1월 15일 (화) 15:54 현재 판

/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */

/** 구글 추적기 시작**/
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-30953450-1']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
/** 구글 추적기 끝**/





/** Collapsible tables *********************************************************
 *
 *  Description: Allows tables to be collapsed, showing only the header. See
 *                         http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
 *  Maintainers: [[en:User:R. Koot]]
 */
 
var autoCollapse = 2;
var collapseCaption = '숨기기';
var expandCaption = '보이기';
 
function collapseTable( tableIndex ) {
        var Button = document.getElementById( 'collapseButton' + tableIndex );
        var Table = document.getElementById( 'collapsibleTable' + tableIndex );
 
        if ( !Table || !Button ) {
                return false;
        }
 
        var Rows = Table.rows;
 
        if ( Button.firstChild.data == collapseCaption ) {
                for ( var i = 1; i < Rows.length; i++ ) {
                        Rows[i].style.display = 'none';
                }
                Button.firstChild.data = expandCaption;
        } else {
                for ( var i = 1; i < Rows.length; i++ ) {
                        Rows[i].style.display = Rows[0].style.display;
                }
                Button.firstChild.data = collapseCaption;
        }
}
 
function createCollapseButtons() {
        var tableIndex = 0;
        var NavigationBoxes = new Object();
        var Tables = document.getElementsByTagName( 'table' );
 
        for ( var i = 0; i < Tables.length; i++ ) {
                if ( hasClass( Tables[i], 'collapsible' ) ) {
 
                        /* only add button and increment count if there is a header row to work with */
                        var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0];
                        if ( !HeaderRow ) {
                                continue;
                        }
                        var Header = HeaderRow.getElementsByTagName( 'th' )[0];
                        if ( !Header ) {
                                continue;
                        }
 
                        NavigationBoxes[tableIndex] = Tables[i];
                        Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );
 
                        var Button = document.createElement( 'span' );
                        var ButtonLink = document.createElement( 'a' );
                        var ButtonText = document.createTextNode( collapseCaption );
 
                        Button.className = 'collapseButton'; // Styles are declared in [[MediaWiki:Common.css]]
 
                        ButtonLink.style.color = Header.style.color;
                        ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
                        ButtonLink.setAttribute( 'href', "javascript:collapseTable(" + tableIndex + ");" );
                        ButtonLink.appendChild( ButtonText );
 
                        Button.appendChild( document.createTextNode( '[' ) );
                        Button.appendChild( ButtonLink );
                        Button.appendChild( document.createTextNode( ']' ) );
 
                        Header.insertBefore( Button, Header.childNodes[0] );
                        tableIndex++;
                }
        }
 
        for ( var i = 0;  i < tableIndex; i++ ) {
                if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) {
                        collapseTable( i );
                } else if ( hasClass( NavigationBoxes[i], 'innercollapse' ) ) {
                        var element = NavigationBoxes[i];
                        while ( element = element.parentNode ) {
                                if ( hasClass( element, 'outercollapse' ) ) {
                                        collapseTable( i );
                                        break;
                                }
                        }
                }
        }
}
 
addOnloadHook( createCollapseButtons );
 
/** Test if an element has a certain class **************************************
 *
 * Description: Uses regular expressions and caching for better performance.
 * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
 */
 
var hasClass = ( function() {
        var reCache = {};
        return function( element, className ) {
                return ( reCache[className] ? reCache[className] : ( reCache[className] = new RegExp( "(?:\\s|^)" + className + "(?:\\s|$)" ) ) ).test( element.className );
        };
})();