var BACKGROUND_IMG_SRC = "/images/bg.png";//path to your transparent .png background image source

var BROWSER_APP_NAME = navigator.appName;
var BROWSER_USER_AGENT = navigator.userAgent;

document.writeln('<style type=\'text/css\'>');//start adding css
document.writeln('.dab {',//for Disabling Alert Box
'z-index:101;',
'position:absolute;',
'left:0px;',
'top:0px;',
'display:block;',
'float:left;',
'padding:0px;',
'margin:0px;',
'visibility:hidden;',
'display:none;}');
document.writeln('.dabbg {',
'z-index:100;',
'position:absolute;',
'width:0px;',
'height:0px;',
'left:0px;',
'top:0px;',
'float:left;',
'padding:0px;',
'margin:0px;',
'visibility:hidden;',
'display:none;');

if(BROWSER_APP_NAME.indexOf('Microsoft') != -1 && BROWSER_USER_AGENT.indexOf('Opera') == -1)//IE
document.writeln('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=\'true\', sizingMethod=\'scale\', src=\''+BACKGROUND_IMG_SRC+'\');}');
else
document.writeln('}');
 
document.writeln('.dabbg[class] {background-image:url('+BACKGROUND_IMG_SRC+');}');//for background (not IE)
document.writeln('</style>');//end adding css

var DAB = new Array();//container for all DAB
var DAB_STACK = new Array();//stack of DAB [in case of several open DAB] with the current one is on top
var BACKGROUND = null;//background

function init(){//init
	BACKGROUND = getBackground();//add background
	getAllDAB();//get all DAB of the page
	}

function getBackground(){//add background div in DOM tree and return it
	var bgdiv = document.createElement("div");
	with(bgdiv){id = "background"; name = "background"; className = "dabbg";}
	document.body.appendChild(bgdiv);
	var bg = getElement("background");
	return bg;
	}

function getElement(id){//return element by id/name cross browser
	if (document.getElementById) element = document.getElementById(id);
	else if (document.all) element = document.all[id];
	else if (document.layers) element = document.layers[id];
	return element;
	}

function getAllDAB(){//find all div with .dab class
	var alldivs = document.getElementsByTagName('div');
	for (var i=0; i<alldivs.length; i++) {
		if(BROWSER_APP_NAME.indexOf("Microsoft") != -1 && BROWSER_USER_AGENT.indexOf("Opera") == -1){//IE
			if(alldivs.item(i).className == "dab"){
				alldivs.item(i).style.zIndex = 101+i;//depth++
				DAB[alldivs.item(i).name] = new DisablingAlertBox(alldivs.item(i));//fill the container with new DAB
				}
			}else{//Opera, FF, Netscape
			if(alldivs[i].className == "dab"){
				alldivs[i].style.zIndex = 101+i;//depth++
				DAB[alldivs[i].id] = new DisablingAlertBox(alldivs[i]);//fill the container with new DAB
				}
			}
		}
	}

function getSize(){//return window dimension
	var w, h = 0;
	var size = new Array();
	if (parseInt(navigator.appVersion)>3) {
	/*if (navigator.appName=="Netscape") {
		w = window.innerWidth;//-16;
		h = window.innerHeight;//-16;
		}
	*/
	if (navigator.appName.indexOf("Microsoft")!=-1) {
		w = document.body.offsetWidth;//-20;
		h = document.body.offsetHeight;//-20;
	}else{
		w = window.innerWidth;
		h = window.innerHeight;
	}
	size['w'] = (w>=0)?w:0;//<0=0
	size['h'] = (h>=0)?h:0;//<0=0
	return size;
	}}

function getScroll(){//return scroll position
  var x, y = 0;
  var scroll = new Array();
	if(typeof(window.pageYOffset) == 'number') {//Netscape compliant
		y = window.pageYOffset;
		x = window.pageXOffset;
	}else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {//DOM compliant
		y = document.body.scrollTop;
		x = document.body.scrollLeft;
	}else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {//IE6 standards compliant
		y = document.documentElement.scrollTop;
		x = document.documentElement.scrollLeft;
	}
	scroll['x'] = (x>=0)?x:0;//<0=0
	scroll['y'] = (y>=0)?y:0;//<0=0
	return scroll;
	}

function showHideAllDisturbingElement(visibility){//show/hide all select
	var alls = document.getElementsByTagName('select');
	var allo = document.getElementsByTagName('object');
	for (var i=0;i<alls.length;i++) {//hide all select...
		alls[i].style.visibility = visibility;//visible or hidden
		}
	for (var j=0;j<allo.length;j++) {//hide all select...
                allo[j].style.visibility = visibility;//visible or hidden
                }

	if(DAB_STACK.length != 0){
		var dabs = DAB_STACK[DAB_STACK.length-1]._div.getElementsByTagName('select');
		var dabo = DAB_STACK[DAB_STACK.length-1]._div.getElementsByTagName('object');
		for(var k=0;k<dabs.length;k++){//...but the ones in the current DAB
			dabs[k].style.visibility = "visible";//always visible
			}
		for(var l=0;l<dabo.length;l++){//...but the ones in the current DAB
                        dabs[l].style.visibility = "visible";//always visible
                        }
		}
	}

function scrollListener(){//check scroll position(for netscape)
	var scroll = getScroll();
	var x = scroll['x'];
	var y = scroll['y'];
	if(x!=DAB_STACK[DAB_STACK.length-1]._cachedx) DAB_STACK[DAB_STACK.length-1]._cachedx = x;
	if(y!=DAB_STACK[DAB_STACK.length-1]._cachedy) DAB_STACK[DAB_STACK.length-1]._cachedy = y;	
	DAB_STACK[DAB_STACK.length-1].updateWindowsElements();
	}

function getNextHighestDepth(){//return the highest depth available
	var depth = null;
	for(var i=0;i<DAB_STACK.length;i++){
		if(DAB_STACK[i].getDepth() > depth){
			depth = DAB_STACK[i].getDepth();
			} 
		}
	if(depth == null)depth = 100;
	depth = parseInt(depth)+1;
	//alert("Next highest depth available: "+depth);
	return depth;
	}

function isOnStage(id){//return true if the DAB is already showed
	var r = false;
	for(var i=0;i<DAB_STACK.length;i++){
		if(DAB_STACK[i]._div.id == id) r = true;
		}
	return r;
	}

function getDABIndex(id){//get index in the stack
	for(var i=0;i<DAB_STACK.length;i++){
		if(DAB_STACK[i]._div.id == id){
			return i;
			}
		}	
	}

function deleteDouble(id){//get rid of a double DAB in the stack
	var index = getDABIndex(id);
	DAB_STACK[index].stopListening();
	DAB_STACK.splice(index,1);
	}

function getMousePosition(){
	document.onmousemove = function(){
		
		}
	}

// Everything below belongs to DisablingAlertBox
//constructor
var DisablingAlertBox = function(div){
	this._div = div;
	this._divheight = parseInt(div.style.height);
	this._divwidth = parseInt(div.style.width);
	this._cachedx = null;
	this._cachedy = null;
	this._listening = null;
	this._div.onclick = function(){//swap depth on click
							var index = getDABIndex(div.id);
							if(index != DAB_STACK.length-1 && isOnStage(div.id)){//if not on top of the stack
								div.style.zIndex=getNextHighestDepth();//
								DAB_STACK.splice(index,1);//if on the stage, then delete it
								DAB_STACK.push(DAB[div.id]);//add it on top
								showHideAllDisturbingElement("hidden");						
								}
							}
	}
//methods
DisablingAlertBox.prototype.show = show;
DisablingAlertBox.prototype.hide = hide;
DisablingAlertBox.prototype.getDepth = getDepth;
DisablingAlertBox.prototype.setDepth = setDepth;
DisablingAlertBox.prototype.startListening = startListening;
DisablingAlertBox.prototype.stopListening = stopListening;
DisablingAlertBox.prototype.updateWindowsElements = updateWindowsElements;

function show(){//show this dab and disable background
	if(isOnStage(this._div.id))deleteDouble(this._div.id);//delete previous existing DAB in stack
	var d = getNextHighestDepth();
	this.setDepth(d)
	DAB_STACK.push(DAB[this._div.id]);//ad DAB on top of the stack
	showHideAllDisturbingElement("hidden");//hide all select but the ones in this dab
	BACKGROUND.style.visibility = "visible";
	BACKGROUND.style.display = "block";
	this._div.style.visibility = "visible";
	this._div.style.display = "block";
	this._div.style.top = "0px";
	this._div.style.left = "0px";
	this.updateWindowsElements();
	this.startListening();
	}

function hide(){//hide this dab and enable background
	this.stopListening();
	DAB_STACK.splice(DAB_STACK.length-1,1);
	if(DAB_STACK.length == 0){
		showHideAllDisturbingElement("visible");
		BACKGROUND.style.visibility = "hidden";
		BACKGROUND.style.display = "none";
	}
	this._div.style.visibility = "hidden";
	this._div.style.display = "none";
	if(DAB_STACK.length == 0)showHideAllDisturbingElement("visible");else showHideAllDisturbingElement("hidden")
	}

function updateWindowsElements(){//update size and position of background and message
	var scroll = getScroll();
	var size = getSize();
	BACKGROUND.style.height = size['h'];
	BACKGROUND.style.width = size['w'];
	BACKGROUND.style.top = scroll['y'];
	BACKGROUND.style.left = scroll['x'];
	this._div.style.top = scroll['y']+(size['h']/2)-(this._divheight/2);
	this._div.style.left = scroll['x']+(size['w']/2)-(this._divwidth/2);
	}

function getDepth(){return this._div.style.zIndex;}//return depth
function setDepth(d){this._div.style.zIndex = d;}//set depth

function startListening(){this._listening = setInterval("scrollListener()",10);}//start interval
function stopListening(){clearTimeout(this._listening);}//kill interval

