import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;

/** BrowserController - Controlleren til browseren binder
 *	(1) BrowserModel,
 *	(2) BrowserDisplay og
 *	(3) BrowserView sammen
 *	@author Søren S Munk (u001614)
 */
public class BrowserController implements ActionListener,
						MouseListener,
						MouseMotionListener {
    
    private BrowserModel model;
    private BrowserDisplay display;
    private BrowserView view;
    
    /** BrowserController konstruktion
     * 	@param m modellen
     * 	@param d displayet
     * 	@param v viewet
	 */
    public BrowserController( BrowserModel m, 
		       BrowserDisplay d,
		       BrowserView v) {
	
		model = m;
		display = d;
		view = v;
		
		view.showTitle( model.getTitle() );
		// Under konverteringen til string kan der ske en fejl
		// hvis currentUrl (i BrowserModel) er null
		try {
			view.showLocation( model.getURL().toString() );
			view.showStatus("Home");
			}		
		catch ( java.lang.NullPointerException n ) {}
	}
    
    /** load opdaterer labels for adresse og titel samt sætter view
     *	til toppen af siden
	 */
    public void load() {
		display.scrollTop();
		// Under konverteringen til string kan der ske en fejl
		// hvis currentUrl (i BrowserModel) er null
		try { view.showLocation( model.getURL().toString() ); }
		catch ( java.lang.NullPointerException n) {}
		view.showTitle( model.getTitle() );
		display.repaint();
    }
    
	/** actionPerformed aktivers når der sker noget meningsfuldt
	 *	ved musen
	 */
    public void actionPerformed(ActionEvent e) {
	if ( e.getSource() == view.HOME )
	    { view.showStatus("Home");
	      model.home();
	      load();
	    }
	
	else if ( e.getSource() == view.SF ) 
	    { model.SF(); }
	
	else if ( e.getSource() == view.QUIT )
	    { System.exit(0); }
	
	else if ( e.getSource() == view.BACK )
	    {
		view.showStatus("Loading previous page");
		if ( model.back() )
			{ 
				load();
			  	view.showStatus("Done...");
			} 
		else view.showStatus("No more pages in stack");
	    }
	
	else if ( e.getSource() == view.FORWARD )
	    {
		view.showStatus("Loading next page");
		if ( model.forward() ) 
			{
				load();
				view.showStatus("Done...");
			}
		else view.showStatus("No more pages in stack");
	    }
	
	else if ( e.getSource() == view.UP )
	    {
			display.scrollUp();
			display.repaint();
		}
	
	else if ( e.getSource() == view.DOWN )
	    {
			display.scrollDown();
			display.repaint();	
		}
	
	else if ( e.getSource() == view.OPEN )
	    {
		view.showStatus("Retrieving " + view.getLocationText() + "...");
		try {
		    URL u = new URL( view.getLocationText() );
		    model.setNewURL(u);
		    load();
		    view.showStatus("Done...");
		}
		catch (MalformedURLException x) {
		    view.showStatus("Malformed URL: "
				    + view.getLocationText() +
				    "!");
			}
	    }
    }
    
	/** mouseClick åbner eventuel link, hvor der bliver trykket */
    public void mouseClicked(MouseEvent e) {
		URL url = model.getLink( e.getX(), e.getY() );
        if (url != null)
	    { 
			model.setNewURL(url);
			load();
			view.showStatus("Done...");
	    }
    }
    
    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void mousePressed(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}

	/** mouseMoved skriver eventuel link i statusbaren, hvis
	 *	musen placeres over det
	 */
    public void mouseMoved(MouseEvent e) {
		try {
		    String s = model.getLink( e.getX(), e.getY() ).toString();
		    System.out.println(s);
		    view.showStatus( s );
		}
		catch ( java.lang.NullPointerException n) { view.showStatus("Done..."); }
    }
    
    public void mouseDragged(MouseEvent e) {}
    
}
