// Copyright (c) 2003, 2004 Four J's Development Tools.
// All Rights Reserved.
// Note that the modification of this file is not supported.
// For customizing with your own javascript and cascading style sheets
// please read the product documentation.
//
// $Id: webBrowser.js,v 1.141.4.1 2007/10/29 14:45:01 jch Exp $
/****************************************************************************/
var g_IsGecko = navigator.userAgent.indexOf('Gecko') != -1;
var g_IsIe = navigator.userAgent.indexOf('MSIE') != -1;
function gIeVer() {
var itb = navigator.userAgent.indexOf('MSIE ') + 5;
return Number( navigator.userAgent.substr( itb, navigator.userAgent.indexOf( ';', itb ) - itb ) );
}
function gIsPlatform( p ) {
return navigator.platform.toLowerCase().indexOf(p) >= 0;
}
var g_KeyEvent = g_IsIe?'keydown':'keypress';
function gCreateElement( eName, attrList ) {
var elt = document.createElement( ( attrList && g_IsIe && attrList['name'] ) ? '<'+eName+' name="'+attrList['name']+'">' : eName );
attrList && gSetAttributes( elt, attrList );
return elt;
}
function gMakeUnselectable( element, set ) {
if ( g_IsIe ) {
gSetEvent( element, 'selectstart', gEventHandled, set );
return;
}
if ( g_IsGecko ) {
element.style.MozUserSelect = set?'none':'';
return;
}
}
function gPageX(o) {
return o.offsetLeft + (o.offsetParent ? gPageX(o.offsetParent) : 0);
}
function gPageY(o) {
return o.offsetTop + (o.offsetParent ? gPageY(o.offsetParent) : 0);
}
function gBrowserX(o) {
return o.offsetLeft + (o.offsetParent ? gBrowserX(o.offsetParent) : 0) - o.scrollLeft;
}
function gBrowserY(o) {
return o.offsetTop + (o.offsetParent ? gBrowserY(o.offsetParent) : 0) - o.scrollTop;
}
function gStdEvent( elt ) {
if ( window.event ) {
var event = window.event;
} else {
var e = elt;
while ( !e.parentWindow )
e = e.parentNode;
var event = e.parentWindow.event;
}
event.target = event.srcElement;
event.currentTarget = elt;
event.charCode = gIsPrintable(event.keyCode) ? event.keyCode : undefined;
if ( event.target ) {
event.pageX = gPageX(event.target) + event.offsetX;
event.pageY = gPageY(event.target) + event.offsetY;
event.layerX = event.offsetX;
event.layerY = event.offsetY;
}
return event;
}
function gAddEvent( elt, ev, fn ) {
elt._evFn || (elt._evFn = {});
var eva = elt._evFn[ev] || (elt._evFn[ev] = []);
var _this = this;
if ( g_IsIe ) {
var ef = function() { return fn.call( _this, gStdEvent(elt) ) }
ef.fn = fn;
eva.push(ef);
return elt.attachEvent( 'on' + ev, ef );
} else {
var ef = function(e) { return fn.call( _this, e ) };
ef.fn = fn;
eva.push(ef);
return elt.addEventListener( ev, ef, false );
}
}
function gHasEvent( elt, ev, fn ) {
if ( elt._evFn && elt._evFn[ev] ) {
var fList = elt._evFn[ev];
for( var i in fList )
if ( fList[i].fn === fn )
return true;
}
}
function gRemoveEvent( elt, ev, fn ) {
if ( elt._evFn && elt._evFn[ev] ) {
var fList = elt._evFn[ev];
for( var i in fList )
if ( fList[i].fn === fn ) {
if ( g_IsIe )
elt.detachEvent( 'on' + ev, fList[i] );
else
elt.removeEventListener( ev, fList[i], false );
//delete fList[i];
fList.splice(i,1);
}
}
}
function gRemoveEvents(e) {
if ( e._evFn ) {
for( var ev in e._evFn )
for( var i in e._evFn[ev] ) {
if ( g_IsIe )
e.detachEvent( 'on' + ev, e._evFn[ev][i] );
else
e.removeEventListener( ev, e._evFn[ev][i], false );
}
e._evFn = undefined;
gRemoveAttribute( e, '_evFn' );
}
}
function gSetEvent( elt, ev, fn, set ) {
if ( set )
gHasEvent( elt, ev, fn ) || gAddEvent.call( this, elt, ev, fn );
else
gRemoveEvent( elt, ev, fn );
}
function gEventHandled( event ) {
if ( g_IsIe ) {
event.cancelBubble = true;
event.returnValue = false;
} else {
event.preventDefault();
event.stopPropagation();
}
}
function gEventStopPropagation( event ) {
if ( g_IsIe ) {
event.cancelBubble = true;
} else {
event.stopPropagation();
}
}
function gEventPreventDefault( event ) {
if ( g_IsIe ) {
event.returnValue = false;
} else {
event.preventDefault();
}
}
function gAddCssFile( win, href, title ) {
if ( g_IsIe ) {
return win.document.createStyleSheet( href );
} else {
var stylesheet = win.document.createElement('LINK');
stylesheet.type = 'text/css';
stylesheet.rel = 'stylesheet';
stylesheet.title = title;
stylesheet.href = href;
win.document.getElementsByTagName('HEAD')[0].appendChild(stylesheet);
return stylesheet.sheet
}
}
function gAppendCssRule( styleSheet, selector, style ) {
var index;
if ( g_IsIe ) {
index = styleSheet.rules.length;
styleSheet.addRule( selector, style, index );
} else {
index = styleSheet.cssRules.length;
styleSheet.insertRule( selector + '{' + style + '}', index );
}
return index;
}
function gRemoveCssRule( styleSheet, index ) {
if ( g_IsIe )
styleSheet.removeRule( index );
else
styleSheet.deleteRule( index );
}
function gAppendStyleSheet( win ) {
if ( g_IsIe ) {
return win.document.createStyleSheet();
} else {
return win.document.getElementsByTagName('HEAD')[0].appendChild( gCreateElement( 'STYLE', { type:'text/css' } ) ).sheet;
}
}
function gRemoveStyleSheet( styleSheet ) {
styleSheet.disabled = true;
if ( g_IsIe ) {
for ( var i=styleSheet.rules.length; i>0; i-- )
styleSheet.removeRule(0);
} else {
for ( var i=styleSheet.cssRules.length; i>0; i-- )
styleSheet.deleteRule(0);
}
}
function gGetStyle( elt, cssStyle ) {
if ( g_IsIe ) {
var sArray = cssStyle.split('-');
var attrStyle = sArray[0];
for( var i = 1, len = sArray.length; i < len; i++ ) {
var s = sArray[i];
attrStyle += s.charAt(0).toUpperCase() + s.substring(1);
}
return elt.currentStyle[attrStyle];
} else
return document.defaultView.getComputedStyle(elt, null).getPropertyValue(cssStyle);
}
function gGray( elt, set ) {
if ( g_IsIe )
elt.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(grayscale='+(set?1:0)+')';
if ( g_IsGecko );
}
function gOpacity( elt, value ) {
if ( g_IsIe )
elt.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+value+')';
if ( g_IsGecko )
elt.style.MozOpacity = value / 100;
}
function gTextPast( elt, text ) {
if ( g_IsIe ) {
var range = document.selection.createRange();
range.text = text;
range.select();
} else {
var pos = elt.selectionStart + text.length;
elt.value = elt.value.substring( 0, elt.selectionStart ) + text + elt.value.substring( elt.selectionEnd );
elt.setSelectionRange(pos,pos);
}
}
function gContains( elt, innerElt ) {
if ( g_IsIe )
return elt.contains(innerElt);
else {
for ( ; innerElt != document && innerElt != elt; innerElt = innerElt.parentNode );
return innerElt == elt;
}
}
function gAllElementsFrom( elt ) {
if ( g_IsIe )
return elt.all;
else
return elt.getElementsByTagName( '*' );
}
function gIsPrintable( charCode ) {
if ( gIsPlatform('win') && charCode >= 32 )
return true;
return false;
}
function gIsCharByUnicode( keyCode ) {
return keyCode == 32 || ( keyCode >= 48 && keyCode <= 90 ) || ( keyCode >= 96 && keyCode <= 111 ) || ( keyCode >= 186 && keyCode <= 223 );
}
function gCurrentPageDomain() {
return document.location.hostname;
}
function gActualEncoding() {
return document.actualEncoding ? document.actualEncoding : document.charset;
}
function gNewXMLHttpRequest() {
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}
function gFirstChild(e) {
e = e.firstChild;
while ( e && e.nodeType != 1 ) e = e.nextSibling;
return e;
}
function gLastChild(e) {
e = e.lastChild;
while ( e && e.nodeType != 1 ) e = e.previousSibling;
return e;
}
function gPreviousSibling(e) {
e = e.previousSibling;
while ( e && e.nodeType != 1 ) e = e.previousSibling;
return e;
}
function gNextSibling(e) {
e = e.nextSibling;
while ( e && e.nodeType != 1 ) e = e.nextSibling;
return e;
}
function gIeMinWidthInEm( elt, em ) {
var s = em * parseInt(elt.currentStyle.fontSize) * screen.deviceXDPI / 72;
return elt.clientWidth <= s ? s : 'auto';
}
function gMozModalWindow( parentWin, url, width, height ) {
var win = parentWin.open( url||'', '_blank', 'dependent=1,dialog=1,modal=1,status=0,menubar=0,location=0,resizable=0,width='+width+',height='+height );
function cancelEvent( event ) {
event.preventDefault();
event.stopPropagation();
}
function LockParentWindow( lock ) {
eventList = [ 'mousedown','mouseup','click','keydown','keyup', 'keypress' ];
for ( i in eventList )
if ( lock )
parentWin.addEventListener( eventList[i], cancelEvent, true );
else
parentWin.removeEventListener( eventList[i], cancelEvent, true );
}
function forceFocus(event) {
win.focus();
cancelEvent(event);
}
function onExitModal() {
win.removeEventListener( 'blur', forceFocus, true );
parentWin.removeEventListener( 'focus', forceFocus, true );
win.removeEventListener( 'unload', onExitModal, false );
LockParentWindow(false);
win.onExit && win.onExit();
}
function InitModalWindow() {
url && win.removeEventListener( 'load', InitModalWindow, true );
win.focus();
win.addEventListener( 'unload', onExitModal, false );
parentWin.addEventListener( 'focus', forceFocus, true );
win.addEventListener( 'blur', forceFocus, true );
LockParentWindow(true);
}
if ( url ) {
win.addEventListener( 'load', InitModalWindow, true );
} else {
win.document.open('text/html');
win.document.write('<HTML><BODY></BODY></HTML>');
win.document.close();
InitModalWindow();
}
return win;
}
function gIeModalWindow( parentWin, url, width, height ) {
var win = parentWin.open( url||'', '_blank', 'status=1,resizable=0,location=0,width='+width+',height='+height );
function forceFocus() {
parentWin.document.body.setCapture(true);
win.focus();
}
function onExitModal() {
parentWin.document.body.detachEvent( 'onfocus', forceFocus );
win.detachEvent( 'onblur', forceFocus );
win.detachEvent( 'onunload', onExitModal );
parentWin.document.body.releaseCapture();
win.onExit && win.onExit();
}
function InitModalWindow() {
url && win.detachEvent( 'onload', InitModalWindow );
win.attachEvent( 'onunload', onExitModal );
win.attachEvent( 'onblur', forceFocus );
parentWin.document.body.attachEvent( 'onfocus', forceFocus );
}
if ( !url ) {
win.document.open('text/html');
win.document.write('<HTML><BODY></BODY></HTML>');
win.document.close();
InitModalWindow();
} else {
win.attachEvent( 'onload', InitModalWindow );
}
return win;
}
gModalWindow = g_IsIe ? gIeModalWindow : gMozModalWindow;
function gOnClose( win, closeEventHandler ) {
function handleUnloadEvent() {
if ( g_IsIe )
win.detachEvent( 'onunload', handleUnloadEvent );
else
win.removeEventListener( 'unload', handleUnloadEvent, false );
window.setTimeout( function() {
var isValid = false;
try {
isValid = Boolean(win.document);
} catch(ex) {}
if ( isValid )
setCloseEvent();
else
closeEventHandler();
}, 100 );
}
function setCloseEvent() {
try {
if ( g_IsIe )
win.attachEvent( 'onunload', handleUnloadEvent );
else
win.addEventListener( 'unload', handleUnloadEvent, false );
} catch(ex) {
closeEventHandler();
}
}
setCloseEvent();
}
/****************************************************************************/
function gStringReplacer( conversionObject ) {
var regexpStr = '';
for ( var k in conversionObject )
regexpStr += (regexpStr.length ? '|' : '') + k;
var regexpr = new RegExp(regexpStr,'ig');
return function(s) { return s.replace(regexpr, function(str, p1, p2, offset, s) { var a = conversionObject[str]; return a == undefined ? str : a }) }
}
function gStringReplace( s, t ) {
var c, s1 = '', len = s.length;
for ( var i=0; i<len; i++ ) {
c = s.charAt(i);
s1 += t[c] || c;
}
return s1;
}
function gTranslate( s, a, t ) {
var c;
for ( var i in a )
if ( (c = t[a[i]]) )
for ( var it in c )
s[it] = c[it];
}
function gCloneObject(obj) {
for ( i in obj ) {
if (typeof obj[i] == 'object')
this[i] = new gCloneObject(obj[i]);
else
this[i] = obj[i];
}
}
function gMergeObjects( obj, add ) {
for ( var p in add )
obj[p] = add[p];
return obj;
}
function gIsObjectEmpty( obj ) {
for ( var p in obj )
return false;
return true;
}
function gDetour( obj, fName, fn ) {
function f() { return fn.apply( obj, arguments ); }
f.obj = obj;
f.fn = obj[fName];
obj[fName] = f;
}
function gDetourCall() {
var c = gDetourCall.caller.caller;
if ( c.fn )
return c.fn.apply( c.obj, c.arguments );
}
function gDetourCallArg() {
var c = gDetourCallArg.caller.caller;
if ( c.fn )
return c.fn.apply( c.obj, arguments );
}
function gDetourRestore( obj, fName ) {
obj[fName] = obj[fName].fn;
}
gSetTimeout = window.setTimeout;
gClearTimeout = window.clearTimeout;
gRound = Math.round;
gFloor = Math.floor;
gCeil = Math.ceil;
function gSetAttributes( obj, attrList ) {
for ( var name in attrList ) {
var attr = attrList[name];
if ( typeof( attr ) == 'object' )
gSetAttributes( obj[name], attr )
else
obj[name] = attr;
}
}
function gRemoveAttribute( obj, attrName ) {
obj.removeAttribute( attrName, 1 );
}
function gCreateHiddenIFrame( name ) {
return document.body.appendChild( gCreateElement( 'IFRAME', { name:name, frameBorder:'0', width:0, height:0 } ) );
}
function gWait( delay ) {
var t =	(new Date()).getTime();
while ( (new Date()).getTime() - t < delay )
for ( var i = 0; i<500; i++ ) {}
}
function gNoop() {}
function gElementId(e) {
return e.id;
}
function gElementName(e) {
return e.name;
}
function gAppendTextNode( elt, text ) {
return elt.appendChild( document.createTextNode( text || '' ) );
}
function gRemoveElement( elt ) {
return elt.parentNode.removeChild(elt);
}
function gIdToElement( id ) {
if ( g_IsIe ) {
var elt = window[id];
if ( elt && elt.id )
return elt;
}
return document.getElementById( id );
}
function gHtmlToElement( htmlCode, targetWindow ) {
var elt = (targetWindow||window).document.createElement( 'DIV' );
elt.innerHTML = htmlCode;
return elt.firstChild;
//return gCreateElement( 'DIV', { innerHTML:htmlCode } ).firstChild; // normaly we do not need to delete the DIV element
}
function gScrollbarWidth() {
var e = document.body.appendChild( gCreateElement( 'span', { style: { visibility:'hidden', position: 'absolute', top:0, right:0, width: 30, height: 60, overflow:'scroll' } } ) );
var width = e.offsetWidth - e.clientWidth + (g_IsIe ? 1 : 0);
gLazyRemove( e );
return width;
}
function gLazyRemove( elt ) {
elt.style.display = 'none';
gSetTimeout( function() { gRemoveElement(elt) }, 1000 );
}
function gInsertAfter( element, position ) {
var ns = position.nextSibling;
return ns ? position.parentNode.insertBefore( element, ns ) : position.parentNode.appendChild( element );
}
function gInsertBefore( element, position ) {
return position.parentNode.insertBefore( element, position );
}
function gSafeSelect( elt ) {
gSetTimeout( function() { try { elt.select() } catch(ex) {} }, 0 );
}
function gSafeFocus( elt ) {
gSetTimeout( function() { try { elt.focus() } catch(ex) {} }, 0 );
}
function gSafeBlur( elt ) {
try { elt.blur() } catch(ex) {};
}
function gSafeCall( fn ) {
try { return fn() } catch(ex) { return true; }
}
function gUnSelectField( elt ) {
var value = elt.value;
elt.value = ' ';
elt.value = value;
}
function gMinMax( val, min, max ) {
return Math.max( Math.min( val, max ), min );
}
function gForEach( c, fct, arg ) {
if ( !c ) return;
var ret;
for ( var i = c.length - 1; i >= 0; --i )
if ( (ret = fct( c[i], i, arg )) !== undefined )
return ret;
}
function gHasClass( e, c ) {
return (' '+e.className+' ').lastIndexOf( ' '+c+' ' ) != -1;
}
function gAddClass( e, c ) {
e.className += ' ' + c;
}
function gRemoveClass( e, c ) {
var str = e.className;
var pos = str.lastIndexOf( c );
e.className = str.substr( 0, pos ) + str.substr( pos + c.length );
}
function gSetClass( e, c, s ) {
gHasClass( e, c ) && ( s || gRemoveClass( e, c ) ) || s && gAddClass( e, c );
}
function gLocalFirstDayOfTheWeek() {
return ' fr fr-be fr-ca fr-ch fr-lu '.indexOf( ' '+navigator.userLanguage+' ' ) != -1 ? 1 : 0;
}
