Completed
Push — master ( 7b031c...3082e8 )
by Yannick
11:44
created

Common::remove_accents()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 101
Code Lines 97

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 97
nc 2
nop 1
dl 0
loc 101
rs 8.2857
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
require_once(dirname(__FILE__).'/libs/simple_html_dom.php');
3
require_once(dirname(__FILE__).'/libs/uagent/uagent.php');
4
5
class Common {
6
	//protected $cookies = array();
7
	
8
	/**
9
	* Get data from form result
10
	* @param String $url form URL
11
	* @param String $type type of submit form method (get or post)
12
	* @param String|Array $data values form post method
13
	* @param Array $headers header to submit with the form
14
	* @return String the result
15
	*/
16
	public function getData($url, $type = 'get', $data = '', $headers = '',$cookie = '',$referer = '',$timeout = '',$useragent = '') {
17
		$ch = curl_init();
18
		curl_setopt($ch, CURLOPT_URL, $url);
19
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
20
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
21
		curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
22
		curl_setopt($ch,CURLOPT_ENCODING , "gzip");
23
		//curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5');
24
//		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0');
25
		if ($useragent == '') {
26
			curl_setopt($ch, CURLOPT_USERAGENT, UAgent::random());
27
		} else {
28
			curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
29
		}
30
		if ($timeout == '') curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
31
		else curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
32
		curl_setopt($ch, CURLOPT_HEADERFUNCTION, array('Common',"curlResponseHeaderCallback"));
33
		if ($type == 'post') {
34
			curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
35
			if (is_array($data)) {
36
				curl_setopt($ch, CURLOPT_POST, count($data));
37
				$data_string = '';
38
				foreach($data as $key=>$value) { $data_string .= $key.'='.$value.'&'; }
39
				rtrim($data_string, '&');
40
				curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
41
			} else {
42
				curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
43
			}
44
		}
45
		if ($headers != '') {
46
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
47
		}
48
		if ($cookie != '') {
49
			if (is_array($cookie)) {
50
				curl_setopt($ch, CURLOPT_COOKIE, implode($cookie,';'));
51
			} else {
52
				curl_setopt($ch, CURLOPT_COOKIE, $cookie);
53
			}
54
		}
55
		if ($referer != '') {
56
			curl_setopt($ch, CURLOPT_REFERER, $referer);
57
		}
58
		$result = curl_exec($ch);
59
		$info = curl_getinfo($ch);
60
		curl_close($ch);
61
		if ($info['http_code'] == '503' && strstr($result,'DDoS protection by CloudFlare')) {
62
			echo "Cloudflare Detected\n";
63
			require_once(dirname(__FILE__).'/libs/cloudflare-bypass/libraries/cloudflareClass.php');
64
			$useragent = UAgent::random();
65
			cloudflare::useUserAgent($useragent);
66
			if ($clearanceCookie = cloudflare::bypass($url)) {
67
				return $this->getData($url,'get',$data,$headers,$clearanceCookie,$referer,$timeout,$useragent);
68
			}
69
		} else {
70
		    return $result;
71
		}
72
	}
73
	
74
	private function curlResponseHeaderCallback($ch, $headerLine) {
75
		//global $cookies;
76
		$cookies = array();
77
		if (preg_match('/^Set-Cookie:\s*([^;]*)/mi', $headerLine, $cookie) == 1)
78
			$cookies[] = $cookie;
79
		return strlen($headerLine); // Needed by curl
80
	}
81
82
	public static function download($url, $file, $referer = '') {
83
		global $globalDebug;
84
		$fp = fopen($file, 'w');
85
		$ch = curl_init();
86
		curl_setopt($ch, CURLOPT_URL, $url);
87
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
88
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
89
		if ($referer != '') curl_setopt($ch, CURLOPT_REFERER, $referer);
90
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5');
91
		curl_setopt($ch, CURLOPT_FILE, $fp);
92
		curl_exec($ch);
93
		if (curl_errno($ch) && $globalDebug) echo 'Download error: '.curl_error($ch);
94
		curl_close($ch);
95
		fclose($fp);
96
	}
97
	
98
	/**
99
	* Convert a HTML table to an array
100
	* @param String $data HTML page
101
	* @return Array array of the tables in HTML page
102
	*/
103
	public function table2array($data) {
104
		if (!is_string($data)) return array();
105
		if ($data == '') return array();
106
		$html = str_get_html($data);
107
		if ($html === false) return array();
108
		$tabledata=array();
109
		foreach($html->find('tr') as $element)
110
		{
111
			$td = array();
112
			foreach( $element->find('th') as $row)
113
			{
114
				$td [] = trim($row->plaintext);
115
			}
116
			$td=array_filter($td);
117
			$tabledata[] = $td;
118
119
			$td = array();
120
			$tdi = array();
121
			foreach( $element->find('td') as $row)
122
			{
123
				$td [] = trim($row->plaintext);
124
				$tdi [] = trim($row->innertext);
125
			}
126
			$td=array_filter($td);
127
			$tdi=array_filter($tdi);
128
			$tabledata[]=array_merge($td,$tdi);
129
		}
130
		$html->clear();
131
		unset($html);
132
		return(array_filter($tabledata));
133
	}
134
	
135
	/**
136
	* Convert <p> part of a HTML page to an array
137
	* @param String $data HTML page
138
	* @return Array array of the <p> in HTML page
139
	*/
140
	public function text2array($data) {
141
		$html = str_get_html($data);
142
		if ($html === false) return array();
143
		$tabledata=array();
144
		foreach($html->find('p') as $element)
145
		{
146
			$tabledata [] = trim($element->plaintext);
147
		}
148
		$html->clear();
149
		unset($html);
150
		return(array_filter($tabledata));
151
	}
152
153
	/**
154
	* Give distance between 2 coordonnates
155
	* @param Float $lat latitude of first point
156
	* @param Float $lon longitude of first point
157
	* @param Float $latc latitude of second point
158
	* @param Float $lonc longitude of second point
159
	* @param String $unit km else no unit used
160
	* @return Float Distance in $unit
161
	*/
162
	public function distance($lat, $lon, $latc, $lonc, $unit = 'km') {
163
		if ($lat == $latc && $lon == $lonc) return 0;
164
		$dist = rad2deg(acos(sin(deg2rad(floatval($lat)))*sin(deg2rad(floatval($latc)))+ cos(deg2rad(floatval($lat)))*cos(deg2rad(floatval($latc)))*cos(deg2rad(floatval($lon)-floatval($lonc)))))*60*1.1515;
165
		if ($unit == "km") {
166
			return round($dist * 1.609344);
167
		} elseif ($unit == "m") {
168
			return round($dist * 1.609344 * 1000);
169
		} elseif ($unit == "mile" || $unit == "mi") {
170
			return round($dist);
171
		} elseif ($unit == "nm") {
172
			return round($dist*0.868976);
173
		} else {
174
			return round($dist);
175
		}
176
	}
177
178
	/**
179
	* Check is distance realistic
180
	* @param int $timeDifference the time between the reception of both messages
181
	* @param float $distance distance covered
182
	* @return whether distance is realistic
183
	*/
184
	public function withinThreshold ($timeDifference, $distance) {
185
		$x = abs($timeDifference);
186
		$d = abs($distance);
187
		if ($x == 0 || $d == 0) return true;
188
		// may be due to Internet jitter; distance is realistic
189
		if ($x < 0.7 && $d < 2000) return true;
190
		else return $d/$x < 1500*0.27778; // 1500 km/h max
191
	}
192
193
194
	// Check if an array is assoc
195
	public function isAssoc($array)
196
	{
197
		return ($array !== array_values($array));
198
	}
199
200
	public function isInteger($input){
201
	    return(ctype_digit(strval($input)));
202
	}
203
204
205
	public function convertDec($dms,$latlong) {
206
		if ($latlong == 'latitude') {
207
			$deg = substr($dms, 0, 2);
208
			$min = substr($dms, 2, 4);
209
		} else {
210
			$deg = substr($dms, 0, 3);
211
			$min = substr($dms, 3, 5);
212
		}
213
		return $deg+(($min*60)/3600);
214
	}
215
	
216
	/**
217
	* Copy folder contents
218
	* @param       string   $source    Source path
219
	* @param       string   $dest      Destination path
220
	* @return      bool     Returns true on success, false on failure
221
	*/
222
	public function xcopy($source, $dest)
223
	{
224
		$files = glob($source.'*.*');
225
		foreach($files as $file){
226
			$file_to_go = str_replace($source,$dest,$file);
227
			copy($file, $file_to_go);
228
		}
229
		return true;
230
	}
231
	
232
	/**
233
	* Check if an url exist
234
	* @param	String $url url to check
235
	* @return	bool Return true on succes false on failure
236
	*/
237
	public function urlexist($url){
238
		$headers=get_headers($url);
239
		return stripos($headers[0],"200 OK")?true:false;
240
	}
241
	
242
	/**
243
	* Convert hexa to string
244
	* @param	String $hex data in hexa
245
	* @return	String Return result
246
	*/
247
	public function hex2str($hex) {
248
		$str = '';
249
		$hexln = strlen($hex);
250
		for($i=0;$i<$hexln;$i+=2) $str .= chr(hexdec(substr($hex,$i,2)));
251
		return $str;
252
	}
253
	
254
	
255
	public function getHeading($lat1, $lon1, $lat2, $lon2) {
256
		//difference in longitudinal coordinates
257
		$dLon = deg2rad($lon2) - deg2rad($lon1);
258
		//difference in the phi of latitudinal coordinates
259
		$dPhi = log(tan(deg2rad($lat2) / 2 + pi() / 4) / tan(deg2rad($lat1) / 2 + pi() / 4));
260
		//we need to recalculate $dLon if it is greater than pi
261
		if(abs($dLon) > pi()) {
262
			if($dLon > 0) {
263
				$dLon = (2 * pi() - $dLon) * -1;
264
			} else {
265
				$dLon = 2 * pi() + $dLon;
266
			}
267
		}
268
		//return the angle, normalized
269
		return (rad2deg(atan2($dLon, $dPhi)) + 360) % 360;
270
	}
271
	
272
	public function checkLine($lat1,$lon1,$lat2,$lon2,$lat3,$lon3,$approx = 0.1) {
273
		//$a = ($lon2-$lon1)*$lat3+($lat2-$lat1)*$lon3+($lat1*$lon2+$lat2*$lon1);
274
		$a = -($lon2-$lon1);
275
		$b = $lat2 - $lat1;
276
		$c = -($a*$lat1+$b*$lon1);
277
		$d = $a*$lat3+$b*$lon3+$c;
278
		if ($d > -$approx && $d < $approx) return true;
279
		else return false;
280
	}
281
	
282
	public function array_merge_noappend() {
283
		$output = array();
284
		foreach(func_get_args() as $array) {
285
			foreach($array as $key => $value) {
286
				$output[$key] = isset($output[$key]) ?
287
				array_merge($output[$key], $value) : $value;
288
			}
289
		}
290
		return $output;
291
	}
292
	
293
294
	public function arr_diff($arraya, $arrayb) {
295
		foreach ($arraya as $keya => $valuea) {
296
			if (in_array($valuea, $arrayb)) {
297
				unset($arraya[$keya]);
298
			}
299
		}
300
		return $arraya;
301
	}
302
	
303
	/**
304
	* Returns list of available locales
305
	*
306
	* @return array
307
	 */
308
	public function listLocaleDir()
309
	{
310
		$result = array('en');
311
		if (!is_dir('./locale')) {
312
			return $result;
313
		}
314
		$handle = @opendir('./locale');
315
		if ($handle === false) return $result;
316
		while (false !== ($file = readdir($handle))) {
317
			$path = './locale'.'/'.$file.'/LC_MESSAGES/fam.mo';
318
			if ($file != "." && $file != ".." && @file_exists($path)) {
319
				$result[] = $file;
320
			}
321
		}
322
		closedir($handle);
323
		return $result;
324
	}
325
326
	public function nextcoord($latitude, $longitude, $speed, $heading, $archivespeed = 1){
327
		global $globalMapRefresh;
328
		$distance = ($speed*0.514444*$globalMapRefresh*$archivespeed)/1000;
329
		$r = 6378;
330
		$latitude = deg2rad($latitude);
331
		$longitude = deg2rad($longitude);
332
		$bearing = deg2rad($heading); 
333
		$latitude2 =  asin( (sin($latitude) * cos($distance/$r)) + (cos($latitude) * sin($distance/$r) * cos($bearing)) );
334
		$longitude2 = $longitude + atan2( sin($bearing)*sin($distance/$r)*cos($latitude), cos($distance/$r)-(sin($latitude)*sin($latitude2)) );
335
		return array('latitude' => number_format(rad2deg($latitude2),5,'.',''),'longitude' => number_format(rad2deg($longitude2),5,'.',''));
336
	}
337
	
338
	public function getCoordfromDistanceBearing($latitude,$longitude,$bearing,$distance) {
339
		// distance in meter
340
		$R = 6378.14;
341
		$latitude1 = $latitude * (M_PI/180);
342
		$longitude1 = $longitude * (M_PI/180);
343
		$brng = $bearing * (M_PI/180);
344
		$d = $distance;
345
346
		$latitude2 = asin(sin($latitude1)*cos($d/$R) + cos($latitude1)*sin($d/$R)*cos($brng));
347
		$longitude2 = $longitude1 + atan2(sin($brng)*sin($d/$R)*cos($latitude1),cos($d/$R)-sin($latitude1)*sin($latitude2));
348
349
		$latitude2 = $latitude2 * (180/M_PI);
350
		$longitude2 = $longitude2 * (180/M_PI);
351
352
		$flat = round ($latitude2,6);
353
		$flong = round ($longitude2,6);
354
/*
355
		$dx = $distance*cos($bearing);
356
		$dy = $distance*sin($bearing);
357
		$dlong = $dx/(111320*cos($latitude));
358
		$dlat = $dy/110540;
359
		$flong = $longitude + $dlong;
360
		$flat = $latitude + $dlat;
361
*/
362
		return array('latitude' => $flat,'longitude' => $flong);
363
	}
364
365
	/**
366
	 * GZIPs a file on disk (appending .gz to the name)
367
	 *
368
	 * From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php
369
	 * Based on function by Kioob at:
370
	 * http://www.php.net/manual/en/function.gzwrite.php#34955
371
	 * 
372
	 * @param string $source Path to file that should be compressed
373
	 * @param integer $level GZIP compression level (default: 9)
374
	 * @return string New filename (with .gz appended) if success, or false if operation fails
375
	 */
376
	public function gzCompressFile($source, $level = 9){ 
377
		$dest = $source . '.gz'; 
378
		$mode = 'wb' . $level; 
379
		$error = false; 
380
		if ($fp_out = gzopen($dest, $mode)) { 
381
			if ($fp_in = fopen($source,'rb')) { 
382
				while (!feof($fp_in)) 
383
					gzwrite($fp_out, fread($fp_in, 1024 * 512)); 
384
				fclose($fp_in); 
385
			} else {
386
				$error = true; 
387
			}
388
			gzclose($fp_out); 
389
		} else {
390
			$error = true; 
391
		}
392
		if ($error)
393
			return false; 
394
		else
395
			return $dest; 
396
	} 
397
	
398
	function remove_accents($string) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
399
		if ( !preg_match('/[\x80-\xff]/', $string) ) return $string;
400
		$chars = array(
401
		    // Decompositions for Latin-1 Supplement
402
		    chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
403
		    chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
404
		    chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
405
		    chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
406
		    chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
407
		    chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
408
		    chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
409
		    chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
410
		    chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
411
		    chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
412
		    chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
413
		    chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
414
		    chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
415
		    chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
416
		    chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
417
		    chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
418
		    chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
419
		    chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
420
		    chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
421
		    chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
422
		    chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
423
		    chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
424
		    chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
425
		    chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
426
		    chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
427
		    chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
428
		    chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
429
		    chr(195).chr(191) => 'y',
430
		    // Decompositions for Latin Extended-A
431
		    chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
432
		    chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
433
		    chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
434
		    chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
435
		    chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
436
		    chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
437
		    chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
438
		    chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
439
		    chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
440
		    chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
441
		    chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
442
		    chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
443
		    chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
444
		    chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
445
		    chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
446
		    chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
447
		    chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
448
		    chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
449
		    chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
450
		    chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
451
		    chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
452
		    chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
453
		    chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
454
		    chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
455
		    chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
456
		    chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
457
		    chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
458
		    chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
459
		    chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
460
		    chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
461
		    chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
462
		    chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
463
		    chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
464
		    chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
465
		    chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
466
		    chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
467
		    chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
468
		    chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
469
		    chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
470
		    chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
471
		    chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
472
		    chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
473
		    chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
474
		    chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
475
		    chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
476
		    chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
477
		    chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
478
		    chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
479
		    chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
480
		    chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
481
		    chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
482
		    chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
483
		    chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
484
		    chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
485
		    chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
486
		    chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
487
		    chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
488
		    chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
489
		    chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
490
		    chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
491
		    chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
492
		    chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
493
		    chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
494
		    chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
495
		);
496
		$string = strtr($string, $chars);
497
		return $string;
498
	}
499
}
500
?>