/**
 * License Agreement.
 *
 *  JBoss RichFaces - Ajax4jsf Component Library
 *
 * Copyright (C) 2007  Exadel, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 2.1 as published by the Free Software Foundation.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 */

/*
 * Created on 04.07.2006
 */
package org.richfaces.renderkit.html;

import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.ajax4jsf.event.AjaxEvent;
import org.ajax4jsf.renderkit.AjaxRendererUtils;
import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
import org.ajax4jsf.renderkit.RendererUtils;
import org.richfaces.component.UIToggleControl;
import org.richfaces.component.UITogglePanel;
import org.richfaces.event.SwitchablePanelSwitchEvent;
import java.io.IOException;

/**
 * @author igels
 *
 */
public class ToggleControlRenderer extends HeaderResourcesRendererBase {

	//xxx by nick - denis - please move scripts to template
	//private InternetResource[] _scripts = {new PrototypeScript(), getResource("scripts/togglePanel.js") };	

	/* (non-Javadoc)
	 * @see org.ajax4jsf.renderkit.RendererBase#getComponentClass()
	 */
	protected Class getComponentClass() {
		return UIToggleControl.class;
	}

//	@Override
//	protected InternetResource[] getScripts() {
//		return _scripts; 
//	}

//	protected InternetResource[] getAdditionalScripts() {
//		return _scripts;
//	}

	public void doDecode(FacesContext context, UIComponent component) {
		super.doDecode(context, component);
		ExternalContext exCtx = context.getExternalContext();
		Map rqMap = exCtx.getRequestParameterMap();
		Object clnId = rqMap.get(component.getClientId(context));
		if(clnId!=null) {
			// enqueue event here for this component or for component with Id 
			// taken fro forId attribute
			UIToggleControl control = (UIToggleControl)component;

			UITogglePanel panel = control.getPanel();

        	new SwitchablePanelSwitchEvent(panel, null, control).queue();
			
//			ToggleEvent event = new ToggleEvent(panel, control.getSwitchToState());
//		    if (control.isImmediate()) {
//		    	event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
//		    } else {
//		    	event.setPhaseId(PhaseId.INVOKE_APPLICATION);
//		    }
//		    event.queue();
		    
		    if(UITogglePanel.AJAX_METHOD.equals(panel.getSwitchType())) {
		    	 new AjaxEvent(component).queue();
		    }
		    ActionEvent actionEvent = new ActionEvent(component);
	    	component.queueEvent(actionEvent);
		}
	}

	public String getOnClick(FacesContext context, UIComponent component) {
		UIToggleControl tgComp = (UIToggleControl)component;
		UITogglePanel panel = tgComp.getPanel();
		//UITogglePanel panel = tgComp.getPanel(context);
		//denis
		String switchType = panel.getSwitchType();
		StringBuffer onClick = new StringBuffer();
		String userOnClick = (String)component.getAttributes().get("onclick");
		if(userOnClick!=null) {
			onClick.append(userOnClick);
			if(!userOnClick.trim().endsWith(";")) {
				onClick.append("; ");
			}
		}

		if(UITogglePanel.CLIENT_METHOD.equals(switchType)) {
			// Client
			String panelId = panel.getClientId(context);
			String switchToDivId = tgComp.getSwitchToState();
			onClick.append("TogglePanelManager.toggleOnClient('")
			.append(panelId)
			.append("',")
			.append(switchToDivId==null?"null":"'" + switchToDivId + "'")
			.append("")
			.append(");");
		} else if(UITogglePanel.AJAX_METHOD.equals(switchType)) {
			// Ajax
			if ( !getUtils().isBooleanAttribute(component,"disabled")) {
				return AjaxRendererUtils.buildOnClick(component, context).toString();
			} else {
				return "return false;";
			}
		} else {
			// Server
			//xxx by nick - denis - use org.ajax4jsf.renderkit.RendererUtils#getNestingForm(FacesContext, UIComponent)
			RendererUtils rendererUtils = new RendererUtils(); 
			UIForm Form= rendererUtils.getNestingForm(context, component);
			String formId=null;			
			if (Form!=null){
				 formId = Form.getClientId(context);
			}						
			if(formId==null) {
				throw new RuntimeException("toogleControl (id=\"" + component.getClientId(context) + "\") did not find parent form.");
			}
			onClick.append("TogglePanelManager.toggleOnServer('")
				.append(formId)
				.append("','")
				.append(component.getClientId(context))
				.append("',")
				.append(tgComp.getSwitchToState()==null?"''":"'" + tgComp.getSwitchToState() + "'")
				.append("")
				.append(");");
		}
		return onClick.toString();
	}

	public void encodeChildren(FacesContext context, UIComponent component) throws IOException {
 		    super.encodeChildren(context, component);
	}
	
/*	
	private String getFormId(FacesContext context,UIComponent component) {
		while (component != null && !(component instanceof UIForm)) {
			component = component.getParent();
		}
		return component != null ? component.getClientId(context) : null;
	}
*/	
}