Completed
Push — master ( 523b76...c0c7e7 )
by Yannick
11:24
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
	/**
110
	* Convert a HTML table to an array
111
	* @param String $data HTML page
112
	* @return Array array of the tables in HTML page
113
	*/
114
	public function table2array($data) {
115
		if (!is_string($data)) return array();
116
		if ($data == '') return array();
117
		$html = str_get_html($data);
118
		if ($html === false) return array();
119
		$tabledata=array();
120
		foreach($html->find('tr') as $element)
121
		{
122
			$td = array();
123
			foreach( $element->find('th') as $row)
124
			{
125
				$td [] = trim($row->plaintext);
126
			}
127
			$td=array_filter($td);
128
			$tabledata[] = $td;
129
130
			$td = array();
131
			$tdi = array();
132
			foreach( $element->find('td') as $row)
133
			{
134
				$td [] = trim($row->plaintext);
135
				$tdi [] = trim($row->innertext);
136
			}
137
			$td=array_filter($td);
138
			$tdi=array_filter($tdi);
139
			$tabledata[]=array_merge($td,$tdi);
140
		}
141
		$html->clear();
142
		unset($html);
143
		return(array_filter($tabledata));
144
	}
145
	
146
	/**
147
	* Convert <p> part of a HTML page to an array
148
	* @param String $data HTML page
149
	* @return Array array of the <p> in HTML page
150
	*/
151
	public function text2array($data) {
152
		$html = str_get_html($data);
153
		if ($html === false) return array();
154
		$tabledata=array();
155
		foreach($html->find('p') as $element)
156
		{
157
			$tabledata [] = trim($element->plaintext);
158
		}
159
		$html->clear();
160
		unset($html);
161
		return(array_filter($tabledata));
162
	}
163
164
	/**
165
	* Give distance between 2 coordonnates
166
	* @param Float $lat latitude of first point
167
	* @param Float $lon longitude of first point
168
	* @param Float $latc latitude of second point
169
	* @param Float $lonc longitude of second point
170
	* @param String $unit km else no unit used
171
	* @return Float Distance in $unit
172
	*/
173
	public function distance($lat, $lon, $latc, $lonc, $unit = 'km') {
174
		if ($lat == $latc && $lon == $lonc) return 0;
175
		$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;
176
		if ($unit == "km") {
177
			return round($dist * 1.609344);
178
		} elseif ($unit == "m") {
179
			return round($dist * 1.609344 * 1000);
180
		} elseif ($unit == "mile" || $unit == "mi") {
181
			return round($dist);
182
		} elseif ($unit == "nm") {
183
			return round($dist*0.868976);
184
		} else {
185
			return round($dist);
186
		}
187
	}
188
189
	/**
190
	* Check is distance realistic
191
	* @param int $timeDifference the time between the reception of both messages
192
	* @param float $distance distance covered
193
	* @return whether distance is realistic
194
	*/
195
	public function withinThreshold ($timeDifference, $distance) {
196
		$x = abs($timeDifference);
197
		$d = abs($distance);
198
		if ($x == 0 || $d == 0) return true;
199
		// may be due to Internet jitter; distance is realistic
200
		if ($x < 0.7 && $d < 2000) return true;
201
		else return $d/$x < 1500*0.27778; // 1500 km/h max
202
	}
203
204
205
	// Check if an array is assoc
206
	public function isAssoc($array)
207
	{
208
		return ($array !== array_values($array));
209
	}
210
211
	public function isInteger($input){
212
	    return(ctype_digit(strval($input)));
213
	}
214
215
216
	public function convertDec($dms,$latlong) {
217
		if ($latlong == 'latitude') {
218
			$deg = substr($dms, 0, 2);
219
			$min = substr($dms, 2, 4);
220
		} else {
221
			$deg = substr($dms, 0, 3);
222
			$min = substr($dms, 3, 5);
223
		}
224
		return $deg+(($min*60)/3600);
225
	}
226
	
227
	public function convertDM($coord,$latlong) {
228
		if ($latlong == 'latitude') {
229
			if ($coord < 0) $NSEW = 'S';
230
			else $NSEW = 'N';
231
		} elseif ($latlong == 'longitude') {
232
			if ($coord < 0) $NSEW = 'W';
233
			else $NSEW = 'E';
234
		}
235
		$coord = abs($coord);
236
		$deg = floor($coord);
237
		$coord = ($coord-$deg)*60;
238
		$min = $coord;
239
		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...
240
	}
241
	
242
	/**
243
	* Copy folder contents
244
	* @param       string   $source    Source path
245
	* @param       string   $dest      Destination path
246
	* @return      bool     Returns true on success, false on failure
247
	*/
248
	public function xcopy($source, $dest)
249
	{
250
		$files = glob($source.'*.*');
251
		foreach($files as $file){
252
			$file_to_go = str_replace($source,$dest,$file);
253
			copy($file, $file_to_go);
254
		}
255
		return true;
256
	}
257
	
258
	/**
259
	* Check if an url exist
260
	* @param	String $url url to check
261
	* @return	bool Return true on succes false on failure
262
	*/
263
	public function urlexist($url){
264
		$headers=get_headers($url);
265
		return stripos($headers[0],"200 OK")?true:false;
266
	}
267
	
268
	/**
269
	* Convert hexa to string
270
	* @param	String $hex data in hexa
271
	* @return	String Return result
272
	*/
273
	public function hex2str($hex) {
274
		$str = '';
275
		$hexln = strlen($hex);
276
		for($i=0;$i<$hexln;$i+=2) $str .= chr(hexdec(substr($hex,$i,2)));
277
		return $str;
278
	}
279
	
280
	/**
281
	* Convert hexa color to rgb
282
	* @param	String $hex data in hexa
283
	* @return	String Return result
284
	*/
285
	public function hex2rgb($hex) {
286
		$hex = str_replace('#','',$hex);
287
		return sscanf($hex, "%02x%02x%02x"); 
288
	}
289
	
290
	public function getHeading($lat1, $lon1, $lat2, $lon2) {
291
		//difference in longitudinal coordinates
292
		$dLon = deg2rad($lon2) - deg2rad($lon1);
293
		//difference in the phi of latitudinal coordinates
294
		$dPhi = log(tan(deg2rad($lat2) / 2 + pi() / 4) / tan(deg2rad($lat1) / 2 + pi() / 4));
295
		//we need to recalculate $dLon if it is greater than pi
296
		if(abs($dLon) > pi()) {
297
			if($dLon > 0) {
298
				$dLon = (2 * pi() - $dLon) * -1;
299
			} else {
300
				$dLon = 2 * pi() + $dLon;
301
			}
302
		}
303
		//return the angle, normalized
304
		return (rad2deg(atan2($dLon, $dPhi)) + 360) % 360;
305
	}
306
	
307
	public function checkLine($lat1,$lon1,$lat2,$lon2,$lat3,$lon3,$approx = 0.2) {
308
		//$a = ($lon2-$lon1)*$lat3+($lat2-$lat1)*$lon3+($lat1*$lon2+$lat2*$lon1);
309
		$a = -($lon2-$lon1);
310
		$b = $lat2 - $lat1;
311
		$c = -($a*$lat1+$b*$lon1);
312
		$d = $a*$lat3+$b*$lon3+$c;
313
		if ($d > -$approx && $d < $approx) return true;
314
		else return false;
315
	}
316
	
317
	public function array_merge_noappend() {
318
		$output = array();
319
		foreach(func_get_args() as $array) {
320
			foreach($array as $key => $value) {
321
				$output[$key] = isset($output[$key]) ?
322
				array_merge($output[$key], $value) : $value;
323
			}
324
		}
325
		return $output;
326
	}
327
	
328
329
	public function arr_diff($arraya, $arrayb) {
330
		foreach ($arraya as $keya => $valuea) {
331
			if (in_array($valuea, $arrayb)) {
332
				unset($arraya[$keya]);
333
			}
334
		}
335
		return $arraya;
336
	}
337
338
	/*
339
	* Check if a key exist in an array
340
	* Come from http://stackoverflow.com/a/19420866
341
	* @param Array array to check
342
	* @param String key to check
343
	* @return Bool true if exist, else false
344
	*/
345
	public function multiKeyExists(array $arr, $key) {
346
		// is in base array?
347
		if (array_key_exists($key, $arr)) {
348
			return true;
349
		}
350
		// check arrays contained in this array
351
		foreach ($arr as $element) {
352
			if (is_array($element)) {
353
				if ($this->multiKeyExists($element, $key)) {
354
					return true;
355
				}
356
			}
357
		}
358
		return false;
359
	}
360
	
361
	/**
362
	* Returns list of available locales
363
	*
364
	* @return array
365
	 */
366
	public function listLocaleDir()
367
	{
368
		$result = array('en');
369
		if (!is_dir('./locale')) {
370
			return $result;
371
		}
372
		$handle = @opendir('./locale');
373
		if ($handle === false) return $result;
374
		while (false !== ($file = readdir($handle))) {
375
			$path = './locale'.'/'.$file.'/LC_MESSAGES/fam.mo';
376
			if ($file != "." && $file != ".." && @file_exists($path)) {
377
				$result[] = $file;
378
			}
379
		}
380
		closedir($handle);
381
		return $result;
382
	}
383
384
	public function nextcoord($latitude, $longitude, $speed, $heading, $archivespeed = 1){
385
		global $globalMapRefresh;
386
		$distance = ($speed*0.514444*$globalMapRefresh*$archivespeed)/1000;
387
		$r = 6378;
388
		$latitude = deg2rad($latitude);
389
		$longitude = deg2rad($longitude);
390
		$bearing = deg2rad($heading); 
391
		$latitude2 =  asin( (sin($latitude) * cos($distance/$r)) + (cos($latitude) * sin($distance/$r) * cos($bearing)) );
392
		$longitude2 = $longitude + atan2( sin($bearing)*sin($distance/$r)*cos($latitude), cos($distance/$r)-(sin($latitude)*sin($latitude2)) );
393
		return array('latitude' => number_format(rad2deg($latitude2),5,'.',''),'longitude' => number_format(rad2deg($longitude2),5,'.',''));
394
	}
395
	
396
	public function getCoordfromDistanceBearing($latitude,$longitude,$bearing,$distance) {
397
		// distance in meter
398
		$R = 6378.14;
399
		$latitude1 = $latitude * (M_PI/180);
400
		$longitude1 = $longitude * (M_PI/180);
401
		$brng = $bearing * (M_PI/180);
402
		$d = $distance;
403
404
		$latitude2 = asin(sin($latitude1)*cos($d/$R) + cos($latitude1)*sin($d/$R)*cos($brng));
405
		$longitude2 = $longitude1 + atan2(sin($brng)*sin($d/$R)*cos($latitude1),cos($d/$R)-sin($latitude1)*sin($latitude2));
406
407
		$latitude2 = $latitude2 * (180/M_PI);
408
		$longitude2 = $longitude2 * (180/M_PI);
409
410
		$flat = round ($latitude2,6);
411
		$flong = round ($longitude2,6);
412
/*
413
		$dx = $distance*cos($bearing);
414
		$dy = $distance*sin($bearing);
415
		$dlong = $dx/(111320*cos($latitude));
416
		$dlat = $dy/110540;
417
		$flong = $longitude + $dlong;
418
		$flat = $latitude + $dlat;
419
*/
420
		return array('latitude' => $flat,'longitude' => $flong);
421
	}
422
423
	/**
424
	 * GZIPs a file on disk (appending .gz to the name)
425
	 *
426
	 * From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php
427
	 * Based on function by Kioob at:
428
	 * http://www.php.net/manual/en/function.gzwrite.php#34955
429
	 * 
430
	 * @param string $source Path to file that should be compressed
431
	 * @param integer $level GZIP compression level (default: 9)
432
	 * @return string New filename (with .gz appended) if success, or false if operation fails
433
	 */
434
	public function gzCompressFile($source, $level = 9){ 
435
		$dest = $source . '.gz'; 
436
		$mode = 'wb' . $level; 
437
		$error = false; 
438
		if ($fp_out = gzopen($dest, $mode)) { 
439
			if ($fp_in = fopen($source,'rb')) { 
440
				while (!feof($fp_in)) 
441
					gzwrite($fp_out, fread($fp_in, 1024 * 512)); 
442
				fclose($fp_in); 
443
			} else {
444
				$error = true; 
445
			}
446
			gzclose($fp_out); 
447
		} else {
448
			$error = true; 
449
		}
450
		if ($error)
451
			return false; 
452
		else
453
			return $dest; 
454
	} 
455
	
456
	public function remove_accents($string) {
457
		if ( !preg_match('/[\x80-\xff]/', $string) ) return $string;
458
		$chars = array(
459
		    // Decompositions for Latin-1 Supplement
460
		    chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
461
		    chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
462
		    chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
463
		    chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
464
		    chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
465
		    chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
466
		    chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
467
		    chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
468
		    chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
469
		    chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
470
		    chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
471
		    chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
472
		    chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
473
		    chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
474
		    chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
475
		    chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
476
		    chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
477
		    chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
478
		    chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
479
		    chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
480
		    chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
481
		    chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
482
		    chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
483
		    chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
484
		    chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
485
		    chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
486
		    chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
487
		    chr(195).chr(191) => 'y',
488
		    // Decompositions for Latin Extended-A
489
		    chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
490
		    chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
491
		    chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
492
		    chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
493
		    chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
494
		    chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
495
		    chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
496
		    chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
497
		    chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
498
		    chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
499
		    chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
500
		    chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
501
		    chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
502
		    chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
503
		    chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
504
		    chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
505
		    chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
506
		    chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
507
		    chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
508
		    chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
509
		    chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
510
		    chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
511
		    chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
512
		    chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
513
		    chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
514
		    chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
515
		    chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
516
		    chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
517
		    chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
518
		    chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
519
		    chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
520
		    chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
521
		    chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
522
		    chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
523
		    chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
524
		    chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
525
		    chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
526
		    chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
527
		    chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
528
		    chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
529
		    chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
530
		    chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
531
		    chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
532
		    chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
533
		    chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
534
		    chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
535
		    chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
536
		    chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
537
		    chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
538
		    chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
539
		    chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
540
		    chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
541
		    chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
542
		    chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
543
		    chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
544
		    chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
545
		    chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
546
		    chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
547
		    chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
548
		    chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
549
		    chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
550
		    chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
551
		    chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
552
		    chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
553
		);
554
		$string = strtr($string, $chars);
555
		return $string;
556
	}
557
	
558
	/*
559
	* Extract int from a string
560
	* Come from http://php.net/manual/fr/function.intval.php comment by michiel ed thalent nl
561
	*
562
	* @param String Input string
563
	* @return Integer integer from the string
564
	*/
565
	public function str2int($string, $concat = false) {
566
		$length = strlen($string);    
567
		for ($i = 0, $int = '', $concat_flag = true; $i < $length; $i++) {
568
			if (is_numeric($string[$i]) && $concat_flag) {
569
				$int .= $string[$i];
570
			} elseif(!$concat && $concat_flag && strlen($int) > 0) {
571
				$concat_flag = false;
572
			}
573
		}
574
		return (int) $int;
575
	}
576
	
577
	public function create_socket($host, $port, &$errno, &$errstr) {
578
		$ip = gethostbyname($host);
579
		$s = socket_create(AF_INET, SOCK_STREAM, 0);
580
		$r = @socket_connect($s, $ip, $port);
581
		if (!socket_set_nonblock($s)) echo "Unable to set nonblock on socket\n";
582
		if ($r || socket_last_error() == 114 || socket_last_error() == 115) {
583
			return $s;
584
		}
585
		$errno = socket_last_error($s);
586
		$errstr = socket_strerror($errno);
587
		socket_close($s);
588
		return false;
589
	}
590
591
	public function create_socket_udp($host, $port, &$errno, &$errstr) {
592
		$ip = gethostbyname($host);
593
		$s = socket_create(AF_INET, SOCK_DGRAM, 0);
594
		$r = @socket_bind($s, $ip, $port);
595
		if ($r || socket_last_error() == 114 || socket_last_error() == 115) {
596
			return $s;
597
		}
598
		$errno = socket_last_error($s);
599
		$errstr = socket_strerror($errno);
600
		socket_close($s);
601
		return false;
602
	}
603
}
604
?>