var Fse; if (!Fse) Fse = {};

if( !Fse.DialogManager ) Fse.DialogManager = {};

YAHOO.namespace( "Fse.Dialogs" );

Fse.DialogManager._getFseAttribute = function( oElement, sAttributeName, sDefaultValue ) {

	var sValue = oElement.getAttribute( "fse:" + sAttributeName );
	if( sValue == undefined && sDefaultValue != undefined ) {
		sValue = sDefaultValue;
	}
	return sValue;
};


Fse.DialogManager._defaultHandlers = {

	beforeRenderEvent:function( sType, aArgs, oMe ) {
		// default does nothing
	},
	
	beforeSubmitEvent:function( sType, aArgs, oMe ) {
	    // setup http headers
	    switch ( this.cfg.getProperty( "postmethod" ) ) {
	    	
	    	case "async" :
	    		break;
	    	
	    }
	},
	
	onSuccess:function() {
	},
	
	onUpload:function() {
	},
	
	onFailure:function() {
	},
	
	preSubmit:function() {
		return true;
	}
};

Fse.DialogManager.hide = function( sDialogId ) {
	if( YAHOO.Fse.Dialogs[sDialogId] ) {
		YAHOO.Fse.Dialogs[sDialogId].hide();
	}
};

Fse.DialogManager.show = function( sDialogId, oArgs ) {
	
	var oStub = document.getElementById( sDialogId );
	if( sDialogId.match( /.*\$$/ )) {
		if( oStub ) {
			var oDialogToDestroy = YAHOO.Fse.Dialogs[sDialogId];
			if( oDialogToDestroy ) {
				oDialogToDestroy.destroy();
				YAHOO.Fse.Dialogs[sDialogId] = null;
			}
			oStub.parentNode.removeChild( oStub );
		}
		var sDialogClass = sDialogId.replace( /\$$/, "_0" );
		oContainer = document.createElement( "div" );
		oContainer.setAttribute( "class", sDialogClass + " fse-hidden" );
		oContainer.setAttribute( "id", sDialogId );
		document.body.appendChild( oContainer );
		oContainer.innerHTML = "<div class=\"bd\"></div>";
		
	}else if ( ! oStub ) {
		alert( "Can't find " + sDialogId );
		return;
	}
	
	var fn = function() {
	
	if(! YAHOO.Fse.Dialogs[sDialogId] ) {
		
		var oDialogElement = document.getElementById( sDialogId );
		var sModal = Fse.DialogManager._getFseAttribute( oDialogElement, "modal", "true" );
		var sTitle = Fse.DialogManager._getFseAttribute( oDialogElement, "title", "Dialog" );
		var sWidth = Fse.DialogManager._getFseAttribute( oDialogElement, "width", "450px" );
		var sHideAfterSubmit = Fse.DialogManager._getFseAttribute( oDialogElement, "hideaftersubmit", "true" );
		
		var sButtons = Fse.DialogManager._getFseAttribute( oDialogElement, "buttons", "cancel,submit" );
		
		var sPostMethod = "async";
		
		if( oArgs && oArgs.postMethod ) {
			sPostMethod = oArgs.postMethod;
		}
		
		YAHOO.Fse.Dialogs[sDialogId] =  new YAHOO.widget.Dialog( oDialogElement, 
											{ width:sWidth, 
											  fixedcenter: true,
											  visible: false,
											  modal: sModal == "true",
											  underlay:"none",
											  zindex:4,
											  hideaftersubmit: sHideAfterSubmit == "true",
											  postmethod : sPostMethod,
											  constraintoviewport: true  
					  					    } );


		var aButtons = [];
		if( oArgs && oArgs.buttons ) { 

			aButtons = oArgs.buttons;

		} else {

			if( sButtons.match( /cancel/i )) {
				aButtons[aButtons.length] = { text:"Cancel", handler:function() { YAHOO.Fse.Dialogs[sDialogId].cancel(); }, isDefault:false };
			}
			if( sButtons.match( /close/i )) {
				aButtons[aButtons.length] = { text:"Close", handler:function() { YAHOO.Fse.Dialogs[sDialogId].cancel(); }, isDefault:false };
			}
			if( sButtons.match( /submit/i )) {
				aButtons[aButtons.length] = { text:"Submit", handler:function() { YAHOO.Fse.Dialogs[sDialogId].submit(); }, isDefault:true };
			}
			if( sButtons.match( /okay/i )) {
				aButtons[aButtons.length] = { text:"Okay", handler:function() { YAHOO.Fse.Dialogs[sDialogId].submit(); }, isDefault:true };
			}
			if( sButtons.match( /continue/i )) {
				aButtons[aButtons.length] = { text:"Continue", handler:function() { YAHOO.Fse.Dialogs[sDialogId].submit(); }, isDefault:true };
			}
			
		}		
		if( aButtons.length ) {
			YAHOO.Fse.Dialogs[sDialogId].cfg.queueProperty( "buttons", aButtons );
		}

		/*
											  buttons: [ 
												 { text:"Cancel", handler:Fse.SPL.cancelEmailDialog, isDefault:false },
												 { text:"Send Email", handler:Fse.SPL.emailOpportunity, isDefault:true } ]; 
		*/

		var beforeRenderEventHandler = Fse.DialogManager._defaultHandlers.beforeRenderEvent;
		if( !oArgs || !oArgs.beforeRenderEvent ) {
			var sInitScript = Fse.DialogManager._getFseAttribute( oDialogElement, "init", null );
			if( sInitScript ) {
				try {
					var handler = eval( sInitScript );
					if( handler ) {
						beforeRenderEventHandler = handler;
					} 
				}
				catch( x ) {} 
			}
		} else if ( oArgs.beforeRenderEvent ) {
			beforeRenderEventHandler = oArgs.beforeRenderEvent;
		}
		
		YAHOO.Fse.Dialogs[sDialogId].beforeRenderEvent.subscribe( beforeRenderEventHandler, oDialogElement );
		YAHOO.Fse.Dialogs[sDialogId].renderEvent.subscribe( Fse.DialogManager._initializePopupCalendar, oDialogElement );
		YAHOO.Fse.Dialogs[sDialogId].beforeSubmitEvent.subscribe( Fse.DialogManager._defaultHandlers.beforeSubmitEvent, oDialogElement );

		
		var _fnTest = function(){ 
			
			// YAHOO.Fse.Dialogs[sDialogId].cfg.setProperty("fixedcenter", false);
			
			var _a = YAHOO.util.Dom.getElementsBy( function(e){ return true; }, "form", oDialogElement );
			if( _a.length == 1 && _a[0].getAttribute( "fse:validationalerts" ) == "display") {

				var _id = _a[0].getAttribute( "name" ) + "_validationAlert";
				var _b = YAHOO.util.Dom.getElementsByClassName( "ft", "div", oDialogElement );
				if( _b.length == 1 ) {

					var _ft = _b[0];
					var oAlertSocket = document.createElement( "span" );
					oAlertSocket.setAttribute( "id", _id );
					oAlertSocket.setAttribute( "class", "validation-alert" );
					_ft.insertBefore( oAlertSocket, _ft.firstChild );
				}
			}
			
		};
		
		var _fnReconfigure = function() {
			YAHOO.Fse.Dialogs[sDialogId].cfg.setProperty("fixedcenter", false);
		};
		
		
		
		// YAHOO.Fse.Dialogs[sDialogId].renderEvent.subscribe( _fnTest, oDialogElement );
		YAHOO.Fse.Dialogs[sDialogId].showEvent.subscribe( _fnReconfigure, oDialogElement );

		
		
		var onSuccess = Fse.DialogManager._defaultHandlers.onSuccess;
		if( oArgs && oArgs.onSuccess ) {
			onSuccess = oArgs.onSuccess;
		} else {
	
			var sOnSuccess = Fse.DialogManager._getFseAttribute( oDialogElement, "onsuccess", null );
			if( sOnSuccess ) {
				try {
					var handler = eval( "YAHOO.Fse.Dialogs[sDialogId]._onSuccess = function( request ) { " + sOnSuccess + " };" );
					if( handler ) {
						onSuccess = handler;
					} 
				}
				catch( x ) {} 
			}

		}

		var onUpload = Fse.DialogManager._defaultHandlers.onUpload;
		if( oArgs && oArgs.onUpload ) {
			onUpload = oArgs.onUpload;
		} else {
	
			var sOnUpload = Fse.DialogManager._getFseAttribute( oDialogElement, "onupload", null );
			if( sOnUpload ) {
				try {
					var handler = eval( "YAHOO.Fse.Dialogs[sDialogId]._onUpload = function( request ) { " + sOnUpload + " };" );
					if( handler ) {
						onUpload = handler;
					} 
				}
				catch( x ) {} 
			}

		}
		
		if( onUpload == Fse.DialogManager._defaultHandlers.onUpload ) {
			onUpload = onSuccess;
		}		
		
		var onFailure = Fse.DialogManager._defaultHandlers.onFailure;
		var sOnFailure = Fse.DialogManager._getFseAttribute( oDialogElement, "onfailure", null );
		if( sOnFailure ) {
			try {
				var handler = eval( "YAHOO.Fse.Dialogs[sDialogId]._onFailure = function( request ) { " + sOnFailure + " };" );
				if( handler ) {
					onFailure = handler;
				} 
			}
			catch( x ) {} 
		}
		
		YAHOO.Fse.Dialogs[sDialogId].callback.scope = YAHOO.Fse.Dialogs[sDialogId];
		YAHOO.Fse.Dialogs[sDialogId].callback.success = onSuccess;
		YAHOO.Fse.Dialogs[sDialogId].callback.failure = onFailure;
		YAHOO.Fse.Dialogs[sDialogId].callback.upload = onUpload;
		
		YAHOO.Fse.Dialogs[sDialogId].setHeader( sTitle );
		YAHOO.Fse.Dialogs[sDialogId].render( document.body );
		YAHOO.util.Dom.removeClass( oDialogElement, "fse-hidden" );


		var oDialog = YAHOO.Fse.Dialogs[sDialogId];
		var fnPreSubmit = Fse.DialogManager._defaultHandlers.preSubmit;
		
		if( oArgs && oArgs.preSubmit ) {
			oDialog.preSubmit = oArgs.preSubmit;	
		} else {
		
			var sPreSubmitScript = Fse.DialogManager._getFseAttribute( oDialogElement, "presubmit", "" );
			if( sPreSubmitScript != "" ) {
				eval( "oDialog.preSubmit = function( ) {" + sPreSubmitScript + "; return true; };" );
			} else {
				oDialog.preSubmit = fnPreSubmit;
			}
		}		
		
		YAHOO.Fse.Dialogs[sDialogId].validate = function() {
			YAHOO.Fse.Dialogs[sDialogId].registerForm();
			
			if( YAHOO.Fse.Dialogs[sDialogId].tabView && ! YAHOO.Fse.Dialogs[sDialogId].form._tabView ) {
				YAHOO.Fse.Dialogs[sDialogId].form._tabView = YAHOO.Fse.Dialogs[sDialogId].tabView;
			}
			
			if( Fse.FormManager.submit( YAHOO.Fse.Dialogs[sDialogId].form, false ) ) {
				if( YAHOO.Fse.Dialogs[sDialogId].preSubmit ) {
					return YAHOO.Fse.Dialogs[sDialogId].preSubmit();
				}				
				return true;
			} else {
				return false;
			}
		};
		

	}


	if( oArgs ) {
		if( oArgs.title ) {
			YAHOO.Fse.Dialogs[sDialogId].setHeader( oArgs.title );
		}
		if( oArgs.width ) {
			YAHOO.Fse.Dialogs[sDialogId].cfg.setProperty( "width", oArgs.width );
		}
	}

	YAHOO.Fse.Dialogs[sDialogId].show();

	};


	var oBd;
	var sSrc;
	var fnOnLoad;
	var oDialogBody = YAHOO.util.Dom.getElementsByClassName( "bd", "div", sDialogId );
	if( oDialogBody.length ) {
		oBd = oDialogBody[0];
		sSrc =  Fse.DialogManager._getFseAttribute( oBd, "src", null );
		sOnLoad = Fse.DialogManager._getFseAttribute( oBd, "onload", null );
		if( sOnLoad ) {
			var sJs = "fnOnLoad = function ( bd ) { " + sOnLoad + " };";
			eval( sJs );
		}
	} else {
	}

	if( oArgs && oArgs.src ) {
		sSrc = oArgs.src;
	}
	
	if( oArgs && oArgs.onLoad ) {
		fnOnLoad = oArgs.onLoad;
	}
	
	if( sSrc ) {
		
		var callback = {
			success : function( oResponse ) {
						Fse.Ajax.hideWait();
						oBd.innerHTML = oResponse.responseText;
						if( fnOnLoad ) {
							fnOnLoad( oBd );
						}
						if( YAHOO.Fse.Dialogs[sDialogId] ) {
							YAHOO.Fse.Dialogs[sDialogId].render( document.body );
						}
						fn();
			          },
			failure : function( oResponse ) {
						Fse.Ajax.hideWait();
						alert( "failure!" );
					  }
			};
		
		
		Fse.Ajax.showWait( 0, "Opening, please wait..." );
		if( oArgs && oArgs.requestHeaders ) {
			for( var _header in oArgs.requestHeaders ) {
				YAHOO.util.Connect.initHeader( _header, oArgs.requestHeaders[_header] );
			}	
		}
		YAHOO.util.Connect.asyncRequest( "GET", sSrc, callback );
		
	} else {
		fn();
	}
	
	/*
	YAHOO.Fse.SPL.emailDialog.setHeader( sTitle);
	YAHOO.Fse.SPL.emailDialog.render( document.body );
	Fse.SPL._emailDialogInitialized = true;
	*/
	
};

Fse.DialogManager.testInit = function() {
	alert( "test called" );
};

Fse.DialogManager.testSuccess = function( oResponse ) {
	alert( "Success " + this );
	alert( oResponse.status );
};

Fse.DialogManager.testFailure = function( oResponse ) {
	alert( "Failure " + this );
	alert( oResponse.status );
};


Fse.DialogManager.confirm = function( sTitle, sMessage ) {
	return confirm( sMessage );
};

Fse.DialogManager.alert = function( sTitle, sMessage ) {
	alert( sMessage );
};

Fse.DialogManager.alert2 = function( sTitle, sMessage ) {
	
	if( ! YAHOO.Fse.Dialogs[ "fseAlertDialog" ]) {
		
		// Instantiate the Dialog
		YAHOO.Fse.Dialogs[ "fseAlertDialog" ] = new YAHOO.widget.SimpleDialog( "fseAlertDialog", 
																				 { width: "300px",
																				   fixedcenter: true,
																				   visible: false,
																				   draggable: true,
																				   close: true,
																				   modal: true,
																				   icon: YAHOO.widget.SimpleDialog.ICON_HELP,
																				   constraintoviewport: true,
																				   buttons: [ { text:"Ok", handler: function() { this.hide(); }, isDefault:true } ]
																				 } );


		YAHOO.Fse.Dialogs[ "fseAlertDialog" ].setHeader( sTitle );
		YAHOO.Fse.Dialogs[ "fseAlertDialog" ].setBody( sMessage );
		YAHOO.Fse.Dialogs[ "fseAlertDialog" ].render( document.body );

		
	}
	
	var oAlertDialog = YAHOO.Fse.Dialogs[ "fseAlertDialog" ];
	
	if( oAlertDialog ) { 

		oAlertDialog.setHeader( sTitle );
		oAlertDialog.setBody( sMessage );
		oAlertDialog.show();
		
	}
	
};

Fse.DialogManager._closeAlertDialog = function() {
	var oAlertDialog = YAHOO.Fse.Dialogs[ "fseAlertDialog" ];
	if( oAlertDialog ) {
		oAlertDialog.hide();
	}
};


YAHOO.util.Connect.initHeader( "fseAjax", true, true );

Fse.DialogManager._initializePopupCalendar = function ( sType, aArgs, oMe ) {
	Fse.DialogManager.initializePopupCalendarHandler( oMe );
};

Fse.DialogManager.initializePopupCalendarHandler = function( oRootElement ) {
	
	var fnMatch = function ( e ) {
		if( e.getAttribute( "type" ) == "text" ) {
			return e.getAttribute( "fse:format" ) == "date";
		} else {
			return false;
		}
	};
	
	var aDateFields = YAHOO.util.Dom.getElementsBy( fnMatch, "input", oRootElement );
	if( aDateFields.length ) {
		
		var sContainerId = oRootElement.getAttribute( "id" ) + "popupCalendar";
		var oContainer = document.getElementById( sContainerId );
		if( ! oContainer ) {
			oContainer = document.createElement( "div" );
			oContainer.setAttribute( "id", sContainerId );
			
			// add it to the button group so that the button group doesn't obscure it
			var aFooter = YAHOO.util.Dom.getElementsByClassName( "ft", "div", oRootElement );
			if( aFooter.length ) {
				aFooter[0].appendChild( oContainer );
			} else {
				oRootElement.appendChild( oContainer );
			}
		}
		
		var oPopupCalendar = new YAHOO.widget.Calendar( sContainerId, { navigator:true, mindate:"1/1/2005", maxdate:"12/31/2110" } );
		var oCurrentField;


		var fnShow = function( oEvent ) {
			var oTarget = YAHOO.util.Event.getTarget( oEvent );
			oCurrentField = oTarget;
			
			var xy = YAHOO.util.Dom.getXY( oTarget );
			var date = YAHOO.util.Dom.get( oTarget ).value;
			if( date ) {
				try {
					oPopupCalendar.cfg.setProperty( "pagedate", new Date( date ), true )
					oPopupCalendar.cfg.setProperty( "selected", date );
				} catch( dateX ) {
					oPopupCalendar.cfg.setProperty( "pagedate", new Date(), true )
					oPopupCalendar.cfg.setProperty( "selected", "" );
				}
			} else {
				oPopupCalendar.cfg.setProperty( "selected", "" );
				oPopupCalendar.cfg.setProperty( "pagedate", new Date(), true )
			}
			oPopupCalendar.bOverCal = false;
			oPopupCalendar.render();
			oPopupCalendar.show();
			xy[1] = xy[1] + 20;
			YAHOO.util.Dom.setXY( sContainerId, xy );
		};
		
		var fnHide = function( oEvent ) {
			if (! oPopupCalendar.bOverCal ) {   
				oPopupCalendar.hide();
			}   
		};


		var fnSelect = function( type, args, obj ) {
	
			var dates = args[0]; 
			var date = dates[0];
			var year = date[0], month = date[1], day = date[2];
			
			if( month < 10 ) {
				month = "0" + month;
			}
			
			if( day < 10 ) {
				day = "0" + day;
			}
			
			oCurrentField.value = month + "/" + day + "/" + year;
			if( oCurrentField.fseOnChange ) {
				oCurrentField.fseOnChange();
			}

			oPopupCalendar.bOverCal = false;
			fnHide();
		};
		
		oPopupCalendar.selectEvent.subscribe( fnSelect, oPopupCalendar, true );
		
		var fnMouseover = function() {
			oPopupCalendar.bOverCal = true;			
		};
		
		var fnMouseout = function() {
			oPopupCalendar.bOverCal = false;
		}
		
		var fnSetupListeners = function() {
			if( ! oPopupCalendar.fseInitialized ) {
				YAHOO.util.Dom.setStyle( sContainerId, "display", "none" );
				YAHOO.util.Dom.setStyle( sContainerId, "position", "absolute" );
				oPopupCalendar.fseInitialized = true;
			}
			YAHOO.util.Event.addListener( sContainerId, "mouseover", fnMouseover );
			YAHOO.util.Event.addListener( sContainerId, "mouseout", fnMouseout );
		};
		
		oPopupCalendar.renderEvent.subscribe( fnSetupListeners, oPopupCalendar, true );
		
		for( var idx = 0; idx < aDateFields.length; idx++ ) {
			
			var adf = aDateFields[idx];
			var fseOnChangeSrc = adf.getAttribute( "fse:onchange" );
			if( fseOnChangeSrc ) {
				try {
					eval( "adf.fseOnChange = function( event ) { " + fseOnChangeSrc + " };" );
				} catch( x ) {
				}
			} 
			
			YAHOO.util.Event.addListener( aDateFields[idx], "focus", fnShow );
			YAHOO.util.Event.addListener( aDateFields[idx], "blur", fnHide );
		}
		
		oPopupCalendar.render();
	}
	
};

