cookiePath = $path; } // ################################################################### /** * Sets the cookie domain setting * * @param string Cookie domain */ public static function SetCookieDomain($domain) { self::SharedInstance()->cookieDomain = $domain; } // ################################################################### /** * Sets the cookie timeout * * @param integer Cookie timeout */ public static function SetCookieTimeout($timeout) { self::SharedInstance()->cookieTimeout = intval($timeout); } // ################################################################### /** * Sets a cookie in the user's computer/browing session * * @param string Name of the cookie * @param string Value of the cookie, FALSE to clear * @param bool Is the cookie permanent? */ public static function Cookie($name, $value, $sticky = true) { // expire the cookie if ($value === false) { setcookie($name, $value, time() - (2 * self::SharedInstance()->cookieTimeout), self::SharedInstance()->cookiePath, self::SharedInstance()->cookieDomain); } // set the cookie else { if ($sticky) { $expire = time() + 60 * 60 * 24 * 365; } else { $expire = time() + self::SharedInstance()->cookieTimeout; } setcookie($name, $value, $expire, self::SharedInstance()->cookiePath, self::SharedInstance()->cookieDomain); } } // ################################################################### /** * Alternate between two CSS classes * * @param string First CSS class name * @param string Second CSS class name */ public function SwapCssClasses($class1 = 'alt1', $class2 = 'alt2') { static $count; self::$cssClass = ($count % 2) ? $class1 : $class2; $count++; } // ################################################################### /** * Returns the 'source path' version of a file path. It adds a * directory separator to the end of a string if it does not already * exist. * * @param string Path * * @return string Path with directory separator ending */ public static function FetchSourcePath($source) { if (substr($source, strlen($source) - 1) != DIRECTORY_SEPARATOR) { $source .= DIRECTORY_SEPARATOR; } return $source; } // ################################################################### /** * Force-download a file by sending application/octetstream * * @param string The text of the file to be streamed * @param string File name of the new file * @param bool Whether or not to die after stringeaming the file */ public static function DownloadFile($file, $name, $exit = true) { if (self::IsBrowser('ie') OR self::IsBrowser('opera') OR self::IsBrowser('safari')) { $mime = 'application/octetstream'; } else { $mime = 'application/octet-stream'; } header("Content-Type: $mime"); header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Content-Disposition: attachment; filename="' . $name . '"'); header('Content-length: ' . strlen($file)); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); print($file); if ($exit) { exit; } } // ################################################################### /** * Verify that an email address is valid via regex * * @param string An email address * * @return bool Validity of the email address */ public static function IsValidEmail($email) { if (preg_match('#^[a-z0-9\.\-\+_]+?@(.*?\.)*?[a-z0-9\-_]+?\.[a-z]{2,4}$#i', $email)) { return true; } else { return false; } } // ################################################################### /** * Check a browser's user agent against a pre-determined list * * @param string Browser name * @param string The browser's version * * @param mixed False if there is no match, the version if there is */ public static function IsBrowser($check, $version = '') { $useragent = strtolower($_SERVER['HTTP_USER_AGENT']); $browser = array(); $matches = array(); // ------------------------------------------------------------------- // -- Opera // ------------------------------------------------------------------- # Opera/6.05 (Windows 98; U) [en] # Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 6.0 [en] # Mozilla/5.0 (Windows 98; U) Opera 6.0 [en] # Mozilla/4.0 (compatible; MSIE, 6.0; Windows 98) Opera 7.0 [en] if (preg_match('#opera ([0-9\.]+)#', $useragent, $matches) !== false) { if (isset($matches[1])) { $browser['opera'] = $matches[1]; } } // ------------------------------------------------------------------- // -- Mac browser // ------------------------------------------------------------------- if (strpos($useragent, 'mac') !== false) { $browser['mac'] = true; } // ------------------------------------------------------------------- // -- Internet explorer // ------------------------------------------------------------------- # Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1; .NET CLR 1.0.2914) # Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) if (preg_match('#msie ([0-9\.]+)#', $useragent, $matches) !== false AND !isset($browser['opera'])) { if (isset($matches[1])) { $browser['ie'] = $matches[1]; } } // ------------------------------------------------------------------- // -- Safari // ------------------------------------------------------------------- # Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 if (preg_match('#safari/([0-9\.]+)#', $useragent, $matches) !== false) { if (isset($matches[1])) { $browser['safari'] = $matches[1]; } } // ------------------------------------------------------------------- // -- Konqueror // ------------------------------------------------------------------- # Mozilla/5.0 (compatible; Konqueror/3) # Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20020628) if (preg_match('#konqueror/([0-9\.]+)#', $useragent, $matches) !== false) { if (isset($matches[1])) { $browser['konqueror'] = $matches[1]; } } // ------------------------------------------------------------------- // -- Mozilla // ------------------------------------------------------------------- # Mozilla/5.001 (windows; U; NT4.0; en-us) Gecko/25250101 # Mozilla/5.001 (Macintosh; N; PPC; ja) Gecko/25250101 MegaCorpBrowser/1.0 (MegaCorp, Inc.) if (preg_match('#gecko/([0-9]+)#', $useragent, $matches) !== false AND !isset($browser['safari'])) { if (isset($matches[1])) { $browser['mozilla'] = $matches[1]; } // ------------------------------------------------------------------- // -- Firefox // ------------------------------------------------------------------- # Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7) Gecko/20040628 Firefox/0.9.1 # Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4a) Gecko/20030423 Firebird Browser/0.6 if (preg_match('#(firebird|firefox)( browser)?/([0-9\.]+)#', $useragent, $matches) !== false) { if (isset($matches[3])) { $browser['firefox'] = $matches[3]; } } // ------------------------------------------------------------------- // -- Netscape // ------------------------------------------------------------------- # Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:0.9.4.1) Gecko/20020318 Netscape6/6.2.2 if (preg_match('#netscape([0-9].*?)?/([0-9\.]+)#', $useragent, $matches) !== false) { if (isset($matches[2])) { $browser['netscape'] = $matches[2]; } } // ------------------------------------------------------------------- // -- Camino // ------------------------------------------------------------------- # Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7) Gecko/20040623 Camino/0.8 if (preg_match('#camino/([0-9\.]+)#', $useragent, $matches) !== false) { if (isset($matches[1])) { $browser['camino'] = $matches[1]; } } } if (isset($browser["$check"])) { if ($version) { if ($browser["$check"] >= $version) { return $browser["$check"]; } else { return false; } } else { return $browser["$check"]; } } else { return false; } } // ################################################################### /** * Generates a random string of random length (unless otherwise * specified) * * @param integer Optional length * * @return string A random string */ public static function Random($length = 0) { // custom high and lows if (is_array($length)) { $length = rand($length[0], $length[1]); } else if (!$length) { // Gimme a length! $length = rand(20, 65); } // Number of ints in our salt $intcount = rand(1, intval($length / 2)); // Number of chars $charcount = $length - $intcount; // Upper-case chars $upperchars = rand(1, intval($charcount / 2)); // Lower-case chars $lowerchars = $charcount - $upperchars; // Generate ints for ($i = 0; $i < $intcount; $i++) { $string[ mt_rand() ] = rand(0, 9); } // Generate upper chars for ($i = 0; $i < $upperchars; $i++) { $string[ mt_rand() ] = chr(rand(65, 90)); } // Generate lower chars for ($i = 0; $i < $lowerchars; $i++) { $string[ mt_rand() ] = chr(rand(97, 122)); } if ($length != sizeof($string)) { return $this->rand($length); } // Sort the chars by thier random assignment ksort($string); // Flatten the array $return = ''; foreach ($string AS $char) { $return .= $char; } return $return; } // ################################################################### /** * Sets the current array position to be the specified key. This * function should be avoided on large arrays. * * @param array The array whose counter is to be updated * @param mixed The key of the element of the array that the counter is to be set to * * @return mixed Return the elelment of the array that we just put the counter to */ public static function ArraySetCurrent(&$array, $key) { reset($array); while (current($array) !== false) { if (key($array) == $key) { break; } next($array); } return current($array); } // ################################################################### /** * Calculates the microtime difference by taking a given microtime and * subtracting it from the current one * * @param string The start microtime * * @return float Microtime difference */ public static function FetchMicrotimeDiff($mtstart) { $mtend = microtime(); list ($starttime['micro'], $starttime['sec']) = explode(' ', $mtstart); list ($endtime['micro'], $endtime['sec']) = explode(' ', $mtend); return ($endtime['micro'] + $endtime['sec']) - ($starttime['micro'] + $starttime['sec']); } // ################################################################### /** * Fetches the extension of a file by extracting everything after the * last period * * @param string Filename * * @return string The extension for the specifid file name */ public static function FetchExtension($filename) { $array = explode('.', $filename); if (sizeof($array) == 1) { return ''; } return strval(end($array)); } // ################################################################### /** * Gets the maximum file size for attachment uploading, as specified by * PHP. If no value is present, 10 MB (represented in bytes) is * returned. * * @return integer The maximum file upload size in bytes */ public static function FetchMaxPhpFileSize() { if ($size = @ini_get('upload_max_filesize')) { if (preg_match('#[^0-9].#', $size)) { return $size; } else { return intval($size) * 1048576; } } else { return 10 * 1048576; } } // ################################################################### /** * Scans a specified directory path and returns an array of all the * items in that directory. Directories found by this are end in a "/" * * @param string Path to scan * @param bool Whether or not to recursively scan the directories encountered * @param bool Ignore files beginning with a dot * @param bool Ignore 'CVS' dirctories * * @return array A list of all the files in the specified path */ public static function ScanDirectory($path, $recurse = true, $ignoredot = true, $ignorecvs = true, $basepath = '', $unset = 1) { static $filelist; if ($unset) { $filelist = array(); } if (substr($path, (strlen($path) - 1), 1) != '/') { $path .= '/'; } if ($handle = opendir($path)) { while (($file = readdir($handle)) !== false) { $isdot = ((substr($file, 0, 1) == '.') ? true : false); $isdot = (($ignoredot) ? $isdot : true); $iscvs = (($file == 'CVS') ? true : false); $iscvs = (($ignorecvs) ? $iscvs : true); if (!$isdot AND !$iscvs) { if (is_dir($path . $file)) { $filelist["$basepath"][] = "$file/"; if ($recurse) { self::ScanDirectory("$path$file", true, $ignoredot, $ignorecvs, "$basepath$file/", 0); } } else { $filelist["$basepath"][] = $file; } } } closedir($handle); } return $filelist; } // ################################################################### /** * Changes line breaks into one format * * @param string Text * @param string New line break (default is UNIX \n format) * * @return string Text with one type of line break */ public static function ConvertLineBreaks($text, $convert_to = "\n") { $text = trim($text); $text = str_replace(array("\r\n", "\r", "\n"), "\n", $text); $text = str_replace("\n", $convert_to, $text); return $text; } // ################################################################### /** * Removes all empty() [by PHP's standards] elements in an array. This * can be used in place of using PREG_SPLIT_NO_EMPTY. * * @param array An array to strip empties from * * @return array Full-valued array */ public static function ArrayStripEmpty($array) { foreach ($array AS $key => $value) { if (is_array($array["$key"])) { $array["$key"] = self::ArrayStripEmpty($array["$key"]); } else if (empty($value) OR is_null($value)) { unset($array["$key"]); } } return $array; } } /*=====================================================================*\ || ################################################################### || # $HeadURL$ || # $Id$ || ################################################################### \*=====================================================================*/ ?>