/* Script Name: Full Featured Javascript Browser/OS detection Authors: Harald Hope, Tapio Markula, Websites: http://techpatterns.com/ http://www.nic.fi/~tapio1/Teaching/index1.php3 Script Source URI: http://techpatterns.com/downloads/javascript_browser_detection.php Version 4.2.1 Copyright (C) 03 March 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. Lesser GPL license text: http://www.gnu.org/licenses/lgpl.txt Coding conventions: http://cvs.sourceforge.net/viewcvs.py/phpbb/phpBB2/docs/codingstandards.htm?rev=1.3 */ /************************************************************* Full version, use it if you are pushing css to its functional limits, and/or are using specialized javascript. Remember, always use method or object testing as your first choice, for example, if ( dom ) { statement; }; This browser detection includes all possibilities I think for most browsers. Let me know if you find an error or a failure to properly detect, or if there is a relevant browser that has special needs for detection at our tech forum: http://techpatterns.com/forums/forum-11.html The main script is separated from the initial netscape 4 detection due to certain bugs in netscape 4 when it comes to unknown things like d.getElementById. The variable declarations of course are made first to make sure that all the variables are global through the page, otherwise a javascript error will occur because you are trying to use an undeclared variable. We test for both browser type (ie, op, or moz/netscape > 6) and version number, then place the version number into a variable which can be tested for < or > values, such as if (moz && nu> 1.1){....statement....;} This seems quite reliable, especially for Opera and Mozilla, where there is no other easy way to get the actual version number. For more in depth discussion of css and browser issues go to: http://www.nic.fi/~tapio1/Teaching/DynamicMenusb.php#detections http://www.nic.fi/~tapio1/Teaching/FAQ.php3 ***************************************************************/ //initialization, browser, os detection var d, dom, nu='', brow='', ie, ie4, ie5, ie5x, ie6, ie7, ie8; var ns4, moz, moz_rv_sub, release_date='', moz_brow, moz_brow_nu='', moz_brow_nu_sub='', rv_full=''; var mac, win, old, lin, ie5mac, ie5xwin, konq, saf, op, op4, op5, op6, op7; d=document; n=navigator; nav=n.appVersion; nan=n.appName; nua=n.userAgent; old=(nav.substring(0,1)<4); mac=(nav.indexOf('Mac')!=-1); win=( ( (nav.indexOf('Win')!=-1) || (nav.indexOf('NT')!=-1) ) && !mac)?true:false; lin=(nua.indexOf('Linux')!=-1); // begin primary dom/ns4 test // this is the most important test on the page if ( !document.layers ) { dom = ( d.getElementById ) ? d.getElementById : false; } else { dom = false; ns4 = true;// only netscape 4 supports document layers } // end main dom/ns4 test op=(nua.indexOf('Opera')!=-1); saf=(nua.indexOf('Safari')!=-1); konq=(!saf && (nua.indexOf('Konqueror')!=-1) ) ? true : false; moz=( (!saf && !konq ) && ( nua.indexOf('Gecko')!=-1 ) ) ? true : false; ie=((nua.indexOf('MSIE')!=-1)&&!op); if (op) { str_pos=nua.indexOf('Opera'); nu=nua.substr((str_pos+6),4); brow = 'Opera'; } else if (saf) { str_pos=nua.indexOf('Safari'); nu=nua.substr((str_pos+7),5); brow = 'Safari'; } else if (konq) { str_pos=nua.indexOf('Konqueror'); nu=nua.substr((str_pos+10),3); brow = 'Konqueror'; } // this part is complicated a bit, don't mess with it unless you understand regular expressions // note, for most comparisons that are practical, compare the 3 digit rv nubmer, that is the output // placed into 'nu'. else if (moz) { // regular expression pattern that will be used to extract main version/rv numbers pattern = /[(); \n]/; // moz type array, add to this if you need to moz_types = new Array( 'Firebird', 'Phoenix', 'Firefox', 'Galeon', 'K-Meleon', 'Camino', 'Epiphany', 'Netscape6', 'Netscape', 'MultiZilla', 'Gecko Debian', 'rv' ); rv_pos = nua.indexOf( 'rv' );// find 'rv' position in nua string rv_full = nua.substr( rv_pos + 3, 6 );// cut out maximum size it can be, eg: 1.8a2, 1.0.0 etc // search for occurance of any of characters in pattern, if found get position of that character rv_slice = ( rv_full.search( pattern ) != -1 ) ? rv_full.search( pattern ) : ''; //check to make sure there was a result, if not do nothing // otherwise slice out the part that you want if there is a slice position ( rv_slice ) ? rv_full = rv_full.substr( 0, rv_slice ) : ''; // this is the working id number, 3 digits, you'd use this for // number comparison, like if nu >= 1.3 do something nu = rv_full.substr( 0, 3 ); for (i=0; i < moz_types.length; i++) { if ( nua.indexOf( moz_types[i]) !=-1 ) { moz_brow = moz_types[i]; break; } } if ( moz_brow )// if it was found in the array { str_pos=nua.indexOf(moz_brow);// extract string position moz_brow_nu = nua.substr( (str_pos + moz_brow.length + 1 ) ,3);// slice out working number, 3 digit // if you got it, use it, else use nu moz_brow_nu = ( isNaN( moz_brow_nu ) ) ? moz_brow_nu = nu: moz_brow_nu; moz_brow_nu_sub = nua.substr( (str_pos + moz_brow.length + 1 ), 8); // this makes sure that it's only the id number sub_nu_slice = ( moz_brow_nu_sub.search( pattern ) != -1 ) ? moz_brow_nu_sub.search( pattern ) : ''; //check to make sure there was a result, if not do nothing ( sub_nu_slice ) ? moz_brow_nu_sub = moz_brow_nu_sub.substr( 0, sub_nu_slice ) : ''; } if ( moz_brow == 'Netscape6' ) { moz_brow = 'Netscape'; } else if ( moz_brow == 'rv' || moz_brow == '' )// default value if no other gecko name fit { moz_brow = 'Mozilla'; } if ( !moz_brow_nu )// use rv number if nothing else is available { moz_brow_nu = nu; moz_brow_nu_sub = nu; } if (n.productSub) { release_date = n.productSub; } } else if (ie) { str_pos=nua.indexOf('MSIE'); nu=nua.substr((str_pos+5),3); brow = 'Microsoft Internet Explorer'; } // default to navigator app name else { brow = nan; } op5=(op&&(nu.substring(0,1)==5)); op6=(op&&(nu.substring(0,1)==6)); op7=(op&&(nu.substring(0,1)==7)); ie4=(ie&&!dom); ie5=(ie&&(nu.substring(0,1)==5)); ie6=(ie&&(nu.substring(0,1)==6)); ie7=(ie&&(nu.substring(0,1)==7)); ie8=(ie&&(nu.substring(0,1)==8)); // default to get number from navigator app version. if(!nu) { nu = nav.substring(0,1); } /*ie5x tests only for functionavlity. dom or ie5x would be default settings. Opera will register true in this test if set to identify as IE 5*/ ie5x=(d.all&&dom); ie5mac=(mac&&ie5); ie5xwin=(win&&ie5x); ffmac=(mac&&moz); function browser_css( ) { d = document; //alert("nu: " + nu); //alert("rv: " + rv_full); if ( ie5mac ) { //alert("IE Mac"); d.write(''); d.write(''); } else if ( saf ) { //alert("Safari"); d.write(''); d.write(''); } else if ( document.layers ){ //alert("document.layers"); d.write(''); d.write(''); } else if ( ie4 ){ //alert("IE 4"); d.write(''); d.write(''); } else if ( ie6 ){ //alert("IE 6"); d.write(''); d.write(''); } else if ( ie7 ){ //alert("IE 7"); d.write(''); d.write(''); } else if ( ie8 ){ //alert("IE 8"); d.write(''); d.write(''); } else if ( op ){ //alert("Opera"); d.write(''); d.write(''); } else if ( moz && (nu> 1.7) ){ //alert("Mozilla-Firefox > 1.7"); d.write(''); d.write(''); } else if ( moz && (nu<1) ){ //alert("Mozilla-Firefox < 1"); d.write(''); d.write(''); } else if ( moz && (nu == 1.7) ){ //alert("ff MB"); d.write(''); d.write(''); } else if ( moz && (rv_full < 1.2) ){ //alert("Mozilla"); d.write(''); d.write(''); } else { //alert("IE"); d.write(''); d.write(''); } } function browser_ezt( ) { d = document; if ( ie5mac ) { d.write(''); } else if ( saf ) { d.write(''); } else if ( document.layers ){ d.write(''); } else if ( ie4 ){ d.write(''); } else if ( ie6 ){ d.write(''); } else if ( op ){ d.write(''); } else if ( moz && nu> 1.7 ){ d.write(''); } else if ( moz && ( nu < 1 ) ){ d.write(''); } else if ( moz ){ d.write(''); } else { d.write(''); } } // Abfrage des verwandten Browsers und Umwandlung Browserspezifischer // Aufrufe in Standardaufruf var ns4 = false; var NN6 = false; var IE = false; var Win = false; var Mac = false; if ((navigator.appName == "Netscape") && parseInt(navigator.appVersion) < 5) {ns4 = true;} if ((navigator.appName == "Netscape") && parseInt(navigator.appVersion) >= 5) {NN6 = true;} if (navigator.userAgent.indexOf("MSIE") > -1) {IE = true;} if (navigator.platform.indexOf("Win") > -1) {Win = true;} if (navigator.platform.indexOf("Mac") > -1) {Mac = true;} var NN = ns4 || NN6; function getElement(name) { if (parseInt(navigator.appVersion) >= 4 && IE) { return eval("document.all." + name + ".style"); } else if (ns4) { for (i = document.layers.length - 1; i >= 0; i--) { if (document.layers[i].name == name) { return eval("document.layers." + name); } else { for (h = document.layers[i].document.layers.length - 1; h >= 0; h--) { if (document.layers[i].document.layers[h].name == name) { return eval("document.layers["+ i +"].document.layers." + name); } else { for (g = document.layers[i].document.layers[h].document.layers.length - 1; g >= 0; g--) { if (document.layers[i].document.layers[h].document.layers[g].name == name) { return eval("document.layers["+ i +"].document.layers["+ h + "].document." + name); } } } } } } } else if (NN6) { return document.getElementById(name).style; } } function getElementPure(name) { if (parseInt(navigator.appVersion) >= 4 && IE) { return eval("document.all." + name); } else if (ns4) { for (i = document.layers.length - 1; i >= 0; i--) { if (document.layers[i].name == name) { return eval("document.layers." + name); } else { for (h = document.layers[i].document.layers.length - 1; h >= 0; h--) { if (document.layers[i].document.layers[h].name == name) { return eval("document.layers["+ i +"].document.layers." + name); } else { for (g = document.layers[i].document.layers[h].document.layers.length - 1; g >= 0; g--) { if (document.layers[i].document.layers[h].document.layers[g].name == name) { return eval("document.layers["+ i +"].document.layers["+ h + "].document.layers." + name); } } } } } } } else if (NN6) { return document.getElementById(name); } } speed = 5; initPos = 0; bottomStop = -4; topStop = -250; var scrollInterval = 0; function aus(){ speed = 5; //clearInterval(parseInt(scroll)); clearInterval(scrollInterval); } function an(move){ move2 = move*speed; scrollInterval = setInterval('scroll(move2)',50); } function scrollDif(direction, diff) { topStop = getHeight(); topStop = (topStop - diff) * -1; an(direction); } function scroll(richtung){ if ((initPos>topStop) && (initPos=bottomStop) initPos = bottomStop-1; } function getHeight() { myHeight = 0; if(NN6) {myHeight = document.getElementById("scroller").offsetHeight;} if(ns4) {myHeight = document.layers["scrollerDiv"].document.layers["scroller"].document.height;} if(ie) {myHeight = document.all["scroller"].offsetHeight;} else {myHeight = document.getElementById("scroller").offsetHeight;} //else {myHeight = document.all["scroller"].offsetHeight;} return myHeight; } function getWinHeight() { var myWinWidth = 0, myWinHeight = 0; if( typeof( window.innerWidth ) == 'number' ) { //Non-IE myWinWidth = window.innerWidth; myWinHeight = window.innerHeight; } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { //IE 6+ in 'standards compliant mode' myWinWidth = document.documentElement.clientWidth; myWinHeight = document.documentElement.clientHeight; } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { //IE 4 compatible myWinWidth = document.body.clientWidth; myWinHeight = document.body.clientHeight; } return myWinHeight; } function getPicPos() { var picPos = 0; //picPos = (getHeight() + 30) (wenn man den letzten strich noch sehen will); if (getHeight()<= getSpace()) { picPos = (getHeight() + 29); if (IE) { return (picPos -1); } else { return picPos; } } else { picPos = getWinHeight() - 208; return picPos; } } function getSpace() { var space = 0; space = getWinHeight() - 238; return space; } function getEndPos() { var endPos = 0; //endPos = getPicPos() - 26 (wenn man den letzten strich noch sehen will); if (IE) { endPos = getPicPos() - 24; return endPos; } else { endPos = getPicPos() - 25; return endPos; } } function NewWindow(URL, fenstername, w, h, scroll, bar) { var winlinks = (screen.width - w) / 2; var winoben = (screen.height - h) / 2 -100; winprobs = 'height='+h+',width='+w+',top='+winoben+',left='+winlinks+',scrollbars='+scroll+',status='+bar+',resizable=no'; win = window.open(URL,fenstername,winprobs); if (parseInt(navigator.appVersion) >= 4) { win.window.focus(); } } function gotoUrl(url) { window.top.location = url; } function gotoSelectBoxValue(selectBoxId) { var selectBox = document.getElementById(selectBoxId); var url = selectBox.options[selectBox.selectedIndex].value; gotoUrl(url); } function conditionalGotoSelectBoxValue(selectBoxId, valueToCheck, checkForUnequality) { if (valueToCheck != checkForUnequality) { var selectBox = document.getElementById(selectBoxId); var url = selectBox.options[selectBox.selectedIndex].value; gotoUrl(url); } } function setFocus(elementId) { document.getElementById(elementId).focus(); } function show(elLayer) { if(document.getElementById(elLayer)) { if(document.getElementById(elLayer).style.visibility == "visible") { shownot(elLayer); } else { document.getElementById(elLayer).style.visibility = "visible"; } } } function shownot(elLayer) { if(document.getElementById(elLayer)) document.getElementById(elLayer).style.visibility = "hidden"; } function validateEmailAddress(valueToValidate) { var regex = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/; return regex.test(valueToValidate); } function setClassOnInvalidEmailAddress(valueToValidate, elementId, classNameValue) { var regex = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/; if (!validateEmailAddress(valueToValidate)) { document.getElementById(elementId).className = classNameValue; } else { document.getElementById(elementId).className = ''; } } // Bild austauschen function MM_openBrWindow(theURL,winName,features) { //v2.0 window.open(theURL,winName,features); } function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i