Completed
Push — master ( 862b39...57932c )
by Yannick
08:32
created

Common::getData()   F

Complexity

Conditions 19
Paths 2592

Size

Total Lines 67
Code Lines 51

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 19
eloc 51
nc 2592
nop 8
dl 0
loc 67
rs 2.7051
c 0
b 0
f 0

How to fix   Long Method    Complexity    Many Parameters   

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:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
require_once(dirname(__FILE__).'/libs/simple_html_dom.php');
3
require_once(dirname(__FILE__).'/libs/uagent/uagent.php');
4
require_once(dirname(__FILE__).'/settings.php');
5
6
class Common {
7
	//protected $cookies = array();
8
	
9
	/**
10
	* Get data from form result
11
	* @param String $url form URL
12
	* @param String $type type of submit form method (get or post)
13
	* @param String|Array $data values form post method
14
	* @param Array $headers header to submit with the form
15
	* @return String the result
16
	*/
17
	public function getData($url, $type = 'get', $data = '', $headers = '',$cookie = '',$referer = '',$timeout = '',$useragent = '') {
18
		global $globalProxy, $globalForceIPv4;
19
		$ch = curl_init();
20
		curl_setopt($ch, CURLOPT_URL, $url);
21
		if (isset($globalForceIPv4) && $globalForceIPv4) {
22
			if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){
23
				curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
24
			}
25
		}
26
		if (isset($globalProxy) && $globalProxy != '') {
27
			curl_setopt($ch, CURLOPT_PROXY, $globalProxy);
28
		}
29
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
30
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
31
		curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
32
		curl_setopt($ch,CURLOPT_ENCODING , "gzip");
33
		//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');
34
//		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0');
35
		if ($useragent == '') {
36
			curl_setopt($ch, CURLOPT_USERAGENT, UAgent::random());
37
		} else {
38
			curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
39
		}
40
		if ($timeout == '') curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
41
		else curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
42
		curl_setopt($ch, CURLOPT_HEADERFUNCTION, array('Common',"curlResponseHeaderCallback"));
43
		if ($type == 'post') {
44
			curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
45
			if (is_array($data)) {
46
				curl_setopt($ch, CURLOPT_POST, count($data));
47
				$data_string = '';
48
				foreach($data as $key=>$value) { $data_string .= $key.'='.$value.'&'; }
49
				rtrim($data_string, '&');
50
				curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
51
			} else {
52
				curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
53
			}
54
		}
55
		if ($headers != '') {
56
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
57
		}
58
		if ($cookie != '') {
59
			if (is_array($cookie)) {
60
				curl_setopt($ch, CURLOPT_COOKIE, implode($cookie,';'));
61
			} else {
62
				curl_setopt($ch, CURLOPT_COOKIE, $cookie);
63
			}
64
		}
65
		if ($referer != '') {
66
			curl_setopt($ch, CURLOPT_REFERER, $referer);
67
		}
68
		$result = curl_exec($ch);
69
		$info = curl_getinfo($ch);
70
		//var_dump($info);
71
		curl_close($ch);
72
		if ($info['http_code'] == '503' && strstr($result,'DDoS protection by CloudFlare')) {
73
			echo "Cloudflare Detected\n";
74
			require_once(dirname(__FILE__).'/libs/cloudflare-bypass/libraries/cloudflareClass.php');
75
			$useragent = UAgent::random();
76
			cloudflare::useUserAgent($useragent);
77
			if ($clearanceCookie = cloudflare::bypass($url)) {
78
				return $this->getData($url,'get',$data,$headers,$clearanceCookie,$referer,$timeout,$useragent);
79
			}
80
		} else {
81
			return $result;
82
		}
83
	}
84
	
85
	private function curlResponseHeaderCallback($ch, $headerLine) {
86
		//global $cookies;
87
		$cookies = array();
88
		if (preg_match('/^Set-Cookie:\s*([^;]*)/mi', $headerLine, $cookie) == 1)
89
			$cookies[] = $cookie;
90
		return strlen($headerLine); // Needed by curl
91
	}
92
93
	public static function download($url, $file, $referer = '') {
94
		global $globalDebug;
95
		$fp = fopen($file, 'w');
96
		$ch = curl_init();
97
		curl_setopt($ch, CURLOPT_URL, $url);
98
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
99
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
100
		if ($referer != '') curl_setopt($ch, CURLOPT_REFERER, $referer);
101
		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');
102
		curl_setopt($ch, CURLOPT_FILE, $fp);
103
		curl_exec($ch);
104
		if (curl_errno($ch) && $globalDebug) echo 'Download error: '.curl_error($ch);
105
		curl_close($ch);
106
		fclose($fp);
107
	}
108
109
	public static function gunzip($in_file,$out_file_name = '') {
110
		//echo $in_file.' -> '.$out_file_name."\n";
111
		$buffer_size = 4096; // read 4kb at a time
112
		if ($out_file_name == '') $out_file_name = str_replace('.gz', '', $in_file); 
113
		if ($in_file != '' && file_exists($in_file)) {
114
			// PHP version of Ubuntu use gzopen64 instead of gzopen
115
			if (function_exists('gzopen')) $file = gzopen($in_file,'rb');
116
			elseif (function_exists('gzopen64')) $file = gzopen64($in_file,'rb');
117
			else {
118
				echo 'gzopen not available';
119
				die;
120
			}
121
			$out_file = fopen($out_file_name, 'wb'); 
122
			while(!gzeof($file)) {
123
				fwrite($out_file, gzread($file, $buffer_size));
124
			}  
125
			fclose($out_file);
126
			gzclose($file);
127
		}
128
	}
129
130
	/**
131
	* Convert a HTML table to an array
132
	* @param String $data HTML page
133
	* @return Array array of the tables in HTML page
134
	*/
135
	public function table2array($data) {
136
		if (!is_string($data)) return array();
137
		if ($data == '') return array();
138
		$html = str_get_html($data);
139
		if ($html === false) return array();
140
		$tabledata=array();
141
		foreach($html->find('tr') as $element)
142
		{
143
			$td = array();
144
			foreach( $element->find('th') as $row)
145
			{
146
				$td [] = trim($row->plaintext);
147
			}
148
			$td=array_filter($td);
149
			$tabledata[] = $td;
150
151
			$td = array();
152
			$tdi = array();
153
			foreach( $element->find('td') as $row)
154
			{
155
				$td [] = trim($row->plaintext);
156
				$tdi [] = trim($row->innertext);
157
			}
158
			$td=array_filter($td);
159
			$tdi=array_filter($tdi);
160
			$tabledata[]=array_merge($td,$tdi);
161
		}
162
		$html->clear();
163
		unset($html);
164
		return(array_filter($tabledata));
165
	}
166
	
167
	/**
168
	* Convert <p> part of a HTML page to an array
169
	* @param String $data HTML page
170
	* @return Array array of the <p> in HTML page
171
	*/
172
	public function text2array($data) {
173
		$html = str_get_html($data);
174
		if ($html === false) return array();
175
		$tabledata=array();
176
		foreach($html->find('p') as $element)
177
		{
178
			$tabledata [] = trim($element->plaintext);
179
		}
180
		$html->clear();
181
		unset($html);
182
		return(array_filter($tabledata));
183
	}
184
185
	/**
186
	* Give distance between 2 coordonnates
187
	* @param Float $lat latitude of first point
188
	* @param Float $lon longitude of first point
189
	* @param Float $latc latitude of second point
190
	* @param Float $lonc longitude of second point
191
	* @param String $unit km else no unit used
192
	* @return Float Distance in $unit
193
	*/
194
	public function distance($lat, $lon, $latc, $lonc, $unit = 'km') {
195
		if ($lat == $latc && $lon == $lonc) return 0;
196
		$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;
197
		if ($unit == "km") {
198
			return round($dist * 1.609344);
199
		} elseif ($unit == "m") {
200
			return round($dist * 1.609344 * 1000);
201
		} elseif ($unit == "mile" || $unit == "mi") {
202
			return round($dist);
203
		} elseif ($unit == "nm") {
204
			return round($dist*0.868976);
205
		} else {
206
			return round($dist);
207
		}
208
	}
209
210
	/**
211
	* Check is distance realistic
212
	* @param int $timeDifference the time between the reception of both messages
213
	* @param float $distance distance covered
214
	* @return whether distance is realistic
215
	*/
216
	public function withinThreshold ($timeDifference, $distance) {
217
		$x = abs($timeDifference);
218
		$d = abs($distance);
219
		if ($x == 0 || $d == 0) return true;
220
		// may be due to Internet jitter; distance is realistic
221
		if ($x < 0.7 && $d < 2000) return true;
222
		else return $d/$x < 1500*0.27778; // 1500 km/h max
223
	}
224
225
226
	// Check if an array is assoc
227
	public function isAssoc($array)
228
	{
229
		return ($array !== array_values($array));
230
	}
231
232
	public function isInteger($input){
233
	    return(ctype_digit(strval($input)));
234
	}
235
236
237
	public function convertDec($dms,$latlong) {
238
		if ($latlong == 'latitude') {
239
			$deg = substr($dms, 0, 2);
240
			$min = substr($dms, 2, 4);
241
		} else {
242
			$deg = substr($dms, 0, 3);
243
			$min = substr($dms, 3, 5);
244
		}
245
		return $deg+(($min*60)/3600);
246
	}
247
	
248
	public function convertDM($coord,$latlong) {
249
		if ($latlong == 'latitude') {
250
			if ($coord < 0) $NSEW = 'S';
251
			else $NSEW = 'N';
252
		} elseif ($latlong == 'longitude') {
253
			if ($coord < 0) $NSEW = 'W';
254
			else $NSEW = 'E';
255
		}
256
		$coord = abs($coord);
257
		$deg = floor($coord);
258
		$coord = ($coord-$deg)*60;
259
		$min = $coord;
260
		return array('deg' => $deg,'min' => $min,'NSEW' => $NSEW);
0 ignored issues
show
Bug introduced by
The variable $NSEW does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
261
	}
262
	
263
	/**
264
	* Copy folder contents
265
	* @param       string   $source    Source path
266
	* @param       string   $dest      Destination path
267
	* @return      bool     Returns true on success, false on failure
268
	*/
269
	public function xcopy($source, $dest)
270
	{
271
		$files = glob($source.'*.*');
272
		foreach($files as $file){
273
			$file_to_go = str_replace($source,$dest,$file);
274
			copy($file, $file_to_go);
275
		}
276
		return true;
277
	}
278
	
279
	/**
280
	* Check if an url exist
281
	* @param	String $url url to check
282
	* @return	bool Return true on succes false on failure
283
	*/
284
	public function urlexist($url){
285
		$headers=get_headers($url);
286
		return stripos($headers[0],"200 OK")?true:false;
287
	}
288
	
289
	/**
290
	* Convert hexa to string
291
	* @param	String $hex data in hexa
292
	* @return	String Return result
293
	*/
294
	public function hex2str($hex) {
295
		$str = '';
296
		$hexln = strlen($hex);
297
		for($i=0;$i<$hexln;$i+=2) $str .= chr(hexdec(substr($hex,$i,2)));
298
		return $str;
299
	}
300
	
301
	/**
302
	* Convert hexa color to rgb
303
	* @param	String $hex data in hexa
304
	* @return	String Return result
305
	*/
306
	public function hex2rgb($hex) {
307
		$hex = str_replace('#','',$hex);
308
		return sscanf($hex, "%02x%02x%02x"); 
309
	}
310
	
311
	public function getHeading($lat1, $lon1, $lat2, $lon2) {
312
		//difference in longitudinal coordinates
313
		$dLon = deg2rad($lon2) - deg2rad($lon1);
314
		//difference in the phi of latitudinal coordinates
315
		$dPhi = log(tan(deg2rad($lat2) / 2 + pi() / 4) / tan(deg2rad($lat1) / 2 + pi() / 4));
316
		//we need to recalculate $dLon if it is greater than pi
317
		if(abs($dLon) > pi()) {
318
			if($dLon > 0) {
319
				$dLon = (2 * pi() - $dLon) * -1;
320
			} else {
321
				$dLon = 2 * pi() + $dLon;
322
			}
323
		}
324
		//return the angle, normalized
325
		return (rad2deg(atan2($dLon, $dPhi)) + 360) % 360;
326
	}
327
	
328
	public function checkLine($lat1,$lon1,$lat2,$lon2,$lat3,$lon3,$approx = 0.2) {
329
		//$a = ($lon2-$lon1)*$lat3+($lat2-$lat1)*$lon3+($lat1*$lon2+$lat2*$lon1);
330
		$a = -($lon2-$lon1);
331
		$b = $lat2 - $lat1;
332
		$c = -($a*$lat1+$b*$lon1);
333
		$d = $a*$lat3+$b*$lon3+$c;
334
		if ($d > -$approx && $d < $approx) return true;
335
		else return false;
336
	}
337
	
338
	public function array_merge_noappend() {
339
		$output = array();
340
		foreach(func_get_args() as $array) {
341
			foreach($array as $key => $value) {
342
				$output[$key] = isset($output[$key]) ?
343
				array_merge($output[$key], $value) : $value;
344
			}
345
		}
346
		return $output;
347
	}
348
	
349
350
	public function arr_diff($arraya, $arrayb) {
351
		foreach ($arraya as $keya => $valuea) {
352
			if (in_array($valuea, $arrayb)) {
353
				unset($arraya[$keya]);
354
			}
355
		}
356
		return $arraya;
357
	}
358
359
	/*
360
	* Check if a key exist in an array
361
	* Come from http://stackoverflow.com/a/19420866
362
	* @param Array array to check
363
	* @param String key to check
364
	* @return Bool true if exist, else false
365
	*/
366
	public function multiKeyExists(array $arr, $key) {
367
		// is in base array?
368
		if (array_key_exists($key, $arr)) {
369
			return true;
370
		}
371
		// check arrays contained in this array
372
		foreach ($arr as $element) {
373
			if (is_array($element)) {
374
				if ($this->multiKeyExists($element, $key)) {
375
					return true;
376
				}
377
			}
378
		}
379
		return false;
380
	}
381
	
382
	/**
383
	* Returns list of available locales
384
	*
385
	* @return array
386
	 */
387
	public function listLocaleDir()
388
	{
389
		$result = array('en');
390
		if (!is_dir('./locale')) {
391
			return $result;
392
		}
393
		$handle = @opendir('./locale');
394
		if ($handle === false) return $result;
395
		while (false !== ($file = readdir($handle))) {
396
			$path = './locale'.'/'.$file.'/LC_MESSAGES/fam.mo';
397
			if ($file != "." && $file != ".." && @file_exists($path)) {
398
				$result[] = $file;
399
			}
400
		}
401
		closedir($handle);
402
		return $result;
403
	}
404
405
	public function nextcoord($latitude, $longitude, $speed, $heading, $archivespeed = 1){
406
		global $globalMapRefresh;
407
		$distance = ($speed*0.514444*$globalMapRefresh*$archivespeed)/1000;
408
		$r = 6378;
409
		$latitude = deg2rad($latitude);
410
		$longitude = deg2rad($longitude);
411
		$bearing = deg2rad($heading); 
412
		$latitude2 =  asin( (sin($latitude) * cos($distance/$r)) + (cos($latitude) * sin($distance/$r) * cos($bearing)) );
413
		$longitude2 = $longitude + atan2( sin($bearing)*sin($distance/$r)*cos($latitude), cos($distance/$r)-(sin($latitude)*sin($latitude2)) );
414
		return array('latitude' => number_format(rad2deg($latitude2),5,'.',''),'longitude' => number_format(rad2deg($longitude2),5,'.',''));
415
	}
416
	
417
	public function getCoordfromDistanceBearing($latitude,$longitude,$bearing,$distance) {
418
		// distance in meter
419
		$R = 6378.14;
420
		$latitude1 = $latitude * (M_PI/180);
421
		$longitude1 = $longitude * (M_PI/180);
422
		$brng = $bearing * (M_PI/180);
423
		$d = $distance;
424
425
		$latitude2 = asin(sin($latitude1)*cos($d/$R) + cos($latitude1)*sin($d/$R)*cos($brng));
426
		$longitude2 = $longitude1 + atan2(sin($brng)*sin($d/$R)*cos($latitude1),cos($d/$R)-sin($latitude1)*sin($latitude2));
427
428
		$latitude2 = $latitude2 * (180/M_PI);
429
		$longitude2 = $longitude2 * (180/M_PI);
430
431
		$flat = round ($latitude2,6);
432
		$flong = round ($longitude2,6);
433
/*
434
		$dx = $distance*cos($bearing);
435
		$dy = $distance*sin($bearing);
436
		$dlong = $dx/(111320*cos($latitude));
437
		$dlat = $dy/110540;
438
		$flong = $longitude + $dlong;
439
		$flat = $latitude + $dlat;
440
*/
441
		return array('latitude' => $flat,'longitude' => $flong);
442
	}
443
444
	/**
445
	 * GZIPs a file on disk (appending .gz to the name)
446
	 *
447
	 * From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php
448
	 * Based on function by Kioob at:
449
	 * http://www.php.net/manual/en/function.gzwrite.php#34955
450
	 * 
451
	 * @param string $source Path to file that should be compressed
452
	 * @param integer $level GZIP compression level (default: 9)
453
	 * @return string New filename (with .gz appended) if success, or false if operation fails
454
	 */
455
	public function gzCompressFile($source, $level = 9){ 
456
		$dest = $source . '.gz'; 
457
		$mode = 'wb' . $level; 
458
		$error = false; 
459
		if ($fp_out = gzopen($dest, $mode)) { 
460
			if ($fp_in = fopen($source,'rb')) { 
461
				while (!feof($fp_in)) 
462
					gzwrite($fp_out, fread($fp_in, 1024 * 512)); 
463
				fclose($fp_in); 
464
			} else {
465
				$error = true; 
466
			}
467
			gzclose($fp_out); 
468
		} else {
469
			$error = true; 
470
		}
471
		if ($error)
472
			return false; 
473
		else
474
			return $dest; 
475
	} 
476
	
477
	public function remove_accents($string) {
478
		if ( !preg_match('/[\x80-\xff]/', $string) ) return $string;
479
		$chars = array(
480
		    // Decompositions for Latin-1 Supplement
481
		    chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
482
		    chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
483
		    chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
484
		    chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
485
		    chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
486
		    chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
487
		    chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
488
		    chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
489
		    chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
490
		    chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
491
		    chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
492
		    chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
493
		    chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
494
		    chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
495
		    chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
496
		    chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
497
		    chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
498
		    chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
499
		    chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
500
		    chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
501
		    chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
502
		    chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
503
		    chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
504
		    chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
505
		    chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
506
		    chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
507
		    chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
508
		    chr(195).chr(191) => 'y',
509
		    // Decompositions for Latin Extended-A
510
		    chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
511
		    chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
512
		    chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
513
		    chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
514
		    chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
515
		    chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
516
		    chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
517
		    chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
518
		    chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
519
		    chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
520
		    chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
521
		    chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
522
		    chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
523
		    chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
524
		    chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
525
		    chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
526
		    chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
527
		    chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
528
		    chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
529
		    chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
530
		    chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
531
		    chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
532
		    chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
533
		    chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
534
		    chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
535
		    chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
536
		    chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
537
		    chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
538
		    chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
539
		    chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
540
		    chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
541
		    chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
542
		    chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
543
		    chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
544
		    chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
545
		    chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
546
		    chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
547
		    chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
548
		    chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
549
		    chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
550
		    chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
551
		    chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
552
		    chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
553
		    chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
554
		    chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
555
		    chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
556
		    chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
557
		    chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
558
		    chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
559
		    chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
560
		    chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
561
		    chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
562
		    chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
563
		    chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
564
		    chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
565
		    chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
566
		    chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
567
		    chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
568
		    chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
569
		    chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
570
		    chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
571
		    chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
572
		    chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
573
		    chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
574
		);
575
		$string = strtr($string, $chars);
576
		return $string;
577
	}
578
	
579
	/*
580
	* Extract int from a string
581
	* Come from http://php.net/manual/fr/function.intval.php comment by michiel ed thalent nl
582
	*
583
	* @param String Input string
584
	* @return Integer integer from the string
585
	*/
586
	public function str2int($string, $concat = false) {
587
		$length = strlen($string);    
588
		for ($i = 0, $int = '', $concat_flag = true; $i < $length; $i++) {
589
			if (is_numeric($string[$i]) && $concat_flag) {
590
				$int .= $string[$i];
591
			} elseif(!$concat && $concat_flag && strlen($int) > 0) {
592
				$concat_flag = false;
593
			}
594
		}
595
		return (int) $int;
596
	}
597
	
598
	public function create_socket($host, $port, &$errno, &$errstr) {
599
		$ip = gethostbyname($host);
600
		$s = socket_create(AF_INET, SOCK_STREAM, 0);
601
		$r = @socket_connect($s, $ip, $port);
602
		if (!socket_set_nonblock($s)) echo "Unable to set nonblock on socket\n";
603
		if ($r || socket_last_error() == 114 || socket_last_error() == 115) {
604
			return $s;
605
		}
606
		$errno = socket_last_error($s);
607
		$errstr = socket_strerror($errno);
608
		socket_close($s);
609
		return false;
610
	}
611
612
	public function create_socket_udp($host, $port, &$errno, &$errstr) {
613
		$ip = gethostbyname($host);
614
		$s = socket_create(AF_INET, SOCK_DGRAM, 0);
615
		$r = @socket_bind($s, $ip, $port);
616
		if ($r || socket_last_error() == 114 || socket_last_error() == 115) {
617
			return $s;
618
		}
619
		$errno = socket_last_error($s);
620
		$errstr = socket_strerror($errno);
621
		socket_close($s);
622
		return false;
623
	}
624
}
625
?>