var browserName = navigator.appName;
var browserVer = parseInt(navigator.appVersion);
var Nav  = (browserName == "Netscape");
var IExp = (browserName == "Microsoft Internet Explorer");
var Nav4 = (Nav && browserVer >= 4);
var divScrollId = 'divScroll';

var dialogWin = new Object();
var lastLinkClicks
var lastLinkHRef
var lastLinkMouseDown
var lastElemetsDisables
var isPageBlocked= false;
var lastWindowOnFocus;
var lastWindowOnClick;

/* **************************************************************************
 *  3 functions GetParentElementByName, GetParentWindow and ShowModalDialog
 *  are designed to work together.
 *  They are required for PageBase.RegisterStartupPopup();
 */
function GetParentElementByName( parent, name )
{
    var field = parent.document.getElementsByName( name );
    if ( field && field.length && field.length == 1 ) field = field[0];
    return field;
}

function GetModalParentWindow()
{
    var parent = window.opener; //for Netscape
    if ( !parent ) parent = window.dialogArguments; //for IE window created by ShowModalDialog
    return parent;    
}

function ShowModalDialog( url, width, height, resizable, scrollbars, args )
{
	if(Nav4)
	{		
        dialogResult = openModalDialog(url, width, height, resizable, scrollbars, args, null ) 
	}
	else
	{
        var options = "status: no; " + 
            "dialogHeight: " + height + 
            "px; dialogWidth: " + width + 
            "px; resizable: " + ( resizable ? "yes" : "no" ) + 
            "; scroll: " + ( scrollbars ? "yes" : "no" );
		dialogResult = showModalDialog( url, window, options );		
	}
	return dialogResult;
} 
/*************************************************************************/ 
 
 
// Generate a modal dialog.
// Parameters:
//    url -- URL of the page/frameset to be loaded into dialog
//    width -- pixel width of the dialog window
//    height -- pixel height of the dialog window
//	  resizable -- whether the dialog will be resizable
//	  scrollbars -- whether the dialog has scrollbars
//    args -- [optional] any data you need to pass to the dialog
function openModalDialog(url, width, height, resizable, scrollbars, args, returnFunc) 
{
	if (!dialogWin.win || (dialogWin.win && dialogWin.win.closed)) 
	{
		// Initialize properties of the modal dialog object.
		if(typeof(returnFunc) == "undefined") dialogWin.returnFunc = onCallback
		else dialogWin.returnFunc = returnFunc;		
		dialogWin.returnedValue = ""
		dialogWin.args = args
		dialogWin.url = url
		dialogWin.width = width
		dialogWin.height = height
		// Keep name unique so Navigator doesn't overwrite an existing dialog.
		dialogWin.name = (new Date()).getSeconds().toString()
		// Assemble window attributes and try to center the dialog.
		if (Nav4) 
		{
			// Center on the main window.
			dialogWin.left = window.screenX + 
			   ((window.outerWidth - dialogWin.width) / 2)
			dialogWin.top = window.screenY + 
			   ((window.outerHeight - dialogWin.height) / 2)
			var attr = "screenX=" + dialogWin.left + 
			   ",screenY=" + dialogWin.top + ",width=" + 
			   dialogWin.width + ",height=" + dialogWin.height
		}
		else {
			// The best we can do is center in screen.
			dialogWin.left = (screen.width - dialogWin.width) / 2
			dialogWin.top = (screen.height - dialogWin.height) / 2
			var attr = "left=" + dialogWin.left + ",top=" + 
			   dialogWin.top + ",width=" + dialogWin.width + 
			   ",height=" + dialogWin.height
		}
		if (resizable) attr=attr+",resizable=yes";
		else attr=attr+",resizable=no";
		
		if (scrollbars) attr=attr+",scrollbars=yes";
		else attr=attr+",scrollbars=no";
		
		if (Nav4) attr=attr+",modal=yes";
		dialogWin.win=window.open(dialogWin.url, dialogWin.name, attr )
		dialogWin.win.focus();
	}
	else 
	{
		dialogWin.win.focus()
	}
}

// Event handler to inhibit Navigator form element 
// and IE link activity when dialog window is active.
function deadend() {
	if (dialogWin.win && !dialogWin.win.closed) {
		dialogWin.win.focus()
		return false
	}
}

// Grab all Navigator events that might get through to form
// elements while dialog is open.
function blockEvents() {
	if (Nav4) {
		window.captureEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.FOCUS);
	}
	lastWindowOnFocus = window.onfocus;
	lastWindowOnClick = window.onclick;
	window.onfocus = deadend;
	window.onclick = deadend;
	isPageBlocked = true;

}
// As dialog closes, restore the main window's original
// event mechanisms.
function unblockEvents() {
	if (!isPageBlocked) return;
	if (Nav4) {
		window.releaseEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.FOCUS);
	}
	window.onfocus = lastWindowOnFocus;
	window.onclick = lastWindowOnClick;
	isPageBlocked = false;
}

function closeModalDialog() {
	if (dialogWin.win && !dialogWin.win.closed) {
		dialogWin.win.close()
	}
}

function PopupBtn_Init(btnElement)
{
	btnElement = AwsGetElementById(btnElement);
	if(!btnElement) return;
	btnElement.ShowPopupDialog = PopupBtn_ShowPopupDialog;
	btnElement.onclick = PopupBtn_OnClick;
	btnElement.ContinueShowPopupDialog = PopupBtn_ContinueShowPopupDialog;
	btnElement.Callback = PopupBtn_Callback;
	btnElement.DoPostBack = PopupBtn_DoPostBack;
}

function PopupBtn_OnClick(e)
{
	var elm;
	if (e)
	    if (e.target)
	        elm = e.target;
	    else
	        elm = e;
	else
	    if (event)
	        elm = event.srcElement;
	
	if(elm && (typeof(elm.ShowPopupDialog)=='function') )
		elm.ShowPopupDialog();
}

function PopupBtn_ShowPopupDialog( arguments )
{	
	// 1. Client before popup event
	var params = new Object();
	params.Target = this.getAttribute('Target');
	params.ModalDialogContainer = this.getAttribute('ModalDialogContainer');
	params.CancelBubble = false;	
	params.srcElement = this;
	params.arguments = arguments;
	var res;

	if( this.getAttribute('BeforePopupDialog') && this.getAttribute('BeforePopupDialog') != "" )
	{
	    var handlers = this.getAttribute('BeforePopupDialog');
        var re = /[\s,]+/;
        var arr = re.exec( handlers );        
	    while ( handlers != null && handlers != "" )
        {
		    var handler = arr ? RegExp.leftContext : handlers;
		    var savedRightContext = RegExp.rightContext;
		    if ( handler != "" ) 
		    {		    
		        eval("res=" + handler + "(params);");

		        if(typeof(res) != "undefined" && (res == null || res == "" || res == false)) return;

		        if(typeof(res) != "object" && res != null) 
		        {			
			        var addParams = res.replace("" + params, "");
			        if(addParams.indexOf("&") == 0) addParams = addParams.substring(1) ;
			        if(params.Target.indexOf("?") > 0) params.Target += "&";
			        else params.Target += "?";
			        params.Target += addParams;
		        }

		        if(params == false || params == null || params.Target == null || params.CancelBubble)
		        {
			        return;	
		        }		    
		    }
		    if ( !arr ) break;
		    handlers = savedRightContext;
            arr = re.exec( handlers );
        } 		    
	}		
	// 2. Server on before popup event	
	if(this.getAttribute('ServerBeforePopupDialog')!=null && this.getAttribute('ServerBeforePopupDialog').toLowerCase() != "false" )
	{
		__doPostBack(this.getAttribute('postbackId'), '_BeforePopup_:' + params.Target);
		return;		
	}
	// 3. Show popup dialog
	return this.ContinueShowPopupDialog(params.Target , params.arguments);
}

function PopupBtn_ContinueShowPopupDialog(sTargetForm, arguments)
{	
	var targetUrl = "";
	var container = this.getAttribute('ModalDialogContainer');
	var paramStr = "";

    var hdwdCtl = AwsGetElementById('__HiddenWindowID');
	var paramsInQueryString = true;
	if(container)
	{
	    targetUrl = container;
	    if (container.toLowerCase().indexOf(".htm") == container.length - 4)
	    {
	        paramStr = "?Modal=True&targetUrl=" + escape(sTargetForm);
	        if (hdwdCtl && hdwdCtl.value) paramStr += '&__HiddenWindowID='+hdwdCtl.value;
	    }
	    else
	    {
		    targetUrl += "?Modal=True&targetUrl=" + escape(sTargetForm);
	        if (hdwdCtl && hdwdCtl.value) targetUrl += '&__HiddenWindowID='+hdwdCtl.value;
		}
	}
	else
	{
		targetUrl += sTargetForm;
		if (hdwdCtl && hdwdCtl.value)
		{
            targetUrl += (targetUrl.indexOf("?") > 0)? "&":"?";
            targetUrl += '__HiddenWindowID='+hdwdCtl.value;
         }
	}	
    
	var dialogResult;
	var features = this.getAttribute('DialogParams');

	dialogResult = showModalDialog(targetUrl, new Arguments (arguments, paramStr), features);		
	this.Callback(dialogResult);
	return dialogResult;
}

function Arguments ( arguments, queryString )
{
    this.Arguments = arguments;
    this.QueryString = queryString;
}

//Executes all callbacks and server postbacks if configured
//Mapped to this.Callback
function PopupBtn_Callback(dialogResult)
{
	var params = new Object();	
	params.DialogResult = dialogResult;
	params.CancelBubble = false;
	params.srcElement = this;
	if(this.getAttribute('AfterPopupDialog') && this.getAttribute('AfterPopupDialog') != "")
	{
		params = FireHandlers( params, this.getAttribute('AfterPopupDialog') );
		//eval(this.getAttribute('AfterPopupDialog') + "(params);");
		if(params === false || params == null || params.CancelBubble)
			return;
	}
	if ( params.DialogResult && typeof( params.DialogResult ) == "string" )
	    dialogResult = params.DialogResult;
	
	this.DoPostBack( dialogResult );    
}

// Executes only server postback if configured skipping all client handlers.
// Mapped to this.DoPostBack
function PopupBtn_DoPostBack( result )
{
	if ( this.getAttribute('ServerAfterPopupDialog') && result && result != 'CancelRefresh' )
	{
		__doPostBack(this.getAttribute('postbackId'), '_AfterPopup_:' + result);
	}
}

function PopupBtn_OnMouseOver(e)
{
	var elm;
	if (e)
	    if (e.target)
	        elm = e.target;
	    else
	        elm = e;
	else
	    if (event)
	        elm = event.srcElement;
	
	if(elm)
	{
		var hoverimageUrl = elm.getAttribute('hoverimageUrl');
		if (hoverimageUrl)
			elm.src = hoverimageUrl;
	}
}

function PopupBtn_OnMouseOut(e)
{
	var elm;
	if (e)
	    if (e.target)
	        elm = e.target;
	    else
	        elm = e;
	else
	    if (event)
	        elm = event.srcElement;
	
	if(elm)
	{
		var imageUrl = elm.getAttribute('imageUrl');
		if (imageUrl)
			elm.src = imageUrl;
	}
}

//support extended popup control that automatically chooses target form according to formId and formGroupId attribute
function PopupBtnEx_Init(btnElement)
{	
	btnElement = AwsGetElementById(btnElement);
	if(!btnElement) return;
	btnElement.ShowPopupDialog = PopupBtn_ShowPopupExDialog;
	btnElement.ShowPopupSimpleDialog = PopupBtn_ShowPopupDialog;
	//btnElement.onclick = PopupBtn_OnClick; //onclick is initalized in PopupButtonEx server code
	btnElement.ContinueShowPopupDialog = PopupBtn_ContinueShowPopupDialog;
	btnElement.Callback = PopupBtn_Callback;
	btnElement.DoPostBack = PopupBtn_DoPostBack;
	btnElement.Enable = PopupButtonEx_Enable;
}

function PopupBtn_ShowPopupExDialog( arguments )
{
	FireBeforeFormIdApplied( this );
	
	if( arguments != null && arguments != '' )
	{
		var strs = arguments.split(';');
		for( var c = 0; c < strs.length; c++ )
		{
			if( strs[c].indexOf('FormId=') == 0 )
			{
				this.setAttribute('FormId', strs[c].slice(7) );
			}
		}
	}
	var menu = igmenu_getMenuById( this.getAttribute('menuId') );
	if( menu == null )//if this code path then target and params should already be initialized
	{
		return this.ShowPopupSimpleDialog( arguments );
	}
	
	if( this.getAttribute('ShowMenu') != null && this.getAttribute('ShowMenu').toLowerCase() == "true" )
	{
		
		if( event == null )
		{
			var menuX = this.offsetLeft + parseInt(this.getAttribute('menuOffsetX'));// - document.body.scrollLeft;
			var menuY = this.offsetTop + parseInt(this.getAttribute('menuOffsetY'));// - document.body.scrollTop;
			ShowMenu( this.getAttribute('menuId'), menuX, menuY );
		}
		else
		{
			//var menuY = event.y - event.offsetY + parseInt(this.getAttribute('menuOffsetY')) - document.body.children[0].scrollTop;
			//var menuX = event.x - event.offsetX + parseInt(this.getAttribute('menuOffsetX'));
			//ShowMenu( this.getAttribute('menuId'), menuX, menuY );
			var menu = igmenu_getMenuById( this.getAttribute('menuId'));
			if ( menu )
			{
				// little hack in case control inside scrollable div
				// mark such div with id attribute equal to 'divScroll'
				var divScroll = document.getElementById(divScrollId) ;
				var divScrollValue = 0;
				if (divScroll) divScrollValue = divScroll.scrollTop - divScroll.getBoundingClientRect().top;
				
				var menuY = event.y - event.offsetY + parseInt(this.getAttribute('menuOffsetY')) + document.body.children[0].scrollTop + divScrollValue;
				var menuX = event.x - event.offsetX + parseInt(this.getAttribute('menuOffsetX'));
				ShowMenu( this.getAttribute('menuId'), menuX, menuY );
				menuY = event.y - event.offsetY - menu.Element.offsetHeight + parseInt(this.getAttribute('menuOffsetY')) + document.body.children[0].scrollTop + divScrollValue;
				// again show menu it's right!!!
				ShowMenu( this.getAttribute('menuId'), menuX, menuY );
			}
		}
		return;		
	}
	else
	{
		var formId = this.getAttribute('FormId');
		if( formId != null && formId != "" )
		{
			var items = menu.getItems();
			var i;
			for( i = 0; i < items.length; i++ )
			{
				var item = items[i];
				var tag = item.getTag();
				if ( tag == formId )
				{
					var targetUrl = item.getTargetUrl();
					eval( targetUrl );
					return;
				}
			}
			alert('formId='+formId + ' is not found in FormMappings');
			return;
		}
		//this.ShowPopupSimpleDialog();
	}
}

function ShowMenu( menuId, x, y )
{
    igmenu_showMenu( menuId, null, x, y );
	return null;
}

function ApplyMappings( ctrlID, formId, containerUrl, targetUrl, dialogParams )
{
	var formIdHidden = AwsGetElementById( ctrlID + '_FormId' );
	formIdHidden.value = formId;

	var ctrl = AwsGetElementById(ctrlID);
	
	ctrl.setAttribute('FormId', formId );
	ctrl.setAttribute('Target', targetUrl );
	ctrl.setAttribute('ModalDialogContainer', containerUrl );
	ctrl.setAttribute('DialogParams', dialogParams );
	ctrl.ShowPopupSimpleDialog();
}

function SetFormIdFromActiveRow( gridId, buttonId )
{
	var row = igtbl_getActiveRow(gridId);
	if( row == null ) return null;
	var editButton = AwsGetElementById(buttonId);
	var cell = row.getCellFromKey('FormId');
	
	if( cell == null || cell.getValue() == null )
	{
		if( editButton.getAttribute('Target') == null || editButton.getAttribute('Target') == '' )
		{
			alert( 'Grid does not have column with Key=FormId and Target is empty' );
		}
		return null;
	}
	var formId = cell.getValue();
	editButton.setAttribute('FormId', formId );
	return;

}

function FireHandlers( params, handlers )
{
	var re = /[\s,]+/;
    var arr = re.exec( handlers );        
	while ( handlers != null && handlers != "" )
    {
		var handler = arr ? RegExp.leftContext : handlers;
		var savedRightContext = RegExp.rightContext;
		if ( handler != "" ) 
		{		    
		    eval("res=" + handler + "(params);");

		    if(typeof(res) != "undefined" && (res == null || res == "" || res === false)) return;

		    if(typeof(res) != "object" && res != null) 
		    {			
			    var addParams = res.replace("" + params, "");
			    if(addParams.indexOf("&") == 0) addParams = addParams.substring(1) ;
			    if(params.Target.indexOf("?") > 0) params.Target += "&";
			    else params.Target += "?";
			    params.Target += addParams;
		    }

		    if(params == false || params == null || params.CancelBubble)
		    {
			    return;	
		    }		    
		}
		if ( !arr ) break;
		handlers = savedRightContext;
        arr = re.exec( handlers );
    } 	
	return params;
}

function FireBeforeFormIdApplied( ctrl )
{
	var params = new Object();
	params.Control = ctrl;
	var res;
	if( ctrl.getAttribute('BeforeFormIdApplied') && ctrl.getAttribute('BeforeFormIdApplied') != "" )
	{
	    var handlers = ctrl.getAttribute('BeforeFormIdApplied');
        var re = /[\s,]+/;
        var arr = re.exec( handlers );        
	    while ( handlers != null && handlers != "" )
        {
		    var handler = arr ? RegExp.leftContext : handlers;
		    var savedRightContext = RegExp.rightContext;
		    if ( handler != "" ) 
		    {		    
		        eval("res=" + handler + "(params);");

		        if(typeof(res) != "undefined" && (res == null || res == "" || res === false)) return;

		        if(typeof(res) != "object" && res != null) 
		        {			
			        var addParams = res.replace("" + params, "");
			        if(addParams.indexOf("&") == 0) addParams = addParams.substring(1) ;
			        if(params.Target.indexOf("?") > 0) params.Target += "&";
			        else params.Target += "?";
			        params.Target += addParams;
		        }

		        if(params == false || params == null || params.CancelBubble)
		        {
			        return;	
		        }		    
		    }
		    if ( !arr ) break;
		    handlers = savedRightContext;
            arr = re.exec( handlers );
        } 		    
	}	
	
}

function PrepareSelectResult( value, firstVisible )
{
	return "Value=" + value + "&FirstVisible=" + firstVisible;
}


function PopupButtonEx_Enable( enabled )
{
	if( enabled == null ) return;
	if( this.getAttribute( 'src' ) != null )
	{
		if( enabled )
		{
			this.setAttribute( 'src', this.getAttribute( 'enabledsrc') );
			var functionName = "PopupBtn_OnClick()";
			this.onclick = function() { eval(functionName); };
		}
		else
		{
			this.setAttribute( 'src', this.getAttribute( 'disabledsrc') );
			this.onclick = function() {};
		}
		
	}	
}

/***********************************************************
 *  Append target params in safe way
 ***********************************************************/
function PopupBtn_AppendTargetParam( args, name, value )
{
    args.Target = addRequestParam( args.Target, name, value );
    return args;
}

/************************************************************
 * Add result params in safe way
 ************************************************************/
 function PopupBtn_AppendDialogResult( args, name, value )
{
    if ( args == null || !args || !args.DialogResult ) return null;
    args.DialogResult = addRequestParam( args.DialogResult, name, value );
    return args;
}

function ShowActivePopup ( id )
{
	var popupControl = document.all ( id );
	if (!popupControl) return;
	var sTargetForm = popupControl.getAttribute('Target');
	var targetUrl = "";
	
	var container = popupControl.getAttribute('ModalDialogContainer');
	var paramStr = null;
	
    var hdwdCtl = AwsGetElementById('__HiddenWindowID');
	if(container)
	{
	    targetUrl = container;
	    if (container.toLowerCase().indexOf(".htm") == container.length - 4)
	    {
	        paramStr = "?Modal=True&targetUrl=" + escape(sTargetForm);
	        if (hdwdCtl && hdwdCtl.value) paramStr += '&__HiddenWindowID='+hdwdCtl.value;
	    }
	    else
	    {
		    targetUrl += "?Modal=True&targetUrl=" + escape(sTargetForm);
	        if (hdwdCtl && hdwdCtl.value) targetUrl += '&__HiddenWindowID='+hdwdCtl.value;
		}
	}
	else
	{
		targetUrl += sTargetForm;
		if (hdwdCtl && hdwdCtl.value)
		{
            targetUrl += (targetUrl.indexOf("?") > 0)? "&":"?";
            targetUrl += '__HiddenWindowID='+hdwdCtl.value;
        }
	}	
	var dialogResult;
	var features = popupControl.getAttribute('DialogParams');

	dialogResult = showModalDialog(targetUrl, new Arguments ( null, paramStr), features);		
	
	var params = new Object();	
	params.DialogResult = dialogResult;
	params.CancelBubble = false;
	params.srcElement = popupControl;
	if(popupControl.getAttribute('AfterPopupDialog') && popupControl.getAttribute('AfterPopupDialog') != "")
	{
		params = FireHandlers( params, popupControl.getAttribute('AfterPopupDialog') );
		if(params === false || params == null || params.CancelBubble)
			return;
	}
	if ( params.DialogResult && typeof( params.DialogResult ) == "string" )
	{
	    dialogResult = params.DialogResult;
		if ( popupControl.getAttribute('ServerAfterPopupDialog') && dialogResult && dialogResult != 'CancelRefresh' )
		 	__doPostBack(popupControl.getAttribute('postbackId'), '_AfterPopup_:' + dialogResult );
	}
	if ( event != null ) event.returnValue = false;
	return dialogResult;
}