//
// Descricao: cria janelas popup
// Ultima atualizacao: 19/05/2007
// Versao: 2.5.1
// Versao YUI: 0.12.2
// Versao YUI-ext: 0.33
//
// v2.4.1: corrigido o problema de carregamento de URLs diferentes a cada abertura de popup
// v2.5: implementado o parametro "default" em "panels" para definir a tab ativa inicialmente
// v.2.5.1: alterado o nome do parametro "default" para "start" por incompatibilidade com o IE
//
var dialogWindow = function() {
	var arr_urls = new Array();
	
	return {
		obj_conn : {},
		id_popup : '',
		
		init : function() {
			
		},
		
		//
		// Monta e exibe uma janela popup em DIVs
		//
		show : function( str_id, str_origin, obj_params, arr_buttons ) {
			var int_locals                   = 0, str_local = '';
			var arr_options                  = new Array();
			var arr_locals                   = new Array();
			
			var boo_created                  = false;
			
			eval ( 'var boo_created = ( !' + str_id + ') ? false : true;' );
			
			// Cria o array para armazenar as URLs dos paineis
			arr_urls[str_id]                 = new Array();
			
			// Cria os DIVs ( se necessario )
			eval( 'arr_options = this.makeStructure( "' + str_id + '", obj_params, boo_created );' );
			
			if ( !boo_created ) {
				// Cria o objeto de dialogo uma unica vez
				eval( str_id + ' = new YAHOO.ext.LayoutDialog( "div_popup_' + str_id + '", arr_options[0] );' );
				
				// Define as funcoes do "esc" e dos botoes adicionados
				if ( arr_buttons ) {
					for ( x = 0; x < arr_buttons.length; x++ ) {
						if ( arr_buttons[x].type == 'close' ) {
							// Botao de fechar
							eval( str_id + '.addKeyListener( 27, ' + str_id + '.hide, ' + str_id + ' );' );
							eval( str_id + '.addButton( arr_buttons[x].caption, ' + str_id + '.hide, ' + str_id + ' );' );
						
						} else if ( arr_buttons[x].type == 'button' ) {
							// Botao de execucao
							eval( str_id + '.addButton( arr_buttons[x].caption, arr_buttons[x].link, ' + str_id + ' );' );
						
						} else if ( arr_buttons[x].type == 'submit' ) {
							// Botao de envio de dados
							eval( str_id + '.addButton( arr_buttons[x].caption, send = function() { dialogWindow.processForm( "' + str_id + '", "' + arr_buttons[x].link + '", ( ( obj_params.reload ) ? obj_params.reload : [] ), "' + ( ( arr_buttons[x].beforeSubmit ) ? arr_buttons[x].beforeSubmit : '' ) + '", "' + ( ( arr_buttons[x].afterSubmit ) ? arr_buttons[x].afterSubmit : '' ) + '" ); }, ' + str_id + ' );' );
						}
					}
				}
				
				if ( arr_options[1].length > 0 ) {
					// Carrega os paineis
					eval( 'var layout = ' + str_id + '.getLayout();' );
					
					eval( str_id + '.beginUpdate();' );
					
					// Insere os paineis na popup
					for ( x = 0; x < arr_options[1].length; x++ ) {
						if ( arr_options[1][x] ) {
							if ( arr_options[1][x].local != str_local ) {
								// Marca o painel para seleciona-lo inicialmente
								arr_locals[int_locals] = new Array( arr_options[1][x].local, arr_options[1][x].id );
								
								int_locals++;
								
								// Local atual
								str_local              = arr_options[1][x].local;
							}
							
							layout.add( arr_options[1][x].local, new YAHOO.ext.ContentPanel( arr_options[1][x].id, { title: arr_options[1][x].title } ) );
						}
					}
					
					// Ativa os primeiros paineis
					for ( x = 0; x < arr_locals.length; x++ )
						layout.getRegion( arr_locals[x][0] ).showPanel( arr_locals[x][1] );
					
					eval( str_id + '.endUpdate();' );
				}
			}
			
			// Captura/atualiza as URLs dos paineis
			if ( arr_options[1].length > 0 ) {
				for ( x = 0; x < arr_options[1].length; x++ ) {
					if ( arr_options[1][x] ) {
						// Armazena as URLs dos paineis
						if ( arr_options[1][x].url )
							arr_urls[str_id][x]      = { id: arr_options[1][x].id, url: arr_options[1][x].url, local: arr_options[1][x].local };
						
						// Define a tab ativa inicialmente
						if ( arr_options[1][x].start == 'true' ) {
							eval( 'obj_layout = ' + str_id + '.getLayout();' );
							
							obj_layout.getRegion( arr_options[1][x].local ).showPanel( arr_options[1][x].id );
						}
					}
				}
			} else if ( obj_params.url )
				// Conteudo geral da popup
				arr_urls[str_id][0]            = { id: ( 'div_content_' + str_id ), url: obj_params.url, params: obj_params.params };
			
			// Atualiza o conteudo dos paineis
			for ( x = 0; x < arr_urls[str_id].length; x++ )
				if ( arr_urls[str_id][x] ) {
					var obj_update               = getEl( arr_urls[str_id][x].id ).getUpdateManager();
					
					obj_update.update( { url: arr_urls[str_id][x].url, params: arr_urls[str_id][x].params, discardUrl: true, nocache: true, text: 'Loading...', timeout: 30, scripts: true } );
				}
			
			// Exibe a janela
			if ( str_origin ) {
				// Com animacao a partir da origem
				obj_origin                     = getEl( str_origin );
				
				eval( str_id + '.show( obj_origin.dom );' );
				
			} else
				// Instantaneamente
				eval( str_id + '.show();' );
		},
		
		//
		// Monta os DIVs da estrutura da popup
		//
		makeStructure : function( str_id, obj_params, boo_created ) {
			var str_params              = '';
			var str_divs                = '';
			var arr_options             = new Array();
			var arr_divs                = new Array( 'north', 'west', 'center', 'east', 'south' );
			
			if ( obj_params ) {
				// Parametros da popup
				str_params               += 'modal: ' + ( ( obj_params.modal ) ? obj_params.modal : 'false' );
				str_params               += ', width: ' + ( ( obj_params.width ) ? obj_params.width : '250' );
				str_params               += ', height: ' + ( ( obj_params.height ) ? obj_params.height : '250' );
				str_params               += ( obj_params.shadow ) ? ( ', shadow: ' + obj_params.shadow ) : '';
				str_params               += ', minWidth: ' + ( ( obj_params.minWidth ) ? obj_params.minWidth : '200' );
				str_params               += ', minHeight: ' + ( ( obj_params.minHeight ) ? obj_params.minHeight : '200' );
				
				if ( !obj_params.url ) {
					// Layout baseado em paineis
					
					for ( x = 0; x < arr_divs.length; x++ ) {
						eval( 'var obj_panel = obj_params.' + arr_divs[x] + ';' );
						
						if ( obj_panel ) {
							var str_content     = '';
							
							str_content        += 'split: ' + ( ( obj_panel.split ) ? obj_panel.split : 'false' );
							str_content        += ( obj_panel.initialSize ) ? ( ', initialSize: ' + obj_panel.initialSize ) : '';
							str_content        += ( obj_panel.minSize ) ? ( ', minSize: ' + obj_panel.minSize ) : '';
							str_content        += ( obj_panel.maxSize ) ? ( ', maxSize: ' + obj_panel.maxSize ) : '';
							str_content        += ( obj_panel.titlebar ) ? ( ', titlebar: ' + obj_panel.titlebar ) : '';
							str_content        += ( obj_panel.collapsible ) ? ( ', collapsible: ' + obj_panel.collapsible ) : '';
							str_content        += ( obj_panel.animate ) ? ( ', animate: ' + obj_panel.animate ) : '';
							str_content        += ( obj_panel.autoScroll ) ? ( ', autoScroll: ' + obj_panel.autoScroll ) : '';
							str_content        += ( obj_panel.tabPosition ) ? ( ', tabPosition: "' + obj_panel.tabPosition + '"' ) : '';
							str_content        += ( obj_panel.closeOnTab ) ? ( ', closeOnTab: ' + obj_panel.closeOnTab ) : '';
							str_content        += ( obj_panel.alwaysShowTabs ) ? ( ', alwaysShowTabs: ' + obj_panel.alwaysShowTabs ) : '';
							
							str_params         += ', ' + arr_divs[x] + ': { ' + str_content + ' }';
						}
					}
				}
			}
			
			if ( !boo_created ) {
				// Formulario
				var obj_form              = document.createElement( 'form' );
				
				obj_form.id               = ( 'form_' + str_id );
				obj_form.setAttribute( 'style', 'margin: 0px; padding: 0px;' );
				
				document.body.appendChild( obj_form );
				
				// DIV base da popup
				var obj_base              = document.createElement( 'div' );
				
				obj_base.id               = ( 'div_popup_' + str_id );
				obj_base.setAttribute( 'style', 'visibility: hidden;' );
				
				document.getElementById( ( 'form_' + str_id ) ).appendChild( obj_base );
				
				// DIV do titulo
				var obj_title             = document.createElement( 'div' );
				
				obj_title.id              = ( 'div_title_' + str_id );
				obj_title.className       = 'ydlg-hd';
				obj_title.innerHTML       = obj_params.title;
				
				document.getElementById( ( 'div_popup_' + str_id ) ).appendChild( obj_title );
				
				// DIV do conteudo
				var obj_content           = document.createElement( 'div' );
				
				obj_content.id            = ( 'div_content_' + str_id );
				obj_content.className     = 'ydlg-bd';
				
				document.getElementById( ( 'div_popup_' + str_id ) ).appendChild( obj_content );
			}
			
			if ( !obj_params.url ) {
				// Layout baseado em paineis
				
				for ( x = 0; x < arr_divs.length; x++ ) {
					eval( 'var obj_panel = obj_params.' + arr_divs[x] + ';' );
					
					if ( obj_panel ) {
						for ( y = 0; y < obj_panel.panels.length; y++ ) {
							if ( !boo_created ) {
								var obj_div       = document.createElement( 'div' );
								
								obj_div.id        = obj_panel.panels[y].id;
								obj_div.className = 'ylayout-active-content';
								
								document.getElementById( ( 'div_content_' + str_id ) ).appendChild( obj_div );
							}

							str_divs           += ( ( str_divs ) ? ', ' : '' ) + '{ local: "' + arr_divs[x] + '", id: "' + obj_panel.panels[y].id + '", title: "' + obj_panel.panels[y].title + '", url: "' + ( obj_panel.panels[y].url ? obj_panel.panels[y].url : '' ) + '", start: "' + obj_panel.panels[y].start + '" }';
						}
					}
				}
			}
			
			// Armazena o retorno em array
			eval( 'arr_options[0] = { ' + str_params + ' };' );
			eval( 'arr_options[1] = [ ' + str_divs + ' ];' );
			
			return arr_options;
		},
		
		//
		// Insere uma nova aba na popup
		//
		addTab : function( str_id, obj_params ) {
			if ( !document.getElementById( obj_params.id ) ) {
				// Cria o DIV
				var obj_div       = document.createElement( 'div' );
				obj_div.id        = obj_params.id;
				obj_div.className = 'ylayout-active-content';
				
				// Insere o div no conteudo da popup
				document.getElementById( ( 'div_content_' + str_id ) ).appendChild( obj_div );
			}
			
			// Insere a aba no painel
			eval( 'var layout = ' + str_id + '.getLayout();' );
			
			eval( str_id + '.beginUpdate();' );
			
			layout.add( obj_params.local, new YAHOO.ext.ContentPanel( obj_params.id, { title: obj_params.title } ) );
			
			eval( str_id + '.endUpdate();' );
			
			if ( obj_params.url ) {
				// Atualiza o conteudo
				var obj_update    = getEl( obj_params.id ).getUpdateManager();
				
				obj_update.update( { url: obj_params.url, params: obj_params.params, discardUrl: true, nocache: true, text: 'Loading...', timeout: 30, scripts: true } );
			}
		},
		
		//
		// Fecha uma aba da popup
		//
		closeTab : function( str_idPopup, str_local, str_idTab ) {
			eval( 'var layout = ' + str_idPopup + '.getLayout();' );
			
			eval( str_idPopup + '.beginUpdate();' );
			
			// Remove a aba
			layout.remove( str_local, str_idTab );
			
			eval( str_idPopup + '.endUpdate();' );
		},
		
		//
		// Define/altera o titulo da popup
		//
		setTitle : function( str_id, str_title ) {
			getEl( 'div_title_' + str_id ).update( str_title );
		},
		
		//
		// Fecha a popup
		//
		close : function( str_id ) {
			eval( str_id + '.hide();' );
		},
		
		//
		// Processa os dados do formulario
		//
		processForm : function( str_id, str_url, arr_reload, str_beforeSubmit, str_afterSubmit ) {
			if ( !YAHOO.util.Connect.isCallInProgress( dialogWindow.obj_conn ) ) {
				var boo_result   = true;
				var obj_return;
				
				if ( str_beforeSubmit )
					eval( 'boo_result = ' + str_beforeSubmit + '();' );
				
				if ( boo_result == true ) {
					// Retorno positivo, envia os dados do formulario para o script
					
					// Define o formulario com os dados
					YAHOO.util.Connect.setForm( 'form_' + str_id )
					
					// Envia os dados
					this.obj_conn  = YAHOO.util.Connect.asyncRequest( 'POST', str_url, { success: this.processReturn, failure: this.processFailure, argument: { id: str_id, reload: arr_reload, afterSubmit: str_afterSubmit } } );
					
					// Exibe a mensagem de processamento
					this.waitOn( str_id );
				
				} else if ( boo_result ) {
					// Retornou um objeto, trata o retorno e interrompe o processo de envio
					
					var obj_return = { responseText: boo_result, argument: { id: str_id, reload: arr_reload, afterSubmit: str_afterSubmit } };
					
					this.processReturn( obj_return );
				}
			}
		},
		
		//
		// Processa o retorno do envio de dados
		//
		processReturn : function( obj_return ) {
			// Monta o objeto com os parametros de retorno
			eval( 'var obj_params = ' + ( obj_return.responseText ? obj_return.responseText : '{}' ) + ';' );
			
			if ( obj_params.status == 'error' ) {
				var str_message      = obj_params.message + "\n";
				
				for ( x = 0; x < obj_params.fields.length; x++ ) {
					// Monta a mensagem de erro
					str_message       += obj_params.fields[x].message + "\n";
					
					// Captura os objetos
					var obj            = document.getElementById( obj_params.fields[x].id );
					
					obj                = getEl( obj );
					
					// Marca o campo
					obj.setStyle( 'background-color', '#FFEFB3' );
				}
				
				// Exibe as mensagens de erro
				alert( str_message );
			
			} else {
				if ( obj_return.argument.id )
					// Fecha a popup
					eval( obj_return.argument.id + '.hide();' );
				
				// Atualiza os objetos informados
				for ( x = 0; x < obj_return.argument.reload.length; x++ ) {
					// Identifica o objeto a ser atualizado
					var obj_reload     = getEl( obj_return.argument.reload[x] );
					
					if ( obj_reload ) {
						// Elemento da pagina
						
						var obj_update   = obj_reload.getUpdateManager();
						
						obj_update.refresh();
					
					} else {
						// Objeto dinamico
						
						// Identifica novamente o objeto a ser atualizado
						eval( 'var obj_reload = ' + obj_return.argument.reload[x] + ';' );
						
						if ( obj_reload.refresh ) {
							// Utiliza a funcao interna do objeto
							obj_reload.refresh();
						
						} else {
							// Tenta utilizar o metodo padrao de atualizacao
							var obj_update = obj_reload.getUpdateManager();
							
							obj_update.refresh();
						}
					}
				}
				
				if ( obj_return.argument.afterSubmit )
					eval( obj_return.argument.afterSubmit + '();' );
			}
		},
		
		//
		// Falhou ao processar
		//
		processFailure : function( obj_return ) {
			
		},
		
		//
		// Exibe a mensagem de processamento
		//
		waitOn : function( str_id ) {
			this.id_popup             = str_id;
			
			// Cria os DIVs da mensagem caso ainda nao existam
			if ( !getEl( 'loading_' + str_id ) ) {
				// Containter principal
				var obj_loading1        = document.createElement( 'div' );
				
				obj_loading1.id         = ( 'loading_' + str_id );
				obj_loading1.className  = 'loading';
				obj_loading1.setAttribute( 'style', 'z-index: 100;' );
				
				document.getElementById( ( 'div_popup_' + str_id ) ).appendChild( obj_loading1 );
				
				// Containter secundario
				var obj_loading2        = document.createElement( 'div' );
				
				obj_loading2.id         = ( 'loading_indicator' + str_id );
				obj_loading2.className  = 'loading-indicator';
				obj_loading2.innerHTML  = 'Processing...';
				
				document.getElementById( ( 'loading_' + str_id ) ).appendChild( obj_loading2 );
			}
			
			// Centraliza o box de mensagem
			getEl( 'loading_' + str_id ).center( 'div_popup_' + str_id );
			
			// Captura o objeto novamente
			var obj_loading           = document.getElementById( 'loading_' + str_id );
			
			// Exibe o objeto
			obj_loading.style.display = '';
			
			// Controla a exibicao
			window.setTimeout( 'dialogWindow.waitOff()', 500 );
		},
		
		//
		// Esconde a mensagem de processamento
		//
		waitOff : function() {
			if ( YAHOO.util.Connect.isCallInProgress( dialogWindow.obj_conn ) ) {
				// Continua o fluxo
				window.setTimeout( 'dialogWindow.waitOff()', 500 );
			
			} else {
				// Esconde o objeto
				var obj_loading           = document.getElementById( 'loading_' + dialogWindow.id_popup );
				
				obj_loading.style.display = 'none';
			}
		}
	};
} ();

// Inicializa o objeto
YAHOO.ext.EventManager.onDocumentReady( dialogWindow.init, dialogWindow, true );