function BrowserObject() {
this.capabilitiesDetected = false;
this.hasJscript = false;
this.hasActiveX = false;
this.isDOMCapable = false;
this.isAJAXCapable = false;
this.name = navigator.appName; 
this.uaName = navigator.appName;
this.OS = navigator.platform;
this.userAgent = navigator.userAgent;
var rawVersion = navigator.appVersion;
this.appVersion = parseInt(rawVersion);
this.version = parseInt(rawVersion);
var isIE = false; 
/*@cc_on @*/
/*@if (@_jscript_version >= 1.0) 
isIE = true;
@end @*/
if ( isIE ) { 
this.name = "Internet Explorer";
this.hasJscript = true;
this.capabilitiesDetected = true;
/*@cc_on @*/
/*@if (@_jscript_version >= 1.0) 
this.version = 3.0;
@end @*/
/*@if (@_jscript_version >= 3.0) 
this.version = 4.0;
@end @*/
/*@if (@_jscript_version >= 5.0) 
this.version = 5.0;
@end @*/
/*@if (@_jscript_version >= 5.1) 
this.version = 5.1;
@end @*/
/*@if (@_jscript_version >= 5.5) 
this.version = 5.5;
@end @*/
/*@if (@_jscript_version >= 5.6) 
this.version = 6.0;
@end @*/
if ( ( this.version == 6.0 ) && window.XMLHttpRequest ) {
this.version = 7;
}
if ( window.ActiveXObject ) {
this.hasActiveX = true;
this.isAJAXCapable = true; 
}
if ( this.version >= 5.0 ) {
this.isDOMCapable = true;
}
} else if ( document.layers ) {
this.name = "Netscape Navigator";
this.version = 4;
this.capabilitiesDetected = true; 
} else if ( window.opera || document.all ) {
this.name = "Opera";
this.version = 4; 
if ( window.opera ) {
this.capabilitiesDetected = true; 
this.version = 5;
if ( window.print && window.opera.buildNumber ) {
this.version = 6;
}
if ( document.implementation && document.implementation.createDocument ) {
this.version = 7;
}
if ( window.XMLHttpRequest && document.createProcessingInstruction && document.createCDATASection ) {
this.version = 8;
this.isAJAXCapable = true;
}
if ( HTMLBaseElement && window.opera.version ) {
this.version = 9;
}
if ( this.version >= 7.0 ) {
this.isDOMCapable = true;
}
}
} else if ( document.getElementById && ! document.all 
&& document.childNodes && ! navigator.taintEnabled 
&& navigator.vendor && ( navigator.vendor == "Apple Computer, Inc." ) ) {
this.name = "Safari"; 
this.version = 3;
this.isDOMCapable = true;
this.capabilitiesDetected = true;
} else if ( document.getElementById && ! document.all 
&& document.childNodes && ! navigator.taintEnabled 
&& navigator.vendor && ( navigator.vendor.toUpperCase() == "KDE" ) ) {
this.name = "Konqueror"; 
this.version = 3;
this.isDOMCapable = true;
this.capabilitiesDetected = true;
} else if ( navigator.product && ( navigator.product == "Gecko" ) ) { 
this.name = "Gecko";
this.version = 5; 
this.capabilitiesDetected = true;
if ( document.getElementById && document.implementation ) {
this.isDOMCapable = true;
}
if ( window.XMLHttpRequest ) {
this.isAJAXCapable = true;
}
}
if ( window.XMLHttpRequest ) {
this.isAJAXCapable = true;
}
var names = new Array("msie", "opera", "gecko", "netscape", 
"firefox", "konqueror", "safari", "omniweb");
var browser = new Array("Internet Explorer", "Opera", "Gecko", "Netscape", 
"Firefox", "Konqueror", "Safari", "Omniweb");
var uaName = "";
var idx = -1;
var uaString = this.userAgent.toLowerCase();
for ( var i = 0; i < names.length; i++) {
if ( uaString.indexOf(names[i]) != -1 ) {
uaName = ( uaName == "" ) ? browser[i] : uaName + " / " + browser[i];
idx = uaString.indexOf(names[i]) + names[i].length + 1;
}
}
this.uaName = uaName; 
this.appVersion = ( idx != -1 ) ? parseFloat(this.userAgent.substring(idx)) : this.appVersion;
}
var WebBrowser = new BrowserObject();
WebBrowser.scriptLocation = "";
WebBrowser.onLoadEventStack = new Array();
WebBrowser.addOnLoad = function(fn) { WebBrowser.onLoadEventStack.push(fn); }
WebBrowser.includeStack = new Array();
WebBrowser.scriptLoadStack = new Array(); 
WebBrowser.include = function(script) {
if ( ! script ) { return; } 
var exists = false;
var scriptName = "WebBrowser" + script.toUpperCase() + ".js";
for ( var i = 0; i < WebBrowser.includeStack.length; i+=1 ) { 
if( WebBrowser.includeStack[i] == scriptName) { exists = true; break; }
}
if ( ! exists ) {
WebBrowser.includeStack.push(scriptName);
var wsn = {"name": scriptName, "loaded": false };
WebBrowser.scriptLoadStack.push(wsn);
}
}
WebBrowser.events = {
eventObj: "",
addEvent: function(obj, eventType, fn, capture) {
if ( window.attachEvent && ! window.addEventListener ) {
var result = obj.attachEvent("on" + eventType, fn);
if ( ! result ) {
throw("Event " + eventType + " could not be added!");
}
} else if ( window.addEventListener ) {
obj.addEventListener(eventType, fn, capture);
}
},
removeEvent: function(obj, eventType, fn, capture) {
if ( window.detachEvent && ! window.removeEventListener ) {
var result = obj.detachEvent('on' + eventType, fn);
if ( ! result ) {
throw("Event on" + eventType + " could not be removed!");
}
} else if ( window.removeEventListener ) {
obj.removeEventListener(eventType, fn, capture);
}
},
getEvent: function(evt) {
this.eventObj = ( window.event ) ? window.event : evt;
return this.eventObj;
},
getTarget: function() {
if ( this.eventObj.srcElement ) {
return this.eventObj.srcElement;
} else if ( this.eventObj.target ) {
return this.eventObj.target;
}
}, 
getEventPosX: function() {
if ( this.eventObj.pageX ) {
return this.eventObj.pageX;
} else if ( this.eventObj.clientX ) {
return this.eventObj.clientX;
}
return 0;   
}, 
getEventPosY: function() {
if ( this.eventObj.pageY ) {
return this.eventObj.pageY;
} else if ( this.eventObj.clientY ) {
return this.eventObj.clientY;
}
return 0;   
}
}; 
WebBrowser.doOnLoad = function() {
var scripts = document.getElementsByTagName("script");
if ( scripts ) {
var slen = scripts.length;
for ( var x = 0; x < slen; x+=1 ) {
var scriptLoc = scripts[x].src;
if ( scriptLoc.indexOf("WebBrowser.js") != -1 ) {
WebBrowser.scriptLocation = scriptLoc.replace("WebBrowser.js", "");
break;
}
}
}
var bodyEle = document.body; 
var index = 0;
var max = (+WebBrowser.includeStack.length) - 1;
var loadScripts = function() { 
var ele = document.createElement("script");
if ( ele && bodyEle ) { 
ele.type = "text/javascript";
ele.src = WebBrowser.scriptLocation + WebBrowser.includeStack[index];
bodyEle.appendChild(ele);
var callFunction = function(element, fnToCall, idx) {
if ( window.addEventListener ) { 
element.onload = fnToCall; 
var scriptLoaded = WebBrowser.scriptLoadStack[idx];
scriptLoaded.loaded = true;
WebBrowser.scriptLoadStack[idx] = scriptLoaded;    
} else {
element.onreadystatechange = function() { 
var scriptLoaded = WebBrowser.scriptLoadStack[idx];
if (this.readyState == "complete" || this.readyState == "loaded") { 
if ( ! scriptLoaded.loaded ) { fnToCall(); } 
scriptLoaded.loaded = true;
WebBrowser.scriptLoadStack[idx] = scriptLoaded;     
} 
}
}
}
if ( index < max ) { 
callFunction(ele, loadScripts, index);
index += 1; 
} else {
var completeScripts = function() {
var stackSize = WebBrowser.onLoadEventStack.length;
for ( var s =0; s < stackSize; s+=1 ) { 
var olFN = WebBrowser.onLoadEventStack[s];
if ( olFN && (typeof olFN).toLowerCase() == 'function' ) { olFN(); }
}
}
callFunction(ele, completeScripts, index);
}
}
}
loadScripts();
}
WebBrowser.screen = {
maxx: window.innerWidth
|| ( document.documentElement && document.documentElement.clientWidth )
|| ( document.documentElement && document.documentElement.offsetWidth )
|| ( document.body && document.body.clientWidth )
|| ( document.body && document.body.offsetWidth ) || 0,
maxy: window.innerHeight
|| ( document.documentElement && document.documentElement.clientHeight )
|| ( document.documentElement && document.documentElement.offsetHeight )
|| ( document.body && document.body.clientHeight )
|| ( document.body && document.body.offsetHeight ) || 0
}; 
WebBrowser.css = {
addCSSClass: function(obj, cls) {
var cssCls = obj.className;
if ( cssCls.indexOf(cls) == -1 ) { 
obj.className += " " + cls;
}
},
removeCSSClass: function(obj, cls) {
var cssClasses = obj.className.split(" ");
var ridx = -1;
for ( var i = 0; i < cssClasses.length; i+=1 ) { if ( cssClasses[i] == cls ) { ridx = i; break; } }
if ( ridx == -1 ) { return; }
cssClasses.splice(i, 1);
obj.className = cssClasses.join(" ");
},
changeCSSClass: function(obj, ocls, ncls) {
WebBrowser.css.removeCSSClass(obj, ocls);
WebBrowser.css.addCSSClass(obj, ncls);
},
containsCSSClass: function(element, cssClass) {
var eObj = element;
var tObj = typeof element;
if ( tObj.toLowerCase() == 'string' ) {
eObj = document.getElementById(element);
if ( eobj ) { tObj = typeof eObj; }
}
if ( tObj.toLowerCase() == 'object' ) {
var cssClasses = eObj.className.split(" ");
for ( var i = 0; i < cssClasses.length; i+=1 ) { if ( cssClasses[i] == cssClass ) { return true; } } 
}
return false;
},   
getComputedStyle: function(el, styleProp) {
var x = document.getElementById(el);
if ( ! x ) { return ''; } 
if (x.currentStyle) {
var y = x.currentStyle[styleProp];
} else if (window.getComputedStyle) {
var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
}
return y;    
} 
};
WebBrowser.dom = { 
createOrGetElement: function(type, id, parent, options) {
var obj = null; 
if ( id ) { obj = document.getElementById(id); }
if ( ! obj && type ) { 
obj = document.createElement(type);
if ( obj && id ) {
obj.id = id;
}
if ( obj && parent ) {
parent.appendChild(obj);
}
}
if ( obj && options ) { 
for ( var optn in options ) {
obj[optn] = options[optn];
} 
}
return obj;
},
getElementsByTagNameAndClassName: function(type, cssClass, parentObj) {
if ( ! parentObj ) { parentObj = document; }
var tags = parentObj.getElementsByTagName(type);
var tags = document.getElementsByTagName(type);
var collection = new Array();
if ( tags ) {
var tlen = tags.length;
for ( var t = 0; t < tlen; t+=1 ) {
if ( WebBrowser.css.containsCSSClass(tags[t], cssClass) ) {
collection.push(tags[t]);
}
}
}
return collection;
},
setContent: function(ele, content) {
var toc = typeof(content); toc = toc.toLowerCase();
if ( ele ) {
ele.innerHTML = content;
} else {
throw("Could not set content on element!");
}
},
findParentNamed: function(objRef, parentType) {
if ( ! objRef || ! parentType ) { return objRef; }
var name = new String(objRef.nodeName);
if ( name.toUpperCase() == parentType.toUpperCase() ) { return objRef; }
return WebBrowser.dom.findParentNamed(objRef.parentNode, parentType);
},
findParentByClassName: function(objRef, parentType, parentClassName) {
if ( ! objRef || ! parentType ) { return objRef; }
var name = new String(objRef.nodeName);
if ( name.toUpperCase() == parentType.toUpperCase() && WebBrowser.css.containsCSSClass(objRef, parentClassName) ) { return objRef; }
return WebBrowser.dom.findParentByClassName(objRef.parentNode, parentType, parentClassName);
},
getTextFieldCursorPosition: function( obj ) {
if ( obj.type != "text" ) {
return -1;        
}
if ( document.selection ) {
var textFieldRange = document.selection.createRange();
var bookmark = textFieldRange.getBookmark().charCodeAt(2) - 2;
return bookmark;
} else if ( obj.selectionStart && obj.selectionEnd ) {
return obj.selectionStart;
} else {
return 0;
}
},
setTextFieldCursorPosition: function(obj, pos) {
if ( obj.type != "text" ) {
return;
}
if ( obj.createTextRange ) {
var textFieldRange = obj.createTextRange();
textFieldRange.collapse(true);
textFieldRange.moveStart("character", pos);
textFieldRange.select();
} else if ( obj.selectionStart ) {
obj.selectionStart = pos;
obj.selectionEnd = pos;
} else {
throw ("Unsupported browser!");
}
obj.focus();
} 
};
WebBrowser.include("dragndrop");
WebBrowser.events.addEvent(window, 'load', WebBrowser.doOnLoad, false); 
