/*
 * Projet : Trustopics
 * Version : 0.2.1
 * Fichier : WebParser.java
 */

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Vector;

public class WebParser {
	
	private Vector glb_vecteurPage = null;
	private Vector glb_vecteurResultsPage = null;
	private Vector glb_vecteurIndicesResultsPage = null;
	private String glb_pattern;
	private String glb_line;
	private int glb_lineIndice;
	private double glb_startTime;
	
	public WebParser() {}
	
	public boolean LoadPage(String prm_page) {
		glb_vecteurPage = new Vector();
	    String lcl_line = new String();
	    try {
	    	URLConnection lcl_connection = new URL(prm_page).openConnection();
	    	BufferedReader lcl_sin = new BufferedReader(new InputStreamReader(lcl_connection.getInputStream()));
	    	if (!Defines.roundProgressIsVisible) glb_startTime = System.currentTimeMillis();
	    	while((lcl_line = lcl_sin.readLine()) != null) {
	    		glb_vecteurPage.add(new String(lcl_line));
	    		if (Defines.roundProgressIsVisible) Defines.roundProgress.MyUpdate();
	    	}
	    	if (!Defines.roundProgressIsVisible) {
	    		Defines.elpasedTime += System.currentTimeMillis() - glb_startTime;
	    		Defines.filesDownload ++;
	    	}
		    lcl_sin.close();
		    if (Defines.roundProgressIsVisible) Defines.roundProgress.Init();
	    }
	    catch (Exception ex) {
	    	return(true);
	    }
	    if (glb_vecteurPage.size() <= 0) return(true);
	    return (false);
	}

	public void PrintPage() {
		for(int i = 0; i < glb_vecteurPage.size(); i++) {
			System.out.println(glb_vecteurPage.elementAt(i));
		}
	}

	public void PrintResultsPage() {
		for(int i = 0; i < glb_vecteurResultsPage.size(); i++) {
			System.out.println(glb_vecteurResultsPage.elementAt(i));
		}
	}

	public boolean TestKey(String prm_url,String prm_key) {
		if (prm_url.indexOf(prm_key) == -1) return (true);
		return(false);
	}

	public boolean TestKeys(String prm_lineVector,String[] prm_keys) {
		int lcl_total = prm_keys.length;
		int lcl_compteur = 0;
		for (int i = 0 ; i < prm_keys.length ; i ++) {
			if (!TestKey(prm_lineVector,prm_keys[i])) lcl_compteur ++; 
		}
		if (lcl_total != lcl_compteur) return(true);
		return(false);
	}

	public String ReplaceKeys(String prm_lineStart,String prm_lineVector,String[] prm_keys) {
		String lcl_lineStart = prm_lineStart;
		for (int i = 0 ; i < prm_keys.length ; i ++) {
			lcl_lineStart = SetParameter(lcl_lineStart,prm_keys[i],GetParameter(prm_lineVector,prm_keys[i]));
		}
		return(lcl_lineStart);
	}
	
	public String GetParameter(String prm_url,String prm_key) {
		String lcl_value = "";
		char lcl_car;
		int lcl_index;
		int i = 0;
		while(true) {
			lcl_index = prm_url.indexOf(prm_key) + prm_key.length() + i;
			if (lcl_index >= prm_url.length()) break;
			lcl_car = prm_url.charAt(lcl_index);
			if (lcl_car >= '0' && lcl_car <= '9') lcl_value += lcl_car;
			else break;
			i ++;
		}
		return(lcl_value);
	}
	
	public String SetParameter(String prm_url,String prm_key,String prm_value) {
		int lcl_keyIndice;
		StringBuffer lcl_url = new StringBuffer(prm_url);
		lcl_keyIndice = prm_url.indexOf(prm_key) + prm_key.length();
		lcl_url.replace(lcl_keyIndice,lcl_keyIndice + 1,prm_value);
		return(lcl_url.toString());
	}

	public boolean SeekLines(String prm_start) {
		String lcl_empty[] = new String[0];
		SeekUrlLines(prm_start,lcl_empty);
		return(false);
	}
	
	public boolean SeekUrlLines(String prm_start,String[] prm_keys) {
		glb_vecteurResultsPage = new Vector();
		glb_vecteurIndicesResultsPage = new Vector();
		String lcl_lineVector;
		String lcl_lineStart;
		for(int i = 0;i < glb_vecteurPage.size();i ++) {
			lcl_lineVector = ((String)glb_vecteurPage.elementAt(i));
			if (prm_keys.length > 0 && !TestKeys(lcl_lineVector,prm_keys)) {
				lcl_lineStart = ReplaceKeys(prm_start,lcl_lineVector,prm_keys);
			}
			else {
				lcl_lineStart = prm_start;
			}
			for(int j = 0;j < lcl_lineVector.length();j ++) {
				if (lcl_lineVector.indexOf(lcl_lineStart) != -1) {
					glb_vecteurResultsPage.add(new String(lcl_lineVector));
					glb_vecteurIndicesResultsPage.add(new String(String.valueOf(i)));
		    		break;
				}
			}
		}
		if (glb_vecteurResultsPage.size() == 0) return(true);
		return(false);
	}

	public boolean SeekPatternLine(String prm_start,String prm_end) {
		if (!SeekLine(prm_start)) {
			if (!SeekPattern(glb_line,prm_start,prm_end)) {
				return(false);
			}
		}
		return(true);
	}
	
	public boolean SeekLine(String prm_start) {
		glb_line = "NULL";
		glb_lineIndice = 0;
		String lcl_line;
		for(int i = 0;i < glb_vecteurPage.size();i ++) {
			lcl_line = ((String)glb_vecteurPage.elementAt(i));
			for(int j = 0;j < lcl_line.length();j ++) {
				if (lcl_line.regionMatches(true,j,prm_start,0,prm_start.length())) {
					glb_line = lcl_line;
					glb_lineIndice = i;
					return(false);
				}
			}
		}
		return(true);
	}

	public boolean SeekPattern(String prm_line,String prm_start,String prm_end) {
		glb_pattern = "NULL";
		int lcl_start;
		int lcl_end;
		lcl_start = prm_line.indexOf(prm_start);
		lcl_end = prm_line.indexOf(prm_end);
		if ( lcl_start == -1 || lcl_end == -1) return(true);
		glb_pattern = new PhpSessId().Del(prm_line.substring(lcl_start + prm_start.length(),lcl_end));
		return(false);
	}
	
	public Vector GetPage() {
		return(glb_vecteurPage);
	}

	public String GetPageLine(int prm_indice) {
		return((String)glb_vecteurPage.elementAt(prm_indice));
	}

	public Vector GetResultsPage() {
		return(glb_vecteurResultsPage);
	}

	public String GetResultLine(int prm_indice) {
		return((String)glb_vecteurResultsPage.elementAt(prm_indice));
	}
	
	public Vector GetIndicesResultsPage() {
		return(glb_vecteurIndicesResultsPage);
	}

	public String GetIndicesResultLine(int prm_indice) {
		return((String)glb_vecteurIndicesResultsPage.elementAt(prm_indice));
	}
	
	public String GetPattern() {
		return(glb_pattern);
	}
	
	public String GetPatternLine() {
		return(glb_line);
	}

	public int GetIndicePatternLine() {
		return(glb_lineIndice);
	}
}