//******************************************************************************
//*                      CROSSBROWSER MODAL WINDOW LIBRARY                     *
//*                                 version 1.5                                *
//*                                                                            *
//*                             (C) by Protocoder                              *
//******************************************************************************

function modalWin() {
}

modalWin.count = 0;
modalWin.stack = [];
modalWin.oldOnResize = null;
modalWin.oldOnScroll = null;
modalWin.oldOnContext= null;
modalWin.oldOnClick= null;
modalWin.oldOnDblClick= null;
modalWin.scrollTop = 0;
modalWin.scrollLeft = 0;

modalWin.createCoverLayer = function() {
	var coverLayer;
	coverLayer = document.createElement( "div" );
	with( coverLayer ) {
		onclick = modalWin.cancelEvent;
		onmouseover = modalWin.cancelEvent;
		onmouseout = modalWin.cancelEvent;
		with( style ) {
			display = "none";
			position = "absolute";
			left = 0;
			top = 0;
			width = "100%";
			height = "100%";
			zIndex = modalWin.count*2 + 5000;
			opacity = 0;
	  		filter = "alpha(opacity=0)";
			backgroundColor = "#000000";
		}
	}

	return coverLayer;
}

modalWin.show = function() {
	if ( modalWin.count <= 0 ) return;
	var md, val;
	for ( i = modalWin.count - 1; i >= 0; i-- ) {
		md = modalWin.stack[i]["dialog"];
		val = ( Math.round( ( document.body.clientWidth - md.offsetWidth ) / 2 ) + document.body.scrollLeft );		
		md.style.left  =  ( val < modalWin.scrollLeft ? modalWin.scrollLeft : val ) + "px";
		val = ( Math.round( ( document.body.clientHeight - md.offsetHeight ) / 2 ) + document.body.scrollTop );
		md.style.top  = ( val < modalWin.scrollTop ? modalWin.scrollTop : val ) + "px";
	}
}

modalWin.cancelEvent = function( e ) {
	if ( !e ) e = event;
	e.cancelBubble = true;
	return false;
}

modalWin.open = function( dialog, width, height, useAjax, onCloseFunc, varObj, removeDialogOnClose ) {
	if ( !dialog ) return false;

	modalWin.count++;
        var data = [];
	modalWin.stack.push( data );

	if ( modalWin.count == 1 ) {
		modalWin.oldOnContext = window.oncontextmenu;
		modalWin.oldOnClick = window.onclick;
		modalWin.oldOnDblClick = window.ondblclick;
		modalWin.oldOnResize = window.onresize;
		modalWin.oldOnScroll = window.onscroll;
	}
	var cl = modalWin.createCoverLayer();
	if ( modalWin.count == 1 ) {
		modalWin.scrollTop = document.body.scrollTop;
		modalWin.scrollLeft = document.body.scrollLeft;
	}
        cl = document.body.appendChild( cl );
	data["coverLayer"] = cl;
	data["dialog"] = dialog;
	data["onClose"] = onCloseFunc ? onCloseFunc : null;
	data["varObj"] = varObj ? varObj : null;
	data["remove"] = removeDialogOnClose ? true : false;

	if ( typeof( dialog ) == "string" ) {
		var url = dialog;

		if ( useAjax ) {
			dialog = document.createElement( "table" );
	 		var attr = document.createAttribute( "cellspacing" );
			attr.value = 0;
			dialog.setAttributeNode( attr );
	 		attr = document.createAttribute( "cellpadding" );
			attr.value = 0;
			dialog.setAttributeNode( attr );
			dialog.appendChild( document.createElement( "tbody" ) ).appendChild( document.createElement( "tr" ) ).appendChild( document.createElement( "td" ) );

			dialog.style.position = "absolute";
			dialog.style.left = 0;
			dialog.style.top = 0;
			dialog = document.body.appendChild( dialog );
		        data["dialog"] = dialog;
		        data["remove"] = true;

			XMLload(
					url,
					"TEXT",
					"GET",
					"",
				  	function( txt ) { 
						if ( modalWin.count <= 0 ) return;

						if ( txt ) {
							var o = modalWin.stack[modalWin.count - 1]["dialog"].getElementsByTagName( "td" )[0];
							o.innerHTML = txt;

							var reg = /<script.*?>((?:.|[\r\n])*?)<\/script>/ig;
							reg.lastIndex=0;
							var result;
							if ( window.execScript ) while ( ( result = reg.exec( txt ) ) != null ) window.execScript( result[1], "javascript" );
							else while ( ( result = reg.exec( txt ) ) != null ) window.eval( result[1] );

							modalWin.show();
						}
						else {
							alert( "Ошибка при запросе диалога!" );
							modalWin.close(); // error - close win
						}
					  }
				);
		}
		else {
			dialog = document.createElement( "iframe" );
	 		var attr = document.createAttribute( "frameborder" );
			attr.value = "no";
			dialog.setAttributeNode( attr );
	 		var attr = document.createAttribute( "scrolling" );
			attr.value = "auto";
			dialog.setAttributeNode( attr );

			dialog.style.width = width;
			dialog.style.height = height;
			dialog.style.position = "absolute";
			dialog.style.left = 0;
			dialog.style.top = 0;
			dialog.src = url;

			dialog = document.body.appendChild( dialog );

		        data["dialog"] = dialog;
		        data["remove"] = true;
		}
	}

	with( dialog.style ) {
		position = "absolute";
		zIndex = modalWin.count*2 + 1 + 5000;
		top = "-1000px";
		left = "-1000px";
		display = "";
	}

	with( cl.style ) {
		left = document.body.scrollLeft;
		top = document.body.scrollTop;
		display = "block";
	}

	modalWin.show();
	dialog.focus();

	window.onscroll = function( e ) {
		if ( !e ) e = event;
		e.cancelBubble = true;
		document.body.scrollTop = modalWin.scrollTop;
		document.body.scrollLeft = modalWin.scrollLeft;
	}

	window.onresize = function() {
		modalWin.show();
	}

	return true;
}

modalWin.close = function( state ) {
	if ( modalWin.count <= 0 ) return false;
	var data = modalWin.stack[modalWin.count - 1];

        if ( data["onClose"] )
		if ( !data["onClose"]( data["varObj"], state ) ) return;

	data["dialog"].style.display = "none";
	if ( data["remove"] ) data["dialog"].parentNode.removeChild( data["dialog"] );

	data["coverLayer"].style.display = "none";
	data["coverLayer"].parentNode.removeChild( data["coverLayer"] );
	modalWin.stack.splice( modalWin.count - 1, 1 );

	if ( modalWin.count == 1 ) {
		window.onresize = modalWin.oldOnResize;
		window.onscroll = modalWin.oldOnScroll;
		window.oncontextmenu = modalWin.oldOnContext;
		window.onclick = modalWin.oldOnClick;
		window.ondblclick = modalWin.oldOnDblClick;
		modalWin.oldOnResize = modalWin.oldOnScroll = null;
		modalWin.scrollTop = 0;
		modalWin.scrollLeft = 0;
	}
	modalWin.count--;

	return true;
}

modalWin.getCur = function() {
	return 	modalWin.count <= 0 ? null : modalWin.stack[modalWin.count - 1];
}

modalWin.getCurDialog = function() {
	return 	modalWin.count <= 0 ? null : modalWin.stack[modalWin.count - 1]["dialog"];
}

modalWin.getCurVO = function() {
	return 	modalWin.count <= 0 ? null : modalWin.stack[modalWin.count - 1]["varObj"];
}

modalWin.openByDialog = function( dialog, onCloseFunc, varObj, removeDialogOnClose ) {
	return modalWin.open( dialog, null, null, null, onCloseFunc, varObj, removeDialogOnClose );
}

modalWin.openByAjax = function( url, onCloseFunc, varObj, removeDialogOnClose ) {
	return modalWin.open( url, null, null, true, onCloseFunc, varObj, removeDialogOnClose );
}

modalWin.openByIFrame = function( url, width, height, onCloseFunc, varObj, removeDialogOnClose ) {
	return modalWin.open( url, width, height, false, onCloseFunc, varObj, removeDialogOnClose );
}

