package com.apropobenefits.wicket.component;

import wicket.Response;
import wicket.contrib.dojo.DojoAjaxHandler;
import wicket.markup.html.HtmlHeaderContainer;
import wicket.protocol.http.WebResponse;
import wicket.util.resource.IResourceStream;
import wicket.util.resource.StringBufferResourceStream;
import wicket.util.time.Time;

public abstract class RedirectHandler extends DojoAjaxHandler {
	public static final String IN_PROCESS = "0";
	public static final String ERROR = "1";
	public static final String SUCCESS = "2";
	
    Class successForward;
    Class errorForward;
    
    public RedirectHandler(Class successForward, Class errorForward) {
    	this.successForward = successForward;
    	this.errorForward = errorForward;
    }

    @Override
    public final void renderHeadContribution(HtmlHeaderContainer container) {
    	String url = getCallbackUrl();
    	String success = getComponent().getPage().urlFor(null, successForward, null);
    	String error = getComponent().getPage().urlFor(null, errorForward, null);
    	
        String s =
            "<script language=\"JavaScript\" type=\"text/javascript\">\n" +
            "function checkStatus() {\n" +
            "   dojo.io.bind({\n" +
            "      url: \"" + url + "\",\n" +
            "      mimetype: \"text/plain\",\n" +
            "      load: function(type, data, event) { \n" +
            "         if (data == \"" + SUCCESS + "\") {\n" +
            "            window.location=\"" + success + "\";\n" +
            "         }\n" +
            "         else if (data == \"" + ERROR + "\") {\n" +
            "            window.location=\"" + error + "\";\n" +
            "         }\n" +
            "      }\n" +
            "   });\n" +
            "   self.setTimeout(\"checkStatus()\", 1000);\n" +
            "}\n" +
            "window.onload = checkStatus;\n" +
            "</script>\n";
        
        container.getResponse().write(s);
    }

    @Override
    protected IResourceStream getResponse() {
        StringBufferResourceStream s = new StringBufferResourceStream();        
        s.append(getStatus());
        return s;
    }
    
    @Override
	protected void configure(Response response, IResourceStream resourceStream) {
		super.configure(response, resourceStream);
		response.setLastModifiedTime(Time.now());
		
		WebResponse servletResponse = (WebResponse) response;
		servletResponse.setHeader("Expires", "Mon, 20 Dec 1998 01:00:00 GMT");
		servletResponse.setHeader("Cache-Control", "no-cache, must-revalidate");
		servletResponse.setHeader("Pragma", "no-cache");
	}

	public abstract String getStatus();
}
