/** class nriClientInfo (ver. 0.1.0)
 ** -------------------
 ** Browser/agent detection class. Requires nriError.js
 **
 ** Stephen Paschall, Jan. 2005
 ** Copyright 2005 - The Greensboro News & Record 
 **                  and Landmark Communications, Inc.
 **                  200 E. Market Street
 **                  Greensboro, NC 27401
 **
 ** Contact webmaster@news-record.com for additional
 ** information.
*/

nriClient = function() {
    nriClient._splitUAString();
    nriClient._identifyOS();
    nriClient._identifyClient();
    nriClient._identifyMajorVersion();
}

// set a few constants
nriClient._CLIENT_UNKNOWN = 0;
nriClient._INTERNET_EXPLORER = 10;
nriClient._WEBTV = 12;
nriClient._NETSCAPE_NAVIGATOR = 20;
nriClient._GECKO = 30;
nriClient._FIREFOX = 32;
nriClient._MOZILLA = 34;
nriClient._CAMINO = 36;
nriClient._OPERA = 40;
nriClient._KHTML = 50;
nriClient._KONQUEROR = 52;
nriClient._SAFARI = 54;

nriClient._OSUNKNOWN = 0;
nriClient._OSWIN16 = 1;
nriClient._OSWIN31 = 2;
nriClient._OSWINNT = 4;
nriClient._OSWIN32 = 10;
nriClient._OSWIN9X = 12;
nriClient._OSWINNT4 = 14;
nriClient._OSWINNT5 = 16;
nriClient._OSMAC = 20;
nriClient._OSMACX = 22;
nriClient._OSxNIX = 30;
nriClient._OSSOLARIS = 32;
nriClient._OSLINUX = 34;
nriClient._OSHPUX = 36;
nriClient._OSMOBILE = 80;
nriClient._OSWINCE = 82;

nriClient._onload_funcs = new Array();
nriClient.loaded = false;

// if non-zero, assume that unidentified clients support
// the W3C's Document Object Model (DOM); if FALSE,
// assume unidentified clients are DOM-challenged. The
// integer you use here defines the default DOM Level
// assumed for unrecognized clients
nriClient._DOM_DEFAULT = 1;

nriClient._ua = new String( navigator.userAgent );
nriClient._uaparts = new Array();
nriClient._uaseps = new String("()[];");
nriClient._os = -1;
nriClient._client = -1;
nriClient._major = -1;
nriClient._minor = -1;

nriClient._splitUAString = function() {
    if ( nriClient._uaparts.length ) return;
    
    var elemIdx = 0;
    var cstr = new String();
    var cchar = new String();
    
    for (var i = 0; i < nriClient._ua.length; i++) {
        cchar = nriClient._ua.charAt(i);
        
        if ( nriClient._uaseps.indexOf(cchar) >= 0 ) {
            nriClient._uaparts[ elemIdx ] = cstr;
            cstr = new String();
            elemIdx++;
            continue;
        }
        else {
            if ( (cstr.length > 0) || (cchar != " ") ) cstr += cchar;
        }
    }
}

nriClient._identifyOS = function() {
    if (nriClient._os >= 0) return nriClient._os;
    
    var p = navigator.platform;
    var tos = nriClient._OSUNKNOWN;
    
    if ( p ) {
        tos = (p == 'WinNT') ? nriClient._identifyWin32() :
              (p == 'Win32') ? nriClient._identifyWin32() :
              (p == 'Win98') ? nriClient._OSWIN9X:
              (p == 'Win95') ? nriClient._OSWIN9X :
              (p == 'MacPPC') ? nriClient._identifyMacOS() :
              (p == 'Mac68K') ? nriClient._OSMAC :
              (p == 'SunOS') ? nriClient._OSSOLARIS :
              (p == 'HP-UX') ? nriClient._OSHPUX :
              (p == 'Win16') ? nriClient._OSWIN16 :
              (p == 'WinCE') ? nriClient._OSWINCE :
              nriClient._OSUNKNOWN;
    }
    else {
        tos = nriClient._identifyWin32();
        if (tos < 0) tos = nriClient._identifyMacOS();
        if (tos < 0) tos = nriClient._OSUNKNOWN;
    }
    
    nriClient._os = tos;
    return nriClient._os;
}

nriClient._identifyWin32 = function() {
    if ( nriClient._ua.indexOf('Win9') >= 0 || nriClient._ua.indexOf('Windows 9') >= 0 ) return nriClient._OSWIN9X;
    if ( nriClient._ua.indexOf('WinNT 4') >= 0 || nriClient._ua.indexOf('Windows NT 4') >= 0) return nriClient._OSWINNT4;
    if ( nriClient._ua.indexOf('WinNT 5') >= 0 || nriClient._ua.indexOf('Windows NT 5') >= 0 ) return nriClient._OSWINNT5;

    return -1;
}

nriClient._identifyMacOS = function () {
    return nriClient._OSMAC;
}

nriClient._identifyClient = function() {
    if (nriClient._client >= 0) return nriClient._client;
    
    nriClient._client = ( nriClient._ua.indexOf('Gecko/') >= 0 ) ? nriClient._GECKO :
                        ( nriClient._ua.indexOf('Opera') >= 0 ) ? nriClient._OPERA :
                        ( nriClient._ua.indexOf('Konqueror/') >= 0 ) ? nriClient._KONQUEROR :
                        ( nriClient._ua.indexOf('Safari/') >= 0 ) ? nriClient._SAFARI :
                        ( nriClient._ua.indexOf('WebTV/') >= 0 ) ? nriClient._WEBTV :
                        ( nriClient._ua.indexOf('MSIE') >= 0 ) ? nriClient._INTERNET_EXPLORER :
                        nriClient._CLIENT_UNKNOWN;
                        
    return nriClient._client;                        
}

nriClient._identifyMajorVersion = function() {
    if (nriClient._major >= 0 && nriClient._minor >= 0) return nriClient._major;
    
    if (! nriClient._client ) nriClient._identifyClient();
    
    var vStart = -1;
    var vmStart = -1;
    var vEnd = -1;
    
    switch ( nriClient._client ) {
        case nriClient._GECKO: {
            nriClient._getVersion('Gecko/',0);
            break;
        }
        case nriClient._OPERA: {
            nriClient._getVersion('Opera',1);
            break;
        }
        case nriClient._KONQUEROR: {
            nriClient._getVersion('Konqueror/',0);
            break;
        }
        case nriClient._SAFARI: {
            nriClient._getVersion('Safari/',0);
            break;
        }
        case nriClient._INTERNET_EXPLORER: {
            nriClient._getVersion('MSIE ',0);
            break;
        }
        default: {
            nriClient._getVersion('Mozilla/',0);
        }
    }
    
    return nriClient._major;
}

nriClient._identifyMinorVersion = function() {
    if (nriClient._minor >= 0) return nriClient._minor;
    else nriClient._identifyMajorVersion();

    return nriClient._minor;
}

// nriClient._getVersion(searchText,separatorCount)
nriClient._getVersion = function(s,sepcnt) {
    var srch = new String(s);
    var vStart = nriClient._ua.indexOf(srch) + srch.length + sepcnt;
    var vmStart = nriClient._ua.indexOf('.',vStart) + 1;
    var ve1 = -1;
    var ve2 = -1;
    var vEnd = -1;
        
    if (vmStart < vStart) {
        ve1 = nriClient._ua.indexOf(';',vStart);
        ve2 = nriClient._ua.indexOf(' ',vStart);
        
        if (ve2 < 0) ve2 = nriClient._ua.length;
        if (ve1 < 0) ve1 = ve2;
        
        vEnd = (ve1 < ve2)? ve1 : ve2;
    }
    else {
        ve1 = nriClient._ua.indexOf(';',vmStart);
        ve2 = nriClient._ua.indexOf(' ',vmStart);
        
        if (ve2 < 0) ve2 = nriClient._ua.length;
        if (ve1 < 0) ve1 = ve2;
        
        vEnd = (ve1 < ve2)? ve1 : ve2;
    }
    
    if (vStart < (srch.length + sepcnt) ) {
        nriClient._major = 0;
        nriClient._minor = 0;
        return;            
    }
    
    if (vEnd < 0) vEnd = nriClient._ua.length;
    
    if (vmStart < vStart) {
        nriClient._major = parseInt( nriClient._ua.substr(vStart,(vEnd-vStart)) );
        nriClient._minor = 0;
    }
    else {
        nriClient._major = parseInt( nriClient._ua.substr(vStart,(vmStart-vStart-1)) );
        nriClient._minor = parseInt( nriClient._ua.substr(vmStart,(vEnd-vmStart)) );
    }
}

/** is client DOM-aware?
*/
nriClient.prototype._dom = -1;
nriClient.prototype.supportsDOM = function() {
    // if we've already cached the client's
    // DOM support, return it
    if ( this._dom >= 0 ) return this._dom;
    
    switch ( this.clientApp ) {
        /** INTERNET EXPLORER **/
        case nriClient._INTERNET_EXPLORER: {
            switch ( this.clientOS ) {
                case nriClient._OSMAC: {
                    /*if ( this.verAtLeast(5,0) ) this._dom = 1;
                    else*/ this._dom = 0;
                    break;
                }
                case nriClient._OSWIN9X:
                case nriClient._OSWINNT:
                case nriClient._OSWINXP:
                case nriClient._OSWINXP2: {
                    if ( this.verBetterThan(5,0) )
                        this._dom = 1;
                    break;
                }
                default: {
                    this._dom = nriClient._DOM_DEFAULT;
                }
            }
            break;
        }
        /** PRE-GECKO NETSCAPE NAVIGATOR **/
        case nriClient._NETSCAPE_NAVIGATOR: {
            this._dom = 0;
            break;
        }
        /** GECKO-BASED CLIENTS **/
        case nriClient._GECKO: {
            this._dom = 1;
            break;
        }
        /** DEFAULT **/
        default: {
            this._dom = nriClient._DOM_DEFAULT;
        }
    }
    
    return this._dom;
}

nriClient.prototype.os = function() {
    return nriClient._identifyOS();
}

nriClient.prototype.client = function() {
    return nriClient._idenitfyClient();
}

nriClient.prototype.major = function() {
    return nriClient._identifyMajorVersion();
}

nriClient.prototype.minor = function() {
    return nriClient._identifyMinorVersion();
}

nriClient.prototype.verAtLeast = function(major,minor) {
    if ( this.clientMajorVersion > major
         || (this.clientMajorVersion == major
             && this.clientMinorVersion >= minor )
    ) return true;
    else return false;
}

nriClient.prototype.verBetterThan = function(major,minor) {
    if ( this.clientMajorVersion > major
         || (this.clientMajorVersion == major
             && this.clientMinorVersion > minor )
    ) return true;
    else return false;
}

/** Methods of convenience...
*/
nriClient.prototype.isWin32 = function() {
    if ( Math.floor( nriClient._os / 10 ) == Math.floor( nriClient._OSWIN32 / 10 ) )
        return true;
    else return false;
}

nriClient.prototype.isIE = function() {
    if ( nriClient._client == nriClient._INTERNET_EXPLORER ) return true;
    else return false;
}

nriClient.prototype.isNav = function() {
    if ( nriClient._client == nriClient._NETSCAPE_NAVIGATOR ) return true;
    else return false;
}

nriClient.prototype.isGecko = function() {
    if ( Math.floor( nriClient._client / 10 ) == Math.floor(nriClient._GECKO / 10)) return true;
    else return false;
}

nriClient.prototype.isOpera = function() {
    if ( nriClient._client == nriClient._OPERA ) return true;
    else return false;
}

nriClient.prototype.isKonqueror = function() {
    if ( nriClient._client == nriClient._KONQUEROR ) return true;
    else return false;
}

nriClient.prototype.isSafari = function() {
    if ( nriClient._client == nriClient._SAFARI ) return true;
    else return false;
}

nriClient.prototype.iskHTML = function() {
    if ( Math.floor( nriClient._client / 10 ) == Math.floor(nriClient._KHTML / 10)) return true;
    else return false;
}

/** Cookie handling
*/
nriClient.getCookie = function( cname ) {
	cname +="=";
	var retval = "";
	var cstart;
	var cend;
	
	if (document.cookie.length > 0) {
		cstart = document.cookie.indexOf(cname);
		if (cstart > -1) {
			cstart += cname.length;
			cend = document.cookie.indexOf(';',cstart);
			if (cend == -1) {
				cend = document.cookie.length;
			}
			retval = unescape(document.cookie.substring(cstart,cend));
		}
	}
	
	return retval;
}

nriClient.setCookie = function( cname, cval, lifetime ) {
	var cset = cname+"="+cval;
	var dows = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	var mons = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	
	if (lifetime) {
		var cdate = new Date();
		cdate.setTime(cdate.getTime() + (cdate.getTimezoneOffset() * 60000) + (lifetime * 1000));
		var cyear = "" + cdate.getYear();
		var cdom = "0" + cdate.getDate();
		var chour = "0" + cdate.getHours();
		var cmin = "0" + cdate.getMinutes();
		var csec = "0" + cdate.getSeconds();
		
		cyear = cyear.substr((cyear.length-2),2);
		cdate = dows[cdate.getDay()] + ", " + cdom.substr(cdom.length-2,2) + "-" + mons[cdate.getMonth()] + "-" + cyear + " " + chour.substr(chour.length-2,2) + ":" + cmin.substr(cmin.length-2,2) + ":" + csec.substr(csec.length-2,2) + " GMT";
		cset += ";EXPIRES="+cdate;
	}
	
	cset += ";PATH=/"
	document.cookie = cset;
	return true;
}

nriClient.deleteCookie = function( cname ) {
	//var cval = get_cookie( cname );
	document.cookie=cname+"=;Path=/";
	//return cval;
	return true;
}

nriClient.Reg_OnLoad_Func = function( callbkf )
{
	nriClient._onload_funcs[ nriClient._onload_funcs.length ] = callbkf;
	return true;
}

nriClient._OnLoad_Hndlr = function()
{
	for (var i = 0; i < nriClient._onload_funcs.length; i++)
	{
		if ( typeof( nriClient._onload_funcs[i] ) == 'function' )
			nriClient._onload_funcs[i]();
	}
	
	nriClient.loaded = true;
	
	return true;
}

nriClient.AlgnDivs = function( divarr )
{
	var odivs = new Array();
	
	// adapted from http://www.devarticles.com/c/a/Web-Design-Standards/Matching-div-heights-with-CSS-and-JavaScript/3/
	var contDivs,maxHeight,divHeight,d;

    contDivs=new Array();
    maxHeight=0; // init
	
	for (var i = 0; i < divarr.length; i++)
	{
		var tdiv = document.getElementById( divarr[i] );
		if ( tdiv ) odivs[ odivs.length ] = tdiv;
	}

	for(var i=0;i<odivs.length;i++){
		d=odivs[i];
		
		if(d.offsetHeight) divHeight=d.offsetHeight;
		else if(d.style.pixelHeight) divHeight=d.style.pixelHeight;
		
		maxHeight=Math.max(maxHeight,divHeight);
	}
	
	for(var i=0;i<odivs.length;i++)
	{
			odivs[i].style.height=maxHeight+"px"; // for ie 5.5,6
			odivs[i].setAttribute("style","height: auto; min-height:"+maxHeight+"px;"); // for DOM-compliant browsers
	}
}
	
nriClient.Reg_OnLoad_Func( window.onload );
window.onload = nriClient._OnLoad_Hndlr;