All pastes #431980 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-04-10 00:00 UTC
rendered paste body
<?php

/**
 * Feed search
 *
 * @author		Tudor Prodan <tudor.prodan@gmail.com>
 */
class feedSearch {
	private $out;
	private $caseSensitiveSearch = false; 
	
	/**
	 * Entry point for the application.
	 *
	 * @return		void
	 */
	public function run($caseSensitiveSearch = false) {
		$this->caseSensitiveSearch = $caseSensitiveSearch;
		
		switch ($this->fetchRunCode()) {
			case "search":
				$this->out = $this->run_search();
				break;
			default:
				$this->out = $this->run_main();
				$this->wrapOut();
				break;
		}
		
		$this->printOut();
	}
	
	/**
	 * Renders the page elements.
	 *
	 * @return 		string
	 */
	private function run_main() {
		$out = "
				<script type=\"text/javascript\">
					var xmlHttp;
					var resultDiv;
					
					function getHTTPObject() {
					    if (typeof XMLHttpRequest != 'undefined') {
					        return new XMLHttpRequest();
					    }
					    try {
					        return new ActiveXObject(\"Msxml2.XMLHTTP\");
					    } catch (e) {
					        try {
					            return new ActiveXObject(\"Microsoft.XMLHTTP\");
					        } catch (e) {}
					    }
					    return false;
					}
					
					function searchStateChange() {
						if (xmlHttp.readyState == 4) {
							if (xmlHttp.status == 200) {
								result = xmlHttp.responseText;
								resultDiv.innerHTML = result;            
							} else {
								resultDiv.innerHTML = \"There was a problem with the request.\";
							}
						}
					}
					
					function checkInput() {
						var search_url = document.getElementById(\"search_url\");
						var search_tagName = document.getElementById(\"search_tagName\");
						var search_keyword = document.getElementById(\"search_keyword\");
						
						if (search_url.value == \"\" || search_tagName.value == \"\" || search_keyword.value == \"\") {
							resultDiv.innerHTML = \"All fields are mandatory for the search.\";
							return false;
						}
						
						return true;
					}
					
					function run_search() {
						resultDiv = document.getElementById(\"result\");
						var params = \"\";
						
						if (checkInput() == false) {
							return;
						}

						xmlHttp = getHTTPObject();
						if (xmlHttp == null) {
							resultDiv.innerHTML = \"Your browser doesn't support AJAX technology. Please use a different browser.\";
							return;
						}
						
						resultDiv.innerHTML = \"Performing search, please wait...\";
						
						var search_url = document.getElementById(\"search_url\");
						var search_tagName = document.getElementById(\"search_tagName\");
						var search_keyword = document.getElementById(\"search_keyword\");
						params = \"search_url=\" + escape(search_url.value) + \"&search_tagName=\" + escape(search_tagName.value) + \"&search_keyword=\" + escape(search_keyword.value);
						
						xmlHttp.onreadystatechange = searchStateChange;
						xmlHttp.open(\"POST\", document.location, true);
						xmlHttp.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");
						xmlHttp.setRequestHeader(\"Content-length\", params.length);
						xmlHttp.setRequestHeader(\"Connection\", \"close\");
						xmlHttp.send(params);
					}
				</script>
				
				<table>
					<tr>
						<td>URL</td>
						<td><input type=\"text\" name=\"search_url\" id=\"search_url\" size=\"50\"/></td>
					</tr>
					<tr>
						<td>Tag Name</td>
						<td><input type=\"text\" name=\"search_tagName\" id=\"search_tagName\" /></td>
					</tr>
					<tr>
						<td>Search keyword</td>
						<td><input type=\"text\" name=\"search_keyword\" id=\"search_keyword\" /></td>
					</tr>
					<tr>
						<td></td>
						<td><input type=\"button\" value=\"Search\" onclick=\"run_search();\"/></td>
					</tr>
				</table>
				<div id=\"result\"></div>
				";
		
		return $out;
	}
	
	/**
	 * Renders the search results.
	 *
	 * @return		string
	 */
	private function run_search() {
		$out = "";
		$search_url = $GLOBALS["_POST"]["search_url"];
		$search_tagName = $GLOBALS["_POST"]["search_tagName"];
		$search_keyword = $GLOBALS["_POST"]["search_keyword"];
		
		if ($search_url == "" || $search_tagName == "" || $search_keyword == "") {
			return "All fields are mandatory for the search.";
		}
		
		if (!$this->checkSearchURL($search_url)) {
			return "You can only access files on the www.";
		}
		
		$fileData = $this->fetchFileContent($search_url);
		if ($fileData == "") {
			return "The requested page does not exist or is unavailable.";
		}
		
		$parser = xml_parser_create();
		xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
		$xmlElements = Array();
		xml_parse_into_struct($parser, $fileData, $xmlElements);
		
		foreach ($xmlElements as $key => $value) {
			if (	$value["type"] = "complete" 	// only elements with values
						// tag match
					&& ($this->caseSensitiveSearch ? strcmp($value["tag"], $search_tagName) : strcasecmp($value["tag"], $search_tagName)) == 0
						// keyword match
					&& ($this->caseSensitiveSearch ? ereg($search_keyword, $value["value"]) : eregi($search_keyword, $value["value"]))
					) {
				$out .= "<li>".$value["value"]."</li>";
			}
		}
		
		if ($out == "") {
			$out = "No match.";
		} else {
			$out = "<ul>".$out."</ul>";
		}
		
		return $out;
	}
	
	/**
	 * Checks if the url is on http.
	 *
	 * @return		bool
	 */
	private function checkSearchURL($url) {
		if (substr($url, 0, 7) != "http://") {
			return false;
		}
		return true;
	}
	
	/**
	 * Returns the content of the file/page.
	 *
	 * @return		string
	 */
	private function fetchFileContent($filePath) {
		$file = @ fopen($filePath, "r");
		if (!$file) {
			return "";
		}
		
		$fileData = "";
		while ($readData = fread($file, 4096)) {
			$fileData .= $readData;
		}
		
		return $fileData;
	}
	
	/**
	 * Returns the application run state.
	 *
	 * @return		string
	 */
	private function fetchRunCode() {
		if (isset($GLOBALS["_POST"]["search_url"])) {
			return "search";
		} else {
			return "main";
		}
	}
	
	/**
	 * Wraps the output in HTML tags.
	 *
	 * @return		void
	 */
	private function wrapOut() {
		$this->out = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">".chr(10).
					 "<html>".chr(10).
						"<head>".chr(10).
							"<title>".$this->docTitle."</title>".chr(10).
						"</head>".chr(10).
						"<body>".chr(10).
							$this->out.
						"</body>".chr(10).
					 "</html>";
	}
	
	private function printOut() {
		echo $this->out;
	}
}

$theApp = new feedSearch();
$theApp->run();		// for case sensitive searching use run(1)

?>