Passed
Branch 1.0.0-dev (4efac2)
by nguereza
04:41
created
core/classes/cache/FileCache.php 1 patch
Indentation   +86 added lines, -86 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
 	 * You should have received a copy of the GNU General Public License
23 23
 	 * along with this program; if not, write to the Free Software
24 24
 	 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25
-	*/
25
+	 */
26 26
 
27 27
 	class FileCache implements CacheInterface{
28 28
 		
@@ -44,15 +44,15 @@  discard block
 block discarded – undo
44 44
 				show_error('The cache for file system is not available. Check the cache directory if is exists or is writable.');
45 45
 			}
46 46
 			/**
47
-	         * instance of the Log class
48
-	         */
49
-	        if(is_object($logger)){
50
-	          $this->logger = $logger;
51
-	        }
52
-	        else{
53
-	            $this->logger =& class_loader('Log', 'classes');
54
-	            $this->logger->setLogger('Library::FileCache');
55
-	        }
47
+			 * instance of the Log class
48
+			 */
49
+			if(is_object($logger)){
50
+			  $this->logger = $logger;
51
+			}
52
+			else{
53
+				$this->logger =& class_loader('Log', 'classes');
54
+				$this->logger->setLogger('Library::FileCache');
55
+			}
56 56
 			
57 57
 			//if Zlib extension is not loaded set compressCacheData to false
58 58
 			if(! extension_loaded('zlib')){
@@ -80,26 +80,26 @@  discard block
 block discarded – undo
80 80
 				return false;
81 81
 			}
82 82
 			// Getting a shared lock 
83
-		    flock($handle, LOCK_SH);
84
-		    $data = file_get_contents($filePath);
85
-      		fclose($handle);
86
-      		$data = @unserialize($this->compressCacheData ? gzinflate($data) : $data);
87
-      		if (! $data) {
88
-      			$this->logger->error('Can not unserialize the cache data for the key ['. $key .'], return false');
89
-		         // If unserializing somehow didn't work out, we'll delete the file
90
-		         unlink($filePath);
91
-		         return false;
92
-	      	}
93
-	      	if (time() > $data['expire']) {
94
-	      		$this->logger->info('The cache data for the key ['. $key .'] already expired delete the cache file [' .$filePath. ']');
95
-		        // Unlinking when the file was expired
96
-		        unlink($filePath);
97
-		        return false;
98
-		     }
99
-		     else{
100
-		     	$this->logger->info('The cache not yet expire, now return the cache data for key ['. $key .'], the cache will expire at [' . date('Y-m-d H:i:s', $data['expire']) . ']');
101
-		     	return $data['data'];
102
-		     }
83
+			flock($handle, LOCK_SH);
84
+			$data = file_get_contents($filePath);
85
+	  		fclose($handle);
86
+	  		$data = @unserialize($this->compressCacheData ? gzinflate($data) : $data);
87
+	  		if (! $data) {
88
+	  			$this->logger->error('Can not unserialize the cache data for the key ['. $key .'], return false');
89
+				 // If unserializing somehow didn't work out, we'll delete the file
90
+				 unlink($filePath);
91
+				 return false;
92
+		  	}
93
+		  	if (time() > $data['expire']) {
94
+		  		$this->logger->info('The cache data for the key ['. $key .'] already expired delete the cache file [' .$filePath. ']');
95
+				// Unlinking when the file was expired
96
+				unlink($filePath);
97
+				return false;
98
+			 }
99
+			 else{
100
+			 	$this->logger->info('The cache not yet expire, now return the cache data for key ['. $key .'], the cache will expire at [' . date('Y-m-d H:i:s', $data['expire']) . ']');
101
+			 	return $data['data'];
102
+			 }
103 103
 		}
104 104
 
105 105
 
@@ -121,25 +121,25 @@  discard block
 block discarded – undo
121 121
 			}
122 122
 			flock($handle, LOCK_EX); // exclusive lock, will get released when the file is closed
123 123
 			//Serializing along with the TTL
124
-		    $cacheData = serialize(array(
124
+			$cacheData = serialize(array(
125 125
 									'mtime' => time(),
126 126
 									'expire' => $expire,
127 127
 									'data' => $data,
128 128
 									'ttl' => $ttl
129 129
 									)
130 130
 								);		   
131
-		    $result = fwrite($handle, $this->compressCacheData ? gzdeflate($cacheData, 9) : $cacheData);
132
-		    if(! $result){
133
-		    	$this->logger->error('Can not write cache data into file [' .$filePath. '] for the key ['. $key .'], return false');
134
-		    	fclose($handle);
135
-		    	return false;
136
-		    }
137
-		    else{
138
-		    	$this->logger->info('Cache data saved into file [' .$filePath. '] for the key ['. $key .']');
139
-		    	fclose($handle);
131
+			$result = fwrite($handle, $this->compressCacheData ? gzdeflate($cacheData, 9) : $cacheData);
132
+			if(! $result){
133
+				$this->logger->error('Can not write cache data into file [' .$filePath. '] for the key ['. $key .'], return false');
134
+				fclose($handle);
135
+				return false;
136
+			}
137
+			else{
138
+				$this->logger->info('Cache data saved into file [' .$filePath. '] for the key ['. $key .']');
139
+				fclose($handle);
140 140
 				chmod($filePath, 0640);
141 141
 				return true;
142
-		    }
142
+			}
143 143
 		}	
144 144
 
145 145
 
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
 			}
160 160
 			else{
161 161
 				$this->logger->info('Found cache file [' .$filePath. '] remove it');
162
-	      		unlink($filePath);
162
+		  		unlink($filePath);
163 163
 				return true;
164 164
 			}
165 165
 		}
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
 			}
183 183
 			else{
184 184
 				$this->logger->info('Found cache file [' .$filePath. '] check the validity');
185
-	      		$data = file_get_contents($filePath);
185
+		  		$data = file_get_contents($filePath);
186 186
 				$data = @unserialize($this->compressCacheData ? gzinflate($data) : $data);
187 187
 				if(! $data){
188 188
 					$this->logger->warning('Can not unserialize the cache data for file [' . $filePath . ']');
@@ -222,17 +222,17 @@  discard block
 block discarded – undo
222 222
 				foreach ($list as $file) {
223 223
 					$this->logger->debug('Processing the cache file [' . $file . ']');
224 224
 					$data = file_get_contents($file);
225
-		      		$data = @unserialize($this->compressCacheData ? gzinflate($data) : $data);
226
-		      		if(! $data){
227
-		      			$this->logger->warning('Can not unserialize the cache data for file [' . $file . ']');
228
-		      		}
229
-		      		else if(time() > $data['expire']){
230
-		      			$this->logger->info('The cache data for file [' . $file . '] already expired remove it');
231
-		      			unlink($file);
232
-		      		}
233
-		      		else{
234
-		      			$this->logger->info('The cache data for file [' . $file . '] not yet expired skip it');
235
-		      		}
225
+			  		$data = @unserialize($this->compressCacheData ? gzinflate($data) : $data);
226
+			  		if(! $data){
227
+			  			$this->logger->warning('Can not unserialize the cache data for file [' . $file . ']');
228
+			  		}
229
+			  		else if(time() > $data['expire']){
230
+			  			$this->logger->info('The cache data for file [' . $file . '] already expired remove it');
231
+			  			unlink($file);
232
+			  		}
233
+			  		else{
234
+			  			$this->logger->info('The cache data for file [' . $file . '] not yet expired skip it');
235
+			  		}
236 236
 				}
237 237
 			}
238 238
 		}	
@@ -255,19 +255,19 @@  discard block
 block discarded – undo
255 255
 			}
256 256
 		}
257 257
 	
258
-	    /**
259
-	     * @return boolean
260
-	     */
261
-	    public function isCompressCacheData(){
262
-	        return $this->compressCacheData;
263
-	    }
258
+		/**
259
+		 * @return boolean
260
+		 */
261
+		public function isCompressCacheData(){
262
+			return $this->compressCacheData;
263
+		}
264 264
 
265
-	    /**
266
-	     * @param boolean $compressCacheData
267
-	     *
268
-	     * @return object
269
-	     */
270
-	    public function setCompressCacheData($status = true){
265
+		/**
266
+		 * @param boolean $compressCacheData
267
+		 *
268
+		 * @return object
269
+		 */
270
+		public function setCompressCacheData($status = true){
271 271
 			//if Zlib extension is not loaded set compressCacheData to false
272 272
 			if($status === true && ! extension_loaded('zlib')){
273 273
 				
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
 				$this->compressCacheData = $status;
279 279
 			}
280 280
 			return $this;
281
-	    }
281
+		}
282 282
 		
283 283
 		/**
284 284
 		 * Check whether the cache feature for the handle is supported
@@ -290,28 +290,28 @@  discard block
 block discarded – undo
290 290
 		}
291 291
 
292 292
 		/**
293
-	     * Return the Log instance
294
-	     * @return object
295
-	     */
296
-	    public function getLogger(){
297
-	      return $this->logger;
298
-	    }
293
+		 * Return the Log instance
294
+		 * @return object
295
+		 */
296
+		public function getLogger(){
297
+		  return $this->logger;
298
+		}
299 299
 
300
-	    /**
301
-	     * Set the log instance
302
-	     * @param Log $logger the log object
303
-	     */
304
-	    public function setLogger(Log $logger){
305
-	      $this->logger = $logger;
306
-	      return $this;
307
-	    }
300
+		/**
301
+		 * Set the log instance
302
+		 * @param Log $logger the log object
303
+		 */
304
+		public function setLogger(Log $logger){
305
+		  $this->logger = $logger;
306
+		  return $this;
307
+		}
308 308
 		
309 309
 		/**
310
-		* Get the cache file full path for the given key
311
-		*
312
-		* @param $key the cache item key
313
-		* @return string
314
-		*/
310
+		 * Get the cache file full path for the given key
311
+		 *
312
+		 * @param $key the cache item key
313
+		 * @return string
314
+		 */
315 315
 		private function getFilePath($key){
316 316
 			return CACHE_PATH . md5($key) . '.cache';
317 317
 		}
Please login to merge, or discard this patch.
core/libraries/Pagination.php 1 patch
Indentation   +135 added lines, -135 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php
2
-    defined('ROOT_PATH') || exit('Access denied');
2
+	defined('ROOT_PATH') || exit('Access denied');
3 3
 	/**
4 4
 	 * TNH Framework
5 5
 	 *
@@ -22,156 +22,156 @@  discard block
 block discarded – undo
22 22
 	 * You should have received a copy of the GNU General Public License
23 23
 	 * along with this program; if not, write to the Free Software
24 24
 	 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25
-	*/
25
+	 */
26 26
 
27
-    class Pagination{
27
+	class Pagination{
28 28
         
29 29
 		/**
30
-         * The list of loaded config
31
-         * @var array
32
-         */
33
-        private $config = array();
30
+		 * The list of loaded config
31
+		 * @var array
32
+		 */
33
+		private $config = array();
34 34
 
35
-        /**
36
-         * Create an instance of pagination
37
-         * @param array $overwriteConfig the list of configuration to overwrite the defined configuration in config_pagination.php
38
-         */
39
-        public function __construct($overwriteConfig = array()){
40
-            if(file_exists(CONFIG_PATH . 'config_pagination.php')){
41
-                $config = array();
42
-                require_once CONFIG_PATH . 'config_pagination.php';
43
-                if(empty($config) || ! is_array($config)){
44
-                    show_error('No configuration found in ' . CONFIG_PATH . 'config_pagination.php');
45
-                }
35
+		/**
36
+		 * Create an instance of pagination
37
+		 * @param array $overwriteConfig the list of configuration to overwrite the defined configuration in config_pagination.php
38
+		 */
39
+		public function __construct($overwriteConfig = array()){
40
+			if(file_exists(CONFIG_PATH . 'config_pagination.php')){
41
+				$config = array();
42
+				require_once CONFIG_PATH . 'config_pagination.php';
43
+				if(empty($config) || ! is_array($config)){
44
+					show_error('No configuration found in ' . CONFIG_PATH . 'config_pagination.php');
45
+				}
46 46
 				else{
47 47
 					if(! empty($overwriteConfig)){
48 48
 						$config = array_merge($config, $overwriteConfig);
49 49
 					}
50 50
 					$this->config = $config;
51
-                    //put it gobally
51
+					//put it gobally
52 52
 					Config::setAll($config);
53 53
 					unset($config);
54 54
 				}
55
-            }
56
-            else{
57
-                show_error('Unable to find the pagination configuration file');
58
-            }
59
-        }
55
+			}
56
+			else{
57
+				show_error('Unable to find the pagination configuration file');
58
+			}
59
+		}
60 60
 
61 61
 
62
-        /**
63
-         * Set the pagination custom configuration to overwrite the default configuration in
64
-         * config_pagination.php
65
-         * @param array $config the configuration to set
66
-         */
67
-        public function setConfig(array $config = array()){
68
-            if(! empty($config)){
69
-                $this->config = array_merge($this->config, $config);
70
-                Config::setAll($config);
71
-            }
72
-        }
62
+		/**
63
+		 * Set the pagination custom configuration to overwrite the default configuration in
64
+		 * config_pagination.php
65
+		 * @param array $config the configuration to set
66
+		 */
67
+		public function setConfig(array $config = array()){
68
+			if(! empty($config)){
69
+				$this->config = array_merge($this->config, $config);
70
+				Config::setAll($config);
71
+			}
72
+		}
73 73
 
74
-        /**
75
-         * Generate the pagination link
76
-         * @param  int $totalRows the total number of data
77
-         * @param  int $currentPageNumber the current page number
78
-         * @return string the pagination link
79
-         */
80
-        public function getLink($totalRows, $currentPageNumber){
81
-            $pageQueryName = $this->config['page_query_string_name'];
82
-            $numberOfLink = $this->config['nb_link'];
74
+		/**
75
+		 * Generate the pagination link
76
+		 * @param  int $totalRows the total number of data
77
+		 * @param  int $currentPageNumber the current page number
78
+		 * @return string the pagination link
79
+		 */
80
+		public function getLink($totalRows, $currentPageNumber){
81
+			$pageQueryName = $this->config['page_query_string_name'];
82
+			$numberOfLink = $this->config['nb_link'];
83 83
 			$numberOfRowPerPage = $this->config['pagination_per_page'];
84
-            $queryString = Url::queryString();
85
-            $currentUrl = Url::current();
86
-            if($queryString == ''){
87
-                $query = '?' . $pageQueryName . '=';
88
-            }
89
-            else{
90
-                $tab = explode($pageQueryName . '=', $queryString);
91
-                $nb = count($tab);
92
-                if($nb == 1){
93
-                    $query = '?' . $queryString . '&' . $pageQueryName . '=';
94
-                }
95
-                else{
96
-                    if($tab[0] == ''){
97
-                        $query = '?' . $pageQueryName . '=';
98
-                    }
99
-                    else{
100
-                        $query = '?' . $tab[0] . '' . $pageQueryName . '=';
101
-                    }
102
-                }
103
-            }
104
-            $temp = explode('?', $currentUrl);
105
-            $query = $temp[0] . $query;
106
-            $navbar = '';
107
-            $numberOfPage = ceil($totalRows / $numberOfRowPerPage);
108
-            $currentPageNumber = (int) $currentPageNumber;
84
+			$queryString = Url::queryString();
85
+			$currentUrl = Url::current();
86
+			if($queryString == ''){
87
+				$query = '?' . $pageQueryName . '=';
88
+			}
89
+			else{
90
+				$tab = explode($pageQueryName . '=', $queryString);
91
+				$nb = count($tab);
92
+				if($nb == 1){
93
+					$query = '?' . $queryString . '&' . $pageQueryName . '=';
94
+				}
95
+				else{
96
+					if($tab[0] == ''){
97
+						$query = '?' . $pageQueryName . '=';
98
+					}
99
+					else{
100
+						$query = '?' . $tab[0] . '' . $pageQueryName . '=';
101
+					}
102
+				}
103
+			}
104
+			$temp = explode('?', $currentUrl);
105
+			$query = $temp[0] . $query;
106
+			$navbar = '';
107
+			$numberOfPage = ceil($totalRows / $numberOfRowPerPage);
108
+			$currentPageNumber = (int) $currentPageNumber;
109 109
 			if($currentPageNumber <= 0){
110 110
 				$currentPageNumber = 1;
111 111
 			}
112
-            if($numberOfPage <= 1 || $numberOfLink <= 0 || $numberOfRowPerPage <= 0 || !is_numeric($numberOfLink) || !is_numeric($numberOfRowPerPage)
113
-            ){
114
-                return $navbar;
115
-            }
116
-            if($numberOfLink % 2 == 0){
117
-                $start = $currentPageNumber - ($numberOfLink / 2) + 1;
118
-                $end = $currentPageNumber + ($numberOfLink / 2);
119
-            }
120
-            else{
121
-                $start = $currentPageNumber - floor($numberOfLink / 2);
122
-                $end = $currentPageNumber + floor($numberOfLink / 2);
123
-            }
124
-            if($start <= 1){
125
-                $begin = 1;
126
-                $end = $numberOfLink;
127
-            }
128
-            else if($start > 1 && $end < $numberOfPage){
129
-                $begin = $start;
130
-                $end = $end;
131
-            }
132
-            else{
133
-                $begin = ($numberOfPage - $numberOfLink) + 1;
134
-                $end = $numberOfPage;
135
-            }
136
-            if($numberOfPage <= $numberOfLink){
137
-                $begin = 1;
138
-                $end = $numberOfPage;
139
-            }
140
-            if($currentPageNumber == 1){
141
-                for($i = $begin; $i <= $end; $i++){
142
-                    if($i == $currentPageNumber){
143
-                        $navbar .= $this->config['active_link_open'] . $currentPageNumber . $this->config['active_link_close'];
144
-                    }
145
-                    else{
146
-                        $navbar .= $this->config['digit_open'] . '<a href="' . $query . $i . '" ' . attributes_to_string($this->config['attributes']) . '>' . $i . '</a>' . $this->config['digit_close'];
147
-                    }
148
-                }
149
-                $navbar .= $this->config['next_open'] . '<a href="' . $query . ($currentPageNumber + 1) . '">' . $this->config['next_text'] . '</a>' . $this->config['next_close'];
150
-            }
151
-            else if($currentPageNumber > 1 && $currentPageNumber < $numberOfPage){
152
-                $navbar .= $this->config['previous_open'] . '<a href="' . $query . ($currentPageNumber - 1) . '">' . $this->config['previous_text'] . '</a>' . $this->config['previous_close'];
153
-                for($i = $begin; $i <= $end; $i++){
154
-                    if($i == $currentPageNumber){
155
-                        $navbar .= $this->config['active_link_open'] . $currentPageNumber . $this->config['active_link_close'];
156
-                    }
157
-                    else{
158
-                        $navbar .= $this->config['digit_open'] . '<a href="' . $query . $i . '"' . attributes_to_string($this->config['attributes']) . '>' . $i .'</a>' . $this->config['digit_close'];
159
-                    }
160
-                }
161
-                $navbar .= $this->config['next_open']."<a href='$query".($currentPageNumber + 1)."'>".$this->config['next_text']."</a>".$this->config['next_close'];
162
-            }
163
-            else if($currentPageNumber == $numberOfPage){
164
-                $navbar .= $this->config['previous_open'] . '<a href="' . $query . ($currentPageNumber - 1) . '">' . $this->config['previous_text'] . '</a>' . $this->config['previous_close'];
165
-                for($i = $begin; $i <= $end; $i++){
166
-                    if($i == $currentPageNumber){
167
-                        $navbar .= $this->config['active_link_open'] . $currentPageNumber . $this->config['active_link_close'];
168
-                    }
169
-                    else{
170
-                        $navbar .= $this->config['digit_open'] . '<a href="' . $query . $i . '"' . attributes_to_string($this->config['attributes']) . '>' . $i . '</a>' . $this->config['digit_close'];
171
-                    }
172
-                }
173
-            }
174
-            $navbar = $this->config['pagination_open'] . $navbar . $this->config['pagination_close'];
175
-            return $navbar;
176
-        }
177
-    }
112
+			if($numberOfPage <= 1 || $numberOfLink <= 0 || $numberOfRowPerPage <= 0 || !is_numeric($numberOfLink) || !is_numeric($numberOfRowPerPage)
113
+			){
114
+				return $navbar;
115
+			}
116
+			if($numberOfLink % 2 == 0){
117
+				$start = $currentPageNumber - ($numberOfLink / 2) + 1;
118
+				$end = $currentPageNumber + ($numberOfLink / 2);
119
+			}
120
+			else{
121
+				$start = $currentPageNumber - floor($numberOfLink / 2);
122
+				$end = $currentPageNumber + floor($numberOfLink / 2);
123
+			}
124
+			if($start <= 1){
125
+				$begin = 1;
126
+				$end = $numberOfLink;
127
+			}
128
+			else if($start > 1 && $end < $numberOfPage){
129
+				$begin = $start;
130
+				$end = $end;
131
+			}
132
+			else{
133
+				$begin = ($numberOfPage - $numberOfLink) + 1;
134
+				$end = $numberOfPage;
135
+			}
136
+			if($numberOfPage <= $numberOfLink){
137
+				$begin = 1;
138
+				$end = $numberOfPage;
139
+			}
140
+			if($currentPageNumber == 1){
141
+				for($i = $begin; $i <= $end; $i++){
142
+					if($i == $currentPageNumber){
143
+						$navbar .= $this->config['active_link_open'] . $currentPageNumber . $this->config['active_link_close'];
144
+					}
145
+					else{
146
+						$navbar .= $this->config['digit_open'] . '<a href="' . $query . $i . '" ' . attributes_to_string($this->config['attributes']) . '>' . $i . '</a>' . $this->config['digit_close'];
147
+					}
148
+				}
149
+				$navbar .= $this->config['next_open'] . '<a href="' . $query . ($currentPageNumber + 1) . '">' . $this->config['next_text'] . '</a>' . $this->config['next_close'];
150
+			}
151
+			else if($currentPageNumber > 1 && $currentPageNumber < $numberOfPage){
152
+				$navbar .= $this->config['previous_open'] . '<a href="' . $query . ($currentPageNumber - 1) . '">' . $this->config['previous_text'] . '</a>' . $this->config['previous_close'];
153
+				for($i = $begin; $i <= $end; $i++){
154
+					if($i == $currentPageNumber){
155
+						$navbar .= $this->config['active_link_open'] . $currentPageNumber . $this->config['active_link_close'];
156
+					}
157
+					else{
158
+						$navbar .= $this->config['digit_open'] . '<a href="' . $query . $i . '"' . attributes_to_string($this->config['attributes']) . '>' . $i .'</a>' . $this->config['digit_close'];
159
+					}
160
+				}
161
+				$navbar .= $this->config['next_open']."<a href='$query".($currentPageNumber + 1)."'>".$this->config['next_text']."</a>".$this->config['next_close'];
162
+			}
163
+			else if($currentPageNumber == $numberOfPage){
164
+				$navbar .= $this->config['previous_open'] . '<a href="' . $query . ($currentPageNumber - 1) . '">' . $this->config['previous_text'] . '</a>' . $this->config['previous_close'];
165
+				for($i = $begin; $i <= $end; $i++){
166
+					if($i == $currentPageNumber){
167
+						$navbar .= $this->config['active_link_open'] . $currentPageNumber . $this->config['active_link_close'];
168
+					}
169
+					else{
170
+						$navbar .= $this->config['digit_open'] . '<a href="' . $query . $i . '"' . attributes_to_string($this->config['attributes']) . '>' . $i . '</a>' . $this->config['digit_close'];
171
+					}
172
+				}
173
+			}
174
+			$navbar = $this->config['pagination_open'] . $navbar . $this->config['pagination_close'];
175
+			return $navbar;
176
+		}
177
+	}
Please login to merge, or discard this patch.
core/libraries/FormValidation.php 1 patch
Indentation   +880 added lines, -880 removed lines patch added patch discarded remove patch
@@ -1,922 +1,922 @@
 block discarded – undo
1 1
 <?php
2
-    defined('ROOT_PATH') || exit('Access denied');
3
-    /**
4
-     * TNH Framework
5
-     *
6
-     * A simple PHP framework using HMVC architecture
7
-     *
8
-     * This content is released under the GNU GPL License (GPL)
9
-     *
10
-     * Copyright (C) 2017 Tony NGUEREZA
11
-     *
12
-     * This program is free software; you can redistribute it and/or
13
-     * modify it under the terms of the GNU General Public License
14
-     * as published by the Free Software Foundation; either version 3
15
-     * of the License, or (at your option) any later version.
16
-     *
17
-     * This program is distributed in the hope that it will be useful,
18
-     * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
-     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
-     * GNU General Public License for more details.
21
-     *
22
-     * You should have received a copy of the GNU General Public License
23
-     * along with this program; if not, write to the Free Software
24
-     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25
-    */
26
-
27
-
28
-     class FormValidation{
2
+	defined('ROOT_PATH') || exit('Access denied');
3
+	/**
4
+	 * TNH Framework
5
+	 *
6
+	 * A simple PHP framework using HMVC architecture
7
+	 *
8
+	 * This content is released under the GNU GPL License (GPL)
9
+	 *
10
+	 * Copyright (C) 2017 Tony NGUEREZA
11
+	 *
12
+	 * This program is free software; you can redistribute it and/or
13
+	 * modify it under the terms of the GNU General Public License
14
+	 * as published by the Free Software Foundation; either version 3
15
+	 * of the License, or (at your option) any later version.
16
+	 *
17
+	 * This program is distributed in the hope that it will be useful,
18
+	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
+	 * GNU General Public License for more details.
21
+	 *
22
+	 * You should have received a copy of the GNU General Public License
23
+	 * along with this program; if not, write to the Free Software
24
+	 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25
+	 */
26
+
27
+
28
+	 class FormValidation{
29 29
 		 
30
-        /**
31
-         * The form validation status
32
-         * @var boolean
33
-         */
34
-        protected $_success  = false;
35
-
36
-        /**
37
-         * The list of errors messages
38
-         * @var array
39
-         */
40
-        protected $_errorsMessages = array();
30
+		/**
31
+		 * The form validation status
32
+		 * @var boolean
33
+		 */
34
+		protected $_success  = false;
35
+
36
+		/**
37
+		 * The list of errors messages
38
+		 * @var array
39
+		 */
40
+		protected $_errorsMessages = array();
41 41
         
42
-        // Array of rule sets, fieldName => PIPE seperated ruleString
43
-        protected $_rules             = array();
42
+		// Array of rule sets, fieldName => PIPE seperated ruleString
43
+		protected $_rules             = array();
44 44
         
45
-        // Array of errors, niceName => Error Message
46
-        protected $_errors             = array();
45
+		// Array of errors, niceName => Error Message
46
+		protected $_errors             = array();
47 47
         
48
-        // Array of post Key => Nice name labels
49
-        protected $_labels          = array();
48
+		// Array of post Key => Nice name labels
49
+		protected $_labels          = array();
50 50
         
51
-        /**
52
-         * The errors delimiters
53
-         * @var array
54
-         */
55
-        protected $_allErrorsDelimiter   = array('<div class="error">', '</div>');
56
-
57
-        /**
58
-         * The each error delimiter
59
-         * @var array
60
-         */
61
-        protected $_eachErrorDelimiter   = array('<p class="error">', '</p>');
51
+		/**
52
+		 * The errors delimiters
53
+		 * @var array
54
+		 */
55
+		protected $_allErrorsDelimiter   = array('<div class="error">', '</div>');
56
+
57
+		/**
58
+		 * The each error delimiter
59
+		 * @var array
60
+		 */
61
+		protected $_eachErrorDelimiter   = array('<p class="error">', '</p>');
62 62
         
63 63
 		/**
64
-         * Indicated if need force the validation to be failed
65
-         * @var boolean
66
-         */
67
-        protected $_forceFail            = false;
68
-
69
-        /**
70
-         * The list of the error messages overrides by the original
71
-         * @var array
72
-         */
73
-        protected $_errorPhraseOverrides = array();
74
-
75
-        /**
76
-         * The logger instance
77
-         * @var Log
78
-         */
79
-        private $logger;
80
-
81
-        /**
82
-         * The data to be validated, the default is to use $_POST
83
-         * @var array
84
-         */
85
-        private $data = array();
86
-
87
-        /**
88
-         * Whether to check the CSRF. This attribute is just a way to allow custom change of the 
64
+		 * Indicated if need force the validation to be failed
65
+		 * @var boolean
66
+		 */
67
+		protected $_forceFail            = false;
68
+
69
+		/**
70
+		 * The list of the error messages overrides by the original
71
+		 * @var array
72
+		 */
73
+		protected $_errorPhraseOverrides = array();
74
+
75
+		/**
76
+		 * The logger instance
77
+		 * @var Log
78
+		 */
79
+		private $logger;
80
+
81
+		/**
82
+		 * The data to be validated, the default is to use $_POST
83
+		 * @var array
84
+		 */
85
+		private $data = array();
86
+
87
+		/**
88
+		 * Whether to check the CSRF. This attribute is just a way to allow custom change of the 
89 89
 		 * CSRF global configuration
90 90
 		 *
91
-         * @var boolean
92
-         */
93
-        public $enableCsrfCheck = false;
94
-
95
-        /**
96
-         * Set all errors and rule sets empty, and sets success to false.
97
-         *
98
-         * @return void
99
-         */
100
-        public function __construct() {
101
-            $this->logger =& class_loader('Log', 'classes');
102
-            $this->logger->setLogger('Library::FormValidation');
91
+		 * @var boolean
92
+		 */
93
+		public $enableCsrfCheck = false;
94
+
95
+		/**
96
+		 * Set all errors and rule sets empty, and sets success to false.
97
+		 *
98
+		 * @return void
99
+		 */
100
+		public function __construct() {
101
+			$this->logger =& class_loader('Log', 'classes');
102
+			$this->logger->setLogger('Library::FormValidation');
103 103
            
104 104
 		   //Load form validation language message
105
-            Loader::lang('form_validation');
106
-            $obj = & get_instance();
107
-            $this->_errorsMessages  = array(
108
-                        'required'         => $obj->lang->get('fv_required'),
109
-                        'min_length'       => $obj->lang->get('fv_min_length'),
110
-                        'max_length'       => $obj->lang->get('fv_max_length'),
111
-                        'exact_length'     => $obj->lang->get('fv_exact_length'),
112
-                        'less_than'        => $obj->lang->get('fv_less_than'),
113
-                        'greater_than'     => $obj->lang->get('fv_greater_than'),
114
-                        'matches'          => $obj->lang->get('fv_matches'),
115
-                        'valid_email'      => $obj->lang->get('fv_valid_email'),
116
-                        'not_equal'        => array(
117
-                                                'post:key' => $obj->lang->get('fv_not_equal_post_key'),
118
-                                                'string'   => $obj->lang->get('fv_not_equal_string')
119
-                                            ),
120
-                        'depends'          => $obj->lang->get('fv_depends'),
121
-                        'is_unique'        => $obj->lang->get('fv_is_unique'),
122
-                        'is_unique_update' => $obj->lang->get('fv_is_unique_update'),
123
-                        'exists'           => $obj->lang->get('fv_exists'),
124
-                        'regex'            => $obj->lang->get('fv_regex'),
125
-                        'in_list'          => $obj->lang->get('fv_in_list'),
126
-                        'numeric'          => $obj->lang->get('fv_numeric'),
127
-                        'callback'         => $obj->lang->get('fv_callback'),
128
-                    );
129
-            $this->_resetValidation();
130
-            $this->setData($obj->request->post(null));
131
-        }
132
-
133
-        /**
134
-         * Reset the form validation instance
135
-         */
136
-        protected function _resetValidation() {
137
-            $this->_rules                = array();
138
-            $this->_labels               = array();
139
-            $this->_errorPhraseOverrides = array();
140
-            $this->_errors               = array();
141
-            $this->_success              = false;
142
-            $this->_forceFail            = false;
143
-            $this->data                  = array();
105
+			Loader::lang('form_validation');
106
+			$obj = & get_instance();
107
+			$this->_errorsMessages  = array(
108
+						'required'         => $obj->lang->get('fv_required'),
109
+						'min_length'       => $obj->lang->get('fv_min_length'),
110
+						'max_length'       => $obj->lang->get('fv_max_length'),
111
+						'exact_length'     => $obj->lang->get('fv_exact_length'),
112
+						'less_than'        => $obj->lang->get('fv_less_than'),
113
+						'greater_than'     => $obj->lang->get('fv_greater_than'),
114
+						'matches'          => $obj->lang->get('fv_matches'),
115
+						'valid_email'      => $obj->lang->get('fv_valid_email'),
116
+						'not_equal'        => array(
117
+												'post:key' => $obj->lang->get('fv_not_equal_post_key'),
118
+												'string'   => $obj->lang->get('fv_not_equal_string')
119
+											),
120
+						'depends'          => $obj->lang->get('fv_depends'),
121
+						'is_unique'        => $obj->lang->get('fv_is_unique'),
122
+						'is_unique_update' => $obj->lang->get('fv_is_unique_update'),
123
+						'exists'           => $obj->lang->get('fv_exists'),
124
+						'regex'            => $obj->lang->get('fv_regex'),
125
+						'in_list'          => $obj->lang->get('fv_in_list'),
126
+						'numeric'          => $obj->lang->get('fv_numeric'),
127
+						'callback'         => $obj->lang->get('fv_callback'),
128
+					);
129
+			$this->_resetValidation();
130
+			$this->setData($obj->request->post(null));
131
+		}
132
+
133
+		/**
134
+		 * Reset the form validation instance
135
+		 */
136
+		protected function _resetValidation() {
137
+			$this->_rules                = array();
138
+			$this->_labels               = array();
139
+			$this->_errorPhraseOverrides = array();
140
+			$this->_errors               = array();
141
+			$this->_success              = false;
142
+			$this->_forceFail            = false;
143
+			$this->data                  = array();
144 144
 			$this->enableCsrfCheck       = false;
145
-        }
145
+		}
146 146
 
147
-        /**
148
-         * Set the form validation data
149
-         * @param array $data the values to be validated
147
+		/**
148
+		 * Set the form validation data
149
+		 * @param array $data the values to be validated
150 150
 		 *
151
-         * @return FormValidation Current instance of object.
152
-         */
153
-        public function setData(array $data){
154
-            $this->logger->debug('Setting the form validation data, the values are: ' . stringfy_vars($data));
155
-            $this->data = $data;
151
+		 * @return FormValidation Current instance of object.
152
+		 */
153
+		public function setData(array $data){
154
+			$this->logger->debug('Setting the form validation data, the values are: ' . stringfy_vars($data));
155
+			$this->data = $data;
156 156
 			return $this;
157
-        }
158
-
159
-        /**
160
-         * Get the form validation data
161
-         * @return array the form validation data to be validated
162
-         */
163
-        public function getData(){
164
-            return $this->data;
165
-        }
166
-
167
-		/**
168
-		* Get the validation function name to validate a rule
169
-		*
170
-		* @return string the function name
171
-		*/
172
-        protected function _toCallCase($funcName, $prefix='_validate') {
173
-            $funcName = strtolower($funcName);
174
-            $finalFuncName = $prefix;
175
-            foreach (explode('_', $funcName) as $funcNamePart) {
176
-                $finalFuncName .= strtoupper($funcNamePart[0]) . substr($funcNamePart, 1);
177
-            }
178
-            return $finalFuncName;
179
-        }
180
-
181
-        /**
182
-         * Returns the boolean of the data status success. It goes by the simple
183
-         *
184
-         * @return boolean Whether or not the data validation has succeeded
185
-         */
186
-        public function isSuccess() {
187
-            return $this->_success;
188
-        }
189
-
190
-        /**
191
-         * Checks if the request method is POST or the Data to be validated is set
192
-         *
193
-         * @return boolean Whether or not the form has been submitted or the data is available for validation.
194
-         */
195
-        public function canDoValidation() {
196
-            return get_instance()->request->method() === 'POST' || ! empty($this->data);
197
-        }
198
-
199
-        /**
200
-         * Runs _run once POST data has been submitted or data is set manually.
201
-         *
202
-         * @return boolean
203
-         */
204
-        public function run() {
205
-            if ($this->canDoValidation()) {
206
-                $this->logger->info('The data to validate are listed below: ' . stringfy_vars($this->getData()));
207
-                $this->_run();
208
-            }
209
-            return $this->isSuccess();
210
-        }
211
-
212
-        /**
213
-         * Validate the CSRF 
214
-         * @return void 
215
-         */
216
-        protected function validateCSRF(){
217
-            if(get_instance()->request->method() == 'POST' || $this->enableCsrfCheck){
218
-                $this->logger->debug('Check if CSRF is enabled in configuration');
219
-                //first check for CSRF
220
-                if ((get_config('csrf_enable', false) || $this->enableCsrfCheck) && ! Security::validateCSRF()){
221
-                    show_error('Invalide data, Cross Site Request Forgery do his job, the data to validate is corrupted.');
222
-                }
223
-                else{
224
-                    $this->logger->info('CSRF is not enabled in configuration or not set manully, no need to check it');
225
-                }
226
-            }
227
-        }
228
-        /**
229
-         * Takes and trims each data, if it has any rules, we parse the rule string and run
230
-         * each rule against the data value. Sets _success to true if there are no errors
231
-         * afterwards.
232
-         */
233
-        protected function _run() {
234
-            //validate CSRF
235
-            $this->validateCSRF();
236
-            /////////////////////////////////////////////
237
-            $this->_forceFail = false;
238
-
239
-            foreach ($this->getData() as $inputName => $inputVal) {
240
-    			if(is_array($this->data[$inputName])){
241
-    				$this->data[$inputName] = array_map('trim', $this->data[$inputName]);
242
-    			}
243
-    			else{
244
-    				$this->data[$inputName] = trim($this->data[$inputName]);
245
-    			}
246
-
247
-                if (array_key_exists($inputName, $this->_rules)) {
248
-                    foreach ($this->_parseRuleString($this->_rules[$inputName]) as $eachRule) {
249
-                        $this->_validateRule($inputName, $this->data[$inputName], $eachRule);
250
-                    }
251
-                }
252
-            }
253
-
254
-            if (empty($this->_errors) && $this->_forceFail === false) {
255
-                $this->_success = true;
256
-            }
257
-        }
258
-
259
-        /**
260
-         * Adds a rule to a form data validation field.
261
-         *
262
-         * @param string $inputField Name of the field or the data key to add a rule to
263
-         * @param string $ruleSets PIPE seperated string of rules
264
-		 *
265
-         * @return FormValidation Current instance of object.
266
-         */
267
-        public function setRule($inputField, $inputLabel, $ruleSets) {
268
-            $this->_rules[$inputField] = $ruleSets;
269
-            $this->_labels[$inputField] = $inputLabel;
270
-            $this->logger->info('Set the field rule: name [' .$inputField. '], label [' .$inputLabel. '], rules [' .$ruleSets. ']');
271
-            return $this;
272
-        }
273
-
274
-        /**
275
-         * Takes an array of rules and uses setRule() to set them, accepts an array
276
-         * of rule names rather than a pipe-delimited string as well.
277
-         * @param array $ruleSets
157
+		}
158
+
159
+		/**
160
+		 * Get the form validation data
161
+		 * @return array the form validation data to be validated
162
+		 */
163
+		public function getData(){
164
+			return $this->data;
165
+		}
166
+
167
+		/**
168
+		 * Get the validation function name to validate a rule
169
+		 *
170
+		 * @return string the function name
171
+		 */
172
+		protected function _toCallCase($funcName, $prefix='_validate') {
173
+			$funcName = strtolower($funcName);
174
+			$finalFuncName = $prefix;
175
+			foreach (explode('_', $funcName) as $funcNamePart) {
176
+				$finalFuncName .= strtoupper($funcNamePart[0]) . substr($funcNamePart, 1);
177
+			}
178
+			return $finalFuncName;
179
+		}
180
+
181
+		/**
182
+		 * Returns the boolean of the data status success. It goes by the simple
183
+		 *
184
+		 * @return boolean Whether or not the data validation has succeeded
185
+		 */
186
+		public function isSuccess() {
187
+			return $this->_success;
188
+		}
189
+
190
+		/**
191
+		 * Checks if the request method is POST or the Data to be validated is set
192
+		 *
193
+		 * @return boolean Whether or not the form has been submitted or the data is available for validation.
194
+		 */
195
+		public function canDoValidation() {
196
+			return get_instance()->request->method() === 'POST' || ! empty($this->data);
197
+		}
198
+
199
+		/**
200
+		 * Runs _run once POST data has been submitted or data is set manually.
201
+		 *
202
+		 * @return boolean
203
+		 */
204
+		public function run() {
205
+			if ($this->canDoValidation()) {
206
+				$this->logger->info('The data to validate are listed below: ' . stringfy_vars($this->getData()));
207
+				$this->_run();
208
+			}
209
+			return $this->isSuccess();
210
+		}
211
+
212
+		/**
213
+		 * Validate the CSRF 
214
+		 * @return void 
215
+		 */
216
+		protected function validateCSRF(){
217
+			if(get_instance()->request->method() == 'POST' || $this->enableCsrfCheck){
218
+				$this->logger->debug('Check if CSRF is enabled in configuration');
219
+				//first check for CSRF
220
+				if ((get_config('csrf_enable', false) || $this->enableCsrfCheck) && ! Security::validateCSRF()){
221
+					show_error('Invalide data, Cross Site Request Forgery do his job, the data to validate is corrupted.');
222
+				}
223
+				else{
224
+					$this->logger->info('CSRF is not enabled in configuration or not set manully, no need to check it');
225
+				}
226
+			}
227
+		}
228
+		/**
229
+		 * Takes and trims each data, if it has any rules, we parse the rule string and run
230
+		 * each rule against the data value. Sets _success to true if there are no errors
231
+		 * afterwards.
232
+		 */
233
+		protected function _run() {
234
+			//validate CSRF
235
+			$this->validateCSRF();
236
+			/////////////////////////////////////////////
237
+			$this->_forceFail = false;
238
+
239
+			foreach ($this->getData() as $inputName => $inputVal) {
240
+				if(is_array($this->data[$inputName])){
241
+					$this->data[$inputName] = array_map('trim', $this->data[$inputName]);
242
+				}
243
+				else{
244
+					$this->data[$inputName] = trim($this->data[$inputName]);
245
+				}
246
+
247
+				if (array_key_exists($inputName, $this->_rules)) {
248
+					foreach ($this->_parseRuleString($this->_rules[$inputName]) as $eachRule) {
249
+						$this->_validateRule($inputName, $this->data[$inputName], $eachRule);
250
+					}
251
+				}
252
+			}
253
+
254
+			if (empty($this->_errors) && $this->_forceFail === false) {
255
+				$this->_success = true;
256
+			}
257
+		}
258
+
259
+		/**
260
+		 * Adds a rule to a form data validation field.
261
+		 *
262
+		 * @param string $inputField Name of the field or the data key to add a rule to
263
+		 * @param string $ruleSets PIPE seperated string of rules
278 264
 		 *
279 265
 		 * @return FormValidation Current instance of object.
280
-         */
281
-        public function setRules(array $ruleSets) {
282
-            foreach ($ruleSets as $ruleSet) {
283
-                $pipeDelimitedRules = null;
284
-                if (is_array($ruleSet['rules'])) {
285
-                    $pipeDelimitedRules = implode('|', $ruleSet['rules']);
286
-                } else {
287
-                    $pipeDelimitedRules = $ruleSet['rules'];
288
-                }
289
-                $this->setRule($ruleSet['name'], $ruleSet['label'], $pipeDelimitedRules);
290
-            }
291
-            return $this;
292
-        }
293
-
294
-        /**
295
-         * This method creates the global errors delimiter, each argument occurs once, at the beginning, and
296
-         * end of the errors block respectively.
297
-         *
298
-         * @param string $start Before block of errors gets displayed, HTML allowed.
299
-         * @param string $end After the block of errors gets displayed, HTML allowed.
300
-         *
266
+		 */
267
+		public function setRule($inputField, $inputLabel, $ruleSets) {
268
+			$this->_rules[$inputField] = $ruleSets;
269
+			$this->_labels[$inputField] = $inputLabel;
270
+			$this->logger->info('Set the field rule: name [' .$inputField. '], label [' .$inputLabel. '], rules [' .$ruleSets. ']');
271
+			return $this;
272
+		}
273
+
274
+		/**
275
+		 * Takes an array of rules and uses setRule() to set them, accepts an array
276
+		 * of rule names rather than a pipe-delimited string as well.
277
+		 * @param array $ruleSets
278
+		 *
301 279
 		 * @return FormValidation Current instance of object.
302
-         */
303
-        public function setErrorsDelimiter($start, $end) {
304
-            $this->_allErrorsDelimiter[0] = $start;
305
-            $this->_allErrorsDelimiter[1] = $end;
306
-            return $this;
307
-        }
308
-
309
-        /**
310
-         * This is the individual error delimiter, each argument occurs once before and after
311
-         * each individual error listed.
312
-         *
313
-         * @param string $start Displayed before each error.
314
-         * @param string $end Displayed after each error.
315
-         * 
280
+		 */
281
+		public function setRules(array $ruleSets) {
282
+			foreach ($ruleSets as $ruleSet) {
283
+				$pipeDelimitedRules = null;
284
+				if (is_array($ruleSet['rules'])) {
285
+					$pipeDelimitedRules = implode('|', $ruleSet['rules']);
286
+				} else {
287
+					$pipeDelimitedRules = $ruleSet['rules'];
288
+				}
289
+				$this->setRule($ruleSet['name'], $ruleSet['label'], $pipeDelimitedRules);
290
+			}
291
+			return $this;
292
+		}
293
+
294
+		/**
295
+		 * This method creates the global errors delimiter, each argument occurs once, at the beginning, and
296
+		 * end of the errors block respectively.
297
+		 *
298
+		 * @param string $start Before block of errors gets displayed, HTML allowed.
299
+		 * @param string $end After the block of errors gets displayed, HTML allowed.
300
+		 *
316 301
 		 * @return FormValidation Current instance of object.
317
-         */
318
-        public function setErrorDelimiter($start, $end) {
319
-            $this->_eachErrorDelimiter[0] = $start;
320
-            $this->_eachErrorDelimiter[1] = $end;
321
-            return $this;
322
-        }
323
-
324
-		/**
325
-		* Get the each errors delimiters
326
-		*
327
-		* @return array
328
-		*/
329
-    	public function getErrorDelimiter() {
330
-            return $this->_eachErrorDelimiter;
331
-        }
332
-
333
-		/**
334
-		* Get the all errors delimiters
335
-		*
336
-		* @return array
337
-		*/
338
-    	public function getErrorsDelimiter() {
339
-            return $this->_allErrorsDelimiter;
340
-        }
341
-
342
-        /**
343
-         * This sets a custom error message that can override the default error phrase provided
344
-         * by FormValidation, it can be used in the format of setMessage('rule', 'error phrase')
345
-         * which will globally change the error phrase of that rule, or in the format of:
346
-         * setMessage('rule', 'fieldname', 'error phrase') - which will only change the error phrase for
347
-         * that rule, applied on that field.
348
-         *
349
-         * @return boolean True on success, false on failure.
350
-         */
351
-        public function setMessage() {
352
-            $numArgs = func_num_args();
353
-            switch ($numArgs) {
354
-                default:
355
-                    return false;
356
-                // A global rule error message
357
-                case 2:
358
-                    foreach ($this->post(null) as $key => $val) {
359
-                        $this->_errorPhraseOverrides[$key][func_get_arg(0)] = func_get_arg(1);
360
-                    }
361
-                    break;
362
-                // Field specific rule error message
363
-                case 3:
364
-                    $this->_errorPhraseOverrides[func_get_arg(1)][func_get_arg(0)] = func_get_arg(2);
365
-                    break;
366
-            }
367
-            return true;
368
-        }
369
-
370
-        /**
371
-         * Adds a custom error message in the errorSet array, that will
372
-         * forcibly display it.
373
-         *
374
-         * @param string $inputName The form input name or data key
375
-         * @param string $errorMessage Error to display
376
-		 *
377
-         * @return formValidation Current instance of the object
378
-         */
379
-        public function setCustomError($inputName, $errorMessage) {
380
-            $errorMessage = str_replace('%1', $this->_labels[$inputName], $errorMessage);
381
-            $this->_errors[$inputName] = $errorMessage;
382
-            return $this;
383
-        }
384
-
385
-        /**
386
-         * Allows for an accesor to any/all post values, if a value of null is passed as the key, it
387
-         * will recursively find all keys/values of the $_POST array or data array. It also automatically trims
388
-         * all values.
389
-         *
390
-         * @param string $key Key of $this->data to be found, pass null for all Key => Val pairs.
391
-         * @param boolean $trim Defaults to true, trims all $this->data values.
392
-         * @return string|array Array of post or data values if null is passed as key, string if only one key is desired.
393
-         */
394
-        public function post($key = null, $trim = true) {
395
-            $returnValue = null;
396
-            if (is_null($key)) {
397
-                $returnValue = array();
398
-                foreach ($this->getData()  as $key => $val) {
399
-                    $returnValue[$key] = $this->post($key, $trim);
400
-                }
401
-            } else {
402
-                $returnValue = (array_key_exists($key, $this->getData())) ? (($trim) ? trim($this->data[$key]) : $this->data[$key]) : null;
403
-            }
404
-            return $returnValue;
405
-        }
406
-
407
-        /**
408
-         * Gets all errors from errorSet and displays them, can be echo out from the
409
-         * function or just returned.
410
-         *
411
-         * @param boolean $limit number of error to display or return
412
-         * @param boolean $echo Whether or not the values are to be returned or displayed
413
-		 *
414
-         * @return string Errors formatted for output
415
-         */
416
-        public function displayErrors($limit = null, $echo = true) {
417
-            list($errorsStart, $errorsEnd) = $this->_allErrorsDelimiter;
418
-            list($errorStart, $errorEnd) = $this->_eachErrorDelimiter;
419
-            $errorOutput = $errorsStart;
420
-    		$i = 0;
421
-            if (!empty($this->_errors)) {
422
-                foreach ($this->_errors as $fieldName => $error) {
423
-        	    	if ($i === $limit) { 
424
-                        break; 
425
-                    }
426
-                    $errorOutput .= $errorStart;
427
-                    $errorOutput .= $error;
428
-                    $errorOutput .= $errorEnd;
429
-                    $i++;
430
-                }
431
-            }
432
-            $errorOutput .= $errorsEnd;
433
-            echo ($echo) ? $errorOutput : '';
434
-            return (! $echo) ? $errorOutput : null;
435
-        }
436
-
437
-        /**
438
-         * Returns raw array of errors in no format instead of displaying them
439
-         * formatted.
440
-         *
441
-         * @return array
442
-         */
443
-        public function returnErrors() {
444
-            return $this->_errors;
445
-        }
446
-
447
-        /**
448
-         * Breaks up a PIPE seperated string of rules, and puts them into an array.
449
-         *
450
-         * @param string $ruleString String to be parsed.
451
-		 *
452
-         * @return array Array of each value in original string.
453
-         */
454
-        protected function _parseRuleString($ruleString) {
455
-            $ruleSets = array();
456
-            /*
302
+		 */
303
+		public function setErrorsDelimiter($start, $end) {
304
+			$this->_allErrorsDelimiter[0] = $start;
305
+			$this->_allErrorsDelimiter[1] = $end;
306
+			return $this;
307
+		}
308
+
309
+		/**
310
+		 * This is the individual error delimiter, each argument occurs once before and after
311
+		 * each individual error listed.
312
+		 *
313
+		 * @param string $start Displayed before each error.
314
+		 * @param string $end Displayed after each error.
315
+		 * 
316
+		 * @return FormValidation Current instance of object.
317
+		 */
318
+		public function setErrorDelimiter($start, $end) {
319
+			$this->_eachErrorDelimiter[0] = $start;
320
+			$this->_eachErrorDelimiter[1] = $end;
321
+			return $this;
322
+		}
323
+
324
+		/**
325
+		 * Get the each errors delimiters
326
+		 *
327
+		 * @return array
328
+		 */
329
+		public function getErrorDelimiter() {
330
+			return $this->_eachErrorDelimiter;
331
+		}
332
+
333
+		/**
334
+		 * Get the all errors delimiters
335
+		 *
336
+		 * @return array
337
+		 */
338
+		public function getErrorsDelimiter() {
339
+			return $this->_allErrorsDelimiter;
340
+		}
341
+
342
+		/**
343
+		 * This sets a custom error message that can override the default error phrase provided
344
+		 * by FormValidation, it can be used in the format of setMessage('rule', 'error phrase')
345
+		 * which will globally change the error phrase of that rule, or in the format of:
346
+		 * setMessage('rule', 'fieldname', 'error phrase') - which will only change the error phrase for
347
+		 * that rule, applied on that field.
348
+		 *
349
+		 * @return boolean True on success, false on failure.
350
+		 */
351
+		public function setMessage() {
352
+			$numArgs = func_num_args();
353
+			switch ($numArgs) {
354
+				default:
355
+					return false;
356
+				// A global rule error message
357
+				case 2:
358
+					foreach ($this->post(null) as $key => $val) {
359
+						$this->_errorPhraseOverrides[$key][func_get_arg(0)] = func_get_arg(1);
360
+					}
361
+					break;
362
+				// Field specific rule error message
363
+				case 3:
364
+					$this->_errorPhraseOverrides[func_get_arg(1)][func_get_arg(0)] = func_get_arg(2);
365
+					break;
366
+			}
367
+			return true;
368
+		}
369
+
370
+		/**
371
+		 * Adds a custom error message in the errorSet array, that will
372
+		 * forcibly display it.
373
+		 *
374
+		 * @param string $inputName The form input name or data key
375
+		 * @param string $errorMessage Error to display
376
+		 *
377
+		 * @return formValidation Current instance of the object
378
+		 */
379
+		public function setCustomError($inputName, $errorMessage) {
380
+			$errorMessage = str_replace('%1', $this->_labels[$inputName], $errorMessage);
381
+			$this->_errors[$inputName] = $errorMessage;
382
+			return $this;
383
+		}
384
+
385
+		/**
386
+		 * Allows for an accesor to any/all post values, if a value of null is passed as the key, it
387
+		 * will recursively find all keys/values of the $_POST array or data array. It also automatically trims
388
+		 * all values.
389
+		 *
390
+		 * @param string $key Key of $this->data to be found, pass null for all Key => Val pairs.
391
+		 * @param boolean $trim Defaults to true, trims all $this->data values.
392
+		 * @return string|array Array of post or data values if null is passed as key, string if only one key is desired.
393
+		 */
394
+		public function post($key = null, $trim = true) {
395
+			$returnValue = null;
396
+			if (is_null($key)) {
397
+				$returnValue = array();
398
+				foreach ($this->getData()  as $key => $val) {
399
+					$returnValue[$key] = $this->post($key, $trim);
400
+				}
401
+			} else {
402
+				$returnValue = (array_key_exists($key, $this->getData())) ? (($trim) ? trim($this->data[$key]) : $this->data[$key]) : null;
403
+			}
404
+			return $returnValue;
405
+		}
406
+
407
+		/**
408
+		 * Gets all errors from errorSet and displays them, can be echo out from the
409
+		 * function or just returned.
410
+		 *
411
+		 * @param boolean $limit number of error to display or return
412
+		 * @param boolean $echo Whether or not the values are to be returned or displayed
413
+		 *
414
+		 * @return string Errors formatted for output
415
+		 */
416
+		public function displayErrors($limit = null, $echo = true) {
417
+			list($errorsStart, $errorsEnd) = $this->_allErrorsDelimiter;
418
+			list($errorStart, $errorEnd) = $this->_eachErrorDelimiter;
419
+			$errorOutput = $errorsStart;
420
+			$i = 0;
421
+			if (!empty($this->_errors)) {
422
+				foreach ($this->_errors as $fieldName => $error) {
423
+					if ($i === $limit) { 
424
+						break; 
425
+					}
426
+					$errorOutput .= $errorStart;
427
+					$errorOutput .= $error;
428
+					$errorOutput .= $errorEnd;
429
+					$i++;
430
+				}
431
+			}
432
+			$errorOutput .= $errorsEnd;
433
+			echo ($echo) ? $errorOutput : '';
434
+			return (! $echo) ? $errorOutput : null;
435
+		}
436
+
437
+		/**
438
+		 * Returns raw array of errors in no format instead of displaying them
439
+		 * formatted.
440
+		 *
441
+		 * @return array
442
+		 */
443
+		public function returnErrors() {
444
+			return $this->_errors;
445
+		}
446
+
447
+		/**
448
+		 * Breaks up a PIPE seperated string of rules, and puts them into an array.
449
+		 *
450
+		 * @param string $ruleString String to be parsed.
451
+		 *
452
+		 * @return array Array of each value in original string.
453
+		 */
454
+		protected function _parseRuleString($ruleString) {
455
+			$ruleSets = array();
456
+			/*
457 457
             //////////////// hack for regex rule that can contain "|"
458 458
             */
459
-            if(strpos($ruleString, 'regex') !== false){
460
-                $regexRule = array();
461
-                $rule = '#regex\[\/(.*)\/([a-zA-Z0-9]?)\]#';
462
-                preg_match($rule, $ruleString, $regexRule);
463
-                $ruleStringTemp = preg_replace($rule, '', $ruleString);
464
-                 if(!empty($regexRule[0])){
465
-                     $ruleSets[] = $regexRule[0];
466
-                 }
467
-                 $ruleStringRegex = explode('|', $ruleStringTemp);
468
-                foreach ($ruleStringRegex as $rule) {
469
-                    $rule = trim($rule);
470
-                    if($rule){
471
-                        $ruleSets[] = $rule;
472
-                    }
473
-                }
459
+			if(strpos($ruleString, 'regex') !== false){
460
+				$regexRule = array();
461
+				$rule = '#regex\[\/(.*)\/([a-zA-Z0-9]?)\]#';
462
+				preg_match($rule, $ruleString, $regexRule);
463
+				$ruleStringTemp = preg_replace($rule, '', $ruleString);
464
+				 if(!empty($regexRule[0])){
465
+					 $ruleSets[] = $regexRule[0];
466
+				 }
467
+				 $ruleStringRegex = explode('|', $ruleStringTemp);
468
+				foreach ($ruleStringRegex as $rule) {
469
+					$rule = trim($rule);
470
+					if($rule){
471
+						$ruleSets[] = $rule;
472
+					}
473
+				}
474 474
                  
475
-            }
476
-            /***********************************/
477
-            else{
478
-                if (strpos($ruleString, '|') !== FALSE) {
479
-                    $ruleSets = explode('|', $ruleString);
480
-                } else {
481
-                    $ruleSets[] = $ruleString;
482
-                }
483
-             }
484
-            return $ruleSets;
485
-        }
486
-
487
-        /**
488
-         * Returns whether or not a field obtains the rule "required".
489
-         *
490
-         * @param string $fieldName Field to check if required.
491
-		 *
492
-         * @return boolean Whether or not the field is required.
493
-         */
494
-        protected function _fieldIsRequired($fieldName) {
495
-            $rules = $this->_parseRuleString($this->_rules[$fieldName]);
496
-            return (in_array('required', $rules));
497
-        }
498
-
499
-        /**
500
-         * Takes a data input name, it's value, and the rule it's being validated against (ex: max_length[16])
501
-         * and adds an error to the errorSet if it fails validation of the rule.
502
-         *
503
-         * @param string $inputName Name or key of the validation data
504
-         * @param string $inputVal Value of the validation data
505
-         * @param string $ruleName Rule to be validated against, including args (exact_length[5])
506
-         * @return void
507
-         */
508
-        protected function _validateRule($inputName, $inputVal, $ruleName) {
509
-            $this->logger->debug('Rule validation of field [' .$inputName. '], value [' .$inputVal. '], rule [' .$ruleName. ']');
510
-            // Array to store args
511
-            $ruleArgs = array();
512
-
513
-            preg_match('/\[(.*)\]/', $ruleName, $ruleArgs);
514
-
515
-            // Get the rule arguments, realRule is just the base rule name
516
-            // Like min_length instead of min_length[3]
517
-            $ruleName = preg_replace('/\[(.*)\]/', '', $ruleName);
475
+			}
476
+			/***********************************/
477
+			else{
478
+				if (strpos($ruleString, '|') !== FALSE) {
479
+					$ruleSets = explode('|', $ruleString);
480
+				} else {
481
+					$ruleSets[] = $ruleString;
482
+				}
483
+			 }
484
+			return $ruleSets;
485
+		}
486
+
487
+		/**
488
+		 * Returns whether or not a field obtains the rule "required".
489
+		 *
490
+		 * @param string $fieldName Field to check if required.
491
+		 *
492
+		 * @return boolean Whether or not the field is required.
493
+		 */
494
+		protected function _fieldIsRequired($fieldName) {
495
+			$rules = $this->_parseRuleString($this->_rules[$fieldName]);
496
+			return (in_array('required', $rules));
497
+		}
498
+
499
+		/**
500
+		 * Takes a data input name, it's value, and the rule it's being validated against (ex: max_length[16])
501
+		 * and adds an error to the errorSet if it fails validation of the rule.
502
+		 *
503
+		 * @param string $inputName Name or key of the validation data
504
+		 * @param string $inputVal Value of the validation data
505
+		 * @param string $ruleName Rule to be validated against, including args (exact_length[5])
506
+		 * @return void
507
+		 */
508
+		protected function _validateRule($inputName, $inputVal, $ruleName) {
509
+			$this->logger->debug('Rule validation of field [' .$inputName. '], value [' .$inputVal. '], rule [' .$ruleName. ']');
510
+			// Array to store args
511
+			$ruleArgs = array();
512
+
513
+			preg_match('/\[(.*)\]/', $ruleName, $ruleArgs);
514
+
515
+			// Get the rule arguments, realRule is just the base rule name
516
+			// Like min_length instead of min_length[3]
517
+			$ruleName = preg_replace('/\[(.*)\]/', '', $ruleName);
518 518
             
519
-            if (method_exists($this, $this->_toCallCase($ruleName))) {
520
-                $methodToCall = $this->_toCallCase($ruleName);
521
-                call_user_func(array($this, $methodToCall), $inputName, $ruleName, $ruleArgs);
522
-            }
523
-            return;
524
-        }
525
-
526
-		/**
527
-		* Set error for the given field or key
528
-		*
529
-		* @param string $inputName the input or key name
530
-		* @param string $ruleName the rule name
531
-		* @param array|string $replacements
532
-		*/
533
-        protected function _setError($inputName, $ruleName, $replacements = array()) {
534
-            $rulePhraseKeyParts = explode(',', $ruleName);
535
-            $rulePhrase = null;
536
-            foreach ($rulePhraseKeyParts as $rulePhraseKeyPart) {
537
-                if (array_key_exists($rulePhraseKeyPart, $this->_errorsMessages)) {
538
-                    $rulePhrase = $this->_errorsMessages[$rulePhraseKeyPart];
539
-                } else {
540
-                    $rulePhrase = $rulePhrase[$rulePhraseKeyPart];
541
-                }
542
-            }
543
-            // Any overrides?
544
-            if (array_key_exists($inputName, $this->_errorPhraseOverrides) && array_key_exists($ruleName, $this->_errorPhraseOverrides[$inputName])) {
545
-                $rulePhrase = $this->_errorPhraseOverrides[$inputName][$ruleName];
546
-            }
547
-            // Type cast to array in case it's a string
548
-            $replacements = (array) $replacements;
519
+			if (method_exists($this, $this->_toCallCase($ruleName))) {
520
+				$methodToCall = $this->_toCallCase($ruleName);
521
+				call_user_func(array($this, $methodToCall), $inputName, $ruleName, $ruleArgs);
522
+			}
523
+			return;
524
+		}
525
+
526
+		/**
527
+		 * Set error for the given field or key
528
+		 *
529
+		 * @param string $inputName the input or key name
530
+		 * @param string $ruleName the rule name
531
+		 * @param array|string $replacements
532
+		 */
533
+		protected function _setError($inputName, $ruleName, $replacements = array()) {
534
+			$rulePhraseKeyParts = explode(',', $ruleName);
535
+			$rulePhrase = null;
536
+			foreach ($rulePhraseKeyParts as $rulePhraseKeyPart) {
537
+				if (array_key_exists($rulePhraseKeyPart, $this->_errorsMessages)) {
538
+					$rulePhrase = $this->_errorsMessages[$rulePhraseKeyPart];
539
+				} else {
540
+					$rulePhrase = $rulePhrase[$rulePhraseKeyPart];
541
+				}
542
+			}
543
+			// Any overrides?
544
+			if (array_key_exists($inputName, $this->_errorPhraseOverrides) && array_key_exists($ruleName, $this->_errorPhraseOverrides[$inputName])) {
545
+				$rulePhrase = $this->_errorPhraseOverrides[$inputName][$ruleName];
546
+			}
547
+			// Type cast to array in case it's a string
548
+			$replacements = (array) $replacements;
549 549
 			$replacementCount = count($replacements);
550
-            for ($i = 1; $i <= $replacementCount; $i++) {
551
-                $key = $i - 1;
552
-                $rulePhrase = str_replace('%' . $i, $replacements[$key], $rulePhrase);
553
-            }
554
-            if (! array_key_exists($inputName, $this->_errors)) {
555
-                $this->_errors[$inputName] = $rulePhrase;
556
-            }
557
-        }
558
-
559
-        /**
560
-         * Used to run a callback for the callback rule, as well as pass in a default
561
-         * argument of the post value. For example the username field having a rule:
562
-         * callback[userExists] will eval userExists(data[username]) - Note the use
563
-         * of eval over call_user_func is in case the function is not user defined.
564
-         *
565
-         * @param type $inputArg
566
-         * @param string $callbackFunc
567
-		 *
568
-         * @return mixed
569
-         */
570
-        protected function _runCallback($inputArg, $callbackFunc) {
550
+			for ($i = 1; $i <= $replacementCount; $i++) {
551
+				$key = $i - 1;
552
+				$rulePhrase = str_replace('%' . $i, $replacements[$key], $rulePhrase);
553
+			}
554
+			if (! array_key_exists($inputName, $this->_errors)) {
555
+				$this->_errors[$inputName] = $rulePhrase;
556
+			}
557
+		}
558
+
559
+		/**
560
+		 * Used to run a callback for the callback rule, as well as pass in a default
561
+		 * argument of the post value. For example the username field having a rule:
562
+		 * callback[userExists] will eval userExists(data[username]) - Note the use
563
+		 * of eval over call_user_func is in case the function is not user defined.
564
+		 *
565
+		 * @param type $inputArg
566
+		 * @param string $callbackFunc
567
+		 *
568
+		 * @return mixed
569
+		 */
570
+		protected function _runCallback($inputArg, $callbackFunc) {
571 571
 			return eval('return ' . $callbackFunc . '("' . $inputArg . '");');
572
-        }
573
-
574
-        /**
575
-         * Used for applying a rule only if the empty callback evaluates to true,
576
-         * for example required[funcName] - This runs funcName without passing any
577
-         * arguments.
578
-         *
579
-         * @param string $callbackFunc
580
-		 *
581
-         * @return mixed
582
-         */
583
-        protected function _runEmptyCallback($callbackFunc) {
584
-            return eval('return ' . $callbackFunc . '();');
585
-        }
586
-
587
-        /**
588
-         * Gets a specific label of a specific field input name.
589
-         *
590
-         * @param string $inputName
591
-		 *
592
-         * @return string
593
-         */
594
-        protected function _getLabel($inputName) {
595
-            return (array_key_exists($inputName, $this->_labels)) ? $this->_labels[$inputName] : $inputName;
596
-        }
572
+		}
573
+
574
+		/**
575
+		 * Used for applying a rule only if the empty callback evaluates to true,
576
+		 * for example required[funcName] - This runs funcName without passing any
577
+		 * arguments.
578
+		 *
579
+		 * @param string $callbackFunc
580
+		 *
581
+		 * @return mixed
582
+		 */
583
+		protected function _runEmptyCallback($callbackFunc) {
584
+			return eval('return ' . $callbackFunc . '();');
585
+		}
586
+
587
+		/**
588
+		 * Gets a specific label of a specific field input name.
589
+		 *
590
+		 * @param string $inputName
591
+		 *
592
+		 * @return string
593
+		 */
594
+		protected function _getLabel($inputName) {
595
+			return (array_key_exists($inputName, $this->_labels)) ? $this->_labels[$inputName] : $inputName;
596
+		}
597 597
 		
598
-        /**
599
-         * Peform validation for the rule "required"
600
-         * @param  string $inputName the form field or data key name used
601
-         * @param  string $ruleName  the rule name for this validation ("required")
602
-         * @param  array  $ruleArgs  the rules argument
603
-         */
598
+		/**
599
+		 * Peform validation for the rule "required"
600
+		 * @param  string $inputName the form field or data key name used
601
+		 * @param  string $ruleName  the rule name for this validation ("required")
602
+		 * @param  array  $ruleArgs  the rules argument
603
+		 */
604 604
 		protected function _validateRequired($inputName, $ruleName, array $ruleArgs) {
605
-            $inputVal = $this->post($inputName);
606
-            if(array_key_exists(1, $ruleArgs) && function_exists($ruleArgs[1])) {
607
-                $callbackReturn = $this->_runEmptyCallback($ruleArgs[1]);
608
-                if ($inputVal == '' && $callbackReturn == true) {
609
-                    $this->_setError($inputName, $ruleName, $this->_getLabel($inputName));
610
-                }
611
-            } 
605
+			$inputVal = $this->post($inputName);
606
+			if(array_key_exists(1, $ruleArgs) && function_exists($ruleArgs[1])) {
607
+				$callbackReturn = $this->_runEmptyCallback($ruleArgs[1]);
608
+				if ($inputVal == '' && $callbackReturn == true) {
609
+					$this->_setError($inputName, $ruleName, $this->_getLabel($inputName));
610
+				}
611
+			} 
612 612
 			else if($inputVal == '') {
613 613
 				$this->_setError($inputName, $ruleName, $this->_getLabel($inputName));
614
-            }
615
-        }
616
-
617
-        /**
618
-         * Perform validation for the honey pot so means for the validation to be failed
619
-         * @param  string $inputName the form field or data key name used
620
-         * @param  string $ruleName  the rule name for this validation
621
-         * @param  array  $ruleArgs  the rules argument
622
-         */
623
-        protected function _validateHoneypot($inputName, $ruleName, array $ruleArgs) {
624
-            if ($this->data[$inputName] != '') {
625
-                $this->_forceFail = true;
626
-            }
627
-        }
628
-
629
-        /**
630
-         * Peform validation for the rule "callback"
631
-         * @param  string $inputName the form field or data key name used
632
-         * @param  string $ruleName  the rule name for this validation ("callback")
633
-         * @param  array  $ruleArgs  the rules argument
634
-         */
635
-        protected function _validateCallback($inputName, $ruleName, array $ruleArgs) {
636
-            if (function_exists($ruleArgs[1]) && !empty($this->data[$inputName])) {
614
+			}
615
+		}
616
+
617
+		/**
618
+		 * Perform validation for the honey pot so means for the validation to be failed
619
+		 * @param  string $inputName the form field or data key name used
620
+		 * @param  string $ruleName  the rule name for this validation
621
+		 * @param  array  $ruleArgs  the rules argument
622
+		 */
623
+		protected function _validateHoneypot($inputName, $ruleName, array $ruleArgs) {
624
+			if ($this->data[$inputName] != '') {
625
+				$this->_forceFail = true;
626
+			}
627
+		}
628
+
629
+		/**
630
+		 * Peform validation for the rule "callback"
631
+		 * @param  string $inputName the form field or data key name used
632
+		 * @param  string $ruleName  the rule name for this validation ("callback")
633
+		 * @param  array  $ruleArgs  the rules argument
634
+		 */
635
+		protected function _validateCallback($inputName, $ruleName, array $ruleArgs) {
636
+			if (function_exists($ruleArgs[1]) && !empty($this->data[$inputName])) {
637 637
 				$result = $this->_runCallback($this->data[$inputName], $ruleArgs[1]);
638 638
 				if(! $result){
639 639
 					$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
640 640
 				}
641
-            }
642
-        }
643
-
644
-        /**
645
-         * Peform validation for the rule "depends"
646
-         * @param  string $inputName the form field or data key name used
647
-         * @param  string $ruleName  the rule name for this validation ("depends")
648
-         * @param  array  $ruleArgs  the rules argument
649
-         */
650
-        protected function _validateDepends($inputName, $ruleName, array $ruleArgs) {
651
-            if (array_key_exists($ruleArgs[1], $this->_errors)) {
652
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
653
-            }
654
-        }
655
-
656
-        /**
657
-         * Peform validation for the rule "not_equal"
658
-         * @param  string $inputName the form field or data key name used
659
-         * @param  string $ruleName  the rule name for this validation ("not_equal")
660
-         * @param  array  $ruleArgs  the rules argument
661
-         */
662
-        protected function _validateNotEqual($inputName, $ruleName, array $ruleArgs) {
663
-            $canNotEqual = explode(',', $ruleArgs[1]);
664
-            foreach ($canNotEqual as $doNotEqual) {
665
-                $inputVal = $this->post($inputName);
666
-                if (preg_match('/post:(.*)/', $doNotEqual)) {
667
-                    if ($inputVal == $this->data[str_replace('post:', '', $doNotEqual)]) {
668
-                        $this->_setError($inputName, $ruleName . ',post:key', array($this->_getLabel($inputName), $this->_getLabel(str_replace('post:', '', $doNotEqual))));
669
-                        continue;
670
-                    }
671
-                } 
641
+			}
642
+		}
643
+
644
+		/**
645
+		 * Peform validation for the rule "depends"
646
+		 * @param  string $inputName the form field or data key name used
647
+		 * @param  string $ruleName  the rule name for this validation ("depends")
648
+		 * @param  array  $ruleArgs  the rules argument
649
+		 */
650
+		protected function _validateDepends($inputName, $ruleName, array $ruleArgs) {
651
+			if (array_key_exists($ruleArgs[1], $this->_errors)) {
652
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
653
+			}
654
+		}
655
+
656
+		/**
657
+		 * Peform validation for the rule "not_equal"
658
+		 * @param  string $inputName the form field or data key name used
659
+		 * @param  string $ruleName  the rule name for this validation ("not_equal")
660
+		 * @param  array  $ruleArgs  the rules argument
661
+		 */
662
+		protected function _validateNotEqual($inputName, $ruleName, array $ruleArgs) {
663
+			$canNotEqual = explode(',', $ruleArgs[1]);
664
+			foreach ($canNotEqual as $doNotEqual) {
665
+				$inputVal = $this->post($inputName);
666
+				if (preg_match('/post:(.*)/', $doNotEqual)) {
667
+					if ($inputVal == $this->data[str_replace('post:', '', $doNotEqual)]) {
668
+						$this->_setError($inputName, $ruleName . ',post:key', array($this->_getLabel($inputName), $this->_getLabel(str_replace('post:', '', $doNotEqual))));
669
+						continue;
670
+					}
671
+				} 
672 672
 				else{
673
-                    if ($inputVal == $doNotEqual) {
674
-                        $this->_setError($inputName, $ruleName . ',string', array($this->_getLabel($inputName), $doNotEqual));
675
-                        continue;
676
-                    }
677
-                }
678
-            }
679
-        }
680
-
681
-        /**
682
-         * Peform validation for the rule "matches"
683
-         * @param  string $inputName the form field or data key name used
684
-         * @param  string $ruleName  the rule name for this validation ("matches")
685
-         * @param  array  $ruleArgs  the rules argument
686
-         */
687
-        protected function _validateMatches($inputName, $ruleName, array $ruleArgs) {
688
-            $inputVal = $this->post($inputName);
689
-            if ($inputVal != $this->data[$ruleArgs[1]]) {
690
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
691
-            }
692
-        }
693
-
694
-        /**
695
-         * Peform validation for the rule "valid_email"
696
-         * @param  string $inputName the form field or data key name used
697
-         * @param  string $ruleName  the rule name for this validation ("valid_email")
698
-         * @param  array  $ruleArgs  the rules argument
699
-         */
700
-        protected function _validateValidEmail($inputName, $ruleName, array $ruleArgs) {
701
-            $inputVal = $this->post($inputName);
702
-            if (! preg_match("/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i", $inputVal)) {
703
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
704
-                    return;
705
-                }
706
-                $this->_setError($inputName, $ruleName, $this->_getLabel($inputName));
707
-            }
708
-        }
709
-
710
-        /**
711
-         * Peform validation for the rule "exact_length"
712
-         * @param  string $inputName the form field or data key name used
713
-         * @param  string $ruleName  the rule name for this validation ("exact_length")
714
-         * @param  array  $ruleArgs  the rules argument
715
-         */
716
-        protected function _validateExactLength($inputName, $ruleName, array $ruleArgs) {
717
-            $inputVal = $this->post($inputName);
718
-            if (strlen($inputVal) != $ruleArgs[1]) { // $ruleArgs[0] is [length] $rulesArgs[1] is just length
719
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
720
-                    return;
721
-                }
722
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
723
-            }
724
-        }
725
-
726
-        /**
727
-         * Peform validation for the rule "max_length"
728
-         * @param  string $inputName the form field or data key name used
729
-         * @param  string $ruleName  the rule name for this validation ("max_length")
730
-         * @param  array  $ruleArgs  the rules argument
731
-         */
732
-        protected function _validateMaxLength($inputName, $ruleName, array $ruleArgs) {
733
-            $inputVal = $this->post($inputName);
734
-            if (strlen($inputVal) > $ruleArgs[1]) { // $ruleArgs[0] is [length] $rulesArgs[1] is just length
735
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
736
-                    return;
737
-                }
738
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
739
-            }
740
-        }
741
-
742
-        /**
743
-         * Peform validation for the rule "min_length"
744
-         * @param  string $inputName the form field or data key name used
745
-         * @param  string $ruleName  the rule name for this validation ("min_length")
746
-         * @param  array  $ruleArgs  the rules argument
747
-         */
748
-        protected function _validateMinLength($inputName, $ruleName, array $ruleArgs) {
749
-            $inputVal = $this->post($inputName);
750
-            if (strlen($inputVal) < $ruleArgs[1]) { // $ruleArgs[0] is [length] $rulesArgs[1] is just length
751
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
752
-                    return;
753
-                }
754
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
755
-            }
756
-        }
673
+					if ($inputVal == $doNotEqual) {
674
+						$this->_setError($inputName, $ruleName . ',string', array($this->_getLabel($inputName), $doNotEqual));
675
+						continue;
676
+					}
677
+				}
678
+			}
679
+		}
680
+
681
+		/**
682
+		 * Peform validation for the rule "matches"
683
+		 * @param  string $inputName the form field or data key name used
684
+		 * @param  string $ruleName  the rule name for this validation ("matches")
685
+		 * @param  array  $ruleArgs  the rules argument
686
+		 */
687
+		protected function _validateMatches($inputName, $ruleName, array $ruleArgs) {
688
+			$inputVal = $this->post($inputName);
689
+			if ($inputVal != $this->data[$ruleArgs[1]]) {
690
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
691
+			}
692
+		}
693
+
694
+		/**
695
+		 * Peform validation for the rule "valid_email"
696
+		 * @param  string $inputName the form field or data key name used
697
+		 * @param  string $ruleName  the rule name for this validation ("valid_email")
698
+		 * @param  array  $ruleArgs  the rules argument
699
+		 */
700
+		protected function _validateValidEmail($inputName, $ruleName, array $ruleArgs) {
701
+			$inputVal = $this->post($inputName);
702
+			if (! preg_match("/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i", $inputVal)) {
703
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
704
+					return;
705
+				}
706
+				$this->_setError($inputName, $ruleName, $this->_getLabel($inputName));
707
+			}
708
+		}
709
+
710
+		/**
711
+		 * Peform validation for the rule "exact_length"
712
+		 * @param  string $inputName the form field or data key name used
713
+		 * @param  string $ruleName  the rule name for this validation ("exact_length")
714
+		 * @param  array  $ruleArgs  the rules argument
715
+		 */
716
+		protected function _validateExactLength($inputName, $ruleName, array $ruleArgs) {
717
+			$inputVal = $this->post($inputName);
718
+			if (strlen($inputVal) != $ruleArgs[1]) { // $ruleArgs[0] is [length] $rulesArgs[1] is just length
719
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
720
+					return;
721
+				}
722
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
723
+			}
724
+		}
725
+
726
+		/**
727
+		 * Peform validation for the rule "max_length"
728
+		 * @param  string $inputName the form field or data key name used
729
+		 * @param  string $ruleName  the rule name for this validation ("max_length")
730
+		 * @param  array  $ruleArgs  the rules argument
731
+		 */
732
+		protected function _validateMaxLength($inputName, $ruleName, array $ruleArgs) {
733
+			$inputVal = $this->post($inputName);
734
+			if (strlen($inputVal) > $ruleArgs[1]) { // $ruleArgs[0] is [length] $rulesArgs[1] is just length
735
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
736
+					return;
737
+				}
738
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
739
+			}
740
+		}
741
+
742
+		/**
743
+		 * Peform validation for the rule "min_length"
744
+		 * @param  string $inputName the form field or data key name used
745
+		 * @param  string $ruleName  the rule name for this validation ("min_length")
746
+		 * @param  array  $ruleArgs  the rules argument
747
+		 */
748
+		protected function _validateMinLength($inputName, $ruleName, array $ruleArgs) {
749
+			$inputVal = $this->post($inputName);
750
+			if (strlen($inputVal) < $ruleArgs[1]) { // $ruleArgs[0] is [length] $rulesArgs[1] is just length
751
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
752
+					return;
753
+				}
754
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
755
+			}
756
+		}
757 757
     	
758
-        /**
759
-         * Peform validation for the rule "less_than"
760
-         * @param  string $inputName the form field or data key name used
761
-         * @param  string $ruleName  the rule name for this validation ("less_than")
762
-         * @param  array  $ruleArgs  the rules argument
763
-         */
764
-    	protected function _validateLessThan($inputName, $ruleName, array $ruleArgs) {
765
-            $inputVal = $this->post($inputName);
766
-            if ($inputVal >= $ruleArgs[1]) { 
767
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
768
-                    return;
769
-                }
770
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
771
-            }
772
-        }
758
+		/**
759
+		 * Peform validation for the rule "less_than"
760
+		 * @param  string $inputName the form field or data key name used
761
+		 * @param  string $ruleName  the rule name for this validation ("less_than")
762
+		 * @param  array  $ruleArgs  the rules argument
763
+		 */
764
+		protected function _validateLessThan($inputName, $ruleName, array $ruleArgs) {
765
+			$inputVal = $this->post($inputName);
766
+			if ($inputVal >= $ruleArgs[1]) { 
767
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
768
+					return;
769
+				}
770
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
771
+			}
772
+		}
773 773
     	
774
-        /**
775
-         * Peform validation for the rule "greater_than"
776
-         * @param  string $inputName the form field or data key name used
777
-         * @param  string $ruleName  the rule name for this validation ("greater_than")
778
-         * @param  array  $ruleArgs  the rules argument
779
-         */
780
-    	protected function _validateGreaterThan($inputName, $ruleName, array $ruleArgs) {
781
-            $inputVal = $this->post($inputName);
782
-            if ($inputVal <= $ruleArgs[1]) {
783
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
784
-                    return;
785
-                }
786
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
787
-            }
788
-        }
774
+		/**
775
+		 * Peform validation for the rule "greater_than"
776
+		 * @param  string $inputName the form field or data key name used
777
+		 * @param  string $ruleName  the rule name for this validation ("greater_than")
778
+		 * @param  array  $ruleArgs  the rules argument
779
+		 */
780
+		protected function _validateGreaterThan($inputName, $ruleName, array $ruleArgs) {
781
+			$inputVal = $this->post($inputName);
782
+			if ($inputVal <= $ruleArgs[1]) {
783
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
784
+					return;
785
+				}
786
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
787
+			}
788
+		}
789 789
     	
790
-        /**
791
-         * Peform validation for the rule "numeric"
792
-         * @param  string $inputName the form field or data key name used
793
-         * @param  string $ruleName  the rule name for this validation ("numeric")
794
-         * @param  array  $ruleArgs  the rules argument
795
-         */
796
-    	protected function _validateNumeric($inputName, $ruleName, array $ruleArgs) {
797
-            $inputVal = $this->post($inputName);
798
-            if (! is_numeric($inputVal)) {
799
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
800
-                    return;
801
-                }
802
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
803
-            }
804
-        }
790
+		/**
791
+		 * Peform validation for the rule "numeric"
792
+		 * @param  string $inputName the form field or data key name used
793
+		 * @param  string $ruleName  the rule name for this validation ("numeric")
794
+		 * @param  array  $ruleArgs  the rules argument
795
+		 */
796
+		protected function _validateNumeric($inputName, $ruleName, array $ruleArgs) {
797
+			$inputVal = $this->post($inputName);
798
+			if (! is_numeric($inputVal)) {
799
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
800
+					return;
801
+				}
802
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
803
+			}
804
+		}
805 805
 		
806
-        /**
807
-         * Peform validation for the rule "exists"
808
-         * @param  string $inputName the form field or data key name used
809
-         * @param  string $ruleName  the rule name for this validation ("exists")
810
-         * @param  array  $ruleArgs  the rules argument
811
-         */
806
+		/**
807
+		 * Peform validation for the rule "exists"
808
+		 * @param  string $inputName the form field or data key name used
809
+		 * @param  string $ruleName  the rule name for this validation ("exists")
810
+		 * @param  array  $ruleArgs  the rules argument
811
+		 */
812 812
 		protected function _validateExists($inputName, $ruleName, array $ruleArgs) {
813
-            $inputVal = $this->post($inputName);
814
-    		$obj = & get_instance();
815
-    		if(! isset($obj->database)){
816
-    			return;
817
-    		}
818
-    		list($table, $column) = explode('.', $ruleArgs[1]);
819
-    		$obj->database->from($table)
820
-    			          ->where($column, $inputVal)
821
-    			          ->get();
822
-    		$nb = $obj->database->numRows();
823
-            if ($nb == 0) {
824
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
825
-                    return;
826
-                }
827
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
828
-            }
829
-        }
830
-
831
-        /**
832
-         * Peform validation for the rule "is_unique"
833
-         * @param  string $inputName the form field or data key name used
834
-         * @param  string $ruleName  the rule name for this validation ("is_unique")
835
-         * @param  array  $ruleArgs  the rules argument
836
-         */
837
-    	protected function _validateIsUnique($inputName, $ruleName, array $ruleArgs) {
838
-            $inputVal = $this->post($inputName);
839
-    		$obj = & get_instance();
840
-    		if(! isset($obj->database)){
841
-    			return;
842
-    		}
843
-    		list($table, $column) = explode('.', $ruleArgs[1]);
844
-    		$obj->database->from($table)
845
-    			          ->where($column, $inputVal)
846
-    			          ->get();
847
-    		$nb = $obj->database->numRows();
848
-            if ($nb != 0) {
849
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
850
-                    return;
851
-                }
852
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
853
-            }
854
-        }
813
+			$inputVal = $this->post($inputName);
814
+			$obj = & get_instance();
815
+			if(! isset($obj->database)){
816
+				return;
817
+			}
818
+			list($table, $column) = explode('.', $ruleArgs[1]);
819
+			$obj->database->from($table)
820
+						  ->where($column, $inputVal)
821
+						  ->get();
822
+			$nb = $obj->database->numRows();
823
+			if ($nb == 0) {
824
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
825
+					return;
826
+				}
827
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
828
+			}
829
+		}
830
+
831
+		/**
832
+		 * Peform validation for the rule "is_unique"
833
+		 * @param  string $inputName the form field or data key name used
834
+		 * @param  string $ruleName  the rule name for this validation ("is_unique")
835
+		 * @param  array  $ruleArgs  the rules argument
836
+		 */
837
+		protected function _validateIsUnique($inputName, $ruleName, array $ruleArgs) {
838
+			$inputVal = $this->post($inputName);
839
+			$obj = & get_instance();
840
+			if(! isset($obj->database)){
841
+				return;
842
+			}
843
+			list($table, $column) = explode('.', $ruleArgs[1]);
844
+			$obj->database->from($table)
845
+						  ->where($column, $inputVal)
846
+						  ->get();
847
+			$nb = $obj->database->numRows();
848
+			if ($nb != 0) {
849
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
850
+					return;
851
+				}
852
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
853
+			}
854
+		}
855 855
     	
856
-        /**
857
-         * Peform validation for the rule "is_unique_update"
858
-         * @param  string $inputName the form field or data key name used
859
-         * @param  string $ruleName  the rule name for this validation ("is_unique_update")
860
-         * @param  array  $ruleArgs  the rules argument
861
-         */
862
-    	protected function _validateIsUniqueUpdate($inputName, $ruleName, array $ruleArgs) {
863
-            $inputVal = $this->post($inputName);
864
-    		$obj = & get_instance();
865
-    		if(! isset($obj->database)){
866
-    			return;
867
-    		}
868
-    		$data = explode(',', $ruleArgs[1]);
869
-    		if(count($data) < 2){
870
-    			return;
871
-    		}
872
-    		list($table, $column) = explode('.', $data[0]);
873
-    		list($field, $val) = explode('=', $data[1]);
874
-    		$obj->database->from($table)
875
-    			          ->where($column, $inputVal)
876
-                		  ->where($field, '!=', trim($val))
877
-                		  ->get();
878
-    		$nb = $obj->database->numRows();
879
-            if ($nb != 0) {
880
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
881
-                    return;
882
-                }
883
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
884
-            }
885
-        }
886
-
887
-        /**
888
-         * Peform validation for the rule "in_list"
889
-         * @param  string $inputName the form field or data key name used
890
-         * @param  string $ruleName  the rule name for this validation ("in_list")
891
-         * @param  array  $ruleArgs  the rules argument
892
-         */
893
-        protected function _validateInList($inputName, $ruleName, array $ruleArgs) {
894
-            $inputVal = $this->post($inputName);
895
-    		$list = explode(',', $ruleArgs[1]);
896
-            $list = array_map('trim', $list);
897
-            if (! in_array($inputVal, $list)) {
898
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
899
-                    return;
900
-                }
901
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
902
-            }
903
-        }
904
-
905
-        /**
906
-         * Peform validation for the rule "regex"
907
-         * @param  string $inputName the form field or data key name used
908
-         * @param  string $ruleName  the rule name for this validation ("regex")
909
-         * @param  array  $ruleArgs  the rules argument
910
-         */
911
-        protected function _validateRegex($inputName, $ruleName, array $ruleArgs) {
912
-            $inputVal = $this->post($inputName);
913
-    		$regex = $ruleArgs[1];
914
-            if (! preg_match($regex, $inputVal)) {
915
-                if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
916
-                    return;
917
-                }
918
-                $this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
919
-            }
920
-        }
856
+		/**
857
+		 * Peform validation for the rule "is_unique_update"
858
+		 * @param  string $inputName the form field or data key name used
859
+		 * @param  string $ruleName  the rule name for this validation ("is_unique_update")
860
+		 * @param  array  $ruleArgs  the rules argument
861
+		 */
862
+		protected function _validateIsUniqueUpdate($inputName, $ruleName, array $ruleArgs) {
863
+			$inputVal = $this->post($inputName);
864
+			$obj = & get_instance();
865
+			if(! isset($obj->database)){
866
+				return;
867
+			}
868
+			$data = explode(',', $ruleArgs[1]);
869
+			if(count($data) < 2){
870
+				return;
871
+			}
872
+			list($table, $column) = explode('.', $data[0]);
873
+			list($field, $val) = explode('=', $data[1]);
874
+			$obj->database->from($table)
875
+						  ->where($column, $inputVal)
876
+						  ->where($field, '!=', trim($val))
877
+						  ->get();
878
+			$nb = $obj->database->numRows();
879
+			if ($nb != 0) {
880
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
881
+					return;
882
+				}
883
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
884
+			}
885
+		}
886
+
887
+		/**
888
+		 * Peform validation for the rule "in_list"
889
+		 * @param  string $inputName the form field or data key name used
890
+		 * @param  string $ruleName  the rule name for this validation ("in_list")
891
+		 * @param  array  $ruleArgs  the rules argument
892
+		 */
893
+		protected function _validateInList($inputName, $ruleName, array $ruleArgs) {
894
+			$inputVal = $this->post($inputName);
895
+			$list = explode(',', $ruleArgs[1]);
896
+			$list = array_map('trim', $list);
897
+			if (! in_array($inputVal, $list)) {
898
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
899
+					return;
900
+				}
901
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName), $this->_getLabel($ruleArgs[1])));
902
+			}
903
+		}
904
+
905
+		/**
906
+		 * Peform validation for the rule "regex"
907
+		 * @param  string $inputName the form field or data key name used
908
+		 * @param  string $ruleName  the rule name for this validation ("regex")
909
+		 * @param  array  $ruleArgs  the rules argument
910
+		 */
911
+		protected function _validateRegex($inputName, $ruleName, array $ruleArgs) {
912
+			$inputVal = $this->post($inputName);
913
+			$regex = $ruleArgs[1];
914
+			if (! preg_match($regex, $inputVal)) {
915
+				if (! $this->_fieldIsRequired($inputName) && empty($this->data[$inputName])) {
916
+					return;
917
+				}
918
+				$this->_setError($inputName, $ruleName, array($this->_getLabel($inputName)));
919
+			}
920
+		}
921 921
         
922
-    }
922
+	}
Please login to merge, or discard this patch.
core/libraries/Upload.php 1 patch
Indentation   +801 added lines, -801 removed lines patch added patch discarded remove patch
@@ -1,807 +1,807 @@
 block discarded – undo
1 1
 <?php
2
-    defined('ROOT_PATH') or exit('Access denied');
3
-    /**
4
-     * TNH Framework
5
-     *
6
-     * A simple PHP framework using HMVC architecture
7
-     *
8
-     * This content is released under the GNU GPL License (GPL)
9
-     *
10
-     * Copyright (C) 2017 Tony NGUEREZA
11
-     *
12
-     * This program is free software; you can redistribute it and/or
13
-     * modify it under the terms of the GNU General Public License
14
-     * as published by the Free Software Foundation; either version 3
15
-     * of the License, or (at your option) any later version.
16
-     *
17
-     * This program is distributed in the hope that it will be useful,
18
-     * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
-     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
-     * GNU General Public License for more details.
21
-     *
22
-     * You should have received a copy of the GNU General Public License
23
-     * along with this program; if not, write to the Free Software
24
-     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25
-    */
26
-
27
-
28
-
29
-    /**
30
-    *    Upload
31
-    *
32
-    *    A complete class to upload files with php 5 or higher, but the best: very simple to use.
33
-    *
34
-    *    @author Olaf Erlandsen <[email protected]>
35
-    *    @author http://www.webdevfreelance.com/
36
-    *
37
-    *    @package FileUpload
38
-    *    @version 1.5
39
-    */
40
-    class Upload{
41
-
42
-        /**
43
-        *   Version
44
-        *
45
-        *   @since      1.5
46
-        *   @version    1.0
47
-        */
48
-        const VERSION = '1.5';
49
-
50
-        /**
51
-        *    Upload function name
52
-        *    Remember:
53
-        *        Default function: move_uploaded_file
54
-        *        Native options:
55
-        *            - move_uploaded_file (Default and best option)
56
-        *            - copy
57
-        *
58
-        *    @since        1.0
59
-        *    @version    1.0
60
-        *    @var        string
61
-        */
62
-        private $upload_function = 'move_uploaded_file';
63
-
64
-        /**
65
-        *    Array with the information obtained from the
66
-        *    variable $_FILES or $HTTP_POST_FILES.
67
-        *
68
-        *    @since        1.0
69
-        *    @version    1.0
70
-        *    @var        array
71
-        */
72
-        private $file_array    = array();
73
-
74
-        /**
75
-        *    If the file you are trying to upload already exists it will
76
-        *    be overwritten if you set the variable to true.
77
-        *
78
-        *    @since        1.0
79
-        *    @version    1.0
80
-        *    @var        boolean
81
-        */
82
-        private $overwrite_file = false;
83
-
84
-        /**
85
-        *    Input element
86
-        *    Example:
87
-        *        <input type="file" name="file" />
88
-        *    Result:
89
-        *        FileUpload::$input = file
90
-        *
91
-        *    @since        1.0
92
-        *    @version    1.0
93
-        *    @var        string
94
-        */
95
-        private $input;
96
-
97
-        /**
98
-        *    Path output
99
-        *
100
-        *    @since        1.0
101
-        *    @version    1.0
102
-        *    @var        string
103
-        */
104
-        private $destination_directory;
105
-
106
-        /**
107
-        *    Output filename
108
-        *
109
-        *    @since        1.0
110
-        *    @version    1.0
111
-        *    @var        string
112
-        */
113
-        private $filename;
114
-
115
-        /**
116
-        *    Max file size
117
-        *
118
-        *    @since        1.0
119
-        *    @version    1.0
120
-        *    @var        float
121
-        */
122
-        private $max_file_size= 0.0;
123
-
124
-        /**
125
-        *    List of allowed mime types
126
-        *
127
-        *    @since        1.0
128
-        *    @version    1.0
129
-        *    @var        array
130
-        */
131
-        private $allowed_mime_types = array();
132
-
133
-        /**
134
-        *    Callbacks
135
-        *
136
-        *    @since        1.0
137
-        *    @version    1.0
138
-        *    @var        array
139
-        */
140
-        private $callbacks = array('before' => null, 'after' => null);
141
-
142
-        /**
143
-        *    File object
144
-        *
145
-        *    @since        1.0
146
-        *    @version    1.0
147
-        *    @var        object
148
-        */
149
-        private $file;
150
-
151
-        /**
152
-        *    Helping mime types
153
-        *
154
-        *    @since        1.0
155
-        *    @version    1.0
156
-        *    @var        array
157
-        */
158
-        private $mime_helping = array(
159
-            'text'      =>    array('text/plain',),
160
-            'image'     =>    array(
161
-                'image/jpeg',
162
-                'image/jpg',
163
-                'image/pjpeg',
164
-                'image/png',
165
-                'image/gif',
166
-            ),
167
-            'document'  =>    array(
168
-                'application/pdf',
169
-                'application/msword',
170
-                'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
171
-                'application/vnd.openxmlformats-officedocument.presentationml.presentation',
172
-                'application/vnd.ms-powerpoint',
173
-                'application/vnd.ms-excel',
174
-                'application/vnd.oasis.opendocument.spreadsheet',
175
-                'application/vnd.oasis.opendocument.presentation',
176
-            ),
177
-            'video'    =>    array(
178
-                'video/3gpp',
179
-                'video/3gpp',
180
-                'video/x-msvideo',
181
-                'video/avi',
182
-                'video/mpeg4',
183
-                'video/mp4',
184
-                'video/mpeg',
185
-                'video/mpg',
186
-                'video/quicktime',
187
-                'video/x-sgi-movie',
188
-                'video/x-ms-wmv',
189
-                'video/x-flv',
190
-            ),
191
-        );
192
-
193
-        /**
194
-         * The upload error message
195
-         * @var array
196
-         */
197
-        public $error_messages = array();
198
-
199
-        /**
200
-         * The upload error message
201
-         * @var string
202
-         */
203
-        protected $error = null;
204
-
205
-        /**
206
-         * The logger instance
207
-         * @var Log
208
-         */
209
-        private $logger;
210
-
211
-
212
-        /**
213
-        *    Construct
214
-        *
215
-        *    @since     0.1
216
-        *    @version   1.0.1
217
-        *    @return    object
218
-        *    @method    object    __construct
219
-        */
220
-        public function __construct(){
221
-            $this->logger =& class_loader('Log', 'classes');
222
-            $this->logger->setLogger('Library::Upload');
223
-
224
-            Loader::lang('file_upload');
225
-            $obj =& get_instance();
226
-
227
-            $this->error_messages = array(
228
-                'upload_err_ini_size' => $obj->lang->get('fu_upload_err_ini_size'),
229
-                'upload_err_form_size' => $obj->lang->get('fu_upload_err_form_size'),
230
-                'upload_err_partial' => $obj->lang->get('fu_upload_err_partial'),
231
-                'upload_err_no_file' => $obj->lang->get('fu_upload_err_no_file'),
232
-                'upload_err_no_tmp_dir' => $obj->lang->get('fu_upload_err_no_tmp_dir'),
233
-                'upload_err_cant_write' => $obj->lang->get('fu_upload_err_cant_write'),
234
-                'upload_err_extension' => $obj->lang->get('fu_upload_err_extension'),
235
-                'accept_file_types' => $obj->lang->get('fu_accept_file_types'),
236
-                'file_uploads' => $obj->lang->get('fu_file_uploads_disabled'),
237
-                'max_file_size' => $obj->lang->get('fu_max_file_size'),
238
-                'overwritten_not_allowed' => $obj->lang->get('fu_overwritten_not_allowed'),
239
-            );
240
-
241
-            $this->file = array(
242
-                'status'                =>    false,    // True: success upload
243
-                'mime'                  =>    '',       // Empty string
244
-                'filename'              =>    '',       // Empty string
245
-                'original'              =>    '',       // Empty string
246
-                'size'                  =>    0,        // 0 Bytes
247
-                'sizeFormated'          =>    '0B',     // 0 Bytes
248
-                'destination'           =>    './',     // Default: ./
249
-                'allowed_mime_types'    =>    array(),  // Allowed mime types
250
-                'error'                 =>    null,        // File error
251
-            );
252
-
253
-            // Change dir to current dir
254
-            $this->destination_directory = dirname(__FILE__) . DIRECTORY_SEPARATOR;
255
-
256
-            // Set file array
257
-            if (isset($_FILES) && is_array($_FILES)) {
258
-                $this->file_array = $_FILES;
259
-            }
260
-            $this->logger->info('The upload file information are : ' .stringfy_vars($this->file_array));
261
-        }
262
-        /**
263
-        *    Set input.
264
-        *    If you have $_FILES["file"], you must use the key "file"
265
-        *    Example:
266
-        *        $object->setInput("file");
267
-        *
268
-        *    @since     1.0
269
-        *    @version   1.0
270
-        *    @param     string      $input
271
-        *    @return    object
272
-        *    @method    boolean     setInput
273
-        */
274
-        public function setInput($input)
275
-        {
276
-            if (!empty($input) && (is_string($input) || is_numeric($input) )) {
277
-                $this->input = $input;
278
-            }
279
-            return $this;
280
-        }
281
-        /**
282
-        *    Set new filename
283
-        *    Example:
284
-        *        FileUpload::setFilename("new file.txt")
285
-        *    Remember:
286
-        *        Use %s to retrive file extension
287
-        *
288
-        *    @since     1.0
289
-        *    @version   1.0
290
-        *    @param     string      $filename
291
-        *    @return    object
292
-        *    @method    boolean     setFilename
293
-        */
294
-        public function setFilename($filename)
295
-        {
296
-            if ($this->isFilename($filename)) {
297
-                $this->filename = $filename;
298
-            }
299
-            return $this;
300
-        }
301
-        /**
302
-        *    Set automatic filename
303
-        *
304
-        *    @since     1.0
305
-        *    @version   1.5
306
-        *    @param     string      $extension
307
-        *    @return    object
308
-        *    @method    boolean     setAutoFilename
309
-        */
310
-        public function setAutoFilename()
311
-        {
312
-            $this->filename = sha1(mt_rand(1, 9999).uniqid());
313
-            $this->filename .= time();
314
-            return $this;
315
-        }
316
-        /**
317
-        *    Set file size limit
318
-        *
319
-        *    @since     1.0
320
-        *    @version   1.0
321
-        *    @param     double     $file_size
322
-        *    @return    object
323
-        *    @method    boolean     setMaxFileSize
324
-        */
325
-        public function setMaxFileSize($file_size)
326
-        {
327
-            $file_size = $this->sizeInBytes($file_size);
328
-            if (is_numeric($file_size) && $file_size > -1) {
329
-                // Get php config
330
-                $php_size = $this->sizeInBytes((int) ini_get('upload_max_filesize'));
331
-                // Calculate difference
332
-                if ($php_size < $file_size) {
333
-                    $this->logger->warning('The upload max file size you set [' .$file_size. '] is greather than the PHP configuration for upload max file size [' .$php_size. ']');
334
-                }
335
-                $this->max_file_size = $file_size;
336
-            }
337
-            return $this;
338
-        }
339
-        /**
340
-        *    Set array mime types
341
-        *
342
-        *    @since     1.0
343
-        *    @version   1.0
344
-        *    @param     array       $mimes
345
-        *    @return    object
346
-        *    @method    boolean     setAllowedMimeTypes
347
-        */
348
-        public function setAllowedMimeTypes(array $mimes)
349
-        {
350
-            if (count($mimes) > 0) {
351
-                array_map(array($this , 'setAllowMimeType'), $mimes);
352
-            }
353
-            return $this;
354
-        }
355
-        /**
356
-        *    Set input callback
357
-        *
358
-        *    @since     1.0
359
-        *    @version   1.0
360
-        *    @param     mixed       $callback
361
-        *    @return    object
362
-        *    @method    boolean     setCallbackInput
363
-        */
364
-        public function setCallbackInput($callback)
365
-        {
366
-            if (is_callable($callback, false)) {
367
-                $this->callbacks['input'] = $callback;
368
-            }
369
-            return $this;
370
-        }
371
-        /**
372
-        *    Set output callback
373
-        *
374
-        *    @since     1.0
375
-        *    @version   1.0
376
-        *    @param     mixed       $callback
377
-        *    @return    object
378
-        *    @method    boolean     setCallbackOutput
379
-        */
380
-        public function setCallbackOutput($callback)
381
-        {
382
-            if (is_callable($callback, false)) {
383
-                $this->callbacks['output'] = $callback;
384
-            }
385
-            return $this;
386
-        }
387
-        /**
388
-        *    Append a mime type to allowed mime types
389
-        *
390
-        *    @since     1.0
391
-        *    @version   1.0.1
392
-        *    @param     string      $mime
393
-        *    @return    object
394
-        *    @method    boolean     setAllowMimeType
395
-        */
396
-        public function setAllowMimeType($mime)
397
-        {
398
-            if (!empty($mime) && is_string($mime)) {
399
-                $this->allowed_mime_types[] = strtolower($mime);
400
-                $this->file['allowed_mime_types'][] = strtolower($mime);
401
-            } 
402
-            return $this;
403
-        }
404
-        /**
405
-        *    Set allowed mime types from mime helping
406
-        *
407
-        *    @since     1.0.1
408
-        *    @version   1.0.1
409
-        *    @return    object
410
-        *    @method    boolean    setMimeHelping
411
-        */
412
-        public function setMimeHelping($name)
413
-        {
414
-            if (!empty($name) && is_string($name)) {
415
-                if (array_key_exists($name, $this->mime_helping)) {
416
-                    return $this->setAllowedMimeTypes($this->mime_helping[ $name ]);
417
-                }
418
-            }
419
-            return $this;
420
-        }
421
-        /**
422
-        *    Set function to upload file
423
-        *    Examples:
424
-        *        1.- FileUpload::setUploadFunction("move_uploaded_file");
425
-        *        2.- FileUpload::setUploadFunction("copy");
426
-        *
427
-        *    @since     1.0
428
-        *    @version   1.0
429
-        *    @param     string      $function
430
-        *    @return    object
431
-        *    @method    boolean     setUploadFunction
432
-        */
433
-        public function setUploadFunction($function)
434
-        {
435
-            if (!empty($function) && (is_array($function) || is_string($function) )) {
436
-                if (is_callable( $function)) {
437
-                    $this->upload_function = $function;
438
-                }
439
-            }
440
-            return $this;
441
-        }
442
-        /**
443
-        *    Clear allowed mime types cache
444
-        *
445
-        *    @since     1.0
446
-        *    @version   1.0
447
-        *    @return    object
448
-        *    @method    boolean    clearAllowedMimeTypes
449
-        */
450
-        public function clearAllowedMimeTypes()
451
-        {
452
-            $this->allowed_mime_types = array();
453
-            $this->file['allowed_mime_types'] = array();
454
-            return $this;
455
-        }
456
-        /**
457
-        *    Set destination output
458
-        *
459
-        *    @since     1.0
460
-        *    @version   1.0
461
-        *    @param     string      $destination_directory      Destination path
462
-        *    @param     boolean     $create_if_not_exist
463
-        *    @return    object
464
-        *    @method    boolean     setDestinationDirectory
465
-        */
466
-        public function setDestinationDirectory($destination_directory, $create_if_not_exist = false) {
467
-            $destination_directory = realpath($destination_directory);
468
-            if (substr($destination_directory, -1) != DIRECTORY_SEPARATOR) {
469
-                $destination_directory .= DIRECTORY_SEPARATOR;
470
-            }
471
-
472
-            if ($this->isDirpath($destination_directory)) {
473
-                if ($this->dirExists($destination_directory)) {
474
-                    $this->destination_directory = $destination_directory;
475
-                    chdir($destination_directory);
476
-                } else if ($create_if_not_exist === true) {
477
-                    if (mkdir($destination_directory, 0775, true)) {
478
-                        $this->destination_directory = $destination_directory;
479
-                        chdir($destination_directory);
480
-                    }
481
-                    else{
482
-                        $this->logger->warning('Can not create the upload directory [' .$destination_directory. ']');
483
-                    }
484
-                }
485
-            }
486
-            return $this;
487
-        }
488
-        /**
489
-        *    Check file exists
490
-        *
491
-        *    @since      1.0
492
-        *    @version    1.0.1
493
-        *    @param      string     $file_destination
494
-        *    @return     boolean
495
-        *    @method     boolean    fileExists
496
-        */
497
-        public function fileExists($file_destination)
498
-        {
499
-            if ($this->isFilename($file_destination)) {
500
-                return (file_exists($file_destination) && is_file($file_destination));
501
-            }
502
-            return false;
503
-        }
504
-        /**
505
-        *    Check dir exists
506
-        *
507
-        *    @since        1.0
508
-        *    @version    1.0.1
509
-        *    @param      string     $path
510
-        *    @return     boolean
511
-        *    @method     boolean    dirExists
512
-        */
513
-        public function dirExists($path)
514
-        {
515
-            if ($this->isDirpath($path)) {
516
-                return (file_exists($path) && is_dir($path));
517
-            }
518
-            return false;
519
-        }
520
-        /**
521
-        *    Check valid filename
522
-        *
523
-        *    @since     1.0
524
-        *    @version   1.0.1
525
-        *    @param     string      $filename
526
-        *    @return    boolean
527
-        *    @method    boolean     isFilename
528
-        */
529
-        public function isFilename($filename)
530
-        {
531
-            $filename = basename($filename);
532
-            return (!empty($filename) && (is_string( $filename) || is_numeric($filename)));
533
-        }
534
-        /**
535
-        *    Validate mime type with allowed mime types,
536
-        *    but if allowed mime types is empty, this method return true
537
-        *
538
-        *    @since     1.0
539
-        *    @version   1.0
540
-        *    @param     string      $mime
541
-        *    @return    boolean
542
-        *    @method    boolean     checkMimeType
543
-        */
544
-        public function checkMimeType($mime)
545
-        {
546
-            if (count($this->allowed_mime_types) == 0) {
547
-                return true;
548
-            }
549
-            return in_array(strtolower($mime), $this->allowed_mime_types);
550
-        }
551
-        /**
552
-        *    Retrive status of upload
553
-        *
554
-        *    @since     1.0
555
-        *    @version   1.0
556
-        *    @return    boolean
557
-        *    @method    boolean    getStatus
558
-        */
559
-        public function getStatus()
560
-        {
561
-            return $this->file['status'];
562
-        }
563
-        /**
564
-        *    Check valid path
565
-        *
566
-        *    @since        1.0
567
-        *    @version    1.0.1
568
-        *    @param        string    $filename
569
-        *    @return     boolean
570
-        *    @method     boolean    isDirpath
571
-        */
572
-        public function isDirpath($path)
573
-        {
574
-            if (!empty( $path) && (is_string( $path) || is_numeric($path) )) {
575
-                if (DIRECTORY_SEPARATOR == '/') {
576
-                    return (preg_match( '/^[^*?"<>|:]*$/' , $path) == 1 );
577
-                } else {
578
-                    return (preg_match( "/^[^*?\"<>|:]*$/" , substr($path,2) ) == 1);
579
-                }
580
-            }
581
-            return false;
582
-        }
583
-        /**
584
-        *    Allow overwriting files
585
-        *
586
-        *    @since      1.0
587
-        *    @version    1.0
588
-        *    @return     object
589
-        *    @method     boolean    allowOverwriting
590
-        */
591
-        public function allowOverwriting()
592
-        {
593
-            $this->overwrite_file = true;
594
-            return $this;
595
-        }
596
-        /**
597
-        *    File info
598
-        *
599
-        *    @since      1.0
600
-        *    @version    1.0
601
-        *    @return     object
602
-        *    @method     object    getInfo
603
-        */
604
-        public function getInfo()
605
-        {
606
-            return (object)$this->file;
607
-        }
608
-
609
-
610
-        /**
611
-         * Check if the file is uploaded
612
-         * @return boolean
613
-         */
614
-        public function isUploaded(){
615
-            return isset($this->file_array[$this->input])
616
-            && is_uploaded_file($this->file_array[$this->input]['tmp_name']);
617
-        }
2
+	defined('ROOT_PATH') or exit('Access denied');
3
+	/**
4
+	 * TNH Framework
5
+	 *
6
+	 * A simple PHP framework using HMVC architecture
7
+	 *
8
+	 * This content is released under the GNU GPL License (GPL)
9
+	 *
10
+	 * Copyright (C) 2017 Tony NGUEREZA
11
+	 *
12
+	 * This program is free software; you can redistribute it and/or
13
+	 * modify it under the terms of the GNU General Public License
14
+	 * as published by the Free Software Foundation; either version 3
15
+	 * of the License, or (at your option) any later version.
16
+	 *
17
+	 * This program is distributed in the hope that it will be useful,
18
+	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
+	 * GNU General Public License for more details.
21
+	 *
22
+	 * You should have received a copy of the GNU General Public License
23
+	 * along with this program; if not, write to the Free Software
24
+	 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25
+	 */
26
+
27
+
28
+
29
+	/**
30
+	 *    Upload
31
+	 *
32
+	 *    A complete class to upload files with php 5 or higher, but the best: very simple to use.
33
+	 *
34
+	 *    @author Olaf Erlandsen <[email protected]>
35
+	 *    @author http://www.webdevfreelance.com/
36
+	 *
37
+	 *    @package FileUpload
38
+	 *    @version 1.5
39
+	 */
40
+	class Upload{
41
+
42
+		/**
43
+		 *   Version
44
+		 *
45
+		 *   @since      1.5
46
+		 *   @version    1.0
47
+		 */
48
+		const VERSION = '1.5';
49
+
50
+		/**
51
+		 *    Upload function name
52
+		 *    Remember:
53
+		 *        Default function: move_uploaded_file
54
+		 *        Native options:
55
+		 *            - move_uploaded_file (Default and best option)
56
+		 *            - copy
57
+		 *
58
+		 *    @since        1.0
59
+		 *    @version    1.0
60
+		 *    @var        string
61
+		 */
62
+		private $upload_function = 'move_uploaded_file';
63
+
64
+		/**
65
+		 *    Array with the information obtained from the
66
+		 *    variable $_FILES or $HTTP_POST_FILES.
67
+		 *
68
+		 *    @since        1.0
69
+		 *    @version    1.0
70
+		 *    @var        array
71
+		 */
72
+		private $file_array    = array();
73
+
74
+		/**
75
+		 *    If the file you are trying to upload already exists it will
76
+		 *    be overwritten if you set the variable to true.
77
+		 *
78
+		 *    @since        1.0
79
+		 *    @version    1.0
80
+		 *    @var        boolean
81
+		 */
82
+		private $overwrite_file = false;
83
+
84
+		/**
85
+		 *    Input element
86
+		 *    Example:
87
+		 *        <input type="file" name="file" />
88
+		 *    Result:
89
+		 *        FileUpload::$input = file
90
+		 *
91
+		 *    @since        1.0
92
+		 *    @version    1.0
93
+		 *    @var        string
94
+		 */
95
+		private $input;
96
+
97
+		/**
98
+		 *    Path output
99
+		 *
100
+		 *    @since        1.0
101
+		 *    @version    1.0
102
+		 *    @var        string
103
+		 */
104
+		private $destination_directory;
105
+
106
+		/**
107
+		 *    Output filename
108
+		 *
109
+		 *    @since        1.0
110
+		 *    @version    1.0
111
+		 *    @var        string
112
+		 */
113
+		private $filename;
114
+
115
+		/**
116
+		 *    Max file size
117
+		 *
118
+		 *    @since        1.0
119
+		 *    @version    1.0
120
+		 *    @var        float
121
+		 */
122
+		private $max_file_size= 0.0;
123
+
124
+		/**
125
+		 *    List of allowed mime types
126
+		 *
127
+		 *    @since        1.0
128
+		 *    @version    1.0
129
+		 *    @var        array
130
+		 */
131
+		private $allowed_mime_types = array();
132
+
133
+		/**
134
+		 *    Callbacks
135
+		 *
136
+		 *    @since        1.0
137
+		 *    @version    1.0
138
+		 *    @var        array
139
+		 */
140
+		private $callbacks = array('before' => null, 'after' => null);
141
+
142
+		/**
143
+		 *    File object
144
+		 *
145
+		 *    @since        1.0
146
+		 *    @version    1.0
147
+		 *    @var        object
148
+		 */
149
+		private $file;
150
+
151
+		/**
152
+		 *    Helping mime types
153
+		 *
154
+		 *    @since        1.0
155
+		 *    @version    1.0
156
+		 *    @var        array
157
+		 */
158
+		private $mime_helping = array(
159
+			'text'      =>    array('text/plain',),
160
+			'image'     =>    array(
161
+				'image/jpeg',
162
+				'image/jpg',
163
+				'image/pjpeg',
164
+				'image/png',
165
+				'image/gif',
166
+			),
167
+			'document'  =>    array(
168
+				'application/pdf',
169
+				'application/msword',
170
+				'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
171
+				'application/vnd.openxmlformats-officedocument.presentationml.presentation',
172
+				'application/vnd.ms-powerpoint',
173
+				'application/vnd.ms-excel',
174
+				'application/vnd.oasis.opendocument.spreadsheet',
175
+				'application/vnd.oasis.opendocument.presentation',
176
+			),
177
+			'video'    =>    array(
178
+				'video/3gpp',
179
+				'video/3gpp',
180
+				'video/x-msvideo',
181
+				'video/avi',
182
+				'video/mpeg4',
183
+				'video/mp4',
184
+				'video/mpeg',
185
+				'video/mpg',
186
+				'video/quicktime',
187
+				'video/x-sgi-movie',
188
+				'video/x-ms-wmv',
189
+				'video/x-flv',
190
+			),
191
+		);
192
+
193
+		/**
194
+		 * The upload error message
195
+		 * @var array
196
+		 */
197
+		public $error_messages = array();
198
+
199
+		/**
200
+		 * The upload error message
201
+		 * @var string
202
+		 */
203
+		protected $error = null;
204
+
205
+		/**
206
+		 * The logger instance
207
+		 * @var Log
208
+		 */
209
+		private $logger;
210
+
211
+
212
+		/**
213
+		 *    Construct
214
+		 *
215
+		 *    @since     0.1
216
+		 *    @version   1.0.1
217
+		 *    @return    object
218
+		 *    @method    object    __construct
219
+		 */
220
+		public function __construct(){
221
+			$this->logger =& class_loader('Log', 'classes');
222
+			$this->logger->setLogger('Library::Upload');
223
+
224
+			Loader::lang('file_upload');
225
+			$obj =& get_instance();
226
+
227
+			$this->error_messages = array(
228
+				'upload_err_ini_size' => $obj->lang->get('fu_upload_err_ini_size'),
229
+				'upload_err_form_size' => $obj->lang->get('fu_upload_err_form_size'),
230
+				'upload_err_partial' => $obj->lang->get('fu_upload_err_partial'),
231
+				'upload_err_no_file' => $obj->lang->get('fu_upload_err_no_file'),
232
+				'upload_err_no_tmp_dir' => $obj->lang->get('fu_upload_err_no_tmp_dir'),
233
+				'upload_err_cant_write' => $obj->lang->get('fu_upload_err_cant_write'),
234
+				'upload_err_extension' => $obj->lang->get('fu_upload_err_extension'),
235
+				'accept_file_types' => $obj->lang->get('fu_accept_file_types'),
236
+				'file_uploads' => $obj->lang->get('fu_file_uploads_disabled'),
237
+				'max_file_size' => $obj->lang->get('fu_max_file_size'),
238
+				'overwritten_not_allowed' => $obj->lang->get('fu_overwritten_not_allowed'),
239
+			);
240
+
241
+			$this->file = array(
242
+				'status'                =>    false,    // True: success upload
243
+				'mime'                  =>    '',       // Empty string
244
+				'filename'              =>    '',       // Empty string
245
+				'original'              =>    '',       // Empty string
246
+				'size'                  =>    0,        // 0 Bytes
247
+				'sizeFormated'          =>    '0B',     // 0 Bytes
248
+				'destination'           =>    './',     // Default: ./
249
+				'allowed_mime_types'    =>    array(),  // Allowed mime types
250
+				'error'                 =>    null,        // File error
251
+			);
252
+
253
+			// Change dir to current dir
254
+			$this->destination_directory = dirname(__FILE__) . DIRECTORY_SEPARATOR;
255
+
256
+			// Set file array
257
+			if (isset($_FILES) && is_array($_FILES)) {
258
+				$this->file_array = $_FILES;
259
+			}
260
+			$this->logger->info('The upload file information are : ' .stringfy_vars($this->file_array));
261
+		}
262
+		/**
263
+		 *    Set input.
264
+		 *    If you have $_FILES["file"], you must use the key "file"
265
+		 *    Example:
266
+		 *        $object->setInput("file");
267
+		 *
268
+		 *    @since     1.0
269
+		 *    @version   1.0
270
+		 *    @param     string      $input
271
+		 *    @return    object
272
+		 *    @method    boolean     setInput
273
+		 */
274
+		public function setInput($input)
275
+		{
276
+			if (!empty($input) && (is_string($input) || is_numeric($input) )) {
277
+				$this->input = $input;
278
+			}
279
+			return $this;
280
+		}
281
+		/**
282
+		 *    Set new filename
283
+		 *    Example:
284
+		 *        FileUpload::setFilename("new file.txt")
285
+		 *    Remember:
286
+		 *        Use %s to retrive file extension
287
+		 *
288
+		 *    @since     1.0
289
+		 *    @version   1.0
290
+		 *    @param     string      $filename
291
+		 *    @return    object
292
+		 *    @method    boolean     setFilename
293
+		 */
294
+		public function setFilename($filename)
295
+		{
296
+			if ($this->isFilename($filename)) {
297
+				$this->filename = $filename;
298
+			}
299
+			return $this;
300
+		}
301
+		/**
302
+		 *    Set automatic filename
303
+		 *
304
+		 *    @since     1.0
305
+		 *    @version   1.5
306
+		 *    @param     string      $extension
307
+		 *    @return    object
308
+		 *    @method    boolean     setAutoFilename
309
+		 */
310
+		public function setAutoFilename()
311
+		{
312
+			$this->filename = sha1(mt_rand(1, 9999).uniqid());
313
+			$this->filename .= time();
314
+			return $this;
315
+		}
316
+		/**
317
+		 *    Set file size limit
318
+		 *
319
+		 *    @since     1.0
320
+		 *    @version   1.0
321
+		 *    @param     double     $file_size
322
+		 *    @return    object
323
+		 *    @method    boolean     setMaxFileSize
324
+		 */
325
+		public function setMaxFileSize($file_size)
326
+		{
327
+			$file_size = $this->sizeInBytes($file_size);
328
+			if (is_numeric($file_size) && $file_size > -1) {
329
+				// Get php config
330
+				$php_size = $this->sizeInBytes((int) ini_get('upload_max_filesize'));
331
+				// Calculate difference
332
+				if ($php_size < $file_size) {
333
+					$this->logger->warning('The upload max file size you set [' .$file_size. '] is greather than the PHP configuration for upload max file size [' .$php_size. ']');
334
+				}
335
+				$this->max_file_size = $file_size;
336
+			}
337
+			return $this;
338
+		}
339
+		/**
340
+		 *    Set array mime types
341
+		 *
342
+		 *    @since     1.0
343
+		 *    @version   1.0
344
+		 *    @param     array       $mimes
345
+		 *    @return    object
346
+		 *    @method    boolean     setAllowedMimeTypes
347
+		 */
348
+		public function setAllowedMimeTypes(array $mimes)
349
+		{
350
+			if (count($mimes) > 0) {
351
+				array_map(array($this , 'setAllowMimeType'), $mimes);
352
+			}
353
+			return $this;
354
+		}
355
+		/**
356
+		 *    Set input callback
357
+		 *
358
+		 *    @since     1.0
359
+		 *    @version   1.0
360
+		 *    @param     mixed       $callback
361
+		 *    @return    object
362
+		 *    @method    boolean     setCallbackInput
363
+		 */
364
+		public function setCallbackInput($callback)
365
+		{
366
+			if (is_callable($callback, false)) {
367
+				$this->callbacks['input'] = $callback;
368
+			}
369
+			return $this;
370
+		}
371
+		/**
372
+		 *    Set output callback
373
+		 *
374
+		 *    @since     1.0
375
+		 *    @version   1.0
376
+		 *    @param     mixed       $callback
377
+		 *    @return    object
378
+		 *    @method    boolean     setCallbackOutput
379
+		 */
380
+		public function setCallbackOutput($callback)
381
+		{
382
+			if (is_callable($callback, false)) {
383
+				$this->callbacks['output'] = $callback;
384
+			}
385
+			return $this;
386
+		}
387
+		/**
388
+		 *    Append a mime type to allowed mime types
389
+		 *
390
+		 *    @since     1.0
391
+		 *    @version   1.0.1
392
+		 *    @param     string      $mime
393
+		 *    @return    object
394
+		 *    @method    boolean     setAllowMimeType
395
+		 */
396
+		public function setAllowMimeType($mime)
397
+		{
398
+			if (!empty($mime) && is_string($mime)) {
399
+				$this->allowed_mime_types[] = strtolower($mime);
400
+				$this->file['allowed_mime_types'][] = strtolower($mime);
401
+			} 
402
+			return $this;
403
+		}
404
+		/**
405
+		 *    Set allowed mime types from mime helping
406
+		 *
407
+		 *    @since     1.0.1
408
+		 *    @version   1.0.1
409
+		 *    @return    object
410
+		 *    @method    boolean    setMimeHelping
411
+		 */
412
+		public function setMimeHelping($name)
413
+		{
414
+			if (!empty($name) && is_string($name)) {
415
+				if (array_key_exists($name, $this->mime_helping)) {
416
+					return $this->setAllowedMimeTypes($this->mime_helping[ $name ]);
417
+				}
418
+			}
419
+			return $this;
420
+		}
421
+		/**
422
+		 *    Set function to upload file
423
+		 *    Examples:
424
+		 *        1.- FileUpload::setUploadFunction("move_uploaded_file");
425
+		 *        2.- FileUpload::setUploadFunction("copy");
426
+		 *
427
+		 *    @since     1.0
428
+		 *    @version   1.0
429
+		 *    @param     string      $function
430
+		 *    @return    object
431
+		 *    @method    boolean     setUploadFunction
432
+		 */
433
+		public function setUploadFunction($function)
434
+		{
435
+			if (!empty($function) && (is_array($function) || is_string($function) )) {
436
+				if (is_callable( $function)) {
437
+					$this->upload_function = $function;
438
+				}
439
+			}
440
+			return $this;
441
+		}
442
+		/**
443
+		 *    Clear allowed mime types cache
444
+		 *
445
+		 *    @since     1.0
446
+		 *    @version   1.0
447
+		 *    @return    object
448
+		 *    @method    boolean    clearAllowedMimeTypes
449
+		 */
450
+		public function clearAllowedMimeTypes()
451
+		{
452
+			$this->allowed_mime_types = array();
453
+			$this->file['allowed_mime_types'] = array();
454
+			return $this;
455
+		}
456
+		/**
457
+		 *    Set destination output
458
+		 *
459
+		 *    @since     1.0
460
+		 *    @version   1.0
461
+		 *    @param     string      $destination_directory      Destination path
462
+		 *    @param     boolean     $create_if_not_exist
463
+		 *    @return    object
464
+		 *    @method    boolean     setDestinationDirectory
465
+		 */
466
+		public function setDestinationDirectory($destination_directory, $create_if_not_exist = false) {
467
+			$destination_directory = realpath($destination_directory);
468
+			if (substr($destination_directory, -1) != DIRECTORY_SEPARATOR) {
469
+				$destination_directory .= DIRECTORY_SEPARATOR;
470
+			}
471
+
472
+			if ($this->isDirpath($destination_directory)) {
473
+				if ($this->dirExists($destination_directory)) {
474
+					$this->destination_directory = $destination_directory;
475
+					chdir($destination_directory);
476
+				} else if ($create_if_not_exist === true) {
477
+					if (mkdir($destination_directory, 0775, true)) {
478
+						$this->destination_directory = $destination_directory;
479
+						chdir($destination_directory);
480
+					}
481
+					else{
482
+						$this->logger->warning('Can not create the upload directory [' .$destination_directory. ']');
483
+					}
484
+				}
485
+			}
486
+			return $this;
487
+		}
488
+		/**
489
+		 *    Check file exists
490
+		 *
491
+		 *    @since      1.0
492
+		 *    @version    1.0.1
493
+		 *    @param      string     $file_destination
494
+		 *    @return     boolean
495
+		 *    @method     boolean    fileExists
496
+		 */
497
+		public function fileExists($file_destination)
498
+		{
499
+			if ($this->isFilename($file_destination)) {
500
+				return (file_exists($file_destination) && is_file($file_destination));
501
+			}
502
+			return false;
503
+		}
504
+		/**
505
+		 *    Check dir exists
506
+		 *
507
+		 *    @since        1.0
508
+		 *    @version    1.0.1
509
+		 *    @param      string     $path
510
+		 *    @return     boolean
511
+		 *    @method     boolean    dirExists
512
+		 */
513
+		public function dirExists($path)
514
+		{
515
+			if ($this->isDirpath($path)) {
516
+				return (file_exists($path) && is_dir($path));
517
+			}
518
+			return false;
519
+		}
520
+		/**
521
+		 *    Check valid filename
522
+		 *
523
+		 *    @since     1.0
524
+		 *    @version   1.0.1
525
+		 *    @param     string      $filename
526
+		 *    @return    boolean
527
+		 *    @method    boolean     isFilename
528
+		 */
529
+		public function isFilename($filename)
530
+		{
531
+			$filename = basename($filename);
532
+			return (!empty($filename) && (is_string( $filename) || is_numeric($filename)));
533
+		}
534
+		/**
535
+		 *    Validate mime type with allowed mime types,
536
+		 *    but if allowed mime types is empty, this method return true
537
+		 *
538
+		 *    @since     1.0
539
+		 *    @version   1.0
540
+		 *    @param     string      $mime
541
+		 *    @return    boolean
542
+		 *    @method    boolean     checkMimeType
543
+		 */
544
+		public function checkMimeType($mime)
545
+		{
546
+			if (count($this->allowed_mime_types) == 0) {
547
+				return true;
548
+			}
549
+			return in_array(strtolower($mime), $this->allowed_mime_types);
550
+		}
551
+		/**
552
+		 *    Retrive status of upload
553
+		 *
554
+		 *    @since     1.0
555
+		 *    @version   1.0
556
+		 *    @return    boolean
557
+		 *    @method    boolean    getStatus
558
+		 */
559
+		public function getStatus()
560
+		{
561
+			return $this->file['status'];
562
+		}
563
+		/**
564
+		 *    Check valid path
565
+		 *
566
+		 *    @since        1.0
567
+		 *    @version    1.0.1
568
+		 *    @param        string    $filename
569
+		 *    @return     boolean
570
+		 *    @method     boolean    isDirpath
571
+		 */
572
+		public function isDirpath($path)
573
+		{
574
+			if (!empty( $path) && (is_string( $path) || is_numeric($path) )) {
575
+				if (DIRECTORY_SEPARATOR == '/') {
576
+					return (preg_match( '/^[^*?"<>|:]*$/' , $path) == 1 );
577
+				} else {
578
+					return (preg_match( "/^[^*?\"<>|:]*$/" , substr($path,2) ) == 1);
579
+				}
580
+			}
581
+			return false;
582
+		}
583
+		/**
584
+		 *    Allow overwriting files
585
+		 *
586
+		 *    @since      1.0
587
+		 *    @version    1.0
588
+		 *    @return     object
589
+		 *    @method     boolean    allowOverwriting
590
+		 */
591
+		public function allowOverwriting()
592
+		{
593
+			$this->overwrite_file = true;
594
+			return $this;
595
+		}
596
+		/**
597
+		 *    File info
598
+		 *
599
+		 *    @since      1.0
600
+		 *    @version    1.0
601
+		 *    @return     object
602
+		 *    @method     object    getInfo
603
+		 */
604
+		public function getInfo()
605
+		{
606
+			return (object)$this->file;
607
+		}
608
+
609
+
610
+		/**
611
+		 * Check if the file is uploaded
612
+		 * @return boolean
613
+		 */
614
+		public function isUploaded(){
615
+			return isset($this->file_array[$this->input])
616
+			&& is_uploaded_file($this->file_array[$this->input]['tmp_name']);
617
+		}
618 618
 
619 619
         
620
-        /**
621
-        *    Upload file
622
-        *
623
-        *    @since     1.0
624
-        *    @version   1.0.1
625
-        *    @return    boolean
626
-        *    @method    boolean    save
627
-        */
628
-        public function save(){
629
-            if (count($this->file_array) > 0 && array_key_exists($this->input, $this->file_array)) {
630
-                // set original filename if not have a new name
631
-                if (empty($this->filename)) {
632
-                    $this->filename = $this->file_array[$this->input]['name'];
633
-                }
634
-                else{
635
-                    // Replace %s for extension in filename
636
-                    // Before: /[\w\d]*(.[\d\w]+)$/i
637
-                    // After: /^[\s[:alnum:]\-\_\.]*\.([\d\w]+)$/iu
638
-                    // Support unicode(utf-8) characters
639
-                    // Example: "русские.jpeg" is valid; "Zhōngguó.jpeg" is valid; "Tønsberg.jpeg" is valid
640
-                    $extension = preg_replace(
641
-                        '/^[\p{L}\d\s\-\_\.\(\)]*\.([\d\w]+)$/iu',
642
-                        '$1',
643
-                        $this->file_array[$this->input]['name']
644
-                    );
645
-                    $this->filename = $this->filename . '.' . $extension;
646
-                }
647
-
648
-                // set file info
649
-                $this->file['mime']         = $this->file_array[$this->input]['type'];
650
-                $this->file['tmp']          = $this->file_array[$this->input]['tmp_name'];
651
-                $this->file['original']     = $this->file_array[$this->input]['name'];
652
-                $this->file['size']         = $this->file_array[$this->input]['size'];
653
-                $this->file['sizeFormated'] = $this->sizeFormat($this->file['size']);
654
-                $this->file['destination']  = $this->destination_directory . $this->filename;
655
-                $this->file['filename']     = $this->filename;
656
-                $this->file['error']        = $this->file_array[$this->input]['error'];
657
-
658
-                $this->logger->info('The upload file information to process is : ' .stringfy_vars($this->file));
659
-
660
-                $error = $this->uploadHasError();
661
-                if($error){
662
-                    return false;
663
-                }
664
-                // Execute input callback
665
-                $this->runCallback('input');
666
-
667
-                $this->file['status'] = call_user_func_array(
668
-                    $this->upload_function, array(
669
-                        $this->file_array[$this->input]['tmp_name'],
670
-                        $this->destination_directory . $this->filename
671
-                    )
672
-                );
673
-
674
-                // Execute output callback
675
-                $this->runCallback('output');
676
-
677
-                return $this->file['status'];
678
-            }
679
-            return false;
680
-        }
681
-
682
-
683
-        /**
684
-        *    File size for humans.
685
-        *
686
-        *    @since      1.0
687
-        *    @version    1.0
688
-        *    @param      integer    $bytes
689
-        *    @param      integer    $precision
690
-        *    @return     string
691
-        *    @method     string     sizeFormat
692
-        */
693
-        public function sizeFormat($size, $precision = 2)
694
-        {
695
-            if($size > 0){
696
-                $base       = log($size) / log(1024);
697
-                $suffixes   = array('B', 'K', 'M', 'G', 'T');
698
-                return round(pow(1024, $base - floor($base)), $precision) . ( isset($suffixes[floor($base)]) ? $suffixes[floor($base)] : '');
699
-            }
700
-            return null;
701
-        }
620
+		/**
621
+		 *    Upload file
622
+		 *
623
+		 *    @since     1.0
624
+		 *    @version   1.0.1
625
+		 *    @return    boolean
626
+		 *    @method    boolean    save
627
+		 */
628
+		public function save(){
629
+			if (count($this->file_array) > 0 && array_key_exists($this->input, $this->file_array)) {
630
+				// set original filename if not have a new name
631
+				if (empty($this->filename)) {
632
+					$this->filename = $this->file_array[$this->input]['name'];
633
+				}
634
+				else{
635
+					// Replace %s for extension in filename
636
+					// Before: /[\w\d]*(.[\d\w]+)$/i
637
+					// After: /^[\s[:alnum:]\-\_\.]*\.([\d\w]+)$/iu
638
+					// Support unicode(utf-8) characters
639
+					// Example: "русские.jpeg" is valid; "Zhōngguó.jpeg" is valid; "Tønsberg.jpeg" is valid
640
+					$extension = preg_replace(
641
+						'/^[\p{L}\d\s\-\_\.\(\)]*\.([\d\w]+)$/iu',
642
+						'$1',
643
+						$this->file_array[$this->input]['name']
644
+					);
645
+					$this->filename = $this->filename . '.' . $extension;
646
+				}
647
+
648
+				// set file info
649
+				$this->file['mime']         = $this->file_array[$this->input]['type'];
650
+				$this->file['tmp']          = $this->file_array[$this->input]['tmp_name'];
651
+				$this->file['original']     = $this->file_array[$this->input]['name'];
652
+				$this->file['size']         = $this->file_array[$this->input]['size'];
653
+				$this->file['sizeFormated'] = $this->sizeFormat($this->file['size']);
654
+				$this->file['destination']  = $this->destination_directory . $this->filename;
655
+				$this->file['filename']     = $this->filename;
656
+				$this->file['error']        = $this->file_array[$this->input]['error'];
657
+
658
+				$this->logger->info('The upload file information to process is : ' .stringfy_vars($this->file));
659
+
660
+				$error = $this->uploadHasError();
661
+				if($error){
662
+					return false;
663
+				}
664
+				// Execute input callback
665
+				$this->runCallback('input');
666
+
667
+				$this->file['status'] = call_user_func_array(
668
+					$this->upload_function, array(
669
+						$this->file_array[$this->input]['tmp_name'],
670
+						$this->destination_directory . $this->filename
671
+					)
672
+				);
673
+
674
+				// Execute output callback
675
+				$this->runCallback('output');
676
+
677
+				return $this->file['status'];
678
+			}
679
+			return false;
680
+		}
681
+
682
+
683
+		/**
684
+		 *    File size for humans.
685
+		 *
686
+		 *    @since      1.0
687
+		 *    @version    1.0
688
+		 *    @param      integer    $bytes
689
+		 *    @param      integer    $precision
690
+		 *    @return     string
691
+		 *    @method     string     sizeFormat
692
+		 */
693
+		public function sizeFormat($size, $precision = 2)
694
+		{
695
+			if($size > 0){
696
+				$base       = log($size) / log(1024);
697
+				$suffixes   = array('B', 'K', 'M', 'G', 'T');
698
+				return round(pow(1024, $base - floor($base)), $precision) . ( isset($suffixes[floor($base)]) ? $suffixes[floor($base)] : '');
699
+			}
700
+			return null;
701
+		}
702 702
 
703 703
         
704
-        /**
705
-        *    Convert human file size to bytes
706
-        *
707
-        *    @since      1.0
708
-        *    @version    1.0.1
709
-        *    @param      integer|double    $size
710
-        *    @return     integer|double
711
-        *    @method     string     sizeInBytes
712
-        */
713
-        public function sizeInBytes($size)
714
-        {
715
-            $unit = 'B';
716
-            $units = array('B' => 0, 'K' => 1, 'M' => 2, 'G' => 3, 'T' => 4);
717
-            $matches = array();
718
-            preg_match('/(?<size>[\d\.]+)\s*(?<unit>b|k|m|g|t)?/i', $size, $matches);
719
-            if (array_key_exists('unit', $matches)) {
720
-                $unit = strtoupper($matches['unit']);
721
-            }
722
-            return (floatval($matches['size']) * pow(1024, $units[$unit]) ) ;
723
-        }
724
-
725
-        /**
726
-         * Get the upload error message
727
-         * @return string
728
-         */
729
-        public function getError(){
730
-            return $this->error;
731
-        }
732
-
733
-        /**
734
-         * Set the upload error message
735
-         * @param string $message the upload error message to set
736
-         */
737
-        public function setError($message){
738
-            $this->logger->info('The file upload got error : ' . $message);
739
-            $this->error = $message;
740
-        }
741
-
742
-        /**
743
-         * Run the callbacks in the file uploaded
744
-         * @param string $type the type of callback "input" or "output"
745
-         * @return void 
746
-         */
747
-        protected function runCallback($type){
748
-            if (!empty( $this->callbacks[$type])) {
749
-                call_user_func($this->callbacks[$type], (object)$this->file);
750
-            }
751
-        }
752
-
753
-        /**
754
-         * Check if file upload has error
755
-         * @return boolean
756
-         */
757
-        protected function uploadHasError(){
758
-            //check if file upload is  allowed in the configuration
759
-            if(! ini_get('file_uploads')){
760
-                $this->setError($this->error_messages['file_uploads']);
761
-                return true;
762
-            }
763
-
764
-             //check for php upload error
765
-            if(is_numeric($this->file['error']) && $this->file['error'] > 0){
766
-                $this->setError($this->getPhpUploadErrorMessageByCode($this->file['error']));
767
-                return true;
768
-            }
704
+		/**
705
+		 *    Convert human file size to bytes
706
+		 *
707
+		 *    @since      1.0
708
+		 *    @version    1.0.1
709
+		 *    @param      integer|double    $size
710
+		 *    @return     integer|double
711
+		 *    @method     string     sizeInBytes
712
+		 */
713
+		public function sizeInBytes($size)
714
+		{
715
+			$unit = 'B';
716
+			$units = array('B' => 0, 'K' => 1, 'M' => 2, 'G' => 3, 'T' => 4);
717
+			$matches = array();
718
+			preg_match('/(?<size>[\d\.]+)\s*(?<unit>b|k|m|g|t)?/i', $size, $matches);
719
+			if (array_key_exists('unit', $matches)) {
720
+				$unit = strtoupper($matches['unit']);
721
+			}
722
+			return (floatval($matches['size']) * pow(1024, $units[$unit]) ) ;
723
+		}
724
+
725
+		/**
726
+		 * Get the upload error message
727
+		 * @return string
728
+		 */
729
+		public function getError(){
730
+			return $this->error;
731
+		}
732
+
733
+		/**
734
+		 * Set the upload error message
735
+		 * @param string $message the upload error message to set
736
+		 */
737
+		public function setError($message){
738
+			$this->logger->info('The file upload got error : ' . $message);
739
+			$this->error = $message;
740
+		}
741
+
742
+		/**
743
+		 * Run the callbacks in the file uploaded
744
+		 * @param string $type the type of callback "input" or "output"
745
+		 * @return void 
746
+		 */
747
+		protected function runCallback($type){
748
+			if (!empty( $this->callbacks[$type])) {
749
+				call_user_func($this->callbacks[$type], (object)$this->file);
750
+			}
751
+		}
752
+
753
+		/**
754
+		 * Check if file upload has error
755
+		 * @return boolean
756
+		 */
757
+		protected function uploadHasError(){
758
+			//check if file upload is  allowed in the configuration
759
+			if(! ini_get('file_uploads')){
760
+				$this->setError($this->error_messages['file_uploads']);
761
+				return true;
762
+			}
763
+
764
+			 //check for php upload error
765
+			if(is_numeric($this->file['error']) && $this->file['error'] > 0){
766
+				$this->setError($this->getPhpUploadErrorMessageByCode($this->file['error']));
767
+				return true;
768
+			}
769 769
             
770
-            //check for mime type
771
-            if (! $this->checkMimeType($this->file['mime'])) {
772
-                $this->setError($this->error_messages['accept_file_types']);
773
-                return true;
774
-            }
775
-
776
-             // Check file size
777
-            if ($this->max_file_size > 0 && $this->max_file_size < $this->file['size']) {
778
-                $this->setError(sprintf($this->error_messages['max_file_size'], $this->sizeFormat($this->max_file_size)));
779
-                return true;
780
-            }
781
-
782
-            // Check if exists file
783
-            if ($this->fileExists($this->destination_directory . $this->filename) && $this->overwrite_file === false) {
784
-                $this->setError($this->error_messages['overwritten_not_allowed']);
785
-                return true;
786
-            }
787
-            return false;
788
-        }
789
-
790
-        /**
791
-         * Get the PHP upload error message for the given code
792
-         * @param  int $code the error code
793
-         * @return string the error message
794
-         */
795
-        private function getPhpUploadErrorMessageByCode($code){
796
-            $codeMessageMaps = array(
797
-                1 => $this->error_messages['upload_err_ini_size'],
798
-                2 => $this->error_messages['upload_err_form_size'],
799
-                3 => $this->error_messages['upload_err_partial'],
800
-                4 => $this->error_messages['upload_err_no_file'],
801
-                6 => $this->error_messages['upload_err_no_tmp_dir'],
802
-                7 => $this->error_messages['upload_err_cant_write'],
803
-                8 => $this->error_messages['upload_err_extension'],
804
-            );
805
-            return isset($codeMessageMaps[$code]) ? $codeMessageMaps[$code] : null;
806
-        }
807
-    }
770
+			//check for mime type
771
+			if (! $this->checkMimeType($this->file['mime'])) {
772
+				$this->setError($this->error_messages['accept_file_types']);
773
+				return true;
774
+			}
775
+
776
+			 // Check file size
777
+			if ($this->max_file_size > 0 && $this->max_file_size < $this->file['size']) {
778
+				$this->setError(sprintf($this->error_messages['max_file_size'], $this->sizeFormat($this->max_file_size)));
779
+				return true;
780
+			}
781
+
782
+			// Check if exists file
783
+			if ($this->fileExists($this->destination_directory . $this->filename) && $this->overwrite_file === false) {
784
+				$this->setError($this->error_messages['overwritten_not_allowed']);
785
+				return true;
786
+			}
787
+			return false;
788
+		}
789
+
790
+		/**
791
+		 * Get the PHP upload error message for the given code
792
+		 * @param  int $code the error code
793
+		 * @return string the error message
794
+		 */
795
+		private function getPhpUploadErrorMessageByCode($code){
796
+			$codeMessageMaps = array(
797
+				1 => $this->error_messages['upload_err_ini_size'],
798
+				2 => $this->error_messages['upload_err_form_size'],
799
+				3 => $this->error_messages['upload_err_partial'],
800
+				4 => $this->error_messages['upload_err_no_file'],
801
+				6 => $this->error_messages['upload_err_no_tmp_dir'],
802
+				7 => $this->error_messages['upload_err_cant_write'],
803
+				8 => $this->error_messages['upload_err_extension'],
804
+			);
805
+			return isset($codeMessageMaps[$code]) ? $codeMessageMaps[$code] : null;
806
+		}
807
+	}
Please login to merge, or discard this patch.