aboutsummaryrefslogtreecommitdiff
path: root/h-source
diff options
context:
space:
mode:
Diffstat (limited to 'h-source')
-rwxr-xr-xh-source/COPYRIGHT.txt18
-rw-r--r--h-source/Library/Array/Validate/Base.php258
-rw-r--r--h-source/Library/Array/Validate/Soft.php102
-rw-r--r--h-source/Library/Array/Validate/Strong.php197
-rw-r--r--h-source/Library/Array/Validate/index.html1
-rw-r--r--h-source/Library/Array/index.html1
-rwxr-xr-xh-source/Library/ArrayExt.php80
-rwxr-xr-xh-source/Library/Bootstrap.php31
-rw-r--r--h-source/Library/BoxParser.php86
-rwxr-xr-xh-source/Library/Call.php357
-rwxr-xr-xh-source/Library/Controller.php321
-rwxr-xr-xh-source/Library/Db/Mysql.php446
-rw-r--r--h-source/Library/Db/Mysqli.php452
-rw-r--r--h-source/Library/Db/index.html1
-rw-r--r--h-source/Library/Email.php246
-rw-r--r--h-source/Library/ErrorReporting.php45
-rwxr-xr-xh-source/Library/Factory/Db.php69
-rw-r--r--h-source/Library/Factory/Strings.php38
-rw-r--r--h-source/Library/Factory/index.html1
-rw-r--r--h-source/Library/Files/Log.php114
-rwxr-xr-xh-source/Library/Files/Upload.php603
-rw-r--r--h-source/Library/Files/index.html1
-rwxr-xr-xh-source/Library/Form/Checkbox.php49
-rwxr-xr-xh-source/Library/Form/Entry.php112
-rw-r--r--h-source/Library/Form/File.php56
-rwxr-xr-xh-source/Library/Form/Form.php140
-rwxr-xr-xh-source/Library/Form/Hidden.php40
-rw-r--r--h-source/Library/Form/Html.php40
-rwxr-xr-xh-source/Library/Form/InputText.php49
-rw-r--r--h-source/Library/Form/Password.php49
-rwxr-xr-xh-source/Library/Form/Radio.php49
-rwxr-xr-xh-source/Library/Form/Select.php49
-rwxr-xr-xh-source/Library/Form/Textarea.php49
-rw-r--r--h-source/Library/Form/index.html1
-rwxr-xr-xh-source/Library/Functions.php307
-rw-r--r--h-source/Library/HeaderObj.php45
-rwxr-xr-xh-source/Library/Helper/Array.php28
-rwxr-xr-xh-source/Library/Helper/Html.php31
-rwxr-xr-xh-source/Library/Helper/List.php496
-rwxr-xr-xh-source/Library/Helper/Menu.php109
-rwxr-xr-xh-source/Library/Helper/Pages.php140
-rwxr-xr-xh-source/Library/Helper/Popup.php142
-rw-r--r--h-source/Library/Helper/index.html1
-rw-r--r--h-source/Library/Hooks.php38
-rw-r--r--h-source/Library/Html/Form.php211
-rw-r--r--h-source/Library/Html/index.html1
-rw-r--r--h-source/Library/Image/Gd/Captcha.php103
-rw-r--r--h-source/Library/Image/Gd/Thumbnail.php220
-rw-r--r--h-source/Library/Image/Gd/index.html1
-rw-r--r--h-source/Library/Image/index.html1
-rw-r--r--h-source/Library/Lang/En/DbCondStrings.php34
-rw-r--r--h-source/Library/Lang/En/Generic.php64
-rw-r--r--h-source/Library/Lang/En/ModelStrings.php36
-rw-r--r--h-source/Library/Lang/En/UploadStrings.php45
-rw-r--r--h-source/Library/Lang/En/ValCondStrings.php93
-rw-r--r--h-source/Library/Lang/En/index.html1
-rw-r--r--h-source/Library/Lang/Eng/DbCondStrings.php34
-rw-r--r--h-source/Library/Lang/Eng/Generic.php48
-rw-r--r--h-source/Library/Lang/Eng/ModelStrings.php36
-rw-r--r--h-source/Library/Lang/Eng/UploadStrings.php45
-rw-r--r--h-source/Library/Lang/Eng/ValCondStrings.php93
-rw-r--r--h-source/Library/Lang/Eng/index.html1
-rw-r--r--h-source/Library/Lang/ResultStrings.php42
-rw-r--r--h-source/Library/Lang/index.html1
-rw-r--r--h-source/Library/ModAbstract.php42
-rwxr-xr-xh-source/Library/Model/Base.php1273
-rwxr-xr-xh-source/Library/Model/Map.php453
-rwxr-xr-xh-source/Library/Model/Tree.php307
-rw-r--r--h-source/Library/Model/index.html1
-rw-r--r--h-source/Library/Params.php63
-rwxr-xr-xh-source/Library/Popup.php32
-rw-r--r--h-source/Library/Request.php56
-rwxr-xr-xh-source/Library/Scaffold.php304
-rw-r--r--h-source/Library/Strings/Functions.php47
-rwxr-xr-xh-source/Library/Theme.php99
-rwxr-xr-xh-source/Library/Url.php53
-rwxr-xr-xh-source/Library/Users/CheckAdmin.php386
-rw-r--r--h-source/Library/Users/index.html1
-rw-r--r--h-source/Library/index.html1
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/AUTHORS28
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/CONTRIBUTORS3
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/COPYING340
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/ChangeLog6
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/add.pngbin0 -> 717 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/clear_filter.pngbin0 -> 1030 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/delete.pngbin0 -> 1030 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/down.pngbin0 -> 858 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/edit.pngbin0 -> 958 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/find.pngbin0 -> 864 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/left.pngbin0 -> 852 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/link.pngbin0 -> 1127 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/panel.pngbin0 -> 791 bytes
-rwxr-xr-xh-source/Public/Img/Icons/elementary_2_5/up.pngbin0 -> 824 bytes
93 files changed, 10089 insertions, 4 deletions
diff --git a/h-source/COPYRIGHT.txt b/h-source/COPYRIGHT.txt
index 63dbdc9..e8c5c1f 100755
--- a/h-source/COPYRIGHT.txt
+++ b/h-source/COPYRIGHT.txt
@@ -1,18 +1,21 @@
EasyGiant is a PHP framework for creating and managing dynamic content
-Copyright (C) 2009 - 2010 Antonio Gallo
+Copyright (C) 2009 - 2011 Antonio Gallo
+See LICENSE.txt.
-This program is free software: you can redistribute it and/or modify
+This file is part of EasyGiant
+
+EasyGiant is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-This program is distributed in the hope that it will be useful,
+EasyGiant is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
+along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
EasyGiant includes works distributed under the licenses listed below.
@@ -22,3 +25,10 @@ FreeFont
License: GNU GPL version 3 or later
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
link: http://savannah.gnu.org/projects/freefont/
+
+
+Elementary icon theme
+---------------------
+License: GNU GPL version 2
+elementary is designed and developed by Daniel Foré <Daniel.p.Fore@gmail.com>
+link: https://launchpad.net/elementaryicons/+milestone/2.5
diff --git a/h-source/Library/Array/Validate/Base.php b/h-source/Library/Array/Validate/Base.php
new file mode 100644
index 0000000..fb4a66c
--- /dev/null
+++ b/h-source/Library/Array/Validate/Base.php
@@ -0,0 +1,258 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to validate associative arrays
+class Array_Validate_Base
+{
+
+ public $errorString = null; //string containing the list fields not found
+ public $errorsNumb = null; //numbers of errors
+
+ protected $_lang; //language of notices
+ protected $_resultString; //reference to the class arraycheckStrings containing all the result strings
+
+
+ public function __construct($lang = 'En')
+ {
+ $this->_lang = $lang;
+ $stringClass = 'Lang_'.$this->_lang.'_ValCondStrings';
+ if (!class_exists($stringClass))
+ {
+ $stringClass = 'Lang_En_ValCondStrings';
+ }
+ $this->_resultString = new $stringClass();
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are not '' and are equal (===) to each other
+ public function checkEqual($associativeArray,$keyString)
+ {
+ $errorString = null;
+ $keyArray = explode(',',$keyString);
+ $numb = 0;
+
+ //set the first value to null
+ $firstValue = null;
+
+ foreach ($keyArray as $key)
+ {
+ if (array_key_exists($key,$associativeArray))
+ {
+ $firstValue = $associativeArray[$key];
+ break;
+ }
+ }
+
+ if (isset($firstValue))
+ {
+ for ($i = 0; $i < count($keyArray); $i++)
+ {
+ if (array_key_exists($keyArray[$i],$associativeArray))
+ {
+ if (strcmp($associativeArray[$keyArray[$i]],$firstValue) !== 0)
+ {
+ $numb++;
+ $errorString = $this->_resultString->getNotEqualResultString($keyString);
+ }
+ }
+ }
+ }
+
+ $this->errorString = $errorString;
+ return $numb === 0 ? true : false;
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are alphabetic values
+ //$strength: hard or soft. If $strength is set equal to soft than non check is made upon array values equalt to '' or null
+ public function checkAlpha($associativeArray,$keyString,$strength = 'strong')
+ {
+ return $this->checkGeneric($associativeArray,$keyString,$strength,'ctype_alpha','getNotAlphabeticResultString');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are alphanumeric values
+ //$strength: hard or soft. If $strength is set equal to soft than non check is made upon array values equalt to '' or null
+ public function checkAlphaNum($associativeArray,$keyString,$strength = 'strong')
+ {
+ return $this->checkGeneric($associativeArray,$keyString,$strength,'ctype_alnum','getNotAlphanumericResultString');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are decimal digits
+ //$strength: hard or soft. If $strength is set equal to soft than non check is made upon array values equalt to '' or null
+ public function checkDigit($associativeArray,$keyString,$strength = 'strong')
+ {
+ return $this->checkGeneric($associativeArray,$keyString,$strength,'ctype_digit','getNotDecimalDigitResultString');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) have mail format
+ //$strength: hard or soft. If $strength is set equal to soft than non check is made upon array values equalt to '' or null
+ public function checkMail($associativeArray,$keyString,$strength = 'strong')
+ {
+ return $this->checkGeneric($associativeArray,$keyString,$strength,'checkMail','getNotMailFormatResultString');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) is a number (integer or number). It makes use of the is_numeric PHP built-in function
+ //$strength: hard or soft. If $strength is set equal to soft than non check is made upon array values equalt to '' or null
+ public function checkNumeric($associativeArray,$keyString,$strength = 'strong')
+ {
+ return $this->checkGeneric($associativeArray,$keyString,$strength,'is_numeric','getNotNumericResultString');
+ }
+
+
+ //apply a generic check function
+ //$strength: hard or soft. If $strength is set equal to soft than non check is made upon array values equalt to '' or null
+ //$func: the function to apply
+ //$strFunc: the method of the object $this->_resultString to apply
+ private function checkGeneric($associativeArray,$keyString,$strength,$func,$strFunc)
+ {
+
+ $errorString = null;
+ $keyArray = explode(',',$keyString);
+ $numb = 0;
+
+ for ($i = 0; $i < count($keyArray); $i++)
+ {
+ if (array_key_exists($keyArray[$i],$associativeArray))
+ {
+ if (strcmp($associativeArray[$keyArray[$i]],'') !== 0 or $strength === 'strong')
+ {
+ if (!call_user_func($func,$associativeArray[$keyArray[$i]]))
+ {
+ $numb++;
+ $errorString .= call_user_func(array($this->_resultString,$strFunc),$keyArray[$i]);
+ }
+ }
+ }
+ }
+
+ $this->errorString = $errorString;
+ return $numb === 0 ? true : false;
+
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) have a number of chars smaller than $maxLenght
+ public function checkLength($associativeArray,$keyString,$maxLength = 10)
+ {
+ $errorString = null;
+ $keyArray = explode(',',$keyString);
+ $numb = 0;
+ for ($i = 0; $i < count($keyArray); $i++)
+ {
+ if (array_key_exists($keyArray[$i],$associativeArray))
+ {
+ if (eg_strlen($associativeArray[$keyArray[$i]]) > $maxLength)
+ {
+ $numb++;
+ $errorString .= $this->_resultString->getLengthExceedsResultString($keyArray[$i],$maxLength);
+ }
+ }
+ }
+ $this->errorString = $errorString;
+ return $numb === 0 ? true : false;
+
+ }
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are different from the values indicated in the argument $strings (a comma-separated list of words)
+ public function checkIsNotStrings($associativeArray,$keyString,$strings = '')
+ {
+ $errorString = null;
+ $keyArray = explode(',',$keyString);
+ $numb = 0;
+ //get the array from the comma-separated list of strings
+ $stringsArray = explode(',',$strings);
+ for ($i = 0; $i < count($keyArray); $i++)
+ {
+ if (array_key_exists($keyArray[$i],$associativeArray))
+ {
+ foreach ($stringsArray as $string)
+ {
+ if (strcmp($associativeArray[$keyArray[$i]],$string) === 0)
+ {
+ $numb++;
+ $errorString .= $this->_resultString->getIsForbiddenStringResultString($keyArray[$i],$strings);
+ }
+ }
+ }
+ }
+ $this->errorString = $errorString;
+ return $numb === 0 ? true : false;
+ }
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are one of the values indicated in the argument $strings (a comma-separated list of words)
+ //$strength: hard or soft. If $strength is set equal to soft than non check is made upon array values equalt to '' or null
+ public function checkIsStrings($associativeArray,$keyString,$strings = '',$strength = 'strong')
+ {
+ $errorString = null;
+ $keyArray = explode(',',$keyString);
+ $numb = 0;
+ //get the array from the comma-separated list of strings
+ $stringsArray = explode(',',$strings);
+ for ($i = 0; $i < count($keyArray); $i++)
+ {
+ if (array_key_exists($keyArray[$i],$associativeArray))
+ {
+ if (strcmp($associativeArray[$keyArray[$i]],'') !== 0 or $strength === 'strong')
+ {
+ if (!in_array($associativeArray[$keyArray[$i]],$stringsArray))
+ {
+ $numb++;
+ $errorString .= $this->_resultString->getIsNotStringResultString($keyArray[$i],$strings);
+ }
+ }
+ }
+ }
+ $this->errorString = $errorString;
+ return $numb === 0 ? true : false;
+ }
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) match the regular expression $regExp
+ public function checkMatch($associativeArray,$keyString,$regExp = '/./',$strength = 'strong')
+ {
+ $errorString = null;
+ $keyArray = explode(',',$keyString);
+ $numb = 0;
+ for ($i = 0; $i < count($keyArray); $i++)
+ {
+ if (array_key_exists($keyArray[$i],$associativeArray))
+ {
+ if (strcmp($associativeArray[$keyArray[$i]],'') !== 0 or $strength === 'strong')
+ {
+ if (!preg_match($regExp,$associativeArray[$keyArray[$i]]))
+ {
+ $numb++;
+ $errorString .= $this->_resultString->getDoesntMatchResultString($keyArray[$i],$regExp);
+ }
+ }
+ }
+ }
+ $this->errorString = $errorString;
+ return $numb === 0 ? true : false;
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Array/Validate/Soft.php b/h-source/Library/Array/Validate/Soft.php
new file mode 100644
index 0000000..b348bdc
--- /dev/null
+++ b/h-source/Library/Array/Validate/Soft.php
@@ -0,0 +1,102 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to validate associative arrays
+class Array_Validate_Soft extends Array_Validate_Base
+{
+
+ public function __construct($lang = 'Eng')
+ {
+ parent::__construct($lang);
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are not '' and are equal (===) to each other
+ public function checkEqual($associativeArray,$keyString)
+ {
+ return parent::checkEqual($associativeArray,$keyString);
+ }
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are alphabetic values
+ public function checkAlpha($associativeArray,$keyString)
+ {
+ return parent::checkAlpha($associativeArray,$keyString,'soft');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are alphanumeric values
+ public function checkAlphaNum($associativeArray,$keyString)
+ {
+ return parent::checkAlphaNum($associativeArray,$keyString,'soft');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are decimal digits
+ public function checkDigit($associativeArray,$keyString)
+ {
+ return parent::checkDigit($associativeArray,$keyString,'soft');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) have mail format
+ public function checkMail($associativeArray,$keyString)
+ {
+ return parent::checkMail($associativeArray,$keyString,'soft');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) is a number (integer or number). It makes use of the is_numeric PHP built-in function
+ public function checkNumeric($associativeArray,$keyString)
+ {
+ return parent::checkNumeric($associativeArray,$keyString,'soft');
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) have a number of chars smaller than $maxLenght
+ public function checkLength($associativeArray,$keyString,$maxLength = 10)
+ {
+ return parent::checkLength($associativeArray,$keyString,$maxLength);
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are different from the values indicated in the argument $strings (a comma-separated list of words)
+ public function checkIsNotStrings($associativeArray,$keyString,$strings = '')
+ {
+ return parent::checkIsNotStrings($associativeArray,$keyString,$strings);
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are one of the values indicated in the argument $strings (a comma-separated list of words)
+ public function checkIsStrings($associativeArray,$keyString,$strings = '')
+ {
+ return parent::checkIsStrings($associativeArray,$keyString,$strings,'soft');
+ }
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) match the regular expression $regExp
+ public function checkMatch($associativeArray,$keyString,$regExp = '/./')
+ {
+ return parent::checkMatch($associativeArray,$keyString,$regExp,'soft');
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Array/Validate/Strong.php b/h-source/Library/Array/Validate/Strong.php
new file mode 100644
index 0000000..ccdce74
--- /dev/null
+++ b/h-source/Library/Array/Validate/Strong.php
@@ -0,0 +1,197 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to manage arrays
+class Array_Validate_Strong extends Array_Validate_Base
+{
+
+ public function __construct($lang = 'Eng')
+ {
+ parent::__construct($lang);
+ }
+
+
+ public function checkNotEmpty($associativeArray,$keyString)
+ {
+ $errorString = null;
+ $keyArray = explode(',',$keyString);
+ $numb = 0;
+ for ($i = 0; $i < count($keyArray); $i++)
+ {
+ if (array_key_exists($keyArray[$i],$associativeArray))
+ {
+ if (strcmp(trim($associativeArray[$keyArray[$i]]),'') === 0)
+ {
+ $errorString .= $this->_resultString->getNotDefinedResultString($keyArray[$i]);
+ $numb++;
+ }
+ }
+ else
+ {
+ $errorString .= $this->_resultString->getNotDefinedResultString($keyArray[$i]);
+ $numb++;
+ }
+ }
+ $this->errorString = $errorString;
+ $this->errorNumb = $numb;
+ return $numb === 0 ? true : false;
+ }
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are not '' and are equal (===) to each other
+ public function checkEqual($associativeArray,$keyString)
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkEqual($associativeArray,$keyString);
+
+ } else {
+ return false;
+ }
+ }
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are alphabetic values
+ public function checkAlpha($associativeArray,$keyString)
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkAlpha($associativeArray,$keyString,'strong');
+
+ } else {
+ return false;
+ }
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are alphanumeric values
+ public function checkAlphaNum($associativeArray,$keyString)
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkAlphaNum($associativeArray,$keyString,'strong');
+
+ } else {
+ return false;
+ }
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are decimal digits
+ public function checkDigit($associativeArray,$keyString)
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkDigit($associativeArray,$keyString,'strong');
+
+ } else {
+ return false;
+ }
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) have mail format
+ public function checkMail($associativeArray,$keyString)
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkMail($associativeArray,$keyString,'strong');
+
+ } else {
+ return false;
+ }
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) is a number (integer or number). It makes use of the is_numeric PHP built-in function
+ public function checkNumeric($associativeArray,$keyString)
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkNumeric($associativeArray,$keyString,'strong');
+
+ } else {
+ return false;
+ }
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) have a number of chars smaller than $maxLenght
+ public function checkLength($associativeArray,$keyString,$maxLength = 10)
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkLength($associativeArray,$keyString,$maxLength);
+
+ } else {
+ return false;
+ }
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are different from the values indicated in the argument $strings (a comma-separated list of words)
+ public function checkIsNotStrings($associativeArray,$keyString,$strings = '')
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkIsNotStrings($associativeArray,$keyString,$strings);
+
+ } else {
+ return false;
+ }
+ }
+
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) are one of the values indicated in the argument $strings (a comma-separated list of words)
+ public function checkIsStrings($associativeArray,$keyString,$strings = '')
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkIsStrings($associativeArray,$keyString,$strings,'strong');
+
+ } else {
+ return false;
+ }
+ }
+
+ //verify that the values of the associative array ($associativeArray) indicated by the key string ($keyString) match the regular expression $regExp
+ public function checkMatch($associativeArray,$keyString,$regExp = '/./')
+ {
+ if ($this->checkNotEmpty($associativeArray,$keyString))
+ {
+
+ return parent::checkMatch($associativeArray,$keyString,$regExp,'strong');
+
+ } else {
+ return false;
+ }
+ }
+} \ No newline at end of file
diff --git a/h-source/Library/Array/Validate/index.html b/h-source/Library/Array/Validate/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Array/Validate/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Array/index.html b/h-source/Library/Array/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Array/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/ArrayExt.php b/h-source/Library/ArrayExt.php
new file mode 100755
index 0000000..2b02c9e
--- /dev/null
+++ b/h-source/Library/ArrayExt.php
@@ -0,0 +1,80 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to manage arrays
+class ArrayExt {
+
+ public $errorString = null; //string containing the list fields not found
+ public $errorsNumb = null; //numbers of errors
+
+ //get the subset of the associative array $associativeArray defined by the keys in the string $keyString (keys separated by comma)
+ public function subset($associativeArray,$keyString,$func = 'none') {
+ if (!in_array($func,explode(',',Params::$allowedSanitizeFunc))) {
+ throw new Exception('"'.$func. '" argument not allowed in '.__METHOD__.' method');
+ }
+ $tempArray = array();
+ if (strcmp($keyString,'') !== 0) {
+ $keyArray=explode(',',$keyString);
+ for ($i = 0; $i < count($keyArray); $i++)
+ {
+ $temp = array();
+ //extract the function after the colon
+ if (strstr($keyArray[$i],':')) {
+ $temp = explode(':',$keyArray[$i]);
+ } else {
+ $temp[0] = $keyArray[$i];
+ $temp[1] = 'none';
+ }
+ //exception
+ if (!in_array($temp[1],explode(',',Params::$allowedSanitizeFunc))) {
+ throw new Exception('"'.$temp[1]. '" function not allowed');
+ }
+ if (array_key_exists($temp[0],$associativeArray)) {
+ $tempArray[$temp[0]] = call_user_func($temp[1],$associativeArray[$temp[0]]);
+ } else {
+ $tempArray[$temp[0]] = '';
+ }
+ }
+ }
+ return call_user_func($func.'Deep',$tempArray); //clean the array values
+ }
+
+ //exctract the complementary subset from an associative array ($associativeArray) of the subset identified by the keys $keyString
+ public function subsetComplementary($associativeArray,$keyString,$func = 'none') {
+ if (!in_array($func,explode(',',Params::$allowedSanitizeFunc))) {
+ throw new Exception('"'.$func. '" argument not allowed in '.__METHOD__.' method');
+ }
+ $keyArray=explode(',',$keyString);
+ $complementaryKeyArray = array();
+ $keys = array_keys($associativeArray);
+ foreach ($keys as $key) {
+ if (!in_array($key,$keyArray)) {
+ $complementaryKeyArray[] = $key;
+ }
+ }
+ $complementaryKeyString = implode(',',$complementaryKeyArray);
+ return $this->subset($associativeArray,$complementaryKeyString,$func);
+ }
+
+}
diff --git a/h-source/Library/Bootstrap.php b/h-source/Library/Bootstrap.php
new file mode 100755
index 0000000..5d7a12f
--- /dev/null
+++ b/h-source/Library/Bootstrap.php
@@ -0,0 +1,31 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+require_once (ROOT . DS . 'Config' . DS . 'Reporting.php');
+require_once (ROOT . DS . 'Config' . DS . 'Restricted.php');
+require_once (ROOT . DS . 'Config' . DS . 'Autoload.php');
+require_once (ROOT . DS . 'Library' . DS . 'Functions.php');
+require_once (ROOT . DS . 'Library' . DS . 'Strings' . DS . 'Functions.php');
+require_once (ROOT . DS . 'Library' . DS . 'ErrorReporting.php');
+require_once (ROOT . DS . 'Library' . DS . 'Call.php');
diff --git a/h-source/Library/BoxParser.php b/h-source/Library/BoxParser.php
new file mode 100644
index 0000000..0e7e03f
--- /dev/null
+++ b/h-source/Library/BoxParser.php
@@ -0,0 +1,86 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to parse an XML text in order to create the modules corresponding to the elements of the XML text.
+//the <type>module name</type> tag defines the name of the object that has to be instantiate and saved in the
+//$modules property (that is an array referencing different module objects) array(moduleObj1,moduleObj2, ...)
+//if the module class corresponding ot the <type>module name</type> tag does not exists, than no module is created and the next <type>module name</type> is checked
+class BoxParser {
+
+ public $modules = array(); //array referencing different module classes --> array(moduleObj1,moduleObj2, ...) See files inside the Application/Modules folder
+
+ //$simpleXMLText: it has to be an XML text
+ //$type; it can be string or file.
+ public function __construct($simpleXMLText, $type = 'string')
+ {
+ if ($type === 'string')
+ {
+ if (@simplexml_load_string($simpleXMLText))
+ {
+ $simpleXmlObj = simplexml_load_string($simpleXMLText);
+ $this->populate($simpleXmlObj);
+ }
+ }
+ else if ($type === 'file')
+ {
+ if (@simplexml_load_file($simpleXMLText))
+ {
+ $simpleXmlObj = simplexml_load_file($simpleXMLText);
+ $this->populate($simpleXmlObj);
+ }
+ }
+ }
+
+ //inistantiate the module objects and save them in the $this->modules property array
+ private function populate($simpleXmlObj)
+ {
+ foreach ($simpleXmlObj as $mod)
+ {
+ $className = 'Mod'.ucwords((string)$mod->type);
+ if (class_exists($className))
+ {
+ if (file_exists(ROOT . DS . APPLICATION_PATH . DS . 'Modules' . DS . $className . '.php'))
+ {
+ $newModule = new $className($mod);
+ if ($newModule instanceof ModAbstract)
+ {
+ $this->modules[] = $newModule;
+ }
+ }
+ }
+ }
+ }
+
+ //create the HTML of the modules
+ public function render()
+ {
+ $HTML = null;
+ foreach ($this->modules as $module)
+ {
+ $HTML .= $module->render();
+ }
+ return $HTML;
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Call.php b/h-source/Library/Call.php
new file mode 100755
index 0000000..c75508b
--- /dev/null
+++ b/h-source/Library/Call.php
@@ -0,0 +1,357 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+
+/* SANITIZE SUPERGLOBAL ARRAYS */
+function sanitizeSuperGlobal()
+{
+ $_GET = stripslashesDeep($_GET);
+
+ $_POST = stripslashesDeep($_POST);
+
+ $_COOKIE = stripslashesDeep($_COOKIE);
+
+ $_SERVER = stripslashesDeep($_SERVER);
+}
+
+
+
+function checkPostLength()
+{
+ if (MAX_POST_LENGTH !== 0)
+ {
+ foreach ($_POST as $key => $value)
+ {
+ if (strlen($value) > MAX_POST_LENGTH) die('the length of some of the $_POST values is too large');
+ }
+ }
+}
+
+function checkRequestUriLength()
+{
+ if (MAX_REQUEST_URI_LENGTH !== 0)
+ {
+ if (strlen($_SERVER['REQUEST_URI']) > MAX_REQUEST_URI_LENGTH) die('the length of the REQUEST_URI is too large');
+ }
+}
+
+function checkRegisterGlobals()
+{
+ if (ini_get('register_globals')) die('register globals is on: easyGiant works only with register globals off');
+}
+
+function callHook()
+{
+
+ $currentUrl = null;
+
+ if (MOD_REWRITE_MODULE === true)
+ {
+ $url = isset($_GET['url']) ? $_GET['url'] : DEFAULT_CONTROLLER . '/' . DEFAULT_ACTION;
+ }
+ else
+ {
+ $url = (strcmp(getQueryString(),"") !== 0) ? getQueryString() : DEFAULT_CONTROLLER . '/' . DEFAULT_ACTION;
+ }
+
+// rewrite the URL
+ if (Route::$rewrite === 'yes')
+ {
+ $res = rewrite($url);
+ $url = $res[0];
+ $currentUrl = $res[1];
+ }
+
+// echo $url;
+
+ $urlArray = array();
+ $urlArray = explode("/",$url);
+
+ $controller = DEFAULT_CONTROLLER;
+ $action = DEFAULT_ACTION;
+
+ if (isset($urlArray[0]))
+ {
+ $controller = (strcmp($urlArray[0],'') !== 0) ? strtolower(trim($urlArray[0])) : DEFAULT_CONTROLLER;
+ }
+
+ array_shift($urlArray);
+
+ if (isset($urlArray[0]))
+ {
+ $action = (strcmp($urlArray[0],'') !== 0) ? strtolower(trim($urlArray[0])) : DEFAULT_ACTION;
+ }
+
+ //set ERROR_CONTROLLER and ERROR_ACTION
+ $errorController = ERROR_CONTROLLER !== false ? ERROR_CONTROLLER : DEFAULT_CONTROLLER;
+ $errorAction = ERROR_ACTION !== false ? ERROR_ACTION : DEFAULT_ACTION;
+
+ /*
+ VERIFY THE ACTION NAME
+ */
+ if (method_exists('Controller', $action) or !ctype_alnum($action) or (strcmp($action,'') === 0))
+ {
+ $controller = $errorController;
+ $action = $errorAction;
+ $urlArray = array();
+ }
+
+ /*
+ VERIFY THE CONTROLLER NAME
+ */
+ if (!ctype_alnum($controller) or (strcmp($controller,'') === 0))
+ {
+ $controller = $errorController;
+ $action = $errorAction;
+ $urlArray = array();
+ }
+
+ //check that the controller class belongs to the application/controllers folder
+ //otherwise set the controller to the default controller
+ if (!file_exists(ROOT.DS.APPLICATION_PATH.DS.'Controllers'.DS.ucwords($controller).'Controller.php'))
+ {
+ $controller = $errorController;
+ $action = $errorAction;
+ $urlArray = array();
+ }
+
+ //set the controller class to DEFAULT_CONTROLLER if it doesn't exists
+ if (!class_exists(ucwords($controller).'Controller'))
+ {
+ $controller = $errorController;
+ $action = $errorAction;
+ $urlArray = array();
+ }
+
+ //set the action to DEFAULT_ACTION if it doesn't exists
+ if (!method_exists(ucwords($controller).'Controller', $action))
+ {
+ $controller = $errorController;
+ $action = $errorAction;
+ $urlArray = array();
+ }
+
+ /*
+ CHECK COUPLES CONTROLLER,ACTION
+ */
+ if (!in_array('all',Route::$allowed))
+ {
+ $couple = "$controller,$action";
+ if (!in_array($couple,Route::$allowed))
+ {
+ $controller = $errorController;
+ $action = $errorAction;
+ $urlArray = array();
+ }
+ }
+
+ array_shift($urlArray);
+ $queryString = $urlArray;
+ //set the name of the application
+ $application = $controller;
+ $controller = ucwords($controller);
+ $model = $controller;
+ $controller .= 'Controller';
+ $model .= 'Model';
+
+ //include the file containing the set of actions to carry out before the initialization of the controller class
+ Hooks::load(ROOT . DS . APPLICATION_PATH . DS . 'Hooks' . DS . 'BeforeInitialization.php');
+
+ if (class_exists($controller))
+ {
+ $dispatch = new $controller($model,$application,$queryString);
+
+ //pass the action to the controller object
+ $dispatch->action = $action;
+
+ $dispatch->currPage = $dispatch->baseUrl.'/'.$dispatch->controller.'/'.$dispatch->action;
+ if (isset($currentUrl))
+ {
+ $dispatch->currPage = $dispatch->baseUrl.'/'.$currentUrl;
+ }
+
+ //require the file containing the set of actions to carry out after the initialization of the controller class
+ Hooks::load(ROOT . DS . APPLICATION_PATH . DS . 'Hooks' . DS . 'AfterInitialization.php');
+
+ $templateFlag= true;
+
+ if (method_exists($controller, $action))
+ {
+ //pass the action to the theme object
+ $dispatch->theme->action = $action;
+ $dispatch->theme->currPage = $dispatch->baseUrl.'/'.$dispatch->controller.'/'.$dispatch->action;
+ if (isset($currentUrl))
+ {
+ $dispatch->theme->currPage = $dispatch->baseUrl.'/'.$currentUrl;
+ }
+
+ call_user_func_array(array($dispatch,$action),$queryString);
+ }
+ else
+ {
+ $templateFlag= false;
+ }
+
+ if ($templateFlag)
+ {
+ $dispatch->theme->render();
+ }
+
+ }
+ else
+ {
+ echo "<h2>the '$controller' controller is not present!</h2>";
+ }
+
+}
+
+
+//rewrite the URL
+function rewrite($url)
+{
+ foreach (Route::$map as $key => $address)
+ {
+ $oldKey = $key;
+ $key = str_replace('\/','/',$key);
+ $key = str_replace('/','\/',$key);
+ if (preg_match('/^'.$key.'/',$url))
+ {
+ $nurl = preg_replace('/^'.$key.'/',$address,$url);
+ return array($nurl,$oldKey);
+// return preg_replace('/^'.$key.'/',$address,$url);
+ }
+ }
+// return $url;
+ return array($url,null);
+}
+
+function getQueryString()
+{
+
+ if (strstr($_SERVER['REQUEST_URI'],'index.php/'))
+ {
+ return Params::$mbStringLoaded === true ? mb_substr(mb_strstr($_SERVER['REQUEST_URI'],'index.php/'),10) : substr(strstr($_SERVER['REQUEST_URI'],'index.php/'),10);
+ }
+
+ return '';
+}
+
+function __autoload($className)
+{
+
+ $backupName = $className;
+
+ if (strstr($className,'_'))
+ {
+ $parts = explode('_',$className);
+ $className = implode(DS,$parts);
+ }
+
+ if (file_exists(ROOT . DS . 'Library' . DS . $className . '.php'))
+ {
+ require_once(ROOT . DS . 'Library' . DS . $className . '.php');
+ }
+ else if (file_exists(ROOT . DS . APPLICATION_PATH . DS . 'Controllers' . DS . $backupName . '.php'))
+ {
+ require_once(ROOT . DS . APPLICATION_PATH . DS . 'Controllers' . DS . $backupName . '.php');
+ }
+ else if (file_exists(ROOT . DS . APPLICATION_PATH . DS . 'Models' . DS . $backupName . '.php'))
+ {
+ require_once(ROOT . DS . APPLICATION_PATH . DS . 'Models' . DS . $backupName . '.php');
+ }
+ else if (file_exists(ROOT . DS . APPLICATION_PATH . DS . 'Modules' . DS . $backupName . '.php'))
+ {
+ require_once(ROOT . DS . APPLICATION_PATH . DS . 'Modules' . DS . $backupName . '.php');
+ }
+ else if (file_exists(ROOT . DS . APPLICATION_PATH . DS . 'Strings' . DS . $className . '.php'))
+ {
+ require_once(ROOT . DS . APPLICATION_PATH . DS . 'Strings' . DS . $className . '.php');
+ }
+
+}
+
+try {
+
+ //check the length of the $_POST values
+ checkPostLength();
+
+ //check the length of the REQUEST_URI
+ checkRequestUriLength();
+
+ //connect to the database
+ Factory_Db::getInstance(DATABASE_TYPE,array(HOST,USER,PWD,DB));
+
+ //set htmlentities charset
+ switch (DEFAULT_CHARSET)
+ {
+ case 'SJIS':
+ Params::$htmlentititiesCharset = 'Shift_JIS';
+ break;
+ }
+
+ $allowedCharsets = array('UTF-8','ISO-8859-1','EUC-JP','SJIS');
+ if (!in_array(DEFAULT_CHARSET,$allowedCharsets)) die('charset not-allowed');
+
+ //check if the mbstring extension is loaded
+ if (extension_loaded('mbstring'))
+ {
+ //set the internal encoding
+ mb_internal_encoding(DEFAULT_CHARSET);
+ Params::$mbStringLoaded = true;
+ }
+
+ //load the files defined inside Config/Autoload.php
+ foreach (Autoload::$files as $file)
+ {
+ $ext = strtolower(end(explode('.', $file)));
+ $path = ROOT . DS . APPLICATION_PATH . DS . 'Include' . DS . $file;
+ if (file_exists($path) and $ext === 'php')
+ {
+ require_once($path);
+ }
+ }
+
+ //include the file containing the set of actions to carry out before the check of the super global array
+ Hooks::load(ROOT . DS . APPLICATION_PATH . DS . 'Hooks' . DS . 'BeforeChecks.php');
+
+ //sanitize super global arrays
+ sanitizeSuperGlobal();
+
+ //report errors
+ ErrorReporting();
+
+ //verify that register globals is not active
+ checkRegisterGlobals();
+
+ //call the main hook
+ callHook();
+
+ //disconnect to the database
+ Factory_Db::disconnect(DATABASE_TYPE);
+
+} catch (Exception $e) {
+
+ echo '<div class="alert">Message: '.$e->getMessage().'</div>';
+
+} \ No newline at end of file
diff --git a/h-source/Library/Controller.php b/h-source/Library/Controller.php
new file mode 100755
index 0000000..b0eef53
--- /dev/null
+++ b/h-source/Library/Controller.php
@@ -0,0 +1,321 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Controller {
+
+ protected $m = array(); //associative array referencing different models
+ protected $h = array(); //associative array referencing different helpers
+ protected $s = array(); //associative array referencing different sessions objects (users_checkAdmin objects: see library/users/checkAdmin.php)
+ protected $c = array(); //associative array referencing different controllers
+
+ protected $_queryString = array(); //the array of args coming from the url
+
+ public $controller;
+ public $action;
+ public $currPage; //the URL of the current page
+
+ public $request = null; //reference to a Request object
+
+ public $modelName;
+
+ public $argKeys = array(); //the array of keys representing the status args of the view action of the controller (validate function after colon)
+ public $argDefault = array(); //the array containing the default values of the $viewArgs array
+
+ public $argFunc = array(); //the array containing the functions to be applied upon the $viewArgs array
+
+ public $viewArgs = array(); //the associative array representing the status args of the main action of the controller. It is the combination of $argKeys and $queryString
+ public $viewStatus = ''; //string containing the additional url string to get the status of the view action of the controller (derived from $this->viewArgs)
+
+ public $theme;
+ public $baseUrl = null; //the base url of the website: http://domainname
+ public $baseUrlSrc = null; //the base url of the website (http://domainname) if MOD_REWRITE_MODULE has been set to false
+
+ public $headerObj; //reference to headerObj class
+
+// protected $_users; //object to manage access
+
+ protected $scaffold = null; //the reference to the scaffold object
+
+ function __construct($model, $controller, $queryString = array()) {
+ $this->controller = $controller;
+ $this->modelName = $model;
+ $this->_queryString = $queryString;
+
+ $this->theme = new Theme($controller);
+ $this->baseUrl = $this->theme->baseUrl;
+ $this->baseUrlSrc = $this->theme->baseUrlSrc;
+
+ $this->headerObj = new HeaderObj(DOMAIN_NAME);
+ $this->request = new Request();
+ }
+
+ //redirect to $path after the time $time
+ final public function redirect($path,$time = 0,$string = null)
+ {
+ $this->headerObj->redirect($path,$time,$string);
+ }
+
+ //set the $_data structure of the theme
+ final public function set($value)
+ {
+ $this->theme->set($value);
+ }
+
+ //append values to the $_data structure of the theme
+ final public function append($value)
+ {
+ $this->theme->append($value);
+ }
+
+ //load a view file
+ final public function load($viewFile,$option = 'none') {
+ $this->theme->load($viewFile,$option);
+ }
+
+ //clean the array containing the view files to load
+ final public function clean() {
+ $this->theme->clean();
+ }
+
+ //load an helper class
+ final function helper($helperName) {
+ $args = func_get_args();
+ array_shift($args);
+ $name = 'Helper_'.$helperName;
+ if (class_exists($name))
+ {
+ $this->h[$helperName] = new $name();
+
+ if ($this->h[$helperName] instanceof Helper_Html) {
+ $this->h[$helperName]->viewArgs = $this->viewArgs;
+ $this->h[$helperName]->viewStatus = $this->viewStatus;
+ }
+
+ if (method_exists($this->h[$helperName], 'build')) {
+ call_user_func_array(array($this->h[$helperName],'build'),$args);
+ }
+ }
+
+ }
+
+ //load a model class
+ //$name: the name of the model class
+ final public function model($name = null) {
+ $modelName = isset($name) ? $name : $this->modelName;
+ if (class_exists($modelName)) {
+ $this->m[$modelName] = new $modelName();
+ } else {
+ throw new Exception('Error in '.__METHOD__.': class "'.$modelName.'" has not been defined');
+ }
+ }
+
+ //load a controller
+ //$controllerName: the name of the controller class to load
+ final public function controller($controller)
+ {
+ if (class_exists($controller)) {
+ $model = str_replace('Controller',null,$controller).'Model';
+ $application = strtolower(str_replace('Controller',null,$controller));
+ $this->c[$controller] = new $controller($model,$application,array());
+ $this->c[$controller]->theme = $this->theme;
+ }
+ }
+
+ //load a users_checkAdmin class
+ //$sessonType: the type of session. It can be 'admin' (in the case of the access of an admin user) or 'registered' (in the case of the access of a registerd user)
+ final public function session($sessionType = 'admin') {
+ $sessionTypeArray = array('admin','registered');
+ if (!in_array($sessionType,$sessionTypeArray)) {
+ throw new Exception('Error in '.__METHOD__.': the session type can be \'admin\' or \'registered\' only');
+ }
+ //admin session
+ if ($sessionType === 'admin') {
+ $params = array(
+ 'users_controller' => ADMIN_USERS_CONTROLLER,
+ 'users_login_action' => ADMIN_USERS_LOGIN_ACTION,
+ 'panel_controller' => ADMIN_PANEL_CONTROLLER,
+ 'panel_main_action' => ADMIN_PANEL_MAIN_ACTION,
+ 'cookie_name' => ADMIN_COOKIE_NAME,
+ 'sessionsTable' => ADMIN_SESSIONS_TABLE,
+ 'usersTable' => ADMIN_USERS_TABLE,
+ 'groupsTable' => ADMIN_GROUPS_TABLE,
+ 'manyToManyTable' => ADMIN_MANYTOMANY_TABLE,
+ 'accessesTable' => ADMIN_ACCESSES_TABLE,
+ 'session_expire' => ADMIN_SESSION_EXPIRE,
+ 'cookie_path' => ADMIN_COOKIE_PATH,
+ 'database_type' => DATABASE_TYPE,
+ 'hijacking_check' => ADMIN_HIJACKING_CHECK,
+ 'on_hijacking_event' => ADMIN_ON_HIJACKING_EVENT,
+ 'hijacking_action' => ADMIN_HIJACKING_ACTION,
+ 'time_after_failure' => ADMIN_TIME_AFTER_FAILURE,
+ 'password_hash' => PASSWORD_HASH,
+ 'cookie_domain' => ADMIN_COOKIE_DOMAIN,
+ 'cookie_secure' => ADMIN_COOKIE_SECURE
+ );
+ $this->s['admin'] = new Users_CheckAdmin($params);
+ }
+ //registered session
+ if ($sessionType === 'registered') {
+ $params = array(
+ 'users_controller' => REG_USERS_CONTROLLER,
+ 'users_login_action' => REG_USERS_LOGIN_ACTION,
+ 'panel_controller' => REG_PANEL_CONTROLLER,
+ 'panel_main_action' => REG_PANEL_MAIN_ACTION,
+ 'cookie_name' => REG_COOKIE_NAME,
+ 'sessionsTable' => REG_SESSIONS_TABLE,
+ 'usersTable' => REG_USERS_TABLE,
+ 'groupsTable' => REG_GROUPS_TABLE,
+ 'manyToManyTable' => REG_MANYTOMANY_TABLE,
+ 'accessesTable' => REG_ACCESSES_TABLE,
+ 'session_expire' => REG_SESSION_EXPIRE,
+ 'cookie_path' => REG_COOKIE_PATH,
+ 'database_type' => DATABASE_TYPE,
+ 'hijacking_check' => REG_HIJACKING_CHECK,
+ 'on_hijacking_event' => REG_ON_HIJACKING_EVENT,
+ 'hijacking_action' => REG_HIJACKING_ACTION,
+ 'time_after_failure' => REG_TIME_AFTER_FAILURE,
+ 'password_hash' => PASSWORD_HASH,
+ 'cookie_domain' => REG_COOKIE_DOMAIN,
+ 'cookie_secure' => REG_COOKIE_SECURE
+ );
+ $this->s['registered'] = new Users_CheckAdmin($params);
+ }
+ }
+
+ //method to set $this->argKeys. Chenge the string in the array!
+ final public function setArgKeys($argKeys) {
+// $this->argKeys = explode(',',$argKeys);
+ $this->argKeys = array_keys($argKeys);
+ $this->argDefault = array_values($argKeys);
+ }
+
+ //shift the $this->_queryString array a number of times equal to the number indicated by the $number variable and build the $this->viewArgs array and the $this->viewStatus string (additional url)
+ final public function shift($number = 0) {
+
+ //save the query string array
+ $oldQueryString = $this->_queryString;
+
+ for ($i = 0; $i < $number; $i++)
+ {
+ array_shift($this->_queryString);
+ }
+ $this->callInArgKeysFunc();
+ for ($i = 0; $i < count($this->argKeys); $i++)
+ {
+ if (isset($_GET[$this->argKeys[$i]]) and strcmp($_GET[$this->argKeys[$i]],'') !== 0)
+ {
+ $this->viewArgs[$this->argKeys[$i]] = $this->request->get($this->argKeys[$i],'',$this->argFunc[$i]);
+ continue;
+ }
+ if (!isset($this->_queryString[$i])) {
+ $this->viewArgs[$this->argKeys[$i]] = isset($this->argDefault[$i]) ? $this->argDefault[$i] : null;
+ continue;
+ }
+ $this->viewArgs[$this->argKeys[$i]] = $this->_queryString[$i];
+ }
+ $this->viewStatus = Url::createUrl(array_values($this->viewArgs));
+ $this->updateHelpers();
+
+ //update the theme
+ $this->theme->viewStatus = $this->viewStatus;
+ $this->theme->viewArgs = $this->viewArgs;
+
+ //restore the query string array
+ $this->_queryString = $oldQueryString;
+ }
+
+ //call the functions defined in $this->argKeys after the colon (ex- 'page:forceInt' => apply the forceInt() function upon the $page arg)
+ final public function callInArgKeysFunc() {
+ for ($i = 0; $i < count($this->argKeys); $i++) {
+
+ $this->argFunc[$i] = 'none';
+
+ if (strstr($this->argKeys[$i],':')) {
+ $temp = explode(':',$this->argKeys[$i]);
+
+ $this->argFunc[$i] = $temp[1];
+
+ //exception
+ if (!in_array($temp[1],explode(',',params::$allowedSanitizeFunc))) {
+ throw new Exception('"'.$temp[1]. '" function not allowed in $this->argKeys');
+ }
+ $this->argKeys[$i] = $temp[0];
+ if (!isset($this->_queryString[$i])) {
+ continue;
+ }
+ $this->_queryString[$i] = call_user_func($temp[1],$this->_queryString[$i]);
+ }
+ }
+ }
+
+ //function to update all the Helper that are instance of the HtmlHelper class. This function update the $viesArgs and $viewStatus properties. This function is called by the shift method.
+ final public function updateHelpers() {
+ foreach ($this->h as $Helper) {
+ if ($Helper instanceof Helper_Html) {
+ $Helper->viewArgs = $this->viewArgs;
+ $Helper->viewStatus = $this->viewStatus;
+ }
+ }
+ }
+
+ //create the viewStatus property
+ final public function buildStatus()
+ {
+ $this->viewStatus = Url::createUrl(array_values($this->viewArgs));
+ //update the theme
+ $this->theme->viewStatus = $this->viewStatus;
+ $this->theme->viewArgs = $this->viewArgs;
+ }
+
+ //method to instanciate the scaffold
+ final public function loadScaffold($type,$params = null) {
+
+ $typeArray = array('main','form');
+ if (!in_array($type,$typeArray)) {
+ throw new Exception("the type '$type' is not allowed in ".__METHOD__);
+ }
+ $this->scaffold = new Scaffold($type,$this->controller,$this->m[$this->modelName],$this->viewArgs,$params);
+
+ $this->helper('Menu',$this->controller,$this->scaffold->params['panelController']);
+ $this->scaffold->mainMenu = $this->h['Menu'];
+
+ $this->m[$this->modelName]->popupBuild();
+ $popupArray = $this->m[$this->modelName]->popupArray;
+
+ if ($type === 'main') {
+
+ $here = $this->controller.'/'.$this->scaffold->params['mainAction'];
+ $this->helper('Pages',$here,$this->scaffold->params['pageVariable']);
+ $this->helper('List',$this->m[$this->modelName]->identifierName,$here,$this->scaffold->params['pageVariable']);
+
+
+ $this->helper('Popup',$here,$popupArray,$this->scaffold->params['popupType'],$this->scaffold->params['pageVariable'],true);
+
+ $this->scaffold->pageList = $this->h['Pages'];
+ $this->scaffold->itemList = $this->h['List'];
+ $this->scaffold->popupMenu = $this->h['Popup'];
+ }
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Db/Mysql.php b/h-source/Library/Db/Mysql.php
new file mode 100755
index 0000000..4561a1b
--- /dev/null
+++ b/h-source/Library/Db/Mysql.php
@@ -0,0 +1,446 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to manage the database
+//singleton!
+class Db_Mysql {
+
+ public $query = null; //the last query executed
+ public $charsetError = true; //true: non eccor occurred during the modification of the connection charset, false: one error occurred
+ public $charset = null; //the charset of the client connection
+
+ private static $instance = null; //instance of this class
+
+ private $dblink;
+ private $fieldsType = array('tinyint','smallint','int','mediumint','bigint','float','double');
+ /**
+
+ *connect to the database
+ *'host','user','password','db_name'
+
+ */
+
+ //PHP-Mysql charset translation table
+ private $charsetTranslationTable = array(
+ 'UTF-8' => 'utf8',
+ 'ISO-8859-1' => 'latin1',
+ 'EUC-JP' => 'ujis',
+ 'SJIS' => 'sjis'
+ );
+
+ private function __construct($host,$user,$pwd,$db_name)
+ {
+
+ $this->dblink = mysql_connect($host,$user,$pwd);
+
+ if ($this->dblink === FALSE) {
+ die ("Connection error. Verify parameters in config.php");
+ }
+
+ $db2 = mysql_select_db($db_name, $this->dblink)
+ or die ("Database selection error. Verify parameters in config.php");
+
+ $charset = array_key_exists(DEFAULT_CHARSET,$this->charsetTranslationTable) ? $this->charsetTranslationTable[DEFAULT_CHARSET] : 'utf8';
+
+ if (!@mysql_set_charset($charset,$this->dblink)) $this->charsetError = false;
+
+ $this->charset = mysql_client_encoding();
+ }
+
+ public static function getInstance($host = null, $user = null, $pwd = null, $db_name = null)
+ {
+ if (!isset(self::$instance)) {
+ $className = __CLASS__;
+ self::$instance = new $className($host,$user,$pwd,$db_name);
+ }
+
+ return self::$instance;
+ }
+
+
+ //close the connection
+ public function disconnect()
+ {
+ mysql_close($this->dblink);
+ }
+
+ //the text of the error message from previous MySQL operation
+ public function getError()
+ {
+ return mysql_error($this->dblink);
+ }
+
+ //the numerical value of the error message from previous MySQL operation
+ public function getErrno()
+ {
+ return mysql_errno($this->dblink);
+ }
+
+ public function getJoinString($string)
+ {
+ if (strstr($string,':'))
+ {
+ $tArray = explode(':',$string);
+ switch($tArray[0])
+ {
+ case 'i':
+ $jString = ' INNER JOIN ' . $tArray[1];
+ break;
+ case 'l':
+ $jString = ' LEFT JOIN ' . $tArray[1];
+ break;
+ case 'r':
+ $jString = ' RIGHT JOIN ' . $tArray[1];
+ break;
+ default:
+ $jString = ' INNER JOIN ' . $tArray[1];
+ break;
+ }
+ return $jString;
+ }
+ else
+ {
+ return ' INNER JOIN '.$string;
+ }
+ }
+
+ public function createSelectQuery($table,$fields='*',$where=null,$group_by=null,$order_by=null,$limit=null,$on=array(),$using=array(),$join=array())
+ {
+ $maxValue = max(count($on),count($using),count($join));
+
+ $joinString = null;
+ for ($i=0; $i < $maxValue; $i++)
+ {
+ $joinString .= isset($join[$i]) ? $this->getJoinString($join[$i]) : null;
+ if (isset($using[$i]))
+ {
+ $joinString .= ' USING ('.$using[$i].')';
+ }
+ else if (isset($on[$i]))
+ {
+ $joinString .= ' ON '.$on[$i];
+ }
+ }
+
+ if (isset($where))
+ {
+ $where='WHERE '.$where;
+ }
+ if (isset($order_by)) {
+ $order_by='ORDER BY '.$order_by;
+ }
+ if (isset($group_by)) {
+ $group_by='GROUP BY '.$group_by;
+ }
+ if (isset($limit)) {
+ $limit='LIMIT '.$limit;
+ }
+
+ $query="SELECT $fields FROM $table $joinString $where $group_by $order_by $limit;";
+ return $query;
+ }
+
+ public function get_num_rows($table,$where=null,$group_by=null,$on=array(),$using=array(),$join=array()) {
+
+ $query = $this->createSelectQuery($table,'*',$where,$group_by,null,null,$on,$using,$join);
+
+ $this->query=$query;
+
+ $ris = mysql_query($query);
+ if ($ris) {
+ $num_rows = mysql_num_rows($ris);
+ return $num_rows;
+ } else {
+ return false;
+ }
+ }
+
+ //get the maximum value of the field $field of the table $table having the $where conditions
+ public function getMath($func,$table,$field,$where=null,$group_by = null, $on=array(),$using=array(),$join=array())
+ {
+ $query = $this->createSelectQuery($table,"$func($field) AS m",$where,$group_by,null,null,$on,$using,$join);
+
+ $this->query = $query;
+ $result = mysql_query($query);
+ if ($result)
+ {
+ $row = mysql_fetch_array($result);
+ return $row['m'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ //get the maximum value of the field $field of the table $table having the $where conditions
+ public function getMax($table,$field,$where=null,$group_by = null,$on=array(),$using=array(),$join=array())
+ {
+ return $this->getMath('MAX',$table,$field,$where,$group_by,$on,$using,$join);
+ }
+
+ //get the minimum value of the field $field of the table $table having the $where conditions
+ public function getMin($table,$field,$where=null,$group_by = null,$on=array(),$using=array(),$join=array())
+ {
+ return $this->getMath('MIN',$table,$field,$where,$group_by,$on,$using,$join);
+ }
+
+ //get the sum of the fields
+ public function getSum($table,$field,$where=null,$group_by = null,$on=array(),$using=array(),$join=array())
+ {
+ return $this->getMath('SUM',$table,$field,$where,$group_by,$on,$using,$join);
+ }
+
+ //get the average of the fields
+ public function getAvg($table,$field,$where=null,$group_by = null,$on=array(),$using=array(),$join=array())
+ {
+ return $this->getMath('AVG',$table,$field,$where,$group_by,$on,$using,$join);
+ }
+
+ public function select($table,$fields='*',$where=null,$group_by=null,$order_by=null,$limit=null,$on=array(),$using=array(),$join=array())
+ {
+ $query = $this->createSelectQuery($table,$fields,$where,$group_by,$order_by,$limit,$on,$using,$join);
+
+ $this->query = $query;
+ $result = mysql_query($query);
+ return $this->getData($result);
+ }
+
+
+// public function select($table,$fields='*',$where=null,$group_by=null,$order_by=null,$limit=null) {
+// $query = $this->selectQuery($table,$fields,$where,$group_by,$order_by,$limit);
+// return $this->getData($query);
+// }
+
+
+ //obtain an associative array containing the result values (keys:tableName_fieldsName)
+ //$par = 'single/multi' single table,multi table
+ public function getData($result)
+ {
+ $data = array(); //data from the query
+ $temp = array(); //temporary array (values of a single record)
+// $result = mysql_query($query);
+ if ($result)
+ {
+ $fieldsNumber = mysql_num_fields($result);
+ while ($row = mysql_fetch_array($result))
+ {
+ for ($i = 0;$i < $fieldsNumber;$i++)
+ {
+ $tableName = mysql_field_table($result, $i);
+ if (strcmp($tableName,'') === 0) $tableName = Params::$aggregateKey;
+ $fieldName = mysql_field_name($result, $i);
+ $temp[$tableName][$fieldName] = $row[$i];
+ }
+ array_push($data,$temp);
+ }
+ return $data;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ //return an array containing all the types of the fields (indicated in $fields) of a table (indicated in $table)
+ public function getTypes($table, $fields)
+ {
+ $query = "DESCRIBE $table;";
+ $result = mysql_query($query);
+ $temp = array();
+ while ($row = mysql_fetch_assoc($result)) {
+ $temp[$row['Field']] = reset(explode('(',$row['Type']));
+ }
+
+ $types = array();
+ $fields = explode(',',$fields);
+ for ($i = 0; $i < count($fields); $i++)
+ {
+ if (!array_key_exists($fields[$i],$temp)) return false;
+ $types[] = $temp[$fields[$i]];
+ }
+
+ return $types;
+ }
+
+ public function insert($table,$fields,$values) {
+
+ #$table is a string
+ #$fields has to be a string with comma as separator: name1,name2,...
+ #$values has to be an array
+ $values = array_values($values);
+ if (strcmp($fields,'') !== 0)
+ {
+ //get the type of the fields
+ $types = $this->getTypes($table,$fields);
+ if (!$types) return false;
+
+ for($i = 0; $i < count($values); $i++)
+ {
+ if (!in_array($types[$i],$this->fieldsType))
+ {
+ $values[$i] = '"'.$values[$i].'"';
+ }
+ else
+ {
+ if (strcmp($values[$i],'') === 0) $values[$i] = '"'.$values[$i].'"';
+ }
+ }
+
+ $values = implode(',',$values);
+ $query="INSERT INTO $table ($fields) VALUES ($values);";
+ $this->query = $query;
+ $ris = mysql_query($query);
+
+ #check the result
+ if ($ris) {
+ return true;
+ } else {
+ return false;
+ }
+
+ } else {
+ return false;
+ }
+ }
+
+ // Retrieves the ID generated for an AUTO_INCREMENT column by the previous query (usually INSERT).
+ public function lastId()
+ {
+ return mysql_insert_id();
+ }
+
+ public function update($table,$fields,$values,$where) {
+
+ #$table and $where are two strings
+ #$fields has to be a string with comma as separator: name1,name2,...
+ #$values has to be an array
+ $values = array_values($values);
+// if (isset($where)) {
+ $where='WHERE '.$where;
+// }
+ #get the array from the $fields string
+ if (strcmp($fields,'') !== 0)
+ {
+ //get the type of the fields
+ $types = $this->getTypes($table,$fields);
+ if (!$types) return false;
+
+ $fields=explode(',',$fields);
+ $str=array();
+
+ for ($i=0;$i<count($fields);$i++) {
+ if (!in_array($types[$i],$this->fieldsType))
+ {
+ $values[$i] = '"'.$values[$i].'"';
+ }
+ else
+ {
+ if (strcmp($values[$i],'') === 0) $values[$i] = '"'.$values[$i].'"';
+ }
+ $str[$i]= $fields[$i].'='.$values[$i];
+ }
+
+ #set the string name1=value1,name2=...
+ $str=implode(',',$str);
+ $query="UPDATE $table SET $str $where;";
+ $this->query=$query;
+ $ris = mysql_query($query);
+
+ #check the result
+ if ($ris) {
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+
+ }
+
+
+ public function del($table,$where) {
+
+ #$table and $where are two strings
+// if (isset($where)) {
+ $where='WHERE '.$where;
+// }
+ $query="DELETE FROM $table $where;";
+ $this->query=$query;
+ $ris = mysql_query($query);
+ #check the result
+
+ if ($ris) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+ // function to check if exist the record having the field $id_name=$id_value
+ public function recordExists($table,$fieldName,$fieldValue,$where = null,$groupBy=null,$on=array(),$using=array(),$join=array())
+ {
+ if (isset($where))
+ {
+ $where=' AND '.$where;
+ }
+
+ $fieldValue = '"'.$fieldValue.'"';
+
+ $num=$this->get_num_rows($table,$fieldName.'='.$fieldValue.$where,$groupBy,$on,$using,$join);
+ $res=($num>0) ? true : false;
+ return $res;
+
+ }
+
+
+ //send a generic query to the database
+ //$query: the query to be sent
+ public function query($query)
+ {
+ $this->query = $query;
+ $result = mysql_query($query);
+ if ($result === false)
+ {
+ return false;
+ }
+ else if ($result === true)
+ {
+ return true;
+ }
+ else if (@get_resource_type($result))
+ {
+ return $this->getData($result);
+ }
+ }
+
+ // Prevent users to clone the instance
+ public function __clone()
+ {
+ throw new Exception('error in '. __METHOD__.': clone is not allowed');
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Db/Mysqli.php b/h-source/Library/Db/Mysqli.php
new file mode 100644
index 0000000..df57a54
--- /dev/null
+++ b/h-source/Library/Db/Mysqli.php
@@ -0,0 +1,452 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to manage the database
+//singleton!
+class Db_Mysqli
+{
+
+ public $query = null; //the last query executed
+ public $charsetError = true; //true: non eccor occurred during the modification of the connection charset, false: one error occurred
+ public $charset = null; //the charset of the client connection
+
+ private static $instance = null; //instance of this class
+
+ private $db;
+ private $fieldsType = array('tinyint','smallint','int','mediumint','bigint','float','double');
+
+ //PHP-Mysql charset translation table
+ private $charsetTranslationTable = array(
+ 'UTF-8' => 'utf8',
+ 'ISO-8859-1' => 'latin1',
+ 'EUC-JP' => 'ujis',
+ 'SJIS' => 'sjis'
+ );
+
+ /**
+
+ *connect to the database
+ *'host','user','password','db_name'
+
+ */
+
+ private function __construct($host,$user,$pwd,$db_name)
+ {
+
+ $this->db = new mysqli($host,$user,$pwd,$db_name);
+
+ if (mysqli_connect_error())
+ {
+ die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+ }
+
+ $charset = array_key_exists(DEFAULT_CHARSET,$this->charsetTranslationTable) ? $this->charsetTranslationTable[DEFAULT_CHARSET] : 'utf8';
+
+ if (!@$this->db->set_charset($charset)) $this->charsetError = false;
+
+ $this->charset = $this->db->character_set_name();
+
+ }
+
+ //return the $this->db property
+ public function getDb()
+ {
+ return $this->db;
+ }
+
+ public static function getInstance($host = null, $user = null, $pwd = null, $db_name = null)
+ {
+ if (!isset(self::$instance)) {
+ $className = __CLASS__;
+ self::$instance = new $className($host,$user,$pwd,$db_name);
+ }
+
+ return self::$instance;
+ }
+
+
+ //close the connection
+ public function disconnect()
+ {
+ $this->db->close();
+ }
+
+ //the text of the error message from previous MySQL operation
+ public function getError()
+ {
+ return $this->db->error;
+ }
+
+ //the numerical value of the error message from previous MySQL operation
+ public function getErrno()
+ {
+ return $this->db->errno;
+ }
+
+ public function getJoinString($string)
+ {
+ if (strstr($string,':'))
+ {
+ $tArray = explode(':',$string);
+ switch($tArray[0])
+ {
+ case 'i':
+ $jString = ' INNER JOIN ' . $tArray[1];
+ break;
+ case 'l':
+ $jString = ' LEFT JOIN ' . $tArray[1];
+ break;
+ case 'r':
+ $jString = ' RIGHT JOIN ' . $tArray[1];
+ break;
+ default:
+ $jString = ' INNER JOIN ' . $tArray[1];
+ break;
+ }
+ return $jString;
+ }
+ else
+ {
+ return ' INNER JOIN '.$string;
+ }
+ }
+
+ public function createSelectQuery($table,$fields='*',$where=null,$group_by=null,$order_by=null,$limit=null,$on=array(),$using=array(),$join=array())
+ {
+ $maxValue = max(count($on),count($using),count($join));
+
+ $joinString = null;
+ for ($i=0; $i < $maxValue; $i++)
+ {
+ $joinString .= isset($join[$i]) ? $this->getJoinString($join[$i]) : null;
+ if (isset($using[$i]))
+ {
+ $joinString .= ' USING ('.$using[$i].')';
+ }
+ else if (isset($on[$i]))
+ {
+ $joinString .= ' ON '.$on[$i];
+ }
+ }
+
+ if (isset($where))
+ {
+ $where='WHERE '.$where;
+ }
+ if (isset($order_by)) {
+ $order_by='ORDER BY '.$order_by;
+ }
+ if (isset($group_by)) {
+ $group_by='GROUP BY '.$group_by;
+ }
+ if (isset($limit)) {
+ $limit='LIMIT '.$limit;
+ }
+
+ $query="SELECT $fields FROM $table $joinString $where $group_by $order_by $limit;";
+ return $query;
+ }
+
+ public function get_num_rows($table,$where=null,$group_by=null,$on=array(),$using=array(),$join=array()) {
+
+ $query = $this->createSelectQuery($table,'*',$where,$group_by,null,null,$on,$using,$join);
+
+ $this->query = $query;
+ $ris = $this->db->query($query);
+ if ($ris) {
+ $num_rows = $ris->num_rows;
+ $ris->close();
+ return $num_rows;
+ } else {
+ return false;
+ }
+ }
+
+ public function getMath($func,$table,$field,$where=null,$group_by = null, $on=array(),$using=array(),$join=array())
+ {
+ $query = $this->createSelectQuery($table,"$func($field) AS m",$where,$group_by,null,null,$on,$using,$join);
+
+ $this->query = $query;
+ $result = $this->db->query($query);
+ if ($result)
+ {
+ $row = $result->fetch_array();
+ $result->close();
+ return $row['m'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ //get the maximum value of the field $field of the table $table having the $where conditions
+ public function getMax($table,$field,$where=null,$group_by = null,$on=array(),$using=array(),$join=array())
+ {
+ return $this->getMath('MAX',$table,$field,$where,$group_by,$on,$using,$join);
+ }
+
+ //get the minimum value of the field $field of the table $table having the $where conditions
+ public function getMin($table,$field,$where=null,$group_by = null,$on=array(),$using=array(),$join=array())
+ {
+ return $this->getMath('MIN',$table,$field,$where,$group_by,$on,$using,$join);
+ }
+
+ //get the sum of the fields
+ public function getSum($table,$field,$where=null,$group_by = null,$on=array(),$using=array(),$join=array())
+ {
+ return $this->getMath('SUM',$table,$field,$where,$group_by,$on,$using,$join);
+ }
+
+ //get the average of the fields
+ public function getAvg($table,$field,$where=null,$group_by = null,$on=array(),$using=array(),$join=array())
+ {
+ return $this->getMath('AVG',$table,$field,$where,$group_by,$on,$using,$join);
+ }
+
+ public function select($table,$fields='*',$where=null,$group_by=null,$order_by=null,$limit=null,$on=array(),$using=array(),$join=array())
+ {
+ $query = $this->createSelectQuery($table,$fields,$where,$group_by,$order_by,$limit,$on,$using,$join);
+
+ $this->query = $query;
+ $result = $this->db->query($query);
+ return $this->getData($result);
+ }
+
+
+// public function select($table,$fields='*',$where=null,$group_by=null,$order_by=null,$limit=null) {
+// $query = $this->selectQuery($table,$fields,$where,$group_by,$order_by,$limit);
+// return $this->getData($query);
+// }
+
+
+ //obtain an associative array containing the result values (keys:tableName_fieldsName)
+ //$par = 'single/multi' single table,multi table
+ public function getData($result) {
+ $data = array(); //data from the query
+ $temp = array(); //temporary array (values of a single record)
+// $result = $this->db->query($query);
+ if ($result) {
+ $fieldsNumber = $result->field_count;
+ while ($row = $result->fetch_array()) {
+ for ($i = 0;$i < $fieldsNumber;$i++) {
+ $finfo = $result->fetch_field_direct($i);
+ $tableName = $finfo->table;
+ if (strcmp($tableName,'') === 0) $tableName = Params::$aggregateKey;
+ $fieldName = $finfo->name;
+ $temp[$tableName][$fieldName] = $row[$i];
+ }
+ array_push($data,$temp);
+ }
+ $result->close();
+ return $data;
+ } else {
+ return false;
+ }
+ }
+
+ //return an array containing all the types of the fields (indicated in $fields) of a table (indicated in $table)
+ public function getTypes($table, $fields)
+ {
+ $query = "DESCRIBE $table;";
+ $result = $this->db->query($query);
+ $temp = array();
+ while ($row = $result->fetch_assoc()) {
+ $temp[$row['Field']] = reset(explode('(',$row['Type']));
+ }
+ $result->close();
+
+ $types = array();
+ $fields = explode(',',$fields);
+ for ($i = 0; $i < count($fields); $i++)
+ {
+ if (!array_key_exists($fields[$i],$temp)) return false;
+ $types[] = $temp[$fields[$i]];
+ }
+
+ return $types;
+ }
+
+ public function insert($table,$fields,$values) {
+
+ #$table is a string
+ #$fields has to be a string with comma as separator: name1,name2,...
+ #$values has to be an array
+ $values = array_values($values);
+ if (strcmp($fields,'') !== 0)
+ {
+ //get the type of the fields
+ $types = $this->getTypes($table,$fields);
+ if (!$types) return false;
+
+ for($i = 0; $i < count($values); $i++)
+ {
+ if (!in_array($types[$i],$this->fieldsType))
+ {
+ $values[$i] = '"'.$values[$i].'"';
+ }
+ else
+ {
+ if (strcmp($values[$i],'') === 0) $values[$i] = '"'.$values[$i].'"';
+ }
+ }
+
+ $values = implode(',',$values);
+ $query="INSERT INTO $table ($fields) VALUES ($values);";
+ $this->query=$query;
+
+ $ris = $this->db->query($query);
+
+ #check the result
+ if ($ris) {
+ return true;
+ } else {
+ return false;
+ }
+
+ } else {
+ return false;
+ }
+ }
+
+ // Retrieves the ID generated for an AUTO_INCREMENT column by the previous query (usually INSERT).
+ public function lastId()
+ {
+ return $this->db->insert_id;
+ }
+
+ public function update($table,$fields,$values,$where) {
+
+ #$table and $where are two strings
+ #$fields has to be a string with comma as separator: name1,name2,...
+ #$values has to be an array
+ $values = array_values($values);
+// if (isset($where)) {
+ $where='WHERE '.$where;
+// }
+ #get the array from the $fields string
+ if (strcmp($fields,'') !== 0)
+ {
+ //get the type of the fields
+ $types = $this->getTypes($table,$fields);
+ if (!$types) return false;
+
+ $fields = explode(',',$fields);
+ $str = array();
+
+ for ($i=0;$i<count($fields);$i++) {
+ if (!in_array($types[$i],$this->fieldsType))
+ {
+ $values[$i] = '"'.$values[$i].'"';
+ }
+ else
+ {
+ if (strcmp($values[$i],'') === 0) $values[$i] = '"'.$values[$i].'"';
+ }
+ $str[$i]= $fields[$i].'='.$values[$i];
+ }
+
+ #set the string name1=value1,name2=...
+ $str=implode(',',$str);
+ $query="UPDATE $table SET $str $where;";
+ $this->query=$query;
+ $ris = $this->db->query($query);
+
+ #check the result
+ if ($ris) {
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+
+ }
+
+
+ public function del($table,$where) {
+
+ #$table and $where are two strings
+// if (isset($where)) {
+ $where='WHERE '.$where;
+// }
+ $query="DELETE FROM $table $where;";
+ $this->query=$query;
+ $ris = $this->db->query($query);
+ #check the result
+
+ if ($ris) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+
+ //function to check if exist the record having the field $id_name=$id_value
+ public function recordExists($table,$fieldName,$fieldValue,$where = null,$groupBy=null,$on=array(),$using=array(),$join=array())
+ {
+ if (isset($where))
+ {
+ $where=' AND '.$where;
+ }
+
+ $fieldValue = '"'.$fieldValue.'"';
+
+ $num = $this->get_num_rows($table,$fieldName.'='.$fieldValue.$where,$groupBy,$on,$using,$join);
+ $res=($num>0) ? true : false;
+ return $res;
+
+ }
+
+
+ //send a generic query to the database
+ //$query: the query to be sent
+ public function query($query)
+ {
+ $this->query = $query;
+ $result = $this->db->query($query);
+ if ($result === true)
+ {
+ return true;
+ }
+ else if ($result === false)
+ {
+ return false;
+ }
+ else if ($result instanceof MySQLi_Result)
+ {
+ return $this->getData($result);
+ }
+ }
+
+ // Prevent users to clone the instance
+ public function __clone()
+ {
+ throw new Exception('error in '. __METHOD__.': clone is not allowed');
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Db/index.html b/h-source/Library/Db/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Db/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Email.php b/h-source/Library/Email.php
new file mode 100644
index 0000000..9d2ff19
--- /dev/null
+++ b/h-source/Library/Email.php
@@ -0,0 +1,246 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to send an e-mail
+class Email {
+
+ //sent to parameters (array)
+ private $_sendTo = array();
+
+ //cc parameters (array)
+ private $_cc = array();
+
+ //bcc parameters (array)
+ private $_bcc = array();
+
+ //the address of the sender
+ private $_from = null;
+
+ //subject (string)
+ private $_subject = null;
+
+ //charset
+ private $_charset = "iso-8859-1";
+
+ //Content-Transfer-Encoding
+ private $_ctencoding = "7bit";
+
+ //body
+ private $_body = '';
+
+ //headers
+ private $_headers = null;
+
+ //check flag. If _check = true than check the mail addresses
+ private $_check = null;
+
+ //regular expression to check each e-mail address
+ private $_addressRegExp = null;
+
+ //array containing all the errors encountered during the execution
+ public $errorsArray = array();
+
+ public function __construct($bool = true)
+ {
+ $this->_check = $bool;
+ }
+
+ //set the sentTo addresses array
+ //$addresses: array of e-mail addresses or a string
+ public function sendTo($addresses)
+ {
+ $this->_sendTo = explode(',',$addresses);
+ }
+
+ //set the subject
+ public function subject($subject)
+ {
+ $this->_subject = $subject;
+ }
+
+ //set the cc addresses array
+ //$addresses: array of e-mail addresses or a string
+ public function cc($addresses)
+ {
+ $this->_cc = explode(',',$addresses);
+ }
+
+ //set the bcc addresses array
+ //$addresses: array of e-mail addresses or a string
+ public function bcc($addresses)
+ {
+ $this->_bcc = explode(',',$addresses);
+ }
+
+ //set the address of the sender
+ public function from($address)
+ {
+ $this->_from = $address;
+ }
+
+ //set the charset
+ public function charset($charset)
+ {
+ $this->_charset = $charset;
+ }
+
+ //set the Content-Transfer-Encoding
+ public function ctencoding($ctencoding)
+ {
+ $this->_ctencoding = $ctencoding;
+ }
+
+ //set the text body
+ public function body($body)
+ {
+ $this->_body = $body;
+ }
+
+ //set the address regular expression
+ public function addressRegExp($regExp)
+ {
+ $this->_addressRegExp = $regExp;
+ }
+
+ //check if the mail address is valid
+ public function isValidAddress($address)
+ {
+
+ if( preg_match( '/^[^<>]*<(.+)>$/', $address, $matches ) )
+ {
+ $address = $matches[1];
+ }
+
+ if (isset($this->_addressRegExp))
+ {
+ if (preg_match($this->_addressRegExp,$address))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ if (checkMail($address)) return true;
+ }
+
+ return false;
+
+ }
+
+ //check the addresses inside the $addresses array
+ public function checkAddresses($addresses)
+ {
+ foreach ($addresses as $address)
+ {
+ if(!$this->isValidAddress($address)) return false;
+ }
+ return true;
+ }
+
+ //build the mail
+ public function buildMail()
+ {
+
+ if (empty($this->_sendTo))
+ {
+ $this->errorsArray[] = 'no address specified';
+ return false;
+ }
+
+ if ($this->_check)
+ {
+ if (!$this->checkAddresses($this->_sendTo))
+ {
+ $this->errorsArray[] = 'errors in the sendTo address validation';
+ return false;
+ }
+
+ if (!empty($this->_cc))
+ {
+ if (!$this->checkAddresses($this->_cc))
+ {
+ $this->errorsArray[] = 'errors in the cc address validation';
+ return false;
+ }
+ }
+
+ if (!empty($this->_bcc))
+ {
+ if (!$this->checkAddresses($this->_bcc))
+ {
+ $this->errorsArray[] = 'errors in the bcc address validation';
+ return false;
+ }
+ }
+
+ if (isset($this->_from))
+ {
+ if (!$this->checkAddresses(array($this->_from)))
+ {
+ $this->errorsArray[] = 'errors in the from address validation';
+ return false;
+ }
+ }
+ }
+
+ if (strcmp($this->_subject,'') === 0)
+ {
+ $this->errorsArray[] = 'no subject specified';
+ return false;
+ }
+
+ $headers = null;
+ if (isset($this->_from)) $headers .= "From: ".$this->_from."\r\n";
+ $headers .= "MIME-Version: 1.0\r\n";
+ $headers .= "Content-Type: text/plain; charset=\"".$this->_charset."\"\r\n";
+ $headers .= "Content-Transfer-Encoding: ".$this->_ctencoding."\r\n";
+ if (!empty($this->_cc)) $headers .= "CC: ".implode(',',$this->_cc)."\r\n";
+ if (!empty($this->_bcc)) $headers .= "Bcc: ".implode(',',$this->_bcc)."\r\n";
+
+ $this->_headers = $headers;
+
+ return true;
+
+ }
+
+ public function send()
+ {
+ if (!$this->buildMail()) return false;
+
+ $to = implode(',',$this->_sendTo);
+
+ if (!@mail($to,$this->_subject,$this->_body,$this->_headers))
+ {
+ $this->errorsArray[] = 'error in the send process';
+ return false;
+ }
+
+ return true;
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/ErrorReporting.php b/h-source/Library/ErrorReporting.php
new file mode 100644
index 0000000..2cb8aed
--- /dev/null
+++ b/h-source/Library/ErrorReporting.php
@@ -0,0 +1,45 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+function ErrorReporting() {
+ if (RUNTIME_CONFIGURATION === true)
+ {
+ error_reporting(ERROR_REPORTING_DIRECTIVE);
+ if (DISPLAY_ERRORS === 'On') {
+ ini_set('display_errors','On');
+ } else {
+ ini_set('display_errors','Off');
+ }
+
+ if (ERROR_REPORTING_FILE === true)
+ {
+ if (LOG_ERROR_FILE === 'default')
+ {
+ ini_set('error_log',ROOT.DS.'Logs/Errors.log');
+ } else {
+ ini_set('error_log',LOG_ERROR_FILE);
+ }
+ }
+ }
+}
diff --git a/h-source/Library/Factory/Db.php b/h-source/Library/Factory/Db.php
new file mode 100755
index 0000000..32a82c1
--- /dev/null
+++ b/h-source/Library/Factory/Db.php
@@ -0,0 +1,69 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to create the database layer class
+class Factory_Db {
+
+ //start the database connection
+ //$dbType: mysql,mysqli,pg
+ //$dbArrayParams: array containing the HOST, the USER, the PWD, and the DB of the database (see config.php)
+ public static function getInstance($dbType,$dbArrayParams = array()) {
+ if (!in_array($dbType,Params::$allowedDb)) {
+ throw new Exception('error in ' . __METHOD__ . ' : the database type has to be '.implode(' or ',Params::$allowedDb));
+ }
+ switch ($dbType) {
+ case 'Mysql':
+ return call_user_func_array(array('Db_'.$dbType,'getInstance'),$dbArrayParams);
+ break;
+ case 'Mysqli':
+ return call_user_func_array(array('Db_'.$dbType,'getInstance'),$dbArrayParams);
+ break;
+ case 'None':
+ return null;
+ break;
+ }
+ }
+
+ //close the database connection
+ public static function disconnect($dbType)
+ {
+ if (!in_array($dbType,Params::$allowedDb)) {
+ throw new Exception('error in ' . __METHOD__ . ' : the database type has to be '.implode(' or ',Params::$allowedDb));
+ }
+ switch ($dbType) {
+ case 'Mysql':
+ $mysql = Db_Mysql::getInstance();
+ $mysql->disconnect();
+ break;
+ case 'Mysqli':
+ $mysqli = Db_Mysqli::getInstance();
+ $mysqli->disconnect();
+ break;
+ case 'None':
+ return null;
+ break;
+ }
+ }
+
+}
diff --git a/h-source/Library/Factory/Strings.php b/h-source/Library/Factory/Strings.php
new file mode 100644
index 0000000..3e766bd
--- /dev/null
+++ b/h-source/Library/Factory/Strings.php
@@ -0,0 +1,38 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//return the string class
+class Factory_Strings {
+
+ //return an instance of the Lang_{language}_Generic class
+ public static function generic($lang = 'En') {
+ $stringClass = 'Lang_'.$lang.'_Generic';
+ if (!class_exists($stringClass))
+ {
+ $stringClass = 'Lang_En_Generic';
+ }
+ return new $stringClass();
+ }
+
+}
diff --git a/h-source/Library/Factory/index.html b/h-source/Library/Factory/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Factory/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Files/Log.php b/h-source/Library/Files/Log.php
new file mode 100644
index 0000000..7eda7b7
--- /dev/null
+++ b/h-source/Library/Files/Log.php
@@ -0,0 +1,114 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to manage a file di log
+//this is a singleton class
+class Files_Log
+{
+
+ const DS = DIRECTORY_SEPARATOR;
+
+ // array of instances of the class
+ //key: name of the instance, value:instance. The name of the instance is also the name of the log file to open
+ private static $instance = array();
+
+ public static $logFolder = './'; //the log folder
+ public static $logExtension = '.log'; //the extension of the log files
+ public static $logPermission = 0777;
+
+ private $splFile; //SplFileObject
+
+ //$fileName: the file to open
+ private function __construct($fileName)
+ {
+ $finalChar = self::$logFolder[strlen(self::$logFolder) - 1];
+ if (strcmp($finalChar,self::DS) !== 0) self::$logFolder .= self::DS;
+
+ $path = self::$logFolder . $fileName . self::$logExtension;
+ $this->splFile = new SplFileObject($path,'a+');
+ //change the permission of the file
+ @chmod($path,self::$logPermission);
+ }
+
+ // The singleton method
+ // $instanceName: name of the key of self::$instance. It is also the name of the log file to open
+ public static function getInstance($instanceName)
+ {
+ if (!isset(self::$instance[$instanceName])) {
+ $className = __CLASS__;
+ self::$instance[$instanceName] = new $className($instanceName);
+ }
+
+ return self::$instance[$instanceName];
+ }
+
+ //write the string $string at the end of the file
+ public function writeString($string,$format = 'Y-m-d H:i:s')
+ {
+ $date = date($format);
+ $this->splFile->fwrite("[$date]\t".$string."\n");
+ }
+
+ //get the date string of the line $line
+ public function getDateString($line)
+ {
+ if (preg_match('/^[\[]{1}([a-zA-Z0-9:\-\s])*[\]]{1}/',$line,$match))
+ {
+ $match[0] = str_replace('[',null,$match[0]);
+ $match[0] = str_replace(']',null,$match[0]);
+ return $match[0];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ //delete all the lines older than a number of days equal to $days
+ public function clearBefore($days = 30)
+ {
+ $tempArray = array();
+ $newTime = time() - (int)$days * 24 * 3600;
+ foreach ($this->splFile as $line)
+ {
+ $lineTime = strtotime($this->getDateString($line));
+ if ($lineTime !== false and $lineTime > $newTime)
+ {
+ $tempArray[] = $line;
+ }
+ }
+ $this->splFile->ftruncate(0);
+ foreach ($tempArray as $row)
+ {
+ $this->splFile->fwrite($row);
+ }
+ }
+
+ // Prevent users to clone the instance
+ public function __clone()
+ {
+ throw new Exception('error in '. __METHOD__.': clone is not allowed');
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Files/Upload.php b/h-source/Library/Files/Upload.php
new file mode 100755
index 0000000..7dbc7d1
--- /dev/null
+++ b/h-source/Library/Files/Upload.php
@@ -0,0 +1,603 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to manage upload files
+class Files_Upload
+{
+
+ const DS = DIRECTORY_SEPARATOR;
+
+ private $base = null; //root directory
+ private $directory = null; //current directory. Path relative to the base directory (Files_Upload::base)
+ private $parentDir = null; //parent folder
+ private $subDir = array(); //subdirectories of the current directory
+ private $relSubDir = array(); //subfolders of $this->directory. The path starts from the $base folder
+ private $files = array(); //files inside the current directory
+ private $relFiles = array(); //files inside $this->directory. The path starts from the $base directory
+ private $params; //class parameters
+ private $pattern = null; //the pattern for the preg_match function
+
+ protected $_resultString; //reference to the class uploadStrings containing all the result strings
+
+ public $fileName = null; //the name of the last file that has been uploaded
+ public $notice = null; //the result string of the operation
+
+ public function __construct($base,$params = null, $directory = null) {
+
+ $this->base = $this->addTrailingSlash($base);
+
+ //set the match pattern
+ $tmp = str_replace(self::DS,'\\'.self::DS,$this->base);
+ $this->pattern = "/^(".$tmp.")/";
+
+ $defaultParams = array(
+ 'filesPermission' => 0777,
+ 'delFolderAction' => 'delFolderAction',
+ 'delFileAction' => 'delFileAction',
+ 'createFolderAction' => 'createFolderAction',
+ 'uploadFileAction' => 'uploadFileAction',
+ 'maxFileSize' => 3000000,
+ 'language' => 'En',
+ 'allowedExtensions' => 'jpg,jpeg,png,gif,txt',
+ 'allowedMimeTypes' => '',
+ 'fileUploadKey' => 'userfile',
+ 'fileUploadBehaviour' => 'add_token', //can be none or add_token
+ 'fileUploadBeforeTokenChar' => '_',
+ 'functionUponFileNane' => 'none',
+ 'createImage' => false,
+ );
+
+ //set the $this->scaffold->params array
+ if (is_array($params))
+ {
+ foreach ($params as $key => $value)
+ {
+ $defaultParams[$key] = $value;
+ }
+ }
+ $this->params = $defaultParams;
+
+ //instantiate the $_resultString object
+ $stringClass = 'Lang_'.$this->params['language'].'_UploadStrings';
+ if (!class_exists($stringClass))
+ {
+ $stringClass = 'Lang_En_UploadStrings';
+ }
+ $this->_resultString = new $stringClass();
+
+ $this->setDirectory($directory);
+
+ }
+
+ //set a new value for one element of the $params array
+ public function setParam($key,$value)
+ {
+ if (array_key_exists($key,$this->params))
+ {
+ $this->params[$key] = $value;
+ }
+ }
+
+ //change a resulting string
+ public function setString($key,$value)
+ {
+ $this->_resultString->string[$key] = $value;
+ }
+
+ //obtain the current directory
+ public function setDirectory($directory = null)
+ {
+ $relDir = (strcmp($directory,"") !== 0) ? $this->addTrailingSlash($directory) : null;
+ $absDir = $this->addTrailingSlash($this->base.$directory);
+
+ if (is_dir($absDir))
+ {
+ if ($this->isValidFolder($absDir))
+ {
+ $this->directory = $relDir;
+ return true;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-child');
+ }
+ }
+ else
+ {
+ $this->directory = null;
+ $this->notice = $this->_resultString->getString('not-dir');
+ }
+ return false;
+ }
+
+ //check if $folder is a folder and is subfolder of $this->base
+ protected function isValidFolder($folder)
+ {
+ if (is_dir($folder))
+ {
+ $folder = $this->addTrailingSlash(realpath($folder));
+ if ($this->isMatching($folder)) return true;
+ }
+ return false;
+ }
+
+ protected function isMatching($path)
+ {
+ if (preg_match($this->pattern,$path))
+ {
+ if (strstr($path,'..')) return false;
+ return true;
+ }
+ return false;
+ }
+
+ public function getDirectory() {
+ return $this->directory;
+ }
+
+ public function getBase()
+ {
+ return $this->base;
+ }
+
+ public function setBase($path)
+ {
+ $this->base = $this->addTrailingSlash($path);
+
+ //set the match pattern
+ $tmp = str_replace(self::DS,'\\'.self::DS,$this->base);
+ $this->pattern = "/^(".$tmp.")/";
+ }
+
+ public function getSubDir() {
+ return $this->subDir;
+ }
+
+ public function getRelSubDir()
+ {
+ return $this->relSubDir;
+ }
+
+ public function getFiles() {
+ return $this->files;
+ }
+
+ public function getRelFiles()
+ {
+ return $this->relFiles;
+ }
+
+ public function getParentDir() {
+ return $this->parentDir;
+ }
+
+ //add the trailing slash to the string
+ protected function addTrailingSlash($string)
+ {
+ $finalChar = $string[strlen($string) - 1];
+ if (strcmp($finalChar,self::DS) !== 0)
+ {
+ return $string.self::DS;
+ }
+ return $string;
+ }
+
+ protected function urlDeep($dir) { #funzione per creare l'indirizzo completo della cartella all'interno della quale voglio entrare
+ #$dir:cartella all'interno della quale voglio entrare
+ return $this->base.$this->directory.$dir.self::DS;
+ }
+
+ public function listFiles() { #creo la lista di file e cartelle all'interno della directory corrente
+ $items = scandir($this->base.$this->directory);
+ foreach( $items as $this_file ) {
+ if( strcmp($this_file,".") !== 0 && strcmp($this_file,"..") !== 0 ) {
+ if (is_dir($this->urlDeep($this_file))) {
+ $this->subDir[] = $this_file;
+ $this->relSubDir[] = $this->directory.$this_file;
+ } else {
+ $this->files[] = $this_file;
+ $this->relFiles[] = $this->directory.$this_file;
+ }
+ }
+ }
+ //get the parent dir
+ $this->parentDir();
+ }
+
+ //get the extension of the file
+ public function getFileExtension($file)
+ {
+ if (strstr($file,'.'))
+ {
+ return strtolower(end(explode('.', $file)));
+ }
+ return '';
+ }
+
+ //get the file name without the extension
+ public function getNameWithoutFileExtension($file)
+ {
+ if (strstr($file,'.'))
+ {
+ $copy = explode('.', $file);
+ array_pop($copy);
+ return implode('.',$copy);
+ }
+ return $file;
+ }
+
+ //get a not existing file name if the one retrieved from the upload process already exists in the current directory
+ public function getUniqueName($file,$int = 0)
+ {
+ $fileNameWithoutExt = $this->getNameWithoutFileExtension($file);
+ $extension = $this->getFileExtension($file);
+ $token = $int === 0 ? null : $this->params['fileUploadBeforeTokenChar'].$int;
+
+ $dotExt = strcmp($extension,'') !== 0 ? ".$extension" : null;
+
+ $newName = $fileNameWithoutExt.$token.$dotExt;
+ if (!file_exists($this->base.$this->directory.$newName))
+ {
+ return $newName;
+ }
+ else
+ {
+ return $this->getUniqueName($file,$int+1);
+ }
+
+ }
+
+ protected function parentDir() { #individuo la cartella madre
+
+ $folders = explode(self::DS,$this->directory);
+ array_pop($folders);
+ array_pop($folders);
+ $parent = implode(self::DS,$folders);
+ $parent = (strcmp($parent,"") !== 0) ? $this->addTrailingSlash($parent) : null;
+
+ if ($this->isValidFolder($this->base.$parent))
+ {
+ $this->parentDir = $parent;
+ }
+ else
+ {
+ $this->parentDir = null;
+ }
+ }
+
+ //create the $name subfolder of the $this->directory folder
+ public function createFolder($name) { #funzione per creare una cartella nella directory corrente
+ $name = basename($name);
+ if (strcmp(trim($name),'') !== 0)
+ {
+ if (is_writable($this->base.$this->directory))
+ {
+ $path = $this->base.$this->directory.$name;
+
+ if ($this->isMatching($path))
+ {
+ if (!file_exists($path))
+ {
+ if (@mkdir($path,$this->params['filesPermission']))
+ {
+ @chmod($path, $this->params['filesPermission']);
+ $this->notice = $this->_resultString->getString('executed');
+ return true;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('error');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('dir-exists');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-child');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-writable');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-folder-specified');
+ }
+ return false;
+ }
+
+ //check if the $name folder is empty or not
+ protected function isEmpty($name)
+ {
+ $items = scandir($name);
+ foreach( $items as $this_file ) {
+ if( strcmp($this_file,".") !== 0 && strcmp($this_file,"..") !== 0 ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public function removeFile($name)
+ {
+ $name = basename($name);
+ if (strcmp(trim($name),'') !== 0)
+ {
+ $path = $this->base.$this->directory.$name;
+ if ($this->isMatching($path))
+ {
+ if ($this->removeAbsFile($path)) return true;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-child');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-file-specified');
+ }
+ return false;
+ }
+
+ //remove the $name file
+ protected function removeAbsFile($name)
+ {
+ if (strcmp(trim($name),'') !== 0)
+ {
+ if (is_writable($name))
+ {
+ if (@unlink($name))
+ {
+ $this->notice = $this->_resultString->getString('executed');
+ return true;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('error');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-writable-file');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-file-specified');
+ }
+ return false;
+ }
+
+ public function removeFolder($name)
+ {
+ $name = basename($name);
+ if (strcmp(trim($name),'') !== 0)
+ {
+ $dir = $this->base.$this->directory.$name;
+ if ($this->isMatching($dir))
+ {
+ if ($this->removeAbsFolder($dir)) return true;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-child');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-folder-specified');
+ }
+ return false;
+ }
+
+ //remove the $name folder
+ protected function removeAbsFolder($name) {
+ if (strcmp(trim($name),'') !== 0) {
+ if (is_writable($name))
+ {
+ if ($this->isEmpty($name))
+ {
+ if (@rmdir($name))
+ {
+ $this->notice = $this->_resultString->getString('executed');
+ return true;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('error');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-empty');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-writable');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-folder-specified');
+ }
+ return false;
+ }
+
+ //remove all the files that are not inside the $list argument
+ public function removeFilesNotInTheList($list = array())
+ {
+ $this->listFiles();
+ $files = $this->getFiles();
+ foreach ($files as $file)
+ {
+ if (!in_array($file,$list))
+ {
+ $this->removeFile($file);
+ }
+ }
+ }
+
+ //upload a file in the current directory
+ //$fileName: name of the file
+ public function uploadFile($fileName = null)
+ {
+ $userfile = $this->params['fileUploadKey'];
+
+ if(strcmp(trim($_FILES[$userfile]["name"]),"") !== 0)
+ {
+ $nameFromUpload = basename($_FILES[$userfile]["name"]);
+
+ $ext = $this->getFileExtension($nameFromUpload);
+ $nameWithoutExtension = $this->getNameWithoutFileExtension($nameFromUpload);
+
+ $dotExt = strcmp($ext,'') !== 0 ? ".$ext" : null;
+
+ //check if the "functionUponFileNane" function exists
+ if (!function_exists($this->params['functionUponFileNane'])) {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$this->params['functionUponFileNane']. '</b> does not exist');
+ }
+
+ //check if the fileinfo extension is loaded
+ if (strcmp($this->params['allowedMimeTypes'],'') !== 0 and !extension_loaded('fileinfo')) {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: no MIME type check is possible because the <b>fileinfo</b> extension is not loaded');
+ }
+
+ $nameWithoutExtension = call_user_func($this->params['functionUponFileNane'],$nameWithoutExtension);
+
+ $fileName = isset($fileName) ? $fileName.$dotExt : $nameWithoutExtension.$dotExt;
+
+ $this->fileName = $fileName;
+
+ switch($this->params['fileUploadBehaviour'])
+ {
+ case 'none':
+ break;
+ case 'add_token':
+ $this->fileName = $this->getUniqueName($this->fileName);
+ $fileName = $this->fileName;
+ break;
+ }
+
+ if(@is_uploaded_file($_FILES[$userfile]["tmp_name"])) {
+ if ($_FILES[$userfile]["size"] <= $this->params['maxFileSize'])
+ {
+ //check the extension of the file
+ $AllowedExtensionsArray = explode(',',$this->params['allowedExtensions']);
+
+ if (strcmp($this->params['allowedExtensions'],'') === 0 or in_array($ext,$AllowedExtensionsArray))
+ {
+ if (strcmp($this->params['allowedMimeTypes'],'') !== 0)
+ {
+ //get the MIME type of the file
+ $finfo = finfo_open(FILEINFO_MIME_TYPE);
+ $MIMEtype = finfo_file($finfo, $_FILES[$userfile]["tmp_name"]);
+ finfo_close($finfo);
+ }
+
+ $AllowedMimeTypesArray = explode(',',$this->params['allowedMimeTypes']);
+
+ if (strcmp($this->params['allowedMimeTypes'],'') === 0 or in_array($MIMEtype,$AllowedMimeTypesArray))
+ {
+ //check if the file doesn't exist
+ if (!file_exists($this->base.$this->directory.$fileName))
+ {
+ if (@move_uploaded_file($_FILES[$userfile]["tmp_name"],$this->base.$this->directory.$fileName))
+ {
+ if ($this->params['createImage'])
+ {
+ //create the image
+ $basePath = $this->base.$this->directory;
+ $thumb = new Image_Gd_Thumbnail($basePath);
+ $thumb->render($fileName,$this->base.$this->directory.$fileName);
+ }
+
+ @chmod($this->base.$this->directory.$fileName, $this->params['filesPermission']);
+ $this->notice = $this->_resultString->getString('executed');
+ return true;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('error');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('file-exists');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-allowed-mime-type');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('not-allowed-ext');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('size-over');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-upload-file');
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-upload-file');
+ }
+ return false;
+ }
+
+ //update the folder tree
+ public function updateTree() {
+
+ if (isset($_POST[$this->params['delFolderAction']])) {
+ $this->removeFolder($_POST[$this->params['delFolderAction']]);
+ }
+
+ if (isset($_POST[$this->params['delFileAction']])) {
+ $this->removeFile($_POST[$this->params['delFileAction']]);
+ }
+
+ if (isset($_POST[$this->params['createFolderAction']])) {
+ $this->createFolder($_POST['folderName']);
+ }
+
+ if (isset($_POST[$this->params['uploadFileAction']])) {
+ $this->uploadFile();
+ }
+
+ }
+} \ No newline at end of file
diff --git a/h-source/Library/Files/index.html b/h-source/Library/Files/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Files/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Form/Checkbox.php b/h-source/Library/Form/Checkbox.php
new file mode 100755
index 0000000..497c097
--- /dev/null
+++ b/h-source/Library/Form/Checkbox.php
@@ -0,0 +1,49 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+/** create the HTML of an input text entry */
+class Form_Checkbox extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $wrap = $this->getWrapElements($value);
+ $returnString = $wrap[0];
+ $returnString .= "<div class='".$this->getEntryClass()."'>\n\t";
+ $returnString .= $wrap[1];
+ $returnString .= $this->getLabelTag();
+ $returnString .= $wrap[2];
+ $returnString .= Html_Form::checkbox($this->entryName, $value, $this->options, $this->className,$this->idName);
+ $returnString .= $wrap[3];
+ $returnString .="</div>\n";
+ $returnString .= $wrap[4];
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/Entry.php b/h-source/Library/Form/Entry.php
new file mode 100755
index 0000000..6f45557
--- /dev/null
+++ b/h-source/Library/Form/Entry.php
@@ -0,0 +1,112 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//base class of the form entries
+abstract class Form_Entry {
+
+ public $entryName = null; //the name of the entry
+ public $entryClass = null; //the class of the entry
+ public $idName = null; //the id of the input entry
+ public $className = null; //the class of the input entry
+ public $labelString = null; //label of the form
+ public $labelClass = null; //the class of the tag of the label
+ public $options = array(); //options (if the entry is a <select> entry or a radio button). Associative array or comma-divided list.
+ public $reverse = null; //reverse label with value in select entries
+ public $defaultValue = '';
+ public $wrap = array();
+ public $deleteButton = null;
+ public $type = null; //the type of the entry
+
+ //create the label of each entry of the form
+ public function getLabelTag()
+ {
+ $labelTagClass = isset($this->labelClass) ? $this->labelClass : 'entryLabel';
+ return isset($this->labelString) ? "<label class='$labelTagClass'>".$this->labelString."</label>\n\t" : null;
+ }
+
+ //get the class of the entry
+ public function getEntryClass()
+ {
+ if (isset($this->entryClass))
+ {
+ $class = $this->entryClass;
+ }
+ else
+ {
+ switch($this->type)
+ {
+ case 'InputText':
+ $class = 'form_input_text';
+ break;
+ case 'Checkbox':
+ $class = 'form_checkbox';
+ break;
+ case 'File':
+ $class = 'form_input_file';
+ break;
+ case 'Textarea':
+ $class = 'form_textarea';
+ break;
+ case 'Password':
+ $class = 'form_input_text form_input_password';
+ break;
+ default:
+ $class = 'form_input_text';
+ break;
+ }
+ }
+ return $class;
+ }
+
+ public function getWrapElements($value = null)
+ {
+ //replace the ;;value;; variable
+ for ($i = 0; $i < count($this->wrap); $i++)
+ {
+ if ( preg_match('/;;(.*)\|value;;/',$this->wrap[$i],$m) )
+ {
+ if (!function_exists($m[1])) {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$m[1].'</b> does not exists..');
+ }
+ //apply the function
+ $v = call_user_func($m[1],$value);
+ $this->wrap[$i] = str_replace(";;".$m[1]."|value;;",$v,$this->wrap[$i]);
+ }
+ else if ( preg_match('/;;value;;/',$this->wrap[$i]) )
+ {
+ $this->wrap[$i] = str_replace(';;value;;',$value,$this->wrap[$i]);
+ }
+ }
+
+ $wrap[0] = isset($this->wrap[0]) ? $this->wrap[0] : null;
+ $wrap[1] = isset($this->wrap[1]) ? $this->wrap[1] : null;
+ $wrap[2] = isset($this->wrap[2]) ? $this->wrap[2] : null;
+ $wrap[3] = isset($this->wrap[3]) ? $this->wrap[3] : null;
+ $wrap[4] = isset($this->wrap[4]) ? $this->wrap[4] : null;
+ return $wrap;
+ }
+
+ abstract public function render($value = null);
+
+}
diff --git a/h-source/Library/Form/File.php b/h-source/Library/Form/File.php
new file mode 100644
index 0000000..ac9b8ab
--- /dev/null
+++ b/h-source/Library/Form/File.php
@@ -0,0 +1,56 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of a file upload entry
+class Form_File extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $wrap = $this->getWrapElements($value);
+ $returnString = $wrap[0];
+ $returnString .= "<div class='".$this->getEntryClass()."'>\n\t";
+ $returnString .= $wrap[1];
+ $returnString .= $this->getLabelTag();
+ $returnString .= $wrap[2];
+ $returnString .= Html_Form::fileUpload($this->entryName, $value, $this->className, $this->idName);
+ if (is_array($this->deleteButton))
+ {
+ $sname = isset($this->deleteButton[0]) ? $this->deleteButton[0] : 'delete_'.$this->entryName;
+ $svalue = isset($this->deleteButton[1]) ? $this->deleteButton[1] : 'delete';
+ $sclass = isset($this->deleteButton[2]) ? "class='".$this->deleteButton[2]."'" : null;
+ $returnString .= "<input $sclass type='submit' name='$sname' value='$svalue'>\n";
+ }
+ $returnString .= $wrap[3];
+ $returnString .="</div>\n";
+ $returnString .= $wrap[4];
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/Form.php b/h-source/Library/Form/Form.php
new file mode 100755
index 0000000..a1a9fda
--- /dev/null
+++ b/h-source/Library/Form/Form.php
@@ -0,0 +1,140 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of the whole form
+class Form_Form {
+
+ public $entry = array(); //associative array containing the entries of the form (objects that inherit the class form_entryModel). Each element of the array corresponds to one field of the table
+
+ public $action = null; //the action of the form
+ public $name = null; //the name of the form
+ public $className = 'formClass'; //the class of the form
+ public $id = null;
+ public $submit = array(); //the submit entries array('name'=>'value')
+ public $method = 'POST'; //the transmission method: POST/GET
+ public $enctype = null; //enctype attribute of the form
+
+ public function __construct($action,$submit = array('generalAction'=>'save'),$method = 'POST',$enctype = null)
+ {
+ $this->action = $action; //action of the form: controller/action
+ $this->submit = $submit;
+ $this->method = $method;
+ $this->enctype = $enctype;
+ }
+
+ //method to manage the $this->entry associative array
+ //entryType: the type of the object to be initialized, $entryName: the name of the entry
+ //$options: the list of options (if the entry is a <select> entry)
+ public function setEntry($entryName,$entryType,$options = null)
+ {
+ $entryObjName = 'Form_'.$entryType;
+ if (!class_exists($entryObjName))
+ {
+ throw new Exception("class <b>$entryObjName</b> not defined: the entry <b>$entryName</b> can't be set");
+ }
+ $this->entry[$entryName] = new $entryObjName($entryName);
+ $this->entry[$entryName]->labelString = $entryName.':';
+ //set the type
+ $this->entry[$entryName]->type = $entryType;
+ if (isset($options))
+ {
+ $this->entry[$entryName]->options = $options;
+ }
+ }
+
+ //set all the entries
+ //$entryStruct : the struct of the entries
+ public function setEntries($entryStruct = array())
+ {
+ foreach ($entryStruct as $name => $entry)
+ {
+ $type = array_key_exists('type',$entry) ? $entry['type'] : 'InputText';
+ $options = array_key_exists('options',$entry) ? $entry['options'] : null;
+ $this->setEntry($name,$type,$options);
+
+ $entryClass = array_key_exists('entryClass',$entry) ? $entry['entryClass'] : null;
+ $labelString = array_key_exists('labelString',$entry) ? $entry['labelString'] : "$name:";
+ $idName = array_key_exists('idName',$entry) ? $entry['idName'] : null;
+ $className = array_key_exists('className',$entry) ? $entry['className'] : null;
+ $labelClass = array_key_exists('labelClass',$entry) ? $entry['labelClass'] : null;
+ $defaultValue = array_key_exists('defaultValue',$entry) ? $entry['defaultValue'] : null;
+ $wrap = array_key_exists('wrap',$entry) ? $entry['wrap'] : array();
+ $deleteButton = array_key_exists('deleteButton',$entry) ? $entry['deleteButton'] : null;
+ $reverse = array_key_exists('reverse',$entry) ? $entry['reverse'] : null;
+
+ $this->entry[$name]->entryClass = $entryClass;
+ $this->entry[$name]->labelString = $labelString;
+ $this->entry[$name]->idName = $idName;
+ $this->entry[$name]->className = $className;
+ $this->entry[$name]->labelClass = $labelClass;
+ $this->entry[$name]->defaultValue = $defaultValue;
+ $this->entry[$name]->wrap = $wrap;
+ $this->entry[$name]->deleteButton = $deleteButton;
+ $this->entry[$name]->reverse = $reverse;
+ }
+ }
+
+ //function to create the HTML of the form
+ //$values: an associative array ('entryName'=>'value')
+ //$subset: subset to print
+ public function render($values = null, $subset = null)
+ {
+
+ if ($values === null)
+ {
+ $values = array();
+ foreach ($this->entry as $key => $value)
+ {
+ $values[$key] = $value->defaultValue;
+ }
+ }
+
+ $fid = isset($this->id) ? "id='".$this->id."'" : null;
+ $fname = isset($this->name) ? "name='".$this->name."'" : null;
+ $fclass = isset($this->className) ? "class='".$this->className."'" : null;
+ $fenctype = isset($this->enctype) ? " enctype=".$this->enctype." " : null;
+ $htmlForm = "<form $fname $fclass $fid action='".Url::getRoot($this->action)."' method='".$this->method."' $fenctype>\n";
+
+ $subset = (isset($subset)) ? explode(',',$subset) : array_keys($values);
+
+ foreach ($subset as $entry)
+ {
+
+ if (array_key_exists($entry,$this->entry))
+ {
+ $value = array_key_exists($entry,$values) ? $values[$entry] : $this->entry[$entry]->defaultValue;
+ $htmlForm .= $this->entry[$entry]->render($value);
+ }
+
+ }
+
+ foreach ($this->submit as $name => $value)
+ {
+ $htmlForm .= "<div class='inputEntry'>\n<input id='".$name."' type='submit' name='$name' value='$value'>\n</div>\n";
+ }
+ $htmlForm .= "</form>\n";
+ return $htmlForm;
+ }
+
+}
diff --git a/h-source/Library/Form/Hidden.php b/h-source/Library/Form/Hidden.php
new file mode 100755
index 0000000..c589662
--- /dev/null
+++ b/h-source/Library/Form/Hidden.php
@@ -0,0 +1,40 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of an input hidden entry
+class Form_Hidden extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $returnString = Html_Form::hidden($this->entryName, $value);
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/Html.php b/h-source/Library/Form/Html.php
new file mode 100644
index 0000000..e5c9989
--- /dev/null
+++ b/h-source/Library/Form/Html.php
@@ -0,0 +1,40 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of an input text entry
+class Form_Html extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $returnString = "<div class='".$this->getEntryClass()."'>\n\t$value\n</div>\n";
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/InputText.php b/h-source/Library/Form/InputText.php
new file mode 100755
index 0000000..344264e
--- /dev/null
+++ b/h-source/Library/Form/InputText.php
@@ -0,0 +1,49 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of an input text entry
+class Form_InputText extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $wrap = $this->getWrapElements($value);
+ $returnString = $wrap[0];
+ $returnString .= "<div class='".$this->getEntryClass()."'>\n\t";
+ $returnString .= $wrap[1];
+ $returnString .= $this->getLabelTag();
+ $returnString .= $wrap[2];
+ $returnString .= Html_Form::input($this->entryName, $value, $this->className, $this->idName);
+ $returnString .= $wrap[3];
+ $returnString .="</div>\n";
+ $returnString .= $wrap[4];
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/Password.php b/h-source/Library/Form/Password.php
new file mode 100644
index 0000000..9bfc68b
--- /dev/null
+++ b/h-source/Library/Form/Password.php
@@ -0,0 +1,49 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of an input text entry
+class Form_Password extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $wrap = $this->getWrapElements($value);
+ $returnString = $wrap[0];
+ $returnString .= "<div class='".$this->getEntryClass()."'>\n\t";
+ $returnString .= $wrap[1];
+ $returnString .= $this->getLabelTag();
+ $returnString .= $wrap[2];
+ $returnString .= Html_Form::password($this->entryName, null, $this->className);
+ $returnString .= $wrap[3];
+ $returnString .="</div>\n";
+ $returnString .= $wrap[4];
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/Radio.php b/h-source/Library/Form/Radio.php
new file mode 100755
index 0000000..4f596ed
--- /dev/null
+++ b/h-source/Library/Form/Radio.php
@@ -0,0 +1,49 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of a radio entry
+class Form_Radio extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $wrap = $this->getWrapElements($value);
+ $returnString = $wrap[0];
+ $returnString .= "<div class='".$this->getEntryClass()."'>\n\t";
+ $returnString .= $wrap[1];
+ $returnString .= $this->getLabelTag();
+ $returnString .= $wrap[2];
+ $returnString .= Html_Form::radio($this->entryName,$value,$this->options,$this->className, 'after', $this->idName);
+ $returnString .= $wrap[3];
+ $returnString .="</div>\n";
+ $returnString .= $wrap[4];
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/Select.php b/h-source/Library/Form/Select.php
new file mode 100755
index 0000000..53d7632
--- /dev/null
+++ b/h-source/Library/Form/Select.php
@@ -0,0 +1,49 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of an select entry
+class Form_Select extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $wrap = $this->getWrapElements($value);
+ $returnString = $wrap[0];
+ $returnString .= "<div class='".$this->getEntryClass()."'>\n\t";
+ $returnString .= $wrap[1];
+ $returnString .= $this->getLabelTag();
+ $returnString .= $wrap[2];
+ $returnString .= Html_Form::select($this->entryName,$value,$this->options,$this->className, $this->idName, $this->reverse);
+ $returnString .= $wrap[3];
+ $returnString .="</div>\n";
+ $returnString .= $wrap[4];
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/Textarea.php b/h-source/Library/Form/Textarea.php
new file mode 100755
index 0000000..aaaf19e
--- /dev/null
+++ b/h-source/Library/Form/Textarea.php
@@ -0,0 +1,49 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of a textarea entry
+class Form_Textarea extends Form_Entry
+{
+
+ public function __construct($entryName = null)
+ {
+ $this->entryName = $entryName;
+ }
+
+ public function render($value = null)
+ {
+ $wrap = $this->getWrapElements($value);
+ $returnString = $wrap[0];
+ $returnString .= "<div class='".$this->getEntryClass()."'>\n\t";
+ $returnString .= $wrap[1];
+ $returnString .= $this->getLabelTag();
+ $returnString .= $wrap[2];
+ $returnString .= Html_Form::textarea($this->entryName, $value, $this->className, $this->idName);
+ $returnString .= $wrap[3];
+ $returnString .="</div>\n";
+ $returnString .= $wrap[4];
+ return $returnString;
+ }
+
+}
diff --git a/h-source/Library/Form/index.html b/h-source/Library/Form/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Form/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Functions.php b/h-source/Library/Functions.php
new file mode 100755
index 0000000..1477680
--- /dev/null
+++ b/h-source/Library/Functions.php
@@ -0,0 +1,307 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+
+/*
+ SANITIZE FUNCTIONS
+*/
+
+function none($string) {
+ return $string;
+}
+
+function forceInt($string) {
+ return (int)$string;
+}
+
+function forceNat($string)
+{
+ $string = (int)$string;
+ if ($string <= 0) return 1;
+ return $string;
+}
+
+function sanitizeDb($stringa) {
+
+ if (DATABASE_TYPE === 'Mysql')
+ {
+ $stringa = mysql_real_escape_string($stringa);
+ return $stringa;
+ }
+
+ if (DATABASE_TYPE === 'Mysqli')
+ {
+ $mysqli = Db_Mysqli::getInstance();
+ $db = $mysqli->getDb();
+ $stringa = $db->real_escape_string($stringa);
+ return $stringa;
+ }
+
+ return $stringa;
+}
+
+function sanitizeAll($stringa) {
+
+ $stringa=sanitizeHtml($stringa);
+ $stringa=sanitizeDb($stringa);
+ return $stringa;
+
+}
+
+function sanitizeHtml($stringa) {
+
+ $charset = Params::$htmlentititiesCharset;
+ $stringa=htmlentities($stringa,ENT_QUOTES,$charset);
+ return $stringa;
+
+}
+
+//check if only alphabetic + optional characters are present in the string $string. Set $string to $altString if other characters are found
+//$optChar: allowed characters divided by '|' Ex: '+|-|;'
+function sanitizeCustom($string,$optChar,$altString = 'EasyGiant')
+{
+
+ $optChar = html_entity_decode($optChar,ENT_QUOTES);
+ $optCharArray = explode('|',$optChar);
+ $temp = $string;
+ foreach($optCharArray as $char)
+ {
+ $temp = str_replace($char,null,$temp);
+ }
+ if (ctype_alnum($temp))
+ {
+ return $string;
+ }
+ else
+ {
+ return $altString;
+ }
+}
+
+
+
+
+/*
+SANITIZE DEEP
+*/
+
+function stripslashesDeep($value) {
+ if(get_magic_quotes_gpc()) {#if stripslashes
+ return array_map('stripslashes', $value);
+ }
+ return $value;
+}
+
+
+function sanitizeHtmlDeep($value) {
+ return array_map('sanitizeHtml', $value);
+}
+
+
+function sanitizeDbDeep($value) {
+ return array_map('sanitizeDb', $value);
+}
+
+
+function sanitizeCustomDeep($stringArray,$optChar,$altString = 'EasyGiant')
+{
+ $result = array();
+ foreach ($stringArray as $key => $value)
+ {
+ $result[$key] = sanitizeCustom($value,$optChar,$altString);
+ }
+ return $result;
+}
+
+
+function sanitizeAllDeep($value) {
+ return array_map('sanitizeAll', $value);
+}
+
+
+function forceIntDeep($value) {
+ return array_map('forceInt', $value);
+}
+
+function forceNatDeep($value) {
+ return array_map('forceNat', $value);
+}
+
+function noneDeep($value) {
+ return array_map('none', $value);
+}
+
+
+function md5Deep($value)
+{
+ return array_map('md5', $value);
+}
+
+function sha1Deep($value)
+{
+ return array_map('sha1', $value);
+}
+
+
+
+
+
+
+
+function sanitizeAlnum($string)
+{
+ return ctype_alnum($string) ? sanitizeAll($string) : '';
+}
+
+
+function sanitizeIp($ip)
+{
+ return preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/',$ip) ? sanitizeAll($ip) : '';
+}
+
+
+/*
+ CHECK FUNCTIONS
+*/
+
+//check if a string has the mail format (abc.efg@hij.klm.on)
+//modification of the rule found at http://www.sastgroup.com/tutorials/8-espressioni-regolari-per-validare-un-po-di-tutto
+//original rule: /^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/
+function checkMail($string)
+{
+ if (preg_match('/^[a-zA-Z0-9_\-]+([.][a-zA-Z0-9_\-]+){0,2}[@][a-zA-Z0-9_\-]+([.][a-zA-Z0-9_\-]+){0,2}[.][a-zA-Z]{2,4}$/',$string))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+
+function wrap($string,$tag_class) {#wrap the string with the tag and its class
+ #$tag_class has to be an associative array (tag1=>class1,$tag2=>class2,.. )!!
+ $str_front=null;
+ $str_rear=null;
+ if (is_array($tag_class)) {
+ foreach ($tag_class as $tag => $class) {
+ $tag = str_replace('+','',$tag);
+ if (!is_array($class))
+ {
+ $str_class=isset($class) ? " class=\"".$class."\"" : null;
+ }
+ else
+ {
+ $str_class = null;
+ foreach ($class as $attr => $val)
+ {
+ $str_class .= " ".$attr."='".$val."' ";
+ }
+ }
+ $str_front.="<".$tag.$str_class.">\n";
+ $str_rear.="</".$tag.">\n";
+ }
+ }
+ return $str_front.$string.$str_rear;
+}
+
+//generate a random password
+//$start: start number of mt_rand
+//$end: end number of mt_rand
+function randString($length,$start = 33, $end = 126)
+{
+ $random = '';
+ for ($i = 0; $i < $length; $i++)
+ {
+ $random .= chr(mt_rand($start, $end));
+ }
+ return $random;
+}
+
+//generate a random string
+//$charNumb:number of characters of the final string
+//$allowedChars: allowed characters
+function generateString($charNumb = 8,$allowedChars = '0123456789abcdefghijklmnopqrstuvwxyz')
+{
+ $str = null;
+ for ($i = 0; $i < $charNumb; $i++)
+ {
+ $str .= substr($allowedChars, mt_rand(0, strlen($allowedChars)-1), 1);
+ }
+ return $str;
+}
+
+
+function getIp()
+{
+ $ip = "";
+
+ if (isset($_SERVER))
+ {
+ if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
+ {
+ $ip = sanitizeIp($_SERVER["HTTP_X_FORWARDED_FOR"]);
+ } else if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
+ $ip = sanitizeIp($_SERVER["HTTP_CLIENT_IP"]);
+ } else {
+ $ip = sanitizeIp($_SERVER["REMOTE_ADDR"]);
+ }
+ } else {
+ if ( getenv( 'HTTP_X_FORWARDED_FOR' ) !== false ) {
+ $ip = sanitizeIp(getenv( 'HTTP_X_FORWARDED_FOR' ));
+ } else if ( getenv( 'HTTP_CLIENT_IP' ) !== false ) {
+ $ip = sanitizeIp(getenv( 'HTTP_CLIENT_IP' ));
+ } else {
+ $ip = sanitizeIp(getenv( 'REMOTE_ADDR' ));
+ }
+ }
+ return $ip;
+}
+
+
+
+function getUserAgent() {
+ if (isset($_SERVER['HTTP_USER_AGENT']))
+ {
+ return md5($_SERVER['HTTP_USER_AGENT']);
+ }
+ else
+ {
+ return md5('firefox');
+ }
+}
+
+
+function xml_encode($string)
+{
+ $trans = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
+ foreach ($trans as $k=>$v)
+ {
+ $trans[$k]= "&#".ord($k).";";
+ }
+
+ return strtr($string, $trans);
+} \ No newline at end of file
diff --git a/h-source/Library/HeaderObj.php b/h-source/Library/HeaderObj.php
new file mode 100644
index 0000000..994eb16
--- /dev/null
+++ b/h-source/Library/HeaderObj.php
@@ -0,0 +1,45 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//manage the header
+class HeaderObj {
+
+ private $domainName; //the base path of the website (domainname)
+
+ public function __construct($domainName)
+ {
+ $this->domainName = $domainName;
+ }
+
+ //redirect to $path after the time $time
+ //string that appears until the page is redirected
+ public function redirect($path,$time = 0,$string = null)
+ {
+ $completePath = Url::getRoot().$path;
+ header('Refresh: '.$time.';url='.$completePath);
+ if (isset($string)) echo $string;
+ exit;
+ }
+
+}
diff --git a/h-source/Library/Helper/Array.php b/h-source/Library/Helper/Array.php
new file mode 100755
index 0000000..329463f
--- /dev/null
+++ b/h-source/Library/Helper/Array.php
@@ -0,0 +1,28 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//Helper class to manage arrays
+class Helper_Array extends ArrayExt {
+
+} \ No newline at end of file
diff --git a/h-source/Library/Helper/Html.php b/h-source/Library/Helper/Html.php
new file mode 100755
index 0000000..81a9bdd
--- /dev/null
+++ b/h-source/Library/Helper/Html.php
@@ -0,0 +1,31 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//base class of all the Helper classes that returns HTML
+class Helper_Html {
+
+ public $viewArgs = array(); //arguments of the view action (to mantain the status, ex: page,language,etc)
+ public $viewStatus = null; //additional string to the url to define the status of the view action (ex: page,language,etc)
+
+} \ No newline at end of file
diff --git a/h-source/Library/Helper/List.php b/h-source/Library/Helper/List.php
new file mode 100755
index 0000000..c455454
--- /dev/null
+++ b/h-source/Library/Helper/List.php
@@ -0,0 +1,496 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to create the HTML of a list of records
+class Helper_List extends Helper_Html {
+
+ private $__rowArray = array(); //the current associative array representing the database record
+
+ protected $_itemsList = array(); //2-dimensional associative array containing the list items
+ //keys: type,table:field,controller/action,value
+ protected $_head = array(); //2-dimensional array containing the head of the table
+ protected $_identifierName;
+
+ protected $_recordNumber = null; //number of records from the table
+
+ protected $_allowedItems = array('simpleLink','simpleText','delForm','editForm','associateForm','moveupForm','movedownForm','Form','ledit','link','text'); //type of items allowed
+
+ //it can be: both, top, bottom, none
+ protected $_boundaries = 'none';
+
+ //array of filters
+ protected $_filters = array();
+
+ //set if the submit buttons have to be images or not (it can be yse or not)
+ public $submitImageType = 'yes';
+
+ //set the files of the images
+ public $submitImages = array();
+
+ //set the titles of the input:submit
+ public $submitTitles = array();
+
+ //properties of columns
+ public $colProperties = array();
+
+ //table attributes
+ public $tableAttributes = array('class'=>'listTable','cellspacing'=>'0');
+
+ //$position: array. First element: page number, second element: number of pages
+ public $position = array();
+
+ //instance of Lang_{language}_Generic
+ public $strings = null;
+
+ //the url (controller/action) of the current page
+ public $url = null;
+
+ public $pageArg = null; //the key of the viewArgs array representing the page number. $this->viewArgs[$this->pageArg] is set to 1 if $this->pageArg !== null
+
+ public function __construct() {
+
+ //get the generic language class
+ $this->strings = Factory_Strings::generic(Params::$language);
+
+ $baseUrl = 'http://'.DOMAIN_NAME.'/Public/Img/Icons/elementary_2_5/';
+
+ //set the files of the images
+ $this->submitImages = array(
+ 'up' => $baseUrl.'up.png',
+ 'down' => $baseUrl.'down.png',
+ 'edit' => $baseUrl.'edit.png',
+ 'del' => $baseUrl.'delete.png',
+ 'link' => $baseUrl.'link.png',
+ );
+
+ $this->submitTitles = array(
+ 'edit' => $this->strings->gtext('edit'),
+ 'del' => $this->strings->gtext('delete'),
+ 'up' => $this->strings->gtext('move up'),
+ 'down' => $this->strings->gtext('move down'),
+ 'link' => $this->strings->gtext('associate')
+ );
+
+ }
+
+ public function build($identifierName = 'identifier', $url = null, $pageArg = null)
+ {
+ $this->_identifierName = $identifierName;
+ $this->url = $url;
+ $this->pageArg = $pageArg;
+ }
+
+ public function setIdentifierName($identifierName)
+ {
+ $this->_identifierName = $identifierName;
+ }
+
+ //add a list Item. $type: the type of the item, $field: the table.field to exctract (use colon to separate the table and the field),$action: controller/action,$value=if type == link->the value of the link
+ public function addItem($type, $action = '', $field = '', $name = '', $value = '', $title = '') {
+ if (!in_array($type,$this->_allowedItems)) {
+ throw new Exception('"'.$type. '" argument not allowed in '.__METHOD__.' method');
+ }
+ $temp=array();
+ $temp['type'] = $type;
+ $temp['action'] = $action;
+ $temp['field'] = $field;
+ $temp['name'] = $name;
+ $temp['value'] = $value;
+ $temp['title'] = $title;
+ $this->_itemsList[] = $temp;
+
+ //set the $this->_head array
+ $head = array();
+ $head['type'] = $type;
+
+ if ($type === 'simpleText') {
+ $head['action'] = $this->extractFieldName($action);
+ } else {
+ $head['action'] = '&nbsp';
+ }
+ $this->_head[] = $head;
+ }
+
+
+ //set the head of the table
+ //$columnsName: name of the columns. It has to be a comma-separated list of strings
+ public function setHead($columnsName = '')
+ {
+ //get the array from the list
+ $columnsArray = explode(',',$columnsName);
+ for ($i = 0; $i < count($columnsArray); $i++)
+ {
+ if ($i < count($this->_itemsList)) $this->_head[$i]['action'] = $columnsArray[$i];
+ }
+ }
+
+ //set the filters
+ //$filters: array whose elements are the viewArgs to be used for the filters forms
+ public function setFilters($filters)
+ {
+ $this->_filters = $filters;
+ }
+
+ //check that the ViewArgs array is complete
+ public function checkViewArgs()
+ {
+ foreach ($this->_filters as $field)
+ {
+ if (!array_key_exists($field,$this->viewArgs) and strcmp($field,null) !== 0) return false;
+ }
+ return true;
+ }
+
+ //$method to extract the field name from the $action string (;table:field;). Used for the head
+ public function extractFieldName($string) {
+ $string = str_replace(';','',$string);
+ return $string;
+ }
+
+ //replace the strings wrapped by ; with their correspondent value taken by the $recordArray associative array (a row of the select query)
+ public function replaceFields($string,$rowArray) {
+ $this->__rowArray = $rowArray; //used by the replaceField method
+
+ $string = preg_replace_callback('/(\;)(.*?)(\;)/', array($this, 'replaceField') ,$string);
+
+ return $string;
+ }
+
+ //replace a single string wrapped by ; with its correspondent value taken by the $recordArray associative array (a row of the select query)
+ public function replaceField($match)
+ {
+ $string = $match[2];
+
+ if (strstr($string,':') or strstr($string,'.')) {
+ if (strstr($string,':'))
+ {
+ $char = ':';
+ }
+ else
+ {
+ $char = '.';
+ }
+ //check if a function has been indicated
+ if (strstr($string,'|'))
+ {
+ //get the function
+ $firstArray = explode('|',$string);
+ $func = $firstArray[0];
+ //replace the fields
+ $temp = explode($char,$firstArray[1]);
+ $string = $this->__rowArray[$temp[0]][$temp[1]];
+
+ if (!function_exists($func)) {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$func.'</b> does not exists..');
+ }
+ //apply the function
+ $string = call_user_func($func,$string);
+ }
+ else
+ {
+ $temp = explode($char,$string);
+ $string = $this->__rowArray[$temp[0]][$temp[1]];
+ }
+ }
+ return $string;
+ }
+
+ //call the method replaceFields upon the $items array using the associative array $rowArray
+ public function replaceAll($item,$rowArray) {
+ $item['action'] = $this->replaceFields($item['action'],$rowArray);
+ $item['field'] = $this->replaceFields($item['field'],$rowArray);
+ $item['name'] = $this->replaceFields($item['name'],$rowArray);
+ $item['value'] = $this->replaceFields($item['value'],$rowArray);
+ $item['title'] = $this->replaceFields($item['title'],$rowArray);
+ return $item;
+ }
+
+ //wrap the column with the tag td
+ public function wrapColumn($string, $className = null) {
+ return wrap($string,array('td'=>$className));
+ }
+
+ //wrap the row with the tag tr
+ public function wrapRow($string,$className = null) {
+ return wrap($string,array('tr'=>$className));
+ }
+
+ public function wrapList($string) {
+ return wrap($string,array('table'=>$this->tableAttributes));
+ }
+
+ //method to create the HTML of the head of the table
+ public function createHead() {
+ $htmlHead = null;
+
+ $count = 0;
+ foreach ($this->_head as $item) {
+ $temp = $item['action'];
+
+ $prop = $item['type'];
+ if (isset($this->colProperties[$count]))
+ {
+ $prop = $this->colProperties[$count];
+ }
+
+ $htmlHead .= $this->wrapColumn($temp,$prop);
+
+ $count++;
+ }
+
+ return $htmlHead;
+ }
+
+ //method to create the HTML of the head of the table
+ public function createFilters() {
+ $htmlFilters = null;
+
+ if (count($this->_filters) > 0)
+ {
+ if ($this->checkViewArgs())
+ {
+ $count = 0;
+ foreach ($this->_head as $item) {
+
+ $prop = $item['type'];
+ if (isset($this->colProperties[$count]))
+ {
+ $prop = $this->colProperties[$count];
+ }
+
+ $html = '&nbsp';
+ if (isset($this->_filters[$count]))
+ {
+ $html = $this->filterForm($this->_filters[$count]);
+ }
+ $htmlFilters .= $this->wrapColumn($html,$prop);
+
+ $count++;
+ }
+ }
+ }
+
+ return $htmlFilters;
+ }
+
+ //create the HTML of a single row (values taken from the associative array $rowArray)
+ public function getRowList($rowArray) {
+ $htmlList = null;
+
+ $count = 0;
+ foreach ($this->_itemsList as $item) {
+ $item = $this->replaceAll($item,$rowArray);
+
+ $prop = $item['type'];
+ if (isset($this->colProperties[$count]))
+ {
+ $prop = $this->colProperties[$count];
+ }
+
+ if (($this->_boundaries === 'top' and $item['type'] === 'moveupForm') or ($this->_boundaries === 'bottom' and $item['type'] === 'movedownForm') or ($this->_boundaries === 'both' and ($item['type'] === 'moveupForm' or $item['type'] === 'movedownForm')))
+ {
+ $htmlList .= $this->wrapColumn('&nbsp',$prop);
+ }
+ else
+ {
+ $temp = call_user_func_array(array($this,$item['type']),array($item));
+ $htmlList .= $this->wrapColumn($temp,$prop);
+ }
+ $count++;
+ }
+ return $htmlList;
+ }
+
+ //$index: record number
+ public function ifInBoundaries($index)
+ {
+ $this->_boundaries = 'none';
+
+ if (!empty($this->position))
+ {
+ if ($this->_recordNumber === 1 and strcmp($this->position[0],1) === 0)
+ {
+ $this->_boundaries = 'both';
+ }
+ else if ($index === 0 and strcmp($this->position[0],1) === 0)
+ {
+ $this->_boundaries = 'top';
+ }
+ else if ($index === ($this->_recordNumber-1) and strcmp($this->position[0],$this->position[1]) === 0)
+ {
+ $this->_boundaries = 'bottom';
+ }
+ }
+
+ }
+
+ //create the HTML of the entire list. $queryResult: the array coming from the select query
+ public function render($queryResult)
+ {
+ //set the number of records
+ $this->_recordNumber = count($queryResult);
+ $htmlList = null;
+ //create the HTML of the head of the record list
+ $htmlList .= $this->wrapRow($this->createHead(),'listHead');
+ //create the HTML of the filters
+ $htmlList .= $this->wrapRow($this->createFilters(),'listFilters');
+ for ($i = 0; $i < count($queryResult); $i++)
+ {
+ $this->ifInBoundaries($i);
+ $temp = $this->getRowList($queryResult[$i]);
+ $htmlList .= $this->wrapRow($temp,'listRow');
+ }
+ return $this->wrapList($htmlList);
+ }
+
+ public function generalForm($itemArray, $submitName, $submitValue)
+ {
+ $string = "<form class='listItemForm' action='".Url::getRoot(null).$itemArray['action'].$this->viewStatus."' method='POST'>\n";
+ $name = (strcmp($itemArray['name'],'') !== 0) ? $itemArray['name'] : $submitName;
+ $value = (strcmp($itemArray['value'],'') !== 0) ? $itemArray['value'] : $submitValue;
+
+ $oldValue = $value;
+ $value = $this->strings->gtext($value);
+
+ if (strcmp($itemArray['title'],'') !== 0)
+ {
+ $title = "title='".$itemArray['title']."'";
+ }
+ else
+ {
+ $title = isset($this->submitTitles[$oldValue]) ? "title='".$this->submitTitles[$oldValue]."'" : null;
+ }
+
+ if (strcmp($this->submitImageType,'yes') === 0 and isset($this->submitImages[$oldValue]))
+ {
+ $imgSrc = $this->submitImages[$oldValue];
+
+ $string .= "<input type='image' $title src='".$imgSrc."' value='$value'>\n";
+ $string .= "<input type='hidden' name='".$name."' value='$value'>\n";
+ }
+ else
+ {
+ $string .= "<input type='submit' $title name='".$name."' value='$value'>\n";
+ }
+
+ $string .= "<input type='hidden' name='".$this->_identifierName."' value='".$itemArray['field']."'>\n";
+ $string .= "</form>\n";
+ return $string;
+ }
+
+ public function Form($itemArray)
+ {
+ return $this->generalForm($itemArray, 'name_missing', 'value_missing');
+ }
+
+ public function moveupForm($itemArray)
+ {
+ return $this->generalForm($itemArray, 'moveupAction', 'up');
+ }
+
+ public function movedownForm($itemArray)
+ {
+ return $this->generalForm($itemArray, 'movedownAction', 'down');
+ }
+
+ public function editForm($itemArray)
+ {
+ return $this->generalForm($itemArray, 'generalAction', 'edit');
+ }
+
+ public function delForm($itemArray)
+ {
+ return $this->generalForm($itemArray, 'delAction', 'del');
+ }
+
+ public function associateForm($itemArray)
+ {
+ return $this->generalForm($itemArray, 'generalAction', 'link');
+ }
+
+ public function simpleText($itemArray) {
+ $text = strcmp($itemArray['action'],'') !== 0 ? $itemArray['action'] : '&nbsp';
+ $string = "<span class='textItem'>".$text."</span>\n";
+ return $string;
+ }
+
+ public function text($itemArray)
+ {
+ return $this->simpleText($itemArray);
+ }
+
+ public function simpleLink($itemArray) {
+ $string = "<a title='".$itemArray['field']."' class='linkItem' href='".Url::getRoot(null).$itemArray['action'].$this->viewStatus."'>".$itemArray['name']."</a>\n";
+ return $string;
+ }
+
+ public function link($itemArray)
+ {
+ return $this->simpleLink($itemArray);
+ }
+
+ public function ledit($itemArray)
+ {
+ $text = isset($this->submitImages['edit']) ? "<img src='".$this->submitImages['edit']."'>" : $itemArray['name'];
+ $title = isset($this->submitTitles['edit']) ? $this->submitTitles['edit'] : $itemArray['field'];
+ $string = "<a title='".$title."' class='linkItem' href='".Url::getRoot(null).$itemArray['action'].$this->viewStatus."'>$text</a>\n";
+ return $string;
+ }
+
+ //create the HTML of the filter
+ public function filterForm($viewArgsName)
+ {
+ $cleanName = str_replace('n!',null,$viewArgsName);
+ $cleanName = str_replace('-',null,$cleanName);
+
+ if (isset($this->viewArgs[$this->pageArg]))
+ {
+ $this->viewArgs[$this->pageArg] = 1;
+ }
+
+ $temp = $value = $this->viewArgs[$viewArgsName];
+ //set the viewArg to the null query value
+ if (Params::$nullQueryValue)
+ {
+ $this->viewArgs[$viewArgsName] = Params::$nullQueryValue;
+ $viewStatus = Url::createUrl(array_values($this->viewArgs));
+ if (strcmp($value,Params::$nullQueryValue) === 0) $value = '';
+ }
+ $this->viewArgs[$viewArgsName] = $temp;
+
+ $action = Url::getRoot($this->url).$viewStatus;
+ $imgSrc = Url::getRoot('Public/Img/Icons/elementary_2_5/find.png');
+ $title = $this->strings->gtext('filter');
+ $clearLinkTitle = $this->strings->gtext('clear the filter');
+
+ $html = "<form class='list_filter_form list_filter_form_$cleanName' action='".$action."' method='GET'>\n";
+ $html .= "<input class='list_filter_input list_filter_input_$cleanName' type='text' name='$viewArgsName' value='".$value."'>";
+ $html .= "<a class='list_filter_clear_link list_filter_clear_link_$cleanName' title='$clearLinkTitle' href='$action'><img src='".Url::getRoot()."/Public/Img/Icons/elementary_2_5/clear_filter.png' /></a>";
+ $html .= "<input class='list_filter_submit list_filter_submit_$cleanName' type='image' title='$title' src='".$imgSrc."' value='trova'>\n";
+ $html .= "</form>\n";
+
+ return $html;
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Helper/Menu.php b/h-source/Library/Helper/Menu.php
new file mode 100755
index 0000000..8fd4bf4
--- /dev/null
+++ b/h-source/Library/Helper/Menu.php
@@ -0,0 +1,109 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to write the top menù of the view files
+class Helper_Menu extends Helper_Html
+{
+
+ public $panelController; //panel controller
+ public $controller;
+
+ public $links = array();
+
+ //instance of Lang_{language}_Generic
+ public $strings = null;
+
+ public function __construct()
+ {
+ $baseUrl = "http://".DOMAIN_NAME.'/Public/Img/Icons/elementary_2_5/';
+
+ //get the generic language class
+ $this->strings = Factory_Strings::generic(Params::$language);
+
+ $this->links = array(
+
+ 'back' => array(
+ 'title' => $this->strings->gtext('back'),
+ 'class' => 'mainMenuItem',
+ 'text' => $this->strings->gtext('Back'),
+ 'url' => 'main',
+ 'icon' => $baseUrl."left.png",
+ ),
+
+ 'add' => array(
+ 'title' => $this->strings->gtext('add a new record'),
+ 'class' => 'mainMenuItem',
+ 'text' => $this->strings->gtext('Add'),
+ 'url' => 'form/insert',
+ 'icon' => $baseUrl."add.png",
+ ),
+
+ 'panel' => array(
+ 'title' => $this->strings->gtext('back to the Panel'),
+ 'class' => 'mainMenuItem',
+ 'text' => $this->strings->gtext('Panel'),
+ 'url' => 'main',
+ 'icon' => $baseUrl."panel.png",
+ )
+
+ );
+ }
+
+ public function build($controller = null, $panelController = null)
+ {
+ $this->controller = $controller;
+ $this->panelController = $panelController;
+ }
+
+ //$voices: comma-separated list of links you want to print
+ public function render($linksList)
+ {
+ $linksArray = explode(',',$linksList);
+ $menu = null;
+ foreach ($linksArray as $linkName)
+ {
+ //check that the voice exists
+ if (array_key_exists($linkName,$this->links))
+ {
+ //check that the text and the ure are defined
+ if (isset($this->links[$linkName]['text']) and isset($this->links[$linkName]['url']))
+ {
+ $title = isset($this->links[$linkName]['title']) ? "title='".$this->links[$linkName]['title']."'" : null;
+ $class = isset($this->links[$linkName]['class']) ? "class='".$this->links[$linkName]['class']."'" : null;
+ $icon = isset($this->links[$linkName]['icon']) ? "<img class='top_menu_icon' src='".$this->links[$linkName]['icon']."'> " : null;
+
+ //choose the controller (current or panel)
+ $controller = (strcmp($linkName,'panel') === 0) ? $this->panelController.'/' : $this->controller.'/';
+ $viewStatus = (strcmp($linkName,'panel') === 0) ? null : $this->viewStatus;
+
+ $href = Url::getRoot($controller.$this->links[$linkName]['url'].$viewStatus);
+ $text = $this->links[$linkName]['text'];
+ $menu .= "<div $class>$icon <a $title href='$href'>$text</a></div>\n";
+ }
+ }
+ }
+ return $menu;
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Helper/Pages.php b/h-source/Library/Helper/Pages.php
new file mode 100755
index 0000000..d8ac856
--- /dev/null
+++ b/h-source/Library/Helper/Pages.php
@@ -0,0 +1,140 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//Helper class to create the HTML of the page list
+class Helper_Pages extends Helper_Html
+{
+
+ protected $_urlViewAction; //url of the current page
+ protected $_currentPage; //number of the page
+ protected $_numbOfPages; //number of pages
+ protected $_variableArg = ''; //value of the $viewArgs key that has to be modified
+
+ public $previousString = null; //string of the link to the previous page
+ public $nextString = null; //string of the link to the next page
+ public $showNext = true;
+ public $showPrev = true;
+
+ //instance of Lang_{language}_Generic
+ public $strings = null;
+
+ public function __construct()
+ {
+ //get the generic language class
+ $this->strings = Factory_Strings::generic(Params::$language);
+ }
+
+ public function build($urlViewAction = '' , $variableArg = 'page', $previousString = 'previous', $nextString = 'next')
+ {
+ $this->_variableArg = $variableArg;
+ $this->_urlViewAction =$urlViewAction; //url of the controller and (/) main action
+ $this->previousString = $this->strings->gtext($previousString);
+ $this->nextString = $this->strings->gtext($nextString);
+ }
+
+ //return the number of pages
+ public function getNumbOfPages()
+ {
+ return $this->_numbOfPages;
+ }
+
+ //get the limit of the select query clause
+ public function getLimit($currentPage,$recordNumber,$recordPerPage)
+ {
+ $this->_currentPage = $currentPage;
+ $this->_numbOfPages=(($recordNumber%$recordPerPage)===0) ? (int) ($recordNumber/$recordPerPage) : ((int) ($recordNumber/$recordPerPage))+1;
+ $start=(($currentPage-1)*$recordPerPage);
+ return "$start,$recordPerPage";
+ }
+
+ //return the page list string
+ public function render($pageNumber,$numberOfPages)
+ {
+ $pageList = null;
+ if ($this->showPrev)
+ {
+ $pageList .= $this->pageLink($this->_currentPage-1,$this->previousString);
+ }
+ $pageList .= $this->recursiveLink($pageNumber,$numberOfPages);
+ if ($this->showNext)
+ {
+ $pageList .= $this->pageLink($this->_currentPage+1,$this->nextString);
+ }
+ return $pageList;
+ }
+
+ //recorsive function in order to write the page list
+ public function recursiveLink($pageNumber,$numberOfPages)
+ {
+
+ if ($numberOfPages === 0) return null;
+
+ if ($numberOfPages === 1) {
+ return $this->pageLink($pageNumber);
+ } else {
+ return $this->pageLink($pageNumber) . $this->recursiveLink($pageNumber+1,$numberOfPages-1);
+ }
+ }
+
+ public function pageLink($pageNumber, $string = null) {
+ if ($pageNumber > 0 and $pageNumber <= $this->_numbOfPages) {
+ return $this->html($pageNumber,$string);
+ } else {
+ return null;
+ }
+ }
+
+ //return the html link
+ public function html($pageNumber,$string = null) {
+ if (isset($string)) {
+ $strNumber = $string;
+ $strClass = "class='itemListPage'";
+ } else {
+ if ($pageNumber === $this->_currentPage)
+ {
+ $strNumber = $pageNumber;
+ $strClass = "class='currentPage'";
+ }
+ else
+ {
+ $strNumber = $pageNumber;
+ $strClass = "class='itemListPage'";
+ }
+ }
+ $this->viewArgs[$this->_variableArg] = $pageNumber;
+ $viewStatus = Url::createUrl(array_values($this->viewArgs));
+ $href= Url::getRoot(null) . $this->_urlViewAction .$viewStatus;
+ return $this->getATag($href,$strNumber,$strClass);
+ }
+
+ //get the HTMl of the tag
+ //$href: href of the link
+ //$text: the text of the link
+ //$strClass: the class of the link
+ public function getATag($href,$text,$strClass)
+ {
+ return "<a $strClass href='$href'>$text</a>";
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Helper/Popup.php b/h-source/Library/Helper/Popup.php
new file mode 100755
index 0000000..18bb00d
--- /dev/null
+++ b/h-source/Library/Helper/Popup.php
@@ -0,0 +1,142 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to create the popup menu
+class Helper_Popup extends Helper_Html {
+
+ public $popupArray = array(); //array of popup objects (see popup.php)
+ public $url = null; //the url (controller/action) to link by means of the popup menù
+// public $fieldArg = null; //the key of the viewArgs array to set to the field in the where clause
+// public $valueArg = null; //the key of the viewArgs array to be set to the value in the where clause
+ public $pageArg = null; //the key of the viewArgs array representing the page number. $this->viewArgs[$this->pageArg] is set to 1 if $this->pageArg !== null
+
+ //the type of the popup. If type !=exclusive, than each voice selected is added to the where clause. If type=exclusive, the selection of a popup voice causes the unselection of the other voices
+ public $type = null;
+
+ public $allString = null;
+
+ //list of popup names
+ public $popupItems = array();
+
+ //if it has to print the filter legend
+ public $printLegend = false;
+
+ //popup legend
+ public $legend = array();
+
+ public function __construct()
+ {
+ //get the generic language class
+ $this->strings = Factory_Strings::generic(Params::$language);
+
+ $this->allString = $this->strings->gtext('All');
+ }
+
+ public function build($url, $popupArray = null, $type = 'exclusive', $pageArg = null, $printLegend = false) {
+ $this->url = $url;
+ $this->popupArray = $popupArray;
+ $this->pageArg = $pageArg;
+ $this->type = $type;
+ $this->printLegend = $printLegend;
+
+ foreach ($this->popupArray as $field => $popup)
+ {
+ $this->popupItems[] = $field;
+ }
+ }
+
+ //check that the ViewArgs array is complete
+ public function checkViewArgs()
+ {
+ foreach ($this->popupArray as $field => $popup)
+ {
+ if (!array_key_exists($field,$this->viewArgs)) return false;
+ }
+ return true;
+ }
+
+ //unselect the voices different from the current one
+ public function unselect($currentVoice)
+ {
+ foreach ($this->popupItems as $item)
+ {
+ if (strcmp($item,$currentVoice) !== 0) $this->viewArgs[$item] = Params::$nullQueryValue;
+ }
+ }
+
+ //create the HTML of the popup
+ public function render() {
+ $returnString = null;
+ if ($this->checkViewArgs())
+ {
+ if (isset($this->viewArgs[$this->pageArg]))
+ {
+ $this->viewArgs[$this->pageArg] = 1;
+ }
+ foreach ($this->popupArray as $field => $popup)
+ {
+ //default legend
+ $this->legend[$field] = Params::$nullQueryValue;
+
+ if ($this->type === 'exclusive') $this->unselect($field);
+ //save the value of the current ViewArg
+ $tempArg = $this->viewArgs[$field];
+ $this->legend[$field] = $tempArg;
+
+ $returnString .= "<ul onMouseOver='DisplayTag(this,\"block\");' onMouseOut='DisplayTag(this,\"none\");' id='menuBlock'><li class='innerItem'>".$popup->name."<ul class='innerList'>\n";
+ for ($i = 0; $i < count($popup->itemsValue); $i++)
+ {
+ $this->viewArgs[$field] = $popup->itemsValue[$i];
+ $viewStatus = Url::createUrl(array_values($this->viewArgs));
+ $returnString .= "<li><a href='".Url::getRoot($this->url).$viewStatus."'>".$popup->itemsName[$i]."</a></li>\n";
+
+ //set the legend
+ if (strcmp($popup->itemsValue[$i],$this->legend[$field]) === 0)
+ {
+ $this->legend[$field] = $popup->itemsName[$i];
+ }
+ }
+ $this->viewArgs[$field] = Params::$nullQueryValue;
+ $viewStatus = Url::createUrl(array_values($this->viewArgs));
+ $returnString .= "<li><a href='".Url::getRoot($this->url).$viewStatus."'>".$this->allString."</a></li>\n";
+ $returnString .= "</ul>\n</li>\n</ul>\n";
+ $this->viewArgs[$field] = $tempArg;
+ }
+ if ($this->printLegend)
+ {
+ $returnString .= "<div class='popup_legend'>\n";
+ foreach ($this->popupArray as $field => $popup)
+ {
+ $returnString .= "<div class='popup_legend_item'>".$this->legend[$field]."</div>";
+ }
+ $returnString .= "</div>\n";
+ }
+ if (count($this->popupArray)>0) {
+ $returnString .= "<script type=\"text/javascript\" src=\"http://".DOMAIN_NAME."/Public/Js/DisplayTag.js\"></script>\n";
+ }
+ }
+ return $returnString;
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Helper/index.html b/h-source/Library/Helper/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Helper/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Hooks.php b/h-source/Library/Hooks.php
new file mode 100644
index 0000000..b16b6d5
--- /dev/null
+++ b/h-source/Library/Hooks.php
@@ -0,0 +1,38 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to call the hooks
+class Hooks
+{
+
+ //include an hook file
+ public static function load($path)
+ {
+ if (file_exists($path))
+ {
+ include_once($path);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Html/Form.php b/h-source/Library/Html/Form.php
new file mode 100644
index 0000000..ec81cfb
--- /dev/null
+++ b/h-source/Library/Html/Form.php
@@ -0,0 +1,211 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//create the HTML of the inputs of a form
+class Html_Form {
+
+ //return the HTML of a select
+ //$name: name of the select
+ //$value: the selected value of the select (set $value equal to null if you don't want to select an option)
+ //$options: options of the select. This param can be a comma-separated list of options or an associative array ('name'=>'value')
+ //$className: the class name of the select
+ //$idName: name of the id
+ static public function select($name, $value, $options, $className = null, $idName = null, $reverse = null, $attributes = null)
+ {
+ $strClass = isset($className) ? "class='".$className."'" : null;
+ $idStr = isset($idName) ? "id='".$idName."'" : null;
+
+ $returnString = null;
+ $returnString .= "<select $attributes ".$idStr." $strClass name='".$name."'>\n";
+ if (is_string($options)) {
+ $tempArray = explode(',',$options);
+ foreach ($tempArray as $item)
+ {
+ if (strstr($item,'optgroupOpen:'))
+ {
+ $temp = explode(':',$item);
+ $optionsArray[$temp[1]] = "optgroupOpen";
+ }
+ else
+ {
+ $optionsArray[$item] = $item;
+ }
+ }
+ }
+ else
+ {
+ $optionsArray = $options;
+ }
+
+ $flag = 0;
+ foreach ($optionsArray as $optionName => $optionValue) {
+
+ $a = $optionName;
+ $b = $optionValue;
+
+ if (strcmp($reverse,'yes') === 0)
+ {
+ $b = $optionName;
+ $a = $optionValue;
+ }
+
+ if (strcmp($b,'optgroupOpen') === 0)
+ {
+ if ($flag === 1) $returnString .= "</optgroup>\n";
+ $returnString .= "<optgroup label='" . $a . "'>\n";
+ $flag = 1;
+ }
+ else
+ {
+ $str= (strcmp($value,$b) === 0) ? "selected='$b'" : null;
+ $returnString .= "<option value='".$b."' $str>$a</option>\n";
+ }
+ }
+ if ($flag === 1) $returnString .= "</optgroup>\n";
+ $returnString .= "</select>\n";
+ return $returnString;
+ }
+
+ //return the HTML of an <input type='text' ...>
+ //$name: the name of the input
+ //$value: the value of the input
+ //$className: the class name of the input
+ //$idName: name of the id
+ static public function input($name, $value, $className = null, $idName = null, $attributes = null)
+ {
+ $strClass = isset($className) ? "class='".$className."'" : null;
+ $idStr = isset($idName) ? "id='".$idName."'" : null;
+
+ $returnString ="<input $attributes ".$idStr." $strClass type='text' name='" .$name. "' value = '$value' />\n";
+ return $returnString;
+ }
+
+ //return the HTML of an <input type='file' ...>
+ //$name: the name of the input
+ //$className: the class name of the input
+ //$idName: name of the id
+ static public function fileUpload($name, $value, $className = null, $idName = null, $attributes = null)
+ {
+ $strClass = isset($className) ? "class='".$className."'" : null;
+ $idStr = isset($idName) ? "id='".$idName."'" : null;
+
+ $returnString ="<input $attributes ".$idStr." $strClass type='file' name='" .$name. "' />\n";
+ return $returnString;
+ }
+
+ //return the HTML of a checkBox
+ //$name: name of the checkBox (string)
+ //$value: the value of the checkBox (string or number)
+ //$option: option of the checkBox (string or number)
+ //$className: the class name of the checkBox (string)
+ //$idName: name of the id
+ static public function checkbox($name, $value, $option, $className = null, $idName = null, $attributes = null)
+ {
+ $strClass = isset($className) ? "class='".$className."'" : null;
+ $idStr = isset($idName) ? "id='".$idName."'" : null;
+
+ $str = (strcmp($value,$option) === 0) ? "checked = 'checked'" : null;
+ return "<input $attributes ".$idStr." $strClass type='checkbox' name='".$name."' value='".$option."' $str />\n";
+ }
+
+ //return the HTML of a hidden entry
+ //$name: name of the hidden entry (string)
+ //$value: the value of the hidden entry (string or number)
+ static public function hidden($name, $value, $className = null, $idName = null, $attributes = null)
+ {
+ $strClass = isset($className) ? "class='".$className."'" : null;
+ $idStr = isset($idName) ? "id='".$idName."'" : null;
+
+ return "<input $attributes ".$idStr." $strClass type='hidden' name='" .$name. "' value = '$value'>\n";
+ }
+
+ //return the HTML of a password entry
+ //$name: name of the password entry (string)
+ //$value: the value of the password entry (string or number)
+ //$idName: name of the id
+ static public function password($name, $value, $className = null, $idName = null, $attributes = null)
+ {
+ $strClass = isset($className) ? "class='".$className."'" : null;
+ $idStr = isset($idName) ? "id='".$idName."'" : null;
+
+ return "<input $attributes ".$idStr." $strClass type='password' name='" .$name. "' value='$value' />\n";
+ }
+
+ //return the HTML of a textarea
+ //$name: name of the textarea (string)
+ //$value: the value of the textarea (string or number)
+ //$idName: name of the id
+ static public function textarea($name, $value, $className = null, $idName = null, $attributes = null)
+ {
+ $strClass = isset($className) ? "class='".$className."'" : null;
+ $idStr = isset($idName) ? "id='".$idName."'" : null;
+
+ return "<textarea $attributes ".$idStr." $strClass name='" .$name. "'>$value</textarea>\n";
+ }
+
+ //return the HTML of a radio button
+ //$name: name of the radio button
+ //$value: the selected value of the radio button (set $value equal to null if you don't want to select an option)
+ //$options: options of the radio button. This param can be a comma-separated list of options or an associative array ('name'=>'value')
+ //$className: the class name of the radio button
+ //$position: position of the strings of the radio with respect to the "circles". It can be before or after
+ //$idName: name of the id
+ static public function radio($name, $value, $options, $className = null, $position = 'after', $idName = null, $attributes = null)
+ {
+ $strClass = isset($className) ? "class='".$className."'" : null;
+ $idStr = isset($idName) ? "id='".$idName."'" : null;
+
+ $returnString = null;
+
+ if (is_string($options)) {
+ $tempArray = explode(',',$options);
+ foreach ($tempArray as $item)
+ {
+ $optionsArray[$item] = $item;
+ }
+ } else {
+ $optionsArray = $options;
+ }
+
+ foreach ($optionsArray as $optionName => $optionValue) {
+
+ if ($position === 'before')
+ {
+ $before = $optionName;
+ $after = null;
+ }
+ else
+ {
+ $before = null;
+ $after = $optionName;
+ }
+
+ $str= (strcmp($value,$optionValue) === 0) ? "checked='checked'" : null;
+ $returnString .= "$before<input $attributes ".$idStr." $strClass type='radio' name='".$name."' value='".$optionValue."' $str />$after\n";
+ }
+
+ return $returnString;
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Html/index.html b/h-source/Library/Html/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Html/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Image/Gd/Captcha.php b/h-source/Library/Image/Gd/Captcha.php
new file mode 100644
index 0000000..1e8d706
--- /dev/null
+++ b/h-source/Library/Image/Gd/Captcha.php
@@ -0,0 +1,103 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to create a captcha
+//you have to call session_start() before to initialize a captcha object
+class Image_Gd_Captcha
+{
+
+ private $params = array(); //parameters of the object
+ private $string = null; //the text string of the captcha
+
+ public function __construct($params = null)
+ {
+ $here = realpath('.');
+
+ $defaultParams = array(
+ 'boxWidth' => 150,
+ 'boxHeight' => 100,
+ 'charNumber' => 6,
+ 'fontPath' => $here.'/External/Fonts/FreeFont/FreeMono.ttf',
+ 'undulation' => true,
+ 'align' => false,
+ 'charHeight' => 28,
+ 'sessionKey' => 'captchaString',
+ );
+
+ //set the $this->scaffold->params array
+ if (is_array($params))
+ {
+ foreach ($params as $key => $value)
+ {
+ $defaultParams[$key] = $value;
+ }
+ }
+ $this->params = $defaultParams;
+
+ $this->string = generateString($this->params['charNumber']);
+ }
+
+ public function render()
+ {
+ //space among characters
+ $space = $this->params['boxWidth'] / ($this->params['charNumber']+1);
+ //create the image box
+ $img = imagecreatetruecolor($this->params['boxWidth'],$this->params['boxHeight']);
+
+ $background = imagecolorallocate($img,255,255,255);
+ $border = imagecolorallocate($img,0,0,0);
+ $colors[] = imagecolorallocate($img,mt_rand(0,125),mt_rand(0,125),mt_rand(0,125));
+ $colors[] = imagecolorallocate($img,mt_rand(0,125),mt_rand(0,125),mt_rand(0,125));
+ $colors[] = imagecolorallocate($img,mt_rand(0,125),mt_rand(0,125),mt_rand(0,125));
+
+ //create the background
+ imagefilledrectangle($img,1,1,$this->params['boxWidth']-2,$this->params['boxHeight']-2,$background);
+ imagerectangle($img,0,0,$this->params['boxWidth']-1,$this->params['boxHeight']-2,$border);
+
+ //set the text
+ for ($i=0; $i< $this->params['charNumber']; $i++)
+ {
+ $color = $colors[$i % count($colors)];
+ $char = substr($this->string,$i,1);
+ $fontPath = $this->params['fontPath'];
+ $angle = $this->params['undulation'] === false ? 0 : -20+rand(0,40);
+ $yposFixed = (int)(($this->params['boxHeight'])/2);
+ $ypos = $this->params['align'] === true ? $yposFixed : $yposFixed + mt_rand(0,10);
+ $charHeight = $this->params['charHeight'];
+ imagettftext($img,$charHeight + rand(0,8),$angle,($i+0.3)*$space,$ypos,$color,$fontPath,$char);
+ }
+
+ $noiseColor = imagecolorallocate($img, mt_rand(125,255), mt_rand(125,255), mt_rand(125,255));
+ /* generate random dots in background */
+ for( $i=0; $i<($this->params['boxWidth'] * $this->params['boxHeight'])/7; $i++ ) {
+ imagefilledellipse($img, mt_rand(0,$this->params['boxWidth']), mt_rand(0,$this->params['boxHeight']), 1, 1, $noiseColor);
+ }
+
+ $_SESSION[$this->params['sessionKey']] = $this->string;
+ header('Content-Type: image/png');
+ imagepng($img);
+ imagedestroy($img);
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Image/Gd/Thumbnail.php b/h-source/Library/Image/Gd/Thumbnail.php
new file mode 100644
index 0000000..22e501e
--- /dev/null
+++ b/h-source/Library/Image/Gd/Thumbnail.php
@@ -0,0 +1,220 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to create a thumbnail
+class Image_Gd_Thumbnail
+{
+ const DS = DIRECTORY_SEPARATOR;
+
+ private $params = array(); //parameters of the object
+ private $basePath = null; //the path of the folder inside which the images are saved
+
+ public function __construct($basePath,$params = null)
+ {
+ $finalChar = $basePath[strlen($basePath) - 1];
+ if (strcmp($finalChar,self::DS) !== 0) $basePath .= self::DS;
+
+ $this->basePath = $basePath;
+
+ $defaultParams = array(
+ 'imgWidth' => null,
+ 'imgHeight' => null,
+ 'defaultImage' => null,
+ 'cropImage' => 'no',
+ 'horizAlign' => 'left',
+ 'vertAlign' => 'top',
+ 'resample' => 'yes',
+ 'function' => 'none',
+ 'outputFormat' => 'jpeg',
+ );
+
+ //set the $this->scaffold->params array
+ if (is_array($params))
+ {
+ foreach ($params as $key => $value)
+ {
+ $defaultParams[$key] = $value;
+ }
+ }
+ $this->params = $defaultParams;
+ }
+
+ //create the thumbnail
+ //$imageName: the name of the file inside $this->basePath
+ //$outputFile: the name of the output file
+ public function render($imageFile, $outputFile = null)
+ {
+ $imagePath = $this->basePath . basename($imageFile);
+
+ if (!file_exists($imagePath) and isset($this->params['defaultImage'])) $imagePath = $this->params['defaultImage'];
+
+ $img = null;
+ $type = 'jpeg';
+ $contentType = 'image/jpeg';
+
+ if (file_exists($imagePath))
+ {
+ $ext = strtolower(end(explode('.', $imagePath)));
+
+ if (strcmp($ext,'jpg') === 0 or strcmp($ext,'jpeg') === 0) {
+ $img = @imagecreatefromjpeg($imagePath);
+ $type = 'jpeg';
+ $contentType = 'image/jpeg';
+ } else if (strcmp($ext,'png') === 0) {
+ $img = @imagecreatefrompng($imagePath);
+ $type = 'png';
+ $contentType = 'image/png';
+ } else if (strcmp($ext,'gif') === 0) {
+ $img = @imagecreatefromgif($imagePath);
+ $type = 'gif';
+ $contentType = 'image/gif';
+ }
+ }
+
+ //If an image was successfully loaded, test the image for size
+ if ($img)
+ {
+ //image size
+ $width = imagesx($img);
+ $height = imagesy($img);
+
+ if (!isset($this->params['imgWidth'])) $this->params['imgWidth'] = $width;
+ if (!isset($this->params['imgHeight'])) $this->params['imgHeight'] = $height;
+
+ if ($this->params['cropImage'] === 'no')
+ {
+ $scale = min($this->params['imgWidth']/$width, $this->params['imgHeight']/$height);
+ }
+ else if ($this->params['cropImage'] === 'yes')
+ {
+ $scale = max($this->params['imgWidth']/$width, $this->params['imgHeight']/$height);
+ }
+
+ if ($scale < 1) {
+
+ $xSrc = 0;
+ $ySrc = 0;
+
+ if ($this->params['cropImage'] === 'no')
+ {
+ $newWidth = floor($scale*$width);
+ $newHeight = floor($scale*$height);
+ }
+ else if ($this->params['cropImage'] === 'yes')
+ {
+
+ $newWidth = $this->params['imgWidth'];
+ $newHeight = $this->params['imgHeight'];
+ $oldWidth = $width;
+ $oldHeight = $height;
+ $width = floor($newWidth/$scale);
+ $height = floor($newHeight/$scale);
+
+ switch ($this->params['horizAlign'])
+ {
+ case 'left':
+ $xSrc = 0;
+ break;
+ case 'right':
+ $xSrc = floor(($oldWidth-$width));
+ break;
+ case 'center':
+ $xSrc = floor(($oldWidth-$width)/2);
+ break;
+ default:
+ $xSrc = $this->params['horizAlign'];
+ }
+
+ switch ($this->params['vertAlign'])
+ {
+ case 'top':
+ $ySrc = 0;
+ break;
+ case 'bottom':
+ $ySrc = floor(($oldHeight-$height));
+ break;
+ case 'center':
+ $ySrc = floor(($oldHeight-$height)/2);
+ break;
+ default:
+ $ySrc = $this->params['vertAlign'];
+ }
+
+ }
+
+ //temp image
+ $tmpImg = imagecreatetruecolor($newWidth, $newHeight);
+
+ if ($this->params['resample'] === 'yes')
+ {
+ //copy and resample
+ imagecopyresampled($tmpImg, $img, 0, 0, $xSrc, $ySrc,$newWidth, $newHeight, $width, $height);
+ }
+ else
+ {
+ //copy and resize
+ imagecopyresized($tmpImg, $img, 0, 0, $xSrc, $ySrc,$newWidth, $newHeight, $width, $height);
+ }
+ imagedestroy($img);
+ $img = $tmpImg;
+
+ if (!function_exists($this->params['function'])) {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$this->params['function']. '</b> does not exist');
+ }
+
+ $img = call_user_func($this->params['function'],$img);
+ }
+
+ }
+
+ if (!$img)
+ {
+ $imgWidth = isset($this->params['imgWidth']) ? $this->params['imgWidth'] : 100;
+ $imgHeight = isset($this->params['imgHeight']) ? $this->params['imgHeight'] : 100;
+
+ $img = imagecreate($imgWidth, $imgHeight);
+ imagecolorallocate($img,200,200,200);
+ }
+
+ //print the image
+ if (!isset($outputFile))
+ {
+ header("Content-type: $contentType");
+ }
+
+ if (strcmp($type,'png') === 0)
+ {
+ imagepng($img,$outputFile,9);
+ }
+ else if (strcmp($type,'gif') === 0)
+ {
+ imagegif($img,$outputFile);
+ }
+ else
+ {
+ imagejpeg($img,$outputFile,90);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Image/Gd/index.html b/h-source/Library/Image/Gd/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Image/Gd/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Image/index.html b/h-source/Library/Image/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Image/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Lang/En/DbCondStrings.php b/h-source/Library/Lang/En/DbCondStrings.php
new file mode 100644
index 0000000..bfc5867
--- /dev/null
+++ b/h-source/Library/Lang/En/DbCondStrings.php
@@ -0,0 +1,34 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//error strings in the case database conditions are not satisfied
+class Lang_En_DbCondStrings {
+
+ //get the error string in the case that the value of the field $field is already present in the table $table
+ public function getNotUniqueString($field)
+ {
+ return "<div class='alert'>The value of <i>". $field ."</i> is already present. Please choose a different value.</div>\n";
+ }
+
+}
diff --git a/h-source/Library/Lang/En/Generic.php b/h-source/Library/Lang/En/Generic.php
new file mode 100644
index 0000000..3268270
--- /dev/null
+++ b/h-source/Library/Lang/En/Generic.php
@@ -0,0 +1,64 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//generic strings
+class Lang_En_Generic
+{
+
+ //English to English
+ public $translations = array(
+ 'edit' => 'edit',
+ 'delete' => 'delete',
+ 'move up' => 'move up',
+ 'move down' => 'move down',
+ 'associate' => 'associate',
+ 'up' => 'su',
+ 'down' => 'down',
+ 'link' => 'link',
+ 'del' => 'del',
+ 'back' => 'back',
+ 'Back' => 'Back',
+ 'add a new record' => 'add a new record',
+ 'Add' => 'Add',
+ 'back to the Panel' => 'back to the Panel',
+ 'Panel' => 'Panel',
+ 'previous' => 'previous',
+ 'next' => 'next',
+ 'All' => 'All',
+ 'pages' => 'pages',
+ 'filter' => 'filter',
+ 'clear the filter' => 'clear the filter',
+ );
+
+ public function gtext($string)
+ {
+ if (array_key_exists($string,$this->translations))
+ {
+ return $this->translations[$string];
+ }
+
+ return $string;
+ }
+
+}
diff --git a/h-source/Library/Lang/En/ModelStrings.php b/h-source/Library/Lang/En/ModelStrings.php
new file mode 100644
index 0000000..cf26b8f
--- /dev/null
+++ b/h-source/Library/Lang/En/ModelStrings.php
@@ -0,0 +1,36 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Lang_En_ModelStrings extends Lang_ResultStrings {
+
+ public $string = array(
+ "error" => "<div class='alert'>Query error: Contact the administrator!</div>\n",
+ "executed" => "<div class='executed'>Operation executed!</div>\n",
+ "associate" => "<div class='alert'>Referential integrity problem: record associated to some other record in a child table. Break the association before.</div>\n",
+ "no-id" => "<div class='alert'>Alert: record identifier not defined!</div>\n",
+ "not-linked" => "<div class='alert'>The Item is not associated : you can't dissociate it</div>",
+ "linked" => "<div class='alert'>The Item is already associated: you can't associate it another time</div>"
+ );
+
+}
diff --git a/h-source/Library/Lang/En/UploadStrings.php b/h-source/Library/Lang/En/UploadStrings.php
new file mode 100644
index 0000000..61bc0c5
--- /dev/null
+++ b/h-source/Library/Lang/En/UploadStrings.php
@@ -0,0 +1,45 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Lang_En_UploadStrings extends Lang_ResultStrings {
+
+ public $string = array(
+ "error" => "<div class='alert'>Error: verify the permissions of the file/directory</div>\n",
+ "executed" => "<div class='executed'>Operation executed!</div>\n",
+ "not-child" => "<div class='alert'>The selected directory is not a child of the base directory</div>\n",
+ "not-dir" => "<div class='alert'>The selected directory is not a directory</div>\n",
+ "not-empty" => "<div class='alert'>The selected directory is not empty</div>\n",
+ "no-folder-specified" => "<div class='alert'>No folder has been specified</div>\n",
+ "no-file-specified" => "<div class='alert'>No file has been specified</div>\n",
+ "not-writable" => "<div class='alert'>The folder is not writable</div>\n",
+ "not-writable-file" => "<div class='alert'>The file is not writable</div>\n",
+ "dir-exists" => "<div class='alert'>The directory is already present in the current folder</div>\n",
+ "no-upload-file" => "<div class='alert'>There is no file to upload</div>\n",
+ "size-over" => "<div class='alert'>The size of the file is too big</div>\n",
+ "not-allowed-ext" => "<div class='alert'>The extension of the file you want to upload is not allowed</div>\n",
+ "not-allowed-mime-type" => "<div class='alert'>The MIME type of the file you want to upload is not allowed</div>\n",
+ "file-exists" => "<div class='alert'>The file is already present in the current folder</div>\n"
+ );
+
+}
diff --git a/h-source/Library/Lang/En/ValCondStrings.php b/h-source/Library/Lang/En/ValCondStrings.php
new file mode 100644
index 0000000..7f4e7ea
--- /dev/null
+++ b/h-source/Library/Lang/En/ValCondStrings.php
@@ -0,0 +1,93 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Lang_En_ValCondStrings {
+
+ //if the element is not defined
+ public function getNotDefinedResultString($element)
+ {
+ return "<div class='alert'>". $element ." not defined!</div>\n";
+ }
+
+ //if the elements are not equal
+ public function getNotEqualResultString($element)
+ {
+ return "<div class='alert'>Different values: $element</div>\n";
+ }
+
+ //if the element is not alphabetic
+ public function getNotAlphabeticResultString($element)
+ {
+ return "<div class='alert'>".$element." has to be alphabetic</div>\n";
+ }
+
+ //if the element is not alphanumeric
+ public function getNotAlphanumericResultString($element)
+ {
+ return "<div class='alert'>".$element." has to be alphanumeric</div>\n";
+ }
+
+ //if the element is not a decimal digit
+ public function getNotDecimalDigitResultString($element)
+ {
+ return "<div class='alert'>".$element." has to be a decimal digit</div>\n";
+ }
+
+ //if the element has the mail format
+ public function getNotMailFormatResultString($element)
+ {
+ return "<div class='alert'>".$element." doesn't seem an e-mail address</div>\n";
+ }
+
+ //if the element is numeric
+ public function getNotNumericResultString($element)
+ {
+ return "<div class='alert'>".$element." has to be a numeric</div>\n";
+ }
+
+ //if the element (string) length exceeds the value of characters (defined by $maxLength)
+ public function getLengthExceedsResultString($element,$maxLength)
+ {
+ return "<div class='alert'>".$element." exceeds the value of $maxLength characters</div>\n";
+ }
+
+ //if the element is one of the strings indicated by $stringList (a comma-separated list of strings)
+ public function getIsForbiddenStringResultString($element,$stringList)
+ {
+ return "<div class='alert'>".$element." can't be one of the following strings: $stringList</div>\n";
+ }
+
+ //if the element is not one of the strings indicated by $stringList (a comma-separated list of strings)
+ public function getIsNotStringResultString($element,$stringList)
+ {
+ return "<div class='alert'>".$element." has to be one of the following strings: $stringList</div>\n";
+ }
+
+ //if the element is not one of the strings indicated by $stringList (a comma-separated list of strings)
+ public function getDoesntMatchResultString($element,$regExp)
+ {
+ return "<div class='alert'>".$element." has to match the following regular expression: $regExp</div>\n";
+ }
+
+}
diff --git a/h-source/Library/Lang/En/index.html b/h-source/Library/Lang/En/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Lang/En/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Lang/Eng/DbCondStrings.php b/h-source/Library/Lang/Eng/DbCondStrings.php
new file mode 100644
index 0000000..e4196b6
--- /dev/null
+++ b/h-source/Library/Lang/Eng/DbCondStrings.php
@@ -0,0 +1,34 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//error strings in the case database conditions are not satisfied
+class Lang_Eng_DbCondStrings {
+
+ //get the error string in the case that the value of the field $field is already present in the table $table
+ public function getNotUniqueString($field)
+ {
+ return "<div class='alert'>The value of <i>". $field ."</i> is already present. Please choose a different value.</div>\n";
+ }
+
+}
diff --git a/h-source/Library/Lang/Eng/Generic.php b/h-source/Library/Lang/Eng/Generic.php
new file mode 100644
index 0000000..bb0ab99
--- /dev/null
+++ b/h-source/Library/Lang/Eng/Generic.php
@@ -0,0 +1,48 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//generic strings
+class Lang_Eng_Generic
+{
+
+ //English to English
+ public $translations = array(
+ 'edit' => 'edit',
+ 'delete' => 'delete',
+ 'move up' => 'move up',
+ 'move down' => 'move down',
+ 'associate' => 'associate',
+ );
+
+ public function gtext($string)
+ {
+ if (array_key_exists($string,$this->translations))
+ {
+ return $this->translations[$string];
+ }
+
+ return $string;
+ }
+
+}
diff --git a/h-source/Library/Lang/Eng/ModelStrings.php b/h-source/Library/Lang/Eng/ModelStrings.php
new file mode 100644
index 0000000..fa741a2
--- /dev/null
+++ b/h-source/Library/Lang/Eng/ModelStrings.php
@@ -0,0 +1,36 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Lang_Eng_ModelStrings extends Lang_ResultStrings {
+
+ public $string = array(
+ "error" => "<div class='alert'>Query error: Contact the administrator!</div>\n",
+ "executed" => "<div class='executed'>Operation executed!</div>\n",
+ "associate" => "<div class='alert'>Referential integrity problem: record associated to some other record in a child table. Break the association before.</div>\n",
+ "no-id" => "<div class='alert'>Alert: record identifier not defined!</div>\n",
+ "not-linked" => "<div class='alert'>The Item is not associated : you can't dissociate it</div>",
+ "linked" => "<div class='alert'>The Item is already associated: you can't associate it another time</div>"
+ );
+
+}
diff --git a/h-source/Library/Lang/Eng/UploadStrings.php b/h-source/Library/Lang/Eng/UploadStrings.php
new file mode 100644
index 0000000..2ae4c9b
--- /dev/null
+++ b/h-source/Library/Lang/Eng/UploadStrings.php
@@ -0,0 +1,45 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Lang_Eng_UploadStrings extends Lang_ResultStrings {
+
+ public $string = array(
+ "error" => "<div class='alert'>Error: verify the permissions of the file/directory</div>\n",
+ "executed" => "<div class='executed'>Operation executed!</div>\n",
+ "not-child" => "<div class='alert'>The selected directory is not a child of the base directory</div>\n",
+ "not-dir" => "<div class='alert'>The selected directory is not a directory</div>\n",
+ "not-empty" => "<div class='alert'>The selected directory is not empty</div>\n",
+ "no-folder-specified" => "<div class='alert'>No folder has been specified</div>\n",
+ "no-file-specified" => "<div class='alert'>No file has been specified</div>\n",
+ "not-writable" => "<div class='alert'>The folder is not writable</div>\n",
+ "not-writable-file" => "<div class='alert'>The file is not writable</div>\n",
+ "dir-exists" => "<div class='alert'>The directory is already present in the current folder</div>\n",
+ "no-upload-file" => "<div class='alert'>There is no file to upload</div>\n",
+ "size-over" => "<div class='alert'>The size of the file is too big</div>\n",
+ "not-allowed-ext" => "<div class='alert'>The extension of the file you want to upload is not allowed</div>\n",
+ "not-allowed-mime-type" => "<div class='alert'>The MIME type of the file you want to upload is not allowed</div>\n",
+ "file-exists" => "<div class='alert'>The file is already present in the current folder</div>\n"
+ );
+
+}
diff --git a/h-source/Library/Lang/Eng/ValCondStrings.php b/h-source/Library/Lang/Eng/ValCondStrings.php
new file mode 100644
index 0000000..42e70d8
--- /dev/null
+++ b/h-source/Library/Lang/Eng/ValCondStrings.php
@@ -0,0 +1,93 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Lang_Eng_ValCondStrings {
+
+ //if the element is not defined
+ public function getNotDefinedResultString($element)
+ {
+ return "<div class='alert'>". $element ." not defined!</div>\n";
+ }
+
+ //if the elements are not equal
+ public function getNotEqualResultString($element)
+ {
+ return "<div class='alert'>Different values: $element</div>\n";
+ }
+
+ //if the element is not alphabetic
+ public function getNotAlphabeticResultString($element)
+ {
+ return "<div class='alert'>".$element." has to be alphabetic</div>\n";
+ }
+
+ //if the element is not alphanumeric
+ public function getNotAlphanumericResultString($element)
+ {
+ return "<div class='alert'>".$element." has to be alphanumeric</div>\n";
+ }
+
+ //if the element is not a decimal digit
+ public function getNotDecimalDigitResultString($element)
+ {
+ return "<div class='alert'>".$element." has to be a decimal digit</div>\n";
+ }
+
+ //if the element has the mail format
+ public function getNotMailFormatResultString($element)
+ {
+ return "<div class='alert'>".$element." doesn't seem an e-mail address</div>\n";
+ }
+
+ //if the element is numeric
+ public function getNotNumericResultString($element)
+ {
+ return "<div class='alert'>".$element." has to be a numeric</div>\n";
+ }
+
+ //if the element (string) length exceeds the value of characters (defined by $maxLength)
+ public function getLengthExceedsResultString($element,$maxLength)
+ {
+ return "<div class='alert'>".$element." exceeds the value of $maxLength characters</div>\n";
+ }
+
+ //if the element is one of the strings indicated by $stringList (a comma-separated list of strings)
+ public function getIsForbiddenStringResultString($element,$stringList)
+ {
+ return "<div class='alert'>".$element." can't be one of the following strings: $stringList</div>\n";
+ }
+
+ //if the element is not one of the strings indicated by $stringList (a comma-separated list of strings)
+ public function getIsNotStringResultString($element,$stringList)
+ {
+ return "<div class='alert'>".$element." has to be one of the following strings: $stringList</div>\n";
+ }
+
+ //if the element is not one of the strings indicated by $stringList (a comma-separated list of strings)
+ public function getDoesntMatchResultString($element,$regExp)
+ {
+ return "<div class='alert'>".$element." has to match the following regular expression: $regExp</div>\n";
+ }
+
+}
diff --git a/h-source/Library/Lang/Eng/index.html b/h-source/Library/Lang/Eng/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Lang/Eng/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Lang/ResultStrings.php b/h-source/Library/Lang/ResultStrings.php
new file mode 100644
index 0000000..2181b90
--- /dev/null
+++ b/h-source/Library/Lang/ResultStrings.php
@@ -0,0 +1,42 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Lang_ResultStrings {
+
+ public $string = array();
+
+ //method to get the string $stringName
+ public function getString($stringName)
+ {
+ if (isset($this->string[$stringName]))
+ {
+ return $this->string[$stringName];
+ }
+ else
+ {
+ return 'result string not defined!';
+ }
+ }
+
+}
diff --git a/h-source/Library/Lang/index.html b/h-source/Library/Lang/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Lang/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/ModAbstract.php b/h-source/Library/ModAbstract.php
new file mode 100644
index 0000000..f576c10
--- /dev/null
+++ b/h-source/Library/ModAbstract.php
@@ -0,0 +1,42 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//aach module class has to inherits from this abstract class
+abstract class ModAbstract
+{
+
+ //reference to a simpleXML object
+ protected $simpleXmlObj = null;
+
+ //type hinting: simplexmlelement
+ public function __construct(SimpleXMLElement $simpleXmlObj)
+ {
+ $this->simpleXmlObj = $simpleXmlObj;
+ }
+
+ //define the abstract method to render (create the HTML) of the single module
+ //$xmlObject: simpleXML object
+ abstract public function render();
+
+}
diff --git a/h-source/Library/Model/Base.php b/h-source/Library/Model/Base.php
new file mode 100755
index 0000000..4162a56
--- /dev/null
+++ b/h-source/Library/Model/Base.php
@@ -0,0 +1,1273 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+abstract class Model_Base
+{
+
+ public $fields = ''; //the fields that have to be manipulated by the update and insert query
+ public $values = array(); //the values that corresponding to the $this->fields fields
+ public $form = null; //reference to a Form_Form object
+ public $formStruct = null; //the form structure
+
+ public $submitName = null; //the current submitName (from the form)
+ public $identifierName = 'identifier';
+
+ public $notice = null; //a string explaining the result of the query applied (or not if an error occured): executed, error, etc
+ public $result = true; //the result of validate conditions, database conditions and query. It can be 'true' or 'false'
+ public $queryResult = false; //the result of the query
+
+ //conditions that have to be satisfied before applying the query
+ //Ex: 'update'=>'checkEmpty:titolo,autore','submitName'=>'conditions'
+ public $strongConditions = array();
+
+ //conditions that have to be satisfied before applying the query
+ //Ex: 'update'=>'checkEmpty:titolo,autore','submitName'=>'conditions'
+ //do not return error if a value is equal to '' or null
+ public $softConditions = array();
+
+ //conditions that have to be satisfied before applying the query
+ //check that the new values inserted satisfy some conditions
+ //Ex: 'update'=>'checkUniqueCompl:titolo,autore;checkUnique:titolo','insert'=>'checkUnique:titolo'
+ public $databaseConditions = array();
+
+ public $popupArray = array(); //array of popup objects (see popup.php)
+
+ public $supplInsertValues = array(); //associative array defining supplementary values to be inserted on each insert query. It has to have the following form: array(field1 => value1,field2 => value2, ...)
+
+ public $supplUpdateValues = array(); //associative array defining supplementary values to be inserted on each update query. It has to have the following form: array(field1 => value1,field2 => value2, ...)
+
+ public $select = null; //fields that have to be selected in select queries
+ public $where = array(); //associative array containing all the where clauses ($field => $value)
+ //group by, order by and limit clauses
+ public $groupBy = null;
+ public $orderBy = null;
+ public $limit = null;
+
+ public $from = null; //from clause of the select queries
+ public $on = array(); //on array
+ public $using = array(); //using array
+ public $join = array(); //join array
+
+ public $toList = false; //if the result have to be given in a list format
+ public $listArray = array(); //array containing the $key and the $value to be used to extract a list from a resultSet
+
+ //logic operator between statements in the where clause of select queries
+ public $logicalOperators = array('AND');
+
+ public $files = null; //reference to the Files_Upload class
+
+ protected $_tables='itemTable,boxTable,item_boxTable';
+ protected $_idFields='id_item,id_box';
+ protected $_tablesArray=array();
+ protected $_idFieldsArray=array();
+ protected $_where = array();
+
+ //the name of the field that has to be used to order the rows of the main table of the model
+ protected $_idOrder = null;
+
+ protected $_onDelete = 'check'; //can be 'nocheck' or 'check'. check: referential integrity check. nocheck: no referential integrity check
+ protected $_reference = null; //array containing the child table that have a reference to this table and the foreign key of the child table-> array($childTable,$foreignKey)
+
+ protected $_popupItemNames = array(); //the fields to be used as names in the popupArray elements. Associative array ($itemNameField1 => $itemNameValue1, ...)
+
+ //the labels of the pop-up menus
+ protected $_popupLabels = array();
+
+ //functions that have to be applied upon the label fields of the popup menu
+ protected $_popupFunctions = array();
+
+ protected $_popupWhere = array(); //where clause for the pupup menu
+
+ protected $_resultString; //reference to the class containing all the result strings of the db queries
+ protected $_dbCondString; //reference to the class containing all the result strings of the database conditions
+
+ protected $_backupFields = ''; //field saved after the delFields method has been applied
+ protected $_backupValues = array(); //values saved after the delFields method has been applied
+ protected $_allowedDbMethods = array('update','insert','del','moveup','movedown'); //methods that can be called by the updateTable method
+
+ protected $submitNames = array(
+ 'update' => 'updateAction',
+ 'insert' => 'insertAction',
+ 'del' =>'delAction',
+ 'moveup' =>'moveupAction',
+ 'movedown' =>'movedownAction'
+ );
+
+ protected $identifierValue = null; //the value of the identifier ($_POST[$this->identifier])
+ protected $arrayExt; //arrayExt object (see library/arrayExt.php)
+
+ protected $_arrayStrongCheck; //Array_Validate_Strong object
+ protected $_arraySoftCheck; //Array_Validate_Soft object
+
+ public $db; //reference to the database layer class
+ protected $_lang = null; //language of notices
+
+
+ public function __construct() {
+ $this->_tablesArray = explode(',',$this->_tables);
+ $this->_idFieldsArray = explode(',',$this->_idFields);
+ $this->_where[$this->_idFieldsArray[0]] = $this->_tablesArray[0];
+ $this->arrayExt = new ArrayExt();
+
+ //initialize the validate objects
+ $this->_arrayStrongCheck = new Array_Validate_Strong($this->_lang);
+ $this->_arraySoftCheck = new Array_Validate_Soft($this->_lang);
+
+ $this->identifierName = $this->_idFieldsArray[0];
+
+ //set the language of notices
+ $this->_lang = Params::$language;
+
+ //create the $_resultString object (result strings of the db queries)
+ $modelStringClass = 'Lang_'.$this->_lang.'_ModelStrings';
+ if (!class_exists($modelStringClass))
+ {
+ $modelStringClass = 'Lang_En_ModelStrings';
+ }
+ $this->_resultString = new $modelStringClass();
+
+ //create the $_dbCondString object (result strings of the database conditions)
+ $dbCondStringClass = 'Lang_'.$this->_lang.'_DbCondStrings';
+ if (!class_exists($dbCondStringClass))
+ {
+ $dbCondStringClass = 'Lang_En_DbCondStrings';
+ }
+ $this->_dbCondString = new $dbCondStringClass();
+
+ //instantiate the database class
+ $this->db = Factory_Db::getInstance(DATABASE_TYPE);
+
+ //instantiate the Files_Upload class
+ $params = array(
+ 'filesPermission' => 0777,
+ 'language' => $this->_lang,
+ 'allowedExtensions' => 'png,jpg,jpeg,gif',
+ 'maxFileSize' => 20000000,
+ 'fileUploadKey' => 'userfile'
+ );
+
+ $this->files = new Files_Upload(ROOT."/media/",$params);
+ }
+
+ //sanitize all the $values property
+ public function sanitize()
+ {
+ $keys = implode(',',array_keys($this->values));
+ $this->values = $this->arrayExt->subset($this->values,$keys,'sanitizeDb');
+ }
+
+ //change a resulting string from a db query
+ public function setString($key,$value)
+ {
+ $this->_resultString->string[$key] = $value;
+ }
+
+ //set the submitNames property (array)
+ //$methodName : the method name, $submitName: the submit name of the submit action of the form
+ public function setSubmitNames($methodName,$submitName)
+ {
+ if (!in_array($methodName,$this->_allowedDbMethods))
+ {
+ throw new Exception('query type <b>"'.$methodName. '"</b> not allowed in '. __METHOD__);
+ }
+ $this->submitNames[$methodName] = $submitName;
+ }
+
+ //get the last query executed
+ public function getQuery()
+ {
+ return $this->db->query;
+ }
+
+ //get the where clause of the select query
+ public function getWhereQueryClause()
+ {
+ return $this->where;
+ }
+
+ //set the where clause of the select query
+ //whereArray = array ($table_field => $value)
+ public function setWhereQueryClause($whereArray)
+ {
+ $this->where = $whereArray;
+ }
+
+ //append the whereArray clause to $this_->whereClause
+ //whereArray = array ($table_field => $value)
+ public function appendWhereQueryClause($whereArray)
+ {
+ $this->where = array_merge($this->where,$whereArray);
+ }
+
+ //drop the char $char from the beginning of the string $string
+ public function dropStartChar($string,$char)
+ {
+ while(strcmp($string[0],$char) === 0)
+ {
+ $string = substr($string,1);
+ }
+ return $string;
+ }
+
+ //get the table name from $this->_where. If the table is not present then return $this->_tablesArray[0]
+ public function getTableName($field)
+ {
+ return isset($this->_where[$field]) ? $this->_where[$field] : $this->_tablesArray[0];
+ }
+
+ //method to create the where clause of the select query from the $this->where array
+ //$level: level of the ricorsion
+ //$whereClauseLevel: array containing the field=>value statements of the where clause. If $whereClause = null than $this->where is considered
+ public function createWhereClause($level = 0, $whereClauseLevel = null, $operator = null)
+ {
+ $whereClause = null;
+ $whereClauseArray = array();
+
+ $whereClause = isset($whereClauseLevel) ? $whereClauseLevel : $this->where;
+
+ foreach ($whereClause as $field => $value)
+ {
+ if (is_array($value))
+ {
+ if (strstr($field,"OR"))
+ {
+ $op = " OR ";
+ }
+ else if (strstr($field,"AND"))
+ {
+ $op = " AND ";
+ }
+ else
+ {
+ $op = null;
+ }
+ $newValue = $this->createWhereClause($level+1, $value, $op);
+ if (isset($newValue)) $whereClauseArray[] = $newValue;
+ }
+ else
+ {
+ $flag = 0; //equal where clause
+ if (isset($field))
+ {
+ //drop the 'n:' and '-' chars from $field
+ $fieldClean = str_replace('n!',null,$field);
+ $fieldClean = $this->dropStartChar($fieldClean,'-');
+ if (strcmp($value,Params::$nullQueryValue) !== 0 or (Params::$nullQueryValue === false))
+ {
+ foreach (params::$whereClauseSymbolArray as $symbol)
+ {
+ if (strstr($value,$symbol))
+ {
+ //check if write or not the table name
+ $tableName = strstr($field,'n!') ? null : $this->getTableName($field).'.';
+ $whereClauseArray[] = $tableName.$fieldClean.' '.$value;
+ $flag = 1; //not equal where clause
+ break;
+ }
+ }
+ if ($flag === 0)
+ {
+ $value = '"'.$value.'"';
+ //check if write or not the table name
+ $tableName = strstr($field,'n!') ? null : $this->getTableName($field).'.';
+ $whereClauseArray[] = $tableName.$fieldClean.'='.$value;
+ }
+ }
+ }
+ }
+ }
+ //get the logic operator at the current level
+ if (isset($operator))
+ {
+ $logicOper = $operator;
+ }
+ else
+ {
+ $logicOper = isset($this->logicalOperators[$level]) ? ' '.$this->logicalOperators[$level].' ' : ' AND ';
+ }
+ $whereClause = !empty($whereClauseArray) ? implode($logicOper,$whereClauseArray) : null;
+ $whereClause = (isset($whereClause) and $level>0) ? '('.$whereClause.')' : $whereClause;
+ return $whereClause;
+ }
+
+
+ //get the submitName having its key (the method name)
+ public function getSubmitName($key)
+ {
+ if (!array_key_exists($key,$this->submitNames))
+ {
+ return 'generalAction';
+// throw new Exception('query type <b>"'.$key. '"</b> not allowed in '.__METHOD__);
+ }
+ return $this->submitNames[$key];
+
+ }
+
+
+ //return the values, taken from the $_POST array, to be inserted inside the forms
+ //$queryType: insert or update
+ //$func: sanitize function to apply upon each value
+ //$id: if $queryType='update' that the values are taken from the record (of the main table of this model) having the primary key equal to $id
+ //$defaultValues = associative array of the form: array($entry=>$defaultValue)
+ //$functionsIfFromDb = associative array of the form: array($entry=>$function_to_be_applied)
+ public function getFormValues($queryType = 'insert', $func = 'sanitizeHtml',$id = null,$defaultValues = array(),$functionsIfFromDb = array())
+ {
+ @session_start();
+ if (is_array($func))
+ {
+ $funcPost = $func[0];
+ $funcDb = $func[1];
+ }
+ else
+ {
+ $funcPost = $func;
+ $funcDb = 'none';
+ }
+
+ $arrayType = array('update','insert');
+ $values = array();
+ $idName = $this->identifierName;
+ if (in_array($queryType,$arrayType))
+ {
+ $ident = null;
+ if (isset($id))
+ {
+ $ident = (int)$id;
+ }
+ else if (isset($_POST[$idName]))
+ {
+ $ident = (int)$_POST[$idName];
+ }
+ if ($this->result)
+ {
+ if ($queryType === 'update')
+ {
+ if (isset($ident))
+ {
+ $recordArray = $this->selectId($ident);
+
+ $fieldsArray = explode(',',$this->fields);
+
+ $values = $this->arrayExt->subset($recordArray,$this->fields,$funcDb);
+
+// foreach ($fieldsArray as $field)
+// {
+// $values[$field] = array_key_exists($field,$recordArray) ? $recordArray[$field] : '';
+// }
+
+ $values[$idName] = $ident;
+
+ //apply the functions upon entries
+ foreach ($functionsIfFromDb as $entry => $funcUponEntry)
+ {
+ if (array_key_exists($entry,$values))
+ {
+ if (!function_exists($funcUponEntry)) {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$funcUponEntry. '</b> does not exist');
+ }
+
+ $values[$entry] = call_user_func($funcUponEntry,$values[$entry]);
+ }
+ }
+
+ //set values of $_SESSION array
+ foreach ($values as $k => $v)
+ {
+ if (isset($this->formStruct['entries'][$k]['type']))
+ {
+ if ($this->formStruct['entries'][$k]['type'] === 'File')
+ {
+ $_SESSION['form_'.$k] = $v;
+ }
+ }
+ }
+ }
+ }
+ else if ($queryType === 'insert')
+ {
+
+ $tempArray = is_array($defaultValues) ? $defaultValues : array();
+
+ $values = $this->arrayExt->subset($tempArray,$this->fields,$funcPost);
+
+ }
+ }
+ else
+ {
+ $values = $this->arrayExt->subset($_POST,$this->fields,$funcPost);
+
+ if ($queryType === 'update')
+ {
+ $values[$idName] = $ident;
+
+ //take values from $_SESSION array
+ $tempFieldArray = explode(',',$this->fields);
+
+ for ($i = 0; $i < count($tempFieldArray); $i++)
+ {
+ if (isset($this->formStruct['entries'][$tempFieldArray[$i]]['type']))
+ {
+ if ($this->formStruct['entries'][$tempFieldArray[$i]]['type'] === 'File')
+ {
+ if (isset($_SESSION['form_'.$tempFieldArray[$i]]))
+ {
+ $values[$tempFieldArray[$i]] = $_SESSION['form_'.$tempFieldArray[$i]];
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return $values;
+ }
+
+
+ //method to set the properties $this->fields and $this->values
+ public function setFields($fields,$func = 'sanitizeAll')
+ {
+ $this->values = $this->arrayExt->subset($_POST,$fields,$func);
+ $this->fields = $this->extractFields($fields);
+
+ //set the backup variables
+ $this->_backupFields = $this->fields;
+ $this->_backupValues = $this->values;
+ }
+
+
+ //clear the fields list
+ public function clearFields()
+ {
+ $this->_backupFields = $this->fields;
+ $this->_backupValues = $this->values;
+ $this->fields = '';
+ $this->values = array();
+ }
+
+ //del the fields written in the $list argument. The $list argument has to be of the type: field1,field2,...
+ public function delFields($list)
+ {
+ $this->_backupFields = $this->fields;
+ $this->_backupValues = $this->values;
+ $this->values = $this->arrayExt->subsetComplementary($this->values,$list);
+// $this->fields = implode(',',array_keys($this->values));
+ }
+
+ //restore the fields and values saved in $_backupFields and $_backupValues
+ public function restoreFields()
+ {
+ $this->fields = $this->_backupFields;
+ $this->values = $this->_backupValues;
+ }
+
+ //method to clean the $fields string deleting the colons (and the word after the colon)
+ public function extractFields($fields) {
+ $fieldsArray = explode(',',$fields);
+ $resultString = array();
+ foreach ($fieldsArray as $field) {
+ if (strstr($field,':')) {
+ $temp = explode(':',$field);
+ $resultString[] = $temp[0];
+ } else {
+ $resultString[] = $field;
+ }
+ }
+ return implode(',',$resultString);
+ }
+
+ //add the supplementary value on insert and update queries
+ //$queryType: insert or update
+ public function setSupplValues($queryType)
+ {
+ if ($queryType === 'insert')
+ {
+ $supplValues = $this->supplInsertValues;
+ }
+ else if ($queryType === 'update')
+ {
+ $supplValues = $this->supplUpdateValues;
+ }
+
+ $baseFields = implode(',',array_keys($this->values));
+
+ $supplFields = implode(',',array_keys($supplValues));
+ $supplFields = (strcmp($supplFields,'') === 0) ? $supplFields : ',' . $supplFields;
+
+ $fields = $baseFields . $supplFields;
+ $values = array_merge(array_values($this->values),array_values($supplValues));
+
+ return array($fields,$values);
+ }
+
+
+ //method to call the update query (overriding of the base_db del method)
+ //update the record with the primary key equal to $id (default)
+ //if $whereClause is set then use $whereClause as where clause of the update query
+ public function update($id = null, $whereClause = null)
+ {
+ if (!is_array($this->supplUpdateValues))
+ {
+ throw new Exception('error in <b>' . __METHOD__ . '</b>: the <b>supplUpdateValues</b> property has to be an array.');
+ }
+ $el = $this->setSupplValues('update');
+ $this->queryResult = false;
+
+ if (isset($whereClause))
+ {
+ $result = $this->db->update($this->_tablesArray[0],$el[0],$el[1],$whereClause);
+ $this->setNotice($result);
+ return $result;
+ }
+ else
+ {
+ if (isset($id))
+ {
+ $where = $this->_idFieldsArray[0].'='.(int)($id);
+ $result = $this->db->update($this->_tablesArray[0],$el[0],$el[1],$where);
+ $this->setNotice($result);
+ return $result;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-id');
+ $this->result = false;
+ $this->identifierValue = null;
+ return false;
+ }
+ }
+ }
+
+ //method to call the insert query (overriding of the base_db del method)
+ public function insert() {
+
+ $this->queryResult = false;
+ if (!is_array($this->supplInsertValues)) {
+ throw new Exception('error in <b>' . __METHOD__ . '</b>: the <b>supplInsertValues</b> property has to be an array.');
+ }
+
+ if (isset($this->_idOrder))
+ {
+ $maxValue = $this->db->getMax($this->_tablesArray[0],$this->_idOrder);
+ $this->supplInsertValues[$this->_idOrder] = (int)$maxValue + 1;
+ }
+
+ $el = $this->setSupplValues('insert');
+
+ $result = $this->db->insert($this->_tablesArray[0],$el[0],$el[1]);
+ $this->setNotice($result);
+ return $result;
+ }
+
+ //method to call the delete query (overriding of the base_db del method)
+ public function del($id = null, $whereClause = null) {
+
+ $this->queryResult = false;
+
+ if (isset($whereClause))
+ {
+ $result = $this->db->del($this->_tablesArray[0],$whereClause);
+ $this->setNotice($result);
+ return $result;
+ }
+ else
+ {
+ if (isset($id)) {
+ $where = $this->_idFieldsArray[0].'='.(int)$id;
+ $result = $this->db->del($this->_tablesArray[0],$where);
+ $this->setNotice($result);
+ return $result;
+ } else {
+ $this->notice = $this->_resultString->getString('no-id');
+ $this->result = false;
+ $this->identifierValue = null;
+ return false;
+ }
+ }
+ }
+
+ //move to the top the record having $this->_idOrder = $id
+ //where clause
+ public function moveup($id)
+ {
+ return $this->move($id,'up');
+ }
+
+ //move to the top the record having $this->_idOrder = $id
+ //where clause
+ public function movedown($id)
+ {
+ return $this->move($id,'down');
+ }
+
+ //move the record having $this->_tablesArray[0] = $id
+ //$par: 'up' or 'down'
+ //where clause
+ public function move($id,$par = 'up')
+ {
+ $this->queryResult = false;
+ if (isset($id))
+ {
+ $increm = ($par === 'up') ? 1 : -1;
+
+ $backupLimit = $this->limit;
+ $this->limit = null;
+
+ $data = $this->getFields($this->_tablesArray[0].'.'.$this->_idFieldsArray[0].','.$this->_tablesArray[0].'.'.$this->_idOrder);
+
+ for($i = 0; $i < count($data); $i++)
+ {
+ if (strcmp($data[$i][$this->_tablesArray[0]][$this->_idFieldsArray[0]],$id) === 0)
+ {
+ if (($par === 'up' and $i !== 0) or ($par === 'down' and $i !== (count($data)-1)))
+ {
+ $prevOrder = $data[$i-$increm][$this->_tablesArray[0]][$this->_idOrder];
+ $prevId = $data[$i-$increm][$this->_tablesArray[0]][$this->_idFieldsArray[0]];
+ $currentOrder = $data[$i][$this->_tablesArray[0]][$this->_idOrder];
+ $currentId = $data[$i][$this->_tablesArray[0]][$this->_idFieldsArray[0]];
+
+ //exchange the id_order of the two record
+ $res1 = $this->db->update($this->_tablesArray[0],$this->_idOrder,array($prevOrder),$this->_idFieldsArray[0]."='$currentId'");
+ $res2 = $this->db->update($this->_tablesArray[0],$this->_idOrder,array($currentOrder),$this->_idFieldsArray[0]."='$prevId'");
+ $result = ($res1 and $res2);
+ $this->setNotice($result);
+ return $result;
+ }
+ }
+ }
+
+ $this->limit = $backupLimit;
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-id');
+ $this->result = false;
+ $this->identifierValue = null;
+ return false;
+ }
+ return false;
+ }
+
+ public function setNotice($result) {
+ if ($result) {
+ $this->notice = $this->_resultString->getString('executed');
+ $this->result = true;
+ $this->queryResult = true;
+ } else {
+ $this->notice = $this->_resultString->getString('error');
+ $this->result = false;
+ $this->queryResult = false;
+ }
+ }
+
+ //method used to verify that the value of a field is not duplicated
+ //$fieldsList: list of fields to check. Ex: field1,field2,...
+ //$where: the where clause
+ public function checkUnique($fieldsList,$where = null)
+ {
+ $errorString = null;
+ $numb = 0;
+ $fieldsArray = explode(',',$fieldsList);
+ $queryFieldsArray = explode(',',$this->fields);
+ foreach ($fieldsArray as $field)
+ {
+ if (in_array($field,$queryFieldsArray))
+ {
+ if ($this->db->recordExists($this->_tablesArray[0],$field,$this->values[$field],$where))
+ {
+ $errorString .= $this->_dbCondString->getNotUniqueString($field);
+ $numb++;
+ }
+ }
+ }
+ $this->notice = $errorString;
+ return $numb === 0 ? true : false;
+ }
+
+ //like checkUnique: check all the records of the table apart from the record that has to be modified
+ public function checkUniqueCompl($fieldsList,$id = null)
+ {
+ if (isset($id))
+ {
+ $where = $this->_idFieldsArray[0].'!='.(int)($id);
+ return $this->checkUnique($fieldsList,$where);
+ } else {
+ $this->notice = $this->_resultString->getString('no-id');
+ return false;
+ }
+ }
+
+ //method to apply the database conditions listed in the $this->databaseConditions associative array
+ //$queryType: indicates what set of validate conditions has to be considered (it's the key of the associative array)
+ public function applyDatabaseConditions($queryType,$id = null)
+ {
+ if (array_key_exists($queryType,$this->databaseConditions))
+ {
+ if (!is_array($this->databaseConditions[$queryType]))
+ {
+ throw new Exception('error in method <b>'.__METHOD__.'</b> : <b>databaseConditions['.$queryType.']</b> has to be an associative array');
+ }
+
+ foreach ($this->databaseConditions[$queryType] as $key => $values)
+ {
+
+ //personalized error string
+ $altErrorString = null;
+
+ //delete all the '+' chars
+ $key = $this->dropStartChar($key,'+');
+
+ if (strcmp($values,'all') === 0 or strstr($values,'all|'))
+ {
+ if (strstr($values,'all|'))
+ {
+ $values = str_replace('all|',$this->fields.'|',$values);
+ }
+ else
+ {
+ $values = $this->fields;
+ }
+ }
+
+ if (strstr($values,'|'))
+ {
+ $temp = explode('|',$values);
+ $altErrorString = "<div class='".Params::$errorStringClassName."'>".$temp[1]."</div>\n";
+ $values = $temp[0];
+ }
+
+ $allowedMethod = array('checkUnique','checkUniqueCompl');
+ if (!in_array($key,$allowedMethod))
+ {
+ throw new Exception('error in method '.__METHOD__.' : method "'.$key. '" not allowed in the property named databaseConditions');
+ }
+ if (!call_user_func_array(array($this,$key),array($values,$id)))
+ {
+ if (isset($altErrorString)) $this->notice = $altErrorString;
+ $this->result = false;
+ $this->queryResult = false;
+ return false;
+ }
+ }
+ return true;
+ } else {
+ return true;
+ }
+ }
+
+
+ //method to apply the validate conditions listed in the $this->strongConditions associative array
+ //$queryType: indicates what set of validate conditions has to be considered (it's the key of the associative array)
+ //$strength: 'strong' or 'soft'
+ public function applyValidateConditions($queryType,$strength = 'strong')
+ {
+ if ($strength === 'strong')
+ {
+ $validateObj = $this->_arrayStrongCheck;
+ $conditions = $this->strongConditions;
+ $errString = 'strongConditions';
+ }
+ else
+ {
+ $validateObj = $this->_arraySoftCheck;
+ $conditions = $this->softConditions;
+ $errString = 'softConditions';
+
+ if (Params::$nullQueryValue !== false)
+ {
+ $conditions['insert']['+++++checkIsNotStrings|'.Params::$nullQueryValue] = 'all';
+ $conditions['update']['+++++checkIsNotStrings|'.Params::$nullQueryValue] = 'all';
+ }
+ }
+
+ if (array_key_exists($queryType,$conditions))
+ {
+ if (!is_array($conditions[$queryType]))
+ {
+ throw new Exception('error in method <b>'.__METHOD__.'</b> : <b>'.$errString.'['.$queryType.']</b> has to be an associative array');
+ }
+
+ foreach ($conditions[$queryType] as $key => $values)
+ {
+
+ //personalized error string
+ $altErrorString = null;
+
+ //delete all the '+' chars
+ $key = $this->dropStartChar($key,'+');
+
+ if (strcmp($values,'all') === 0 or strstr($values,'all|'))
+ {
+ if (strstr($values,'all|'))
+ {
+ $values = str_replace('all|',$this->fields.'|',$values);
+ }
+ else
+ {
+ $values = $this->fields;
+ }
+ }
+
+ if (strstr($values,'|'))
+ {
+ $temp = explode('|',$values);
+ $altErrorString = "<div class='".Params::$errorStringClassName."'>".$temp[1]."</div>\n";
+ $values = $temp[0];
+ }
+
+ $baseArgs = array($_POST,$values);
+
+ if (strstr($key,'|'))
+ {
+ $funcArray = explode('|',$key);
+ $funcName = $funcArray[0];
+ array_shift($funcArray);
+ $funcArgs = array_merge($baseArgs,$funcArray);
+ }
+ else
+ {
+ $funcName = $key;
+ $funcArgs = $baseArgs;
+ }
+
+ if (!method_exists($validateObj,$funcName) or $funcName === 'checkGeneric')
+ {
+ throw new Exception('error in method '.__METHOD__.' :method "'.$funcName. '" not allowed in '.$errString);
+ }
+ if (!call_user_func_array(array($validateObj,$funcName),$funcArgs))
+ {
+ $this->notice .= (isset($altErrorString)) ? $altErrorString : $validateObj->errorString;
+ $this->result = false;
+ $this->queryResult = false;
+ return false;
+ }
+ }
+ return true;
+ } else {
+ return true;
+ }
+ }
+
+
+ //apply, in sequence, the strong,soft and database conditions
+ //$methodName: insert,update
+ //$id: the id of the record. It is necessary for database conditions
+ public function checkConditions($methodName,$id = null)
+ {
+ if ($this->applyValidateConditions($methodName,'strong'))
+ {
+ if ($this->applyValidateConditions($methodName,'soft'))
+ {
+ if ($this->applyDatabaseConditions($methodName,$id))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ //method that calls the function indicated in $this->submitNames. Ex: if $_POST['delAction'] is found, then the "del" method is called.
+ public function updateTable($methodsList = '',$id = null) {
+
+ $allowedMethodsArray = explode(',',$methodsList);
+ $resultArray = array();
+ $this->identifierValue = null;
+ if (isset($id))
+ {
+ $this->identifierValue = (int)$id;
+ }
+ else if (isset($_POST[$this->identifierName]))
+ {
+ $this->identifierValue = (int)$_POST[$this->identifierName];
+ }
+ foreach ($this->submitNames as $methodName => $submitName)
+ {
+ if (array_key_exists($submitName,$_POST))
+ {
+ $this->submitName = $submitName;
+ if (method_exists($this,$methodName))
+ {
+ //if the method is allowed
+ if (in_array($methodName,$allowedMethodsArray))
+ {
+ if ($this->checkConditions($methodName,$this->identifierValue))
+ {
+ $this->notice = null;
+ call_user_func_array(array($this,$methodName),array($this->identifierValue));
+ }
+ }
+ }
+ else
+ {
+ throw new Exception('method <b>'.$methodName.'</b> not defined in class <b>'.__CLASS__.'</b>; error in method <b>'.__METHOD__.'</b>');
+ }
+ return; //only one cycle!
+ }
+ }
+ }
+
+ //method to build the array of popup objects
+ public function popupBuild()
+ {
+ foreach ($this->_popupItemNames as $field => $itemName)
+ {
+// if (array_key_exists($field,$this->_where))
+// {
+ $fieldClean = str_replace('n!',null,$field);
+ $itemNameClean = str_replace('n!',null,$itemName);
+ $fieldClean = $this->dropStartChar($fieldClean,'-');
+ $itemNameClean = $this->dropStartChar($itemNameClean,'-');
+
+ //fields that have to be extracted
+ $queryFields = ($fieldClean === $itemNameClean) ? $fieldClean : $fieldClean.','.$itemNameClean;
+
+ $table = $this->getTableName($field);
+ $this->popupArray[$field] = new Popup();
+
+ $popupWhereClause = array_key_exists($field,$this->_popupWhere) ? $this->_popupWhere[$field] : null;
+
+ $result = $this->db->select($table,$queryFields,$popupWhereClause,$fieldClean);
+
+ if ($result and $result !== false)
+ {
+ //get the label of the popup menu
+ $label = array_key_exists($field,$this->_popupLabels) ? $this->_popupLabels[$field] : $table.' : '.$itemNameClean;
+ $this->popupArray[$field]->name = $label;
+
+ //get the table name
+ $fieldTable = isset($result[0][$table][$fieldClean]) ? $table : Params::$aggregateKey;
+ $itemNameTable = isset($result[0][$table][$itemNameClean]) ? $table : Params::$aggregateKey;
+
+ foreach ($result as $row)
+ {
+ $this->popupArray[$field]->itemsValue[] = $row[$fieldTable][$fieldClean];
+
+ if (array_key_exists($field,$this->_popupFunctions))
+ {
+ if (!function_exists($this->_popupFunctions[$field]))
+ {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$this->_popupFunctions[$field]. '</b> does not exist');
+ }
+
+ $tempName = call_user_func($this->_popupFunctions[$field],$row[$itemNameTable][$itemNameClean]);
+ }
+ else
+ {
+ $tempName = $row[$itemNameTable][$itemNameClean];
+ }
+
+ $this->popupArray[$field]->itemsName[] = $tempName;
+ }
+ }
+// }
+ }
+ }
+
+
+ //get the element before and after the current one
+ //$key: the key of the self::$where array that indicates the field to be used in order to find out the records before and after
+ //$fields: the fields that have to be extracted
+ public function getNeighbours($key,$fields = '')
+ {
+ //backup of the values
+ $tempWhere = $this->where;
+ $tempLimit = $this->limit;
+ $tempOrderBy = $this->orderBy;
+ $this->limit = 1;
+ //before
+ $this->where[$key] = '<'.$tempWhere[$key];
+ $this->orderBy = $this->getTableName($key).'.'.$key.' DESC';
+ $dataAfter = $this->getFields($fields);
+ //after
+ $this->where[$key] = '>'.$tempWhere[$key];
+ $this->orderBy = $this->getTableName($key).'.'.$key;
+ $dataBefore = $this->getFields($fields);
+ //restore the previous values
+ $this->where = $tempWhere;
+ $this->limit = $tempLimit;
+ $this->orderBy = $tempOrderBy;
+ $result[0] = isset($dataBefore[0]) ? $dataBefore[0] : null;
+ $result[1] = isset($dataAfter[0]) ? $dataAfter[0] : null;
+ return $result;
+ }
+
+ //set the $select property and return the current object
+ public function select($fields = null)
+ {
+ $this->select = $fields;
+ return $this;
+ }
+
+ //set the $from property and return the current object
+ public function from($tables = null)
+ {
+ $this->from = isset($tables) ? $tables : $this->_tables;
+ return $this;
+ }
+
+ //set the on property and return the current object
+ public function on($joinClause = '-')
+ {
+ $this->on[] = $joinClause;
+ $this->using[] = null;
+ return $this;
+ }
+
+ //set the $using property and return the current object
+ public function using($using = null)
+ {
+ $this->using[] = $using;
+ $this->on[] = null;
+ return $this;
+ }
+
+ //set the $join property and return the current object
+ public function left($string = null)
+ {
+ $this->join[] = "l:$string";
+ return $this;
+ }
+
+ //set the $join property and return the current object
+ public function right($string = null)
+ {
+ $this->join[] = "r:$string";
+ return $this;
+ }
+
+ //set the $join property and return the current object
+ public function inner($string = null)
+ {
+ $this->join[] = "i:$string";
+ return $this;
+ }
+
+ //set the $where property and return the current object
+ public function where($where = array())
+ {
+ $this->where = $where;
+ return $this;
+ }
+
+ //append the $where array to the ::where property and return the current object
+ public function aWhere($where = array())
+ {
+ $this->appendWhereQueryClause($where);
+ return $this;
+ }
+
+ //set the $groupBy property and return the current object
+ public function groupBy($groupBy = null)
+ {
+ $this->groupBy = $groupBy;
+ return $this;
+ }
+
+ //set the $orderBy property and return the current object
+ public function orderBy($orderBy = null)
+ {
+ $this->orderBy = $orderBy;
+ return $this;
+ }
+
+ //set the $limit property and return the current object
+ public function limit($limit = null)
+ {
+ $this->limit = $limit;
+ return $this;
+ }
+
+ //set the $listArray property
+ public function toList($key, $value = null)
+ {
+ $this->listArray = array($key,$value);
+ $this->toList = true;
+ return $this;
+ }
+
+ //reset all the clauses of the select query
+ public function clear()
+ {
+ $this->select = null;
+ $this->where = array();
+ $this->groupBy = null;
+ $this->orderBy = null;
+ $this->limit = null;
+ $this->from = null;
+ $this->on = array();
+ $this->using = array();
+ $this->join = array();
+ $this->toList = false;
+ return $this;
+ }
+
+ //initialize and populate the ::form property (reference to a Form_Form object)
+ public function setForm($defAction = null, $defSubmit = array(), $defMethod = 'POST', $defEnctype = null)
+ {
+ if (isset($this->formStruct))
+ {
+ $action = array_key_exists('action',$this->formStruct) ? $this->formStruct['action'] : $defAction;
+ $submit = array_key_exists('submit',$this->formStruct) ? $this->formStruct['submit'] : $defSubmit;
+ $entries = array_key_exists('entries',$this->formStruct) ? $this->formStruct['entries'] : null;
+ $method = array_key_exists('post',$this->formStruct) ? $this->formStruct['post'] : $defMethod;
+ $enctype = array_key_exists('enctype',$this->formStruct) ? $this->formStruct['enctype'] : $defEnctype;
+
+ $this->form = new Form_Form($action,$submit,$method,$enctype);
+
+ if (isset($entries))
+ {
+ $this->form->setEntries($entries);
+ }
+
+ $copy = $this->form->entry;
+
+ foreach ($copy as $name => $entry)
+ {
+ if (strcmp($entry->type,'Select') === 0 and isset($entry->options))
+ {
+ if (!is_array($entry->options))
+ {
+ if (strstr($entry->options,'foreign::'))
+ {
+ $elements = explode('::',$entry->options);
+
+ for ($i = 0; $i < count($elements); $i++)
+ {
+ if (strcmp($elements[$i],'--') === 0) $elements[$i] = null;
+ }
+ //send the query
+ array_shift($elements);
+ $resultSet = call_user_func_array(array($this->db,'select'),$elements);
+
+ $single = true;
+
+ if (strstr($elements[1],','))
+ {
+ $args = explode(',',$elements[1]);
+ //add the table name
+ $args[0] = $elements[0].'.'.$args[0];
+ $args[1] = $elements[0].'.'.$args[1];
+ //associative array
+ $single = false;
+ }
+ else
+ {
+ $args[0] = $elements[0].'.'.$elements[1];
+ $args[1] = null;
+ }
+
+ $list = $this->getList($resultSet,$args[0],$args[1]);
+
+ $this->form->entry[$name]->options = ($single) ? implode(',',array_values($list)) : $list;
+ }
+ }
+ }
+ }
+
+ }
+ else
+ {
+ $this->form = new Form_Form($defAction,$defSubmit,$defMethod,$defEnctype);
+ }
+ }
+
+ //get a list from a result set
+ //$resultSet: the result set coming from a select query
+ public function getList($resultSet, $key, $value = null)
+ {
+ $list = array();
+
+ if (strstr($key,'.'))
+ {
+ $arr = explode('.',$key);
+ $keyTable = $arr[0];
+ $keyField = $arr[1];
+ }
+ else
+ {
+ $keyTable = $this->_tablesArray[0];
+ $keyField = $key;
+ }
+
+ if (!isset($value))
+ {
+ foreach ($resultSet as $row)
+ {
+ $list[] = $row[$keyTable][$keyField];
+ }
+ }
+ else
+ {
+ if (strstr($value,'.'))
+ {
+ $arr = explode('.',$value);
+ $valueTable = $arr[0];
+ $valueField = $arr[1];
+ }
+ else
+ {
+ $valueTable = $this->_tablesArray[0];
+ $valueField = $value;
+ }
+
+ foreach ($resultSet as $row)
+ {
+ $list[$row[$keyTable][$keyField]] = $row[$valueTable][$valueField];
+ }
+
+ }
+ return $list;
+ }
+
+ // Retrieves the ID generated for an AUTO_INCREMENT column by the previous query (usually INSERT).
+ public function lastId()
+ {
+ return $this->db->lastId();
+ }
+
+ //send a free query
+ public function query($query)
+ {
+ return $this->db->query($query);
+ }
+
+ //the text of the error message from previous MySQL operation
+ public function getError()
+ {
+ return $this->db->getError();
+ }
+
+ //the numerical value of the error message from previous MySQL operation
+ public function getErrno()
+ {
+ return $this->db->getErrno();
+ }
+
+ //define the abstract method to get the value of the record $id of the main table
+ abstract public function selectId($id);
+
+ //define the abstract method to get the fields from the tables
+ abstract public function getFields();
+
+} \ No newline at end of file
diff --git a/h-source/Library/Model/Map.php b/h-source/Library/Model/Map.php
new file mode 100755
index 0000000..7a093e1
--- /dev/null
+++ b/h-source/Library/Model/Map.php
@@ -0,0 +1,453 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Model_Map extends Model_Base {
+
+// //many to many model
+
+ public $printAssError = 'yes'; //'yes': print association error if the association/dissociation is already present. 'no': doen't print association error
+ public $boxIdentifierName = 'boxIdentifier';//key of the value of the $_POST array that represent the id of the Box that we want to associate with the Item having the id $_POST[$this->identifierName]
+ protected $_boxIdentifierValue = null; //the id of the box that has to be associated with the item
+
+ public function __construct()
+ {
+ //add some submit names (method => form_submit_value)
+ $this->submitNames['associate'] = 'associateAction';
+ $this->submitNames['dissociate'] = 'dissociateAction';
+ //add the allowed methods
+ $this->_allowedDbMethods[] = 'associate';
+ $this->_allowedDbMethods[] = 'dissociate';
+ parent::__construct();
+ }
+
+ public function createMapWhere($choice)
+ { //create the where join clause
+ //$choice=(first,last,all)
+ $first = $this->_tablesArray[0].'.'.$this->_idFieldsArray[0].'='.$this->_tablesArray[2].'.'.$this->_idFieldsArray[0];
+ $last = $this->_tablesArray[1].'.'.$this->_idFieldsArray[1].'='.$this->_tablesArray[2].'.'.$this->_idFieldsArray[1];
+ switch ($choice) {
+ case 'first':
+ return $first;
+ break;
+ case 'last':
+ return $last;
+ break;
+ case 'all':
+ return $first. ' and '.$last;
+ break;
+ }
+ }
+
+ //check if a join query is necessary or not
+ //$val: 0 or 1 (items or boxes)
+ //$whereClauseLevel: array containing the field=>value statements of the where clause. If $whereClause = null than $this->where is considered
+ public function checkIfJoinNeeded($val, $whereClauseLevel = null)
+ {
+ $whereClause = isset($whereClauseLevel) ? $whereClauseLevel : $this->where;
+
+ foreach ($whereClause as $field => $value)
+ {
+ if (is_array($value))
+ {
+ if ($this->checkIfJoinNeeded($val, $value) === true) return true;
+ }
+ else
+ {
+ if (strcmp($this->getTableName($field),$this->_tablesArray[$val]) !== 0)
+ {
+ if (strcmp($value,Params::$nullQueryValue) !== 0 or (Params::$nullQueryValue === false)) return true;
+ }
+ }
+ }
+ //return false if no where clause has been defined
+ return false;
+ }
+
+ //method to create the where clause and the list of tables of the select query
+ public function mapQueryElements($val)
+ {
+// $val = $element === 'Items' ? 0 : 1;
+ $tables = $this->_tablesArray[$val];
+ $where = null;
+ $fields = $this->_tablesArray[$val].'.*';
+
+ if ($this->checkIfJoinNeeded($val))
+ {
+ $tables = $this->_tables;
+ $fields = $this->_tablesArray[$val].'.*';
+ $wherePlus = $this->createWhereClause();
+ $wherePlus = isset($wherePlus) ? ' AND ' . $wherePlus : null;
+ $where = $this->createMapWhere('all') . $wherePlus;
+ }
+ else
+ {
+ $where = $this->createWhereClause();
+ }
+
+ return array('tables' => $tables,'where' => $where,'fields' => $fields);
+ }
+
+ //$element: Items or Boxes.
+ //get all Item or Boxes
+ public function getAll($element = 'Items')
+ {
+ return $this->getFields('',$element);
+ }
+
+ //method to get the values of the selected fields
+ //$fields: the fields that have to be excracted from the tableName
+ public function getFields($fields = '',$element = 'Items')
+ {
+ //get all Item or Boxes
+ if ((strcmp($element,'Items') !== 0) and (strcmp($element,'Boxes') !== 0))
+ {
+ throw new Exception('<b>"'.$element. '"</b> argument not allowed in <b>'.__METHOD__.'</b> method');
+ }
+ $val = $element === 'Items' ? 0 : 1;
+
+ $elements = $this->mapQueryElements($val);
+
+ $queryFields = (strcmp($fields,'') === 0) ? $elements['fields'] : $fields;
+
+ return $row = $this->db->select($elements['tables'],$queryFields,$elements['where'],$this->groupBy,$this->orderBy,$this->limit);
+
+ }
+
+ public function send($element = 'Items')
+ {
+ $table = $this->getFields($this->select, $element);
+
+ if ($this->toList)
+ {
+ $key = $this->listArray[0];
+ $value = isset($this->listArray[1]) ? $this->listArray[1] : null;
+ $this->toList = false;
+ return $this->getList($table, $key, $value);
+ }
+ else
+ {
+ return $table;
+ }
+ }
+
+ //the fields that have to be extracted from the table
+ public function getTable($fields = null)
+ {
+ return isset($fields) ? $this->getFields($fields) : $this->getAll();
+ }
+
+ //select the values of a specified record
+ //$id: the id (primary key) of the record
+ //$fields: the comma separated list of fields that have to be extracted
+ public function selectId($id,$fields = null)
+ {
+ $id = (int)$id;
+
+ $tempWhere = $this->where;
+ $this->setWhereQueryClause(array($this->_idFieldsArray[0] => $id));
+
+ if (isset($fields))
+ {
+ $values = $this->getFields($fields,'Items');
+ }
+ else
+ {
+ $values = $this->getAll('Items');
+ }
+
+ $this->where = $tempWhere;
+
+ return (count($values) > 0) ? $values[0][$this->_tablesArray[0]] : array();
+ }
+
+ //get the number of records (items or boxes)
+ public function recordNumber($element)
+ {
+ $val = $element === 'Items' ? 0 : 1;
+
+ $elements = $this->mapQueryElements($val);
+ return $this->db->get_num_rows($elements['tables'],$elements['where'],$this->groupBy);
+ }
+
+ //get the number of records (only items)
+ public function rowNumber()
+ {
+ return $this->recordNumber('Items');
+ }
+
+ public function getMax($field)
+ {
+ $elements = $this->mapQueryElements(0);
+ return $this->db->getMax($elements['tables'],$field,$elements['where'],$this->groupBy);
+ }
+
+ public function getMin($field)
+ {
+ $elements = $this->mapQueryElements(0);
+ return $this->db->getMin($elements['tables'],$field,$elements['where'],$this->groupBy);
+ }
+
+ public function getSum($field)
+ {
+ $elements = $this->mapQueryElements(0);
+ return $this->db->getSum($elements['tables'],$field,$elements['where'],$this->groupBy);
+ }
+
+ public function getAvg($field)
+ {
+ $elements = $this->mapQueryElements(0);
+ return $this->db->getAvg($elements['tables'],$field,$elements['where'],$this->groupBy);
+ }
+
+ //check if the table has the field $field equal to $value
+ public function has($field,$value)
+ {
+ $elements = $this->mapQueryElements(0);
+ return $this->db->recordExists($elements['tables'],$field,$value,$elements['where'],$this->groupBy);
+ }
+
+ //associate an item with a box
+ //$idItem : name of the field of the Items table, $idGroup : name of the field of the Boxes table
+ public function associate($idItem = null,$idGroup = null)
+ {
+ $this->queryResult = false;
+ if (isset($idItem) and isset($idGroup))
+ {
+ $idItem = (int)$idItem;
+ $idGroup = (int)$idGroup;
+ $values = array($idItem,$idGroup); //values relative to the fields $this->_idFields
+ $var = $this->checkAssociation($idItem,$idGroup);
+ if (!$var)
+ {
+ $result = $this->db->insert($this->_tablesArray[2],$this->_idFields,$values);
+ $this->setNotice($result);
+ return $result;
+ }
+ else
+ {
+ if (strcmp($this->printAssError,'yes') === 0) $this->notice = $this->_resultString->getString('linked');
+ $this->result = false;
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-id');
+ $this->result = false;
+ }
+ return false;
+ }
+
+ //associate an item with a box
+ //$idItem : name of the field of the Items table, $idGroup : name of the field of the Boxes table
+ public function dissociate($idItem = null,$idGroup = null)
+ {
+ $this->queryResult = false;
+ if (isset($idItem) and isset($idGroup))
+ {
+ $idItem = (int)$idItem;
+ $idGroup = (int)$idGroup;
+ $var = $this->checkAssociation($idItem,$idGroup);
+ if ($var)
+ {
+ $result = $this->db->del($this->_tablesArray[2],$this->_idFieldsArray[0].'='.$idItem.' and '.$this->_idFieldsArray[1].'='.$idGroup);
+ $this->setNotice($result);
+ return $result;
+ }
+ else
+ {
+ if (strcmp($this->printAssError,'yes') === 0) $this->notice = $this->_resultString->getString('not-linked');
+ $this->result = false;
+ }
+ }
+ else
+ {
+ $this->notice = $this->_resultString->getString('no-id');
+ $this->result = false;
+ }
+ return false;
+ }
+
+ public function checkAssociation($idItem,$idGroup)
+ {
+ $idItem = (int)$idItem;
+ $idGroup = (int)$idGroup;
+ $numRow = $this->db->get_num_rows($this->_tablesArray[2],$this->_idFieldsArray[0].'='.$idItem.' and '.$this->_idFieldsArray[1].'='.$idGroup);
+ if ($numRow === 1)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ //check what items are associate to a box
+ //itemsArray:array of items to check
+ public function checkAssociationDeep($itemsArray)
+ {
+ $associatedItems = array();
+ $itemsArray = is_array($itemsArray) ? array_values($itemsArray) : array($itemsArray);
+ foreach ($itemsArray as $item) {
+ if ($this->db->recordExists($this->_tablesArray[2],$this->_idFieldsArray[0],$item))
+ {
+ $associatedItems[] = $item;
+ }
+ }
+ return $associatedItems;
+ }
+
+ //method to call the delete query (overriding of the del method of Model.php)
+ //check the referential integrity
+ public function del($id = null, $whereClause = null)
+ {
+ $this->queryResult = false;
+
+ if (isset($whereClause))
+ {
+ return parent::del(null,$whereClause);
+ }
+ else
+ {
+ if ($this->_onDelete === 'check')
+ {
+ if ($this->db->recordExists($this->_tablesArray[2],$this->_idFieldsArray[0],(int)$id))
+ {
+ $this->notice = $this->_resultString->getString('associate');
+ $this->identifierValue = null;
+ $this->result = false;
+ }
+ else
+ {
+ return parent::del((int)$id);
+ }
+ }
+ else if ($this->_onDelete === 'nocheck')
+ {
+ return parent::del((int)$id);
+ }
+ }
+ return false;
+ }
+
+ //override of the updateTable method of the parent class
+ //method that calls the function indicated in $this->submitNames. Ex: if $_POST['delAction'] is found, then the "del" method is called.
+ public function updateTable($methodsList = '',$id = null)
+ {
+ $allowedMethodsArray = explode(',',$methodsList);
+ $resultArray = array();
+ $this->identifierValue = null;
+ if (isset($id))
+ {
+ $this->identifierValue = (int)$id;
+ }
+ else if (isset($_POST[$this->identifierName]))
+ {
+ $this->identifierValue = (int)$_POST[$this->identifierName];
+ }
+ foreach ($this->submitNames as $methodName => $submitName) {
+ if (array_key_exists($submitName,$_POST))
+ {
+ $this->submitName = $submitName;
+ if (method_exists($this,$methodName))
+ {
+ if (in_array($methodName,$allowedMethodsArray))
+ {
+ if ($this->checkConditions($methodName,$this->identifierValue))
+ {
+ $this->notice = null;
+ $methodArray = array('associate','dissociate');
+ if (in_array($methodName,$methodArray))
+ {
+ $this->_boxIdentifierValue = null;
+ if (isset($_POST[$this->boxIdentifierName]))
+ {
+ $this->_boxIdentifierValue = (int)$_POST[$this->boxIdentifierName];
+ }
+ call_user_func_array(array($this,$methodName),array($this->identifierValue,$this->_boxIdentifierValue));
+ }
+ else
+ {
+ call_user_func_array(array($this,$methodName),array($this->identifierValue));
+ }
+ }
+ }
+ }
+ else
+ {
+ throw new Exception('method "'.$methodName. '" not defined in class '.__CLASS__.'; error in method '.__METHOD__);
+ }
+ return; //only one cycle!
+ }
+ }
+ }
+
+ //method to obtain one columns from the tables $this->_tablesArray as an associative array
+ //$valueField: the column that have to be extracted (array_values of the resulting associative array), $keyField: the column that have to play the role of array_keys
+ //$valueField = field:table, $keyField = field:table
+ public function getFieldArray($valueField,$keyField = null, $groupBy = null, $orderBy = null, $limit = null)
+ {
+
+ $keyField = isset($keyField) ? $keyField : $valueField;
+ $valueFieldArray = explode(':',$valueField);
+ $keyFieldArray = explode(':',$keyField);
+
+ $keyFieldTable = $keyFieldArray[0];
+ $valueFieldTable = $valueFieldArray[0];
+
+ $keyFieldName = $keyFieldArray[1];
+ $valueFieldName = $valueFieldArray[1];
+
+ $fields = implode('.',$keyFieldArray) . ',' . implode('.',$valueFieldArray);
+
+ $temp = $this->where; //save the $this->where array
+ $this->where = array();
+
+ $val = array_search($keyFieldTable,$this->_tablesArray);
+
+ if (strcmp($keyFieldTable,$valueFieldTable) !== 0)
+ {
+ throw new Exception("the tables '$valueFieldTable' and '$keyFieldTable' do not match in ".__METHOD__);
+ }
+
+ if ($val === false or !in_array($val,array(0,1)))
+ {
+ throw new Exception("the table '$keyFieldTable' is not allowed in ".__METHOD__);
+ }
+
+ $elements = $this->mapQueryElements($val);
+
+ $table = $this->db->select($elements['tables'],$fields,$elements['where'],$groupBy,$orderBy,$limit);
+ $this->where = $temp;
+
+ $returnArray = array();
+ foreach ($table as $record) {
+ $returnArray[$record[$keyFieldTable][$keyFieldName]] = $record[$valueFieldTable][$valueFieldName];
+ }
+
+ return $returnArray;
+
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Model/Tree.php b/h-source/Library/Model/Tree.php
new file mode 100755
index 0000000..f7f95ea
--- /dev/null
+++ b/h-source/Library/Model/Tree.php
@@ -0,0 +1,307 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Model_Tree extends Model_Base {
+
+ public function __construct() {
+ parent::__construct();
+ }
+
+ //method to create the first part of where clause
+ //$index: the index of $this->_tablesArray
+ public function createTreeWhere($index) {
+ if (!empty($this->on))
+ {
+ return $this->on;
+ }
+ else
+ {
+ $whereArray = array();
+ for ($i = $index; $i < (count($this->_tablesArray)-1); $i++)
+ {
+ $whereArray[] = $this->_tablesArray[$i].'.'.$this->_idFieldsArray[$i+1].'='.$this->_tablesArray[$i+1].'.'.$this->_idFieldsArray[$i+1];
+ }
+ $whereString = !empty($whereArray) ? implode(' and ',$whereArray) : null;
+ return $whereString;
+ }
+ }
+
+ //create the list of tables of the select query
+ //$index: the index of $this->_tablesArray
+ public function createTablesList($index) {
+ if (isset($this->from))
+ {
+ return $this->from;
+ }
+ else
+ {
+ $tablesString = null;
+ for ($i = $index; $i < (count($this->_tablesArray)-1); $i++)
+ {
+ $tablesString .= $this->_tablesArray[$i] . ',';
+ }
+ $tablesString .= $this->_tablesArray[count($this->_tablesArray)-1];
+ return $tablesString;
+ }
+ }
+
+ //method to create the list of fields of the select query
+ public function createFieldsList($index) {
+ $fieldsString = null;
+ for ($i = $index; $i < (count($this->_tablesArray)-1); $i++)
+ {
+ $fieldsString .= $this->_tablesArray[$i] . '.*,';
+ }
+ $fieldsString .= $this->_tablesArray[count($this->_tablesArray)-1].'.*';
+ return $fieldsString;
+ }
+
+
+ //method to create the where clause and the list of tables and fields of the select query
+ //$tableName: the table name ($this->_tablesArray)
+ //$choice:all->all the tables in $this->_arrayTables, other value->only the table of $this->_arrayTables ad index $index
+ //return: $elements = array('tables'=>$tables,'where'=>$where,'fields'=>$fields)
+ public function treeQueryElements($tableName,$choice = 'all')
+ {
+ $index = array_search($tableName,$this->_tablesArray);
+ $subArray = ($choice === 'all') ? array_slice($this->_tablesArray,$index) : array($tableName); //this array is necessary to verify that the where clause makes sense
+ $tables = ($choice === 'all') ? $this->createTablesList($index) : $tableName;
+ $where = ($choice === 'all') ? $this->createTreeWhere($index) : null;
+ $fields = ($choice === 'all') ? $this->createFieldsList($index) : $tableName.'.*';
+
+ $wherePlus = $this->createWhereClause();
+
+ if (empty($this->on))
+ {
+ $on = array();
+
+ if (isset($where) and isset($wherePlus))
+ {
+ $where .= ' AND ' . $wherePlus;
+ }
+ else if (!isset($where) and isset($wherePlus))
+ {
+ $where .= $wherePlus;
+ }
+ }
+ else
+ {
+ $on = $where;
+ $where = $wherePlus;
+ }
+
+ return array('tables' => $tables,'where' => $where,'fields'=>$fields,'on'=>$on);
+ }
+
+
+ //method to obtain the values of the whole tree
+ //$choice:all->all the tables in $this->_arrayTables, other value->only the table of $this->_arrayTables ad index $index
+ public function getAll($choice = 'all') {
+ return $this->getFields('',$choice);
+ }
+
+ //method to get the values of the selected fields
+ //it walks the tree by means of a join query
+ //$fields: the fields that have to be excracted from the tableName
+ public function getFields($fields = '',$choice = 'all')
+ {
+ $elements = $this->treeQueryElements($this->_tablesArray[0],$choice);
+
+ $queryFields = (strcmp($fields,'') === 0) ? $elements['fields'] : $fields;
+
+ return $row = $this->db->select($elements['tables'],$queryFields,$elements['where'],$this->groupBy,$this->orderBy,$this->limit,$elements['on'],$this->using,$this->join);
+ }
+
+ public function send()
+ {
+ $table = $this->getFields($this->select);
+
+ if ($this->toList)
+ {
+ $key = $this->listArray[0];
+ $value = isset($this->listArray[1]) ? $this->listArray[1] : null;
+ $this->toList = false;
+ return $this->getList($table, $key, $value);
+ }
+ else
+ {
+ return $table;
+ }
+ }
+
+ //call the getAll method with $tableName = $this->_tablesArray[0]
+ //the fields that have to be extracted from the table
+ public function getTable($fields = null) {
+ return isset($fields) ? $this->getFields($fields) : $this->getAll();
+ }
+
+ //select the values of a specified record
+ //$id: the id (primary key) of the record
+ //$fields: the comma separated list of fields that have to be extracted
+ public function selectId($id,$fields = null) {
+ $tempWhere = $this->where;
+ $this->setWhereQueryClause(array($this->_idFieldsArray[0] => (int)$id));
+
+ $this->using = null;
+
+ if (isset($fields))
+ {
+ $values = $this->getFields($fields,'other');
+ }
+ else
+ {
+ $values = $this->getAll('other');
+ }
+
+ $this->where = $tempWhere;
+
+ return (count($values) > 0) ? $values[0][$this->_tablesArray[0]] : array();
+
+ }
+
+ //get the number of records ()
+ //the number of records of the table $tableName is returned
+ public function rowNumber() {
+ $elements = $this->treeQueryElements($this->_tablesArray[0]);
+ return $this->db->get_num_rows($elements['tables'],$elements['where'],$this->groupBy,$elements['on'],$this->using,$this->join);
+ }
+
+ public function getMax($field)
+ {
+ $elements = $this->treeQueryElements($this->_tablesArray[0]);
+ return $this->db->getMax($elements['tables'],$field,$elements['where'],$this->groupBy,$elements['on'],$this->using,$this->join);
+ }
+
+ public function getMin($field)
+ {
+ $elements = $this->treeQueryElements($this->_tablesArray[0]);
+ return $this->db->getMin($elements['tables'],$field,$elements['where'],$this->groupBy,$elements['on'],$this->using,$this->join);
+ }
+
+ public function getSum($field)
+ {
+ $elements = $this->treeQueryElements($this->_tablesArray[0]);
+ return $this->db->getSum($elements['tables'],$field,$elements['where'],$this->groupBy,$elements['on'],$this->using,$this->join);
+ }
+
+ public function getAvg($field)
+ {
+ $elements = $this->treeQueryElements($this->_tablesArray[0]);
+ return $this->db->getAvg($elements['tables'],$field,$elements['where'],$this->groupBy,$elements['on'],$this->using,$this->join);
+ }
+
+ //check if the table has the field $field equal to $value
+ public function has($field,$value)
+ {
+ $elements = $this->treeQueryElements($this->_tablesArray[0]);
+ return $this->db->recordExists($elements['tables'],$field,$value,$elements['where'],$this->groupBy,$elements['on'],$this->using,$this->join);
+ }
+
+// //get the number of records of the table $this->_tablesArray[0]
+// public function rowNumber() {
+// return $this->recordNumber($this->_tablesArray[0]);
+// }
+
+ //method to call the delete query (overriding of the del method of Model.php)
+ //check the referential integrity
+ public function del($id = null, $whereClause = null)
+ {
+ $this->queryResult = false;
+
+ if (isset($whereClause))
+ {
+ return parent::del(null,$whereClause);
+ }
+ else
+ {
+ if ($this->_onDelete === 'check' and isset($this->_reference))
+ {
+ if (isset($this->_reference[0]) and isset($this->_reference[1]))
+ {
+ if ($this->db->recordExists($this->_reference[0],$this->_reference[1],(int)$id))
+ {
+ $this->notice = $this->_resultString->getString('associate');
+ $this->identifierValue = null;
+ $this->result = false;
+ }
+ else
+ {
+ return parent::del((int)$id);
+ }
+ }
+ else
+ {
+ throw new Exception('you have forgotten to set \'$this->_reference\' or you have forgotten to set $this->_onDelete = \'nocheck\'');
+ }
+ }
+ else
+ {
+ return parent::del((int)$id);
+ }
+ }
+ return false;
+ }
+
+ //method to obtain one columns from the tables $this->_tablesArray as an associative array
+ //$valueField: the column that have to be extracted (array_values of the resulting associative array), $keyField: the column that have to play the role of array_keys
+ public function getFieldArray($valueField,$keyField = null, $groupBy = null, $orderBy = null, $limit = null) {
+
+ $keyField = isset($keyField) ? $keyField : $valueField;
+ $valueFieldArray = explode(':',$valueField);
+ $keyFieldArray = explode(':',$keyField);
+
+ $keyFieldTable = $keyFieldArray[0];
+ $valueFieldTable = $valueFieldArray[0];
+
+ $keyFieldName = $keyFieldArray[1];
+ $valueFieldName = $valueFieldArray[1];
+
+ $fields = implode('.',$keyFieldArray) . ',' . implode('.',$valueFieldArray);
+
+ $temp = $this->where; //save the $this->where array
+ $this->where = array();
+
+ if (strcmp($keyFieldTable,$valueFieldTable) !== 0) {
+ throw new Exception("the tables '$valueFieldTable' and '$keyFieldTable' do not match in ".__METHOD__);
+ }
+
+ if (!in_array($keyFieldTable,$this->_tablesArray)) {
+ throw new Exception("the table '$keyFieldTable' is not allowed in ".__METHOD__);
+ }
+
+ $elements = $this->treeQueryElements($keyFieldTable,'');
+
+ $table = $this->db->select($elements['tables'],$fields,$elements['where'],$groupBy,$orderBy,$limit,$elements['on'],$this->using);
+ $this->where = $temp;
+
+ $returnArray = array();
+ foreach ($table as $record) {
+ $returnArray[$record[$keyFieldTable][$keyFieldName]] = $record[$valueFieldTable][$valueFieldName];
+ }
+
+ return $returnArray;
+
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Model/index.html b/h-source/Library/Model/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Model/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/Params.php b/h-source/Library/Params.php
new file mode 100644
index 0000000..d98c3b4
--- /dev/null
+++ b/h-source/Library/Params.php
@@ -0,0 +1,63 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class containing all the parameters necessary to EasyGiant to work properly
+class Params
+{
+
+ //allowed database type
+ public static $allowedDb = array('Mysql','Mysqli','None');
+
+ //allowed sanitize functions
+ public static $allowedSanitizeFunc = 'sanitizeAll,sanitizeDb,sanitizeHtml,forceInt,forceNat,none,md5,sha1';
+
+ //allowed hash functions
+ public static $allowedHashFunc = array('md5','sha1');
+
+ //conventional null value for the value of the field in the createWhereClause method of the Model class
+ public static $nullQueryValue = false;
+
+ //class name of the div that contains the error strings
+ public static $errorStringClassName = 'alert';
+
+ //table name in the returning structure of the select queries in the case of an aggregate function. Ex count(*),sum(*)
+ public static $aggregateKey = 'aggregate';
+
+ //htmlentities function charset
+ //see http://php.net/manual/en/function.htmlentities.php for a complete list of the allowed values
+ public static $htmlentititiesCharset = DEFAULT_CHARSET;
+
+ //list of symbols used in the statements of the where clause of the select queries
+ public static $whereClauseSymbolArray = array('<','>','!=','<=','>=','in(','not in(','like');
+
+ //is the mbstring extension enabled?
+ public static $mbStringLoaded = false;
+
+ //subfolder of the View folder where to look for view files
+ public static $viewSubfolder = null;
+
+ //global website language used by the models and by the helpers
+ public static $language = 'It';
+
+} \ No newline at end of file
diff --git a/h-source/Library/Popup.php b/h-source/Library/Popup.php
new file mode 100755
index 0000000..186e4b3
--- /dev/null
+++ b/h-source/Library/Popup.php
@@ -0,0 +1,32 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to contain the values of the popup menù of the scaffold
+class Popup {
+
+ public $name; //the name of the popup
+ public $itemsName = array(); //array containing the names of the different items of the list (popup)
+ public $itemsValue = array(); //array containing the values of the different items of the list (popup)
+
+}
diff --git a/h-source/Library/Request.php b/h-source/Library/Request.php
new file mode 100644
index 0000000..d99585d
--- /dev/null
+++ b/h-source/Library/Request.php
@@ -0,0 +1,56 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//manage the associative arrays inside the request ($_GET,$_POST,$_COOKIE)
+class Request
+{
+
+ public function get($name, $default = null, $func = 'none')
+ {
+ if (!function_exists($func))
+ {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$func. '</b> does not exists');
+ }
+ return isset($_GET[$name]) ? call_user_func($func,$_GET[$name]) : $default;
+ }
+
+ public function post($name, $default = null, $func = 'none')
+ {
+ if (!function_exists($func))
+ {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$func. '</b> does not exists');
+ }
+ return isset($_POST[$name]) ? call_user_func($func,$_POST[$name]) : $default;
+ }
+
+ public function cookie($name, $default = null, $func = 'none')
+ {
+ if (!function_exists($func))
+ {
+ throw new Exception('Error in <b>'.__METHOD__.'</b>: function <b>'.$func. '</b> does not exists');
+ }
+ return isset($_COOKIE[$name]) ? call_user_func($func,$_COOKIE[$name]) : $default;
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Scaffold.php b/h-source/Library/Scaffold.php
new file mode 100755
index 0000000..7e43134
--- /dev/null
+++ b/h-source/Library/Scaffold.php
@@ -0,0 +1,304 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+//class to manage the scaffold of the controller
+class Scaffold
+{
+
+ protected $_type = null; //the type of the scaffold. It can be 'main' or 'form'
+ protected $_queryType = null; //it can be insert or update
+
+ protected $_primaryKey = null; //the primary key of the table
+ protected $_controller = null; //the name of the controller
+
+ public $model = null; //the reference to the model associated with the controller
+
+ public $viewArgs = array(); //the associative array representing the status args of the main action of the controller.
+
+ public $params = array(); //associative array containing the parameters of the scaffold
+ public $html = array(); //associative array containing the HTML of the scaffold ('pageList'=>HTML,..)
+
+ public $mainMenu = null; //the reference to the MenuHelper object
+ public $pageList = null; //the reference to the PageDivisionHelper object
+ public $itemList = null; //the reference to the ListHelper object
+ public $popupMenu = null; //the reference to the PopupHelper object
+
+ public $form = null; //the reference to the form object
+ public $entries = null; //the entries of the form (string having entries separated by comma)
+ public $values = array(); //the values inserted in the form (taken from the table if $this->queryType === 'update' or if an error occured during the databse query, otherwise taken from the $_POST array)
+
+ //the list of fields of the select query
+ public $fields = null;
+
+ //instance of Lang_{language}_Generic
+ public $strings = null;
+
+ public function __construct($type,$controller,$model,$viewArgs,$params = null) {
+
+ $this->_type = $type;
+ $this->_controller = $controller;
+ $this->model = $model;
+ $this->viewArgs = $viewArgs;
+
+ //get the generic language class
+ $this->strings = Factory_Strings::generic(Params::$language);
+
+ $autoParams = array(
+ 'mainAction' => 'main',
+ 'modifyAction' => 'form/update',
+ 'associateAction' => 'associate',
+ 'panelController' => 'panel',
+ 'pageList' => true,
+ 'pageVariable' => 'page',
+ 'recordPerPage' => 10,
+ 'mainMenu' => 'panel,add',
+ 'formMenu' => 'panel,back',
+ 'postSubmitValue' => 'Save',
+ 'popup' => false,
+ 'popupType' => 'exclusive'
+ );
+
+ //set the $this->scaffold->params array
+ if (is_array($params)) {
+ foreach ($params as $key => $value) {
+ $autoParams[$key] = $value;
+ }
+ }
+ $this->params = $autoParams;
+
+ }
+
+ //ad some clauses to the select query
+ //whereArray = array ($table_field => $value)
+ public function appendWhereQueryClause($whereArray)
+ {
+ $this->model->appendWhereQueryClause($whereArray);
+ }
+
+ //set clauses to the select query
+ //whereArray = array ($table_field => $value)
+ public function setWhereQueryClause($whereArray)
+ {
+ $this->model->setWhereQueryClause($whereArray);
+ }
+
+ //initialize the main scaffold (ListHelper)
+ //$recordList: field of the table to show, $primaryKey: the key of the table
+ public function loadMain($recordList,$primaryKey,$theme = 'edit,del')
+ {
+ $this->_primaryKey = $primaryKey;
+
+ if (strcmp($recordList,'') !== 0)
+ {
+ $recordListArray = explode(',',$recordList);
+ foreach ($recordListArray as $record) {
+ $this->itemList->addItem("simpleText",";$record;");
+ }
+ }
+
+ $themeArray = explode(',',$theme);
+
+ if (strcmp($theme,'') !== 0)
+ {
+ foreach ($themeArray as $el)
+ {
+ switch ($el)
+ {
+ case 'moveup':
+ $this->itemList->addItem('moveupForm',$this->_controller.'/'.$this->params['mainAction'],";".$primaryKey.";");
+ break;
+ case 'movedown':
+ $this->itemList->addItem('movedownForm',$this->_controller.'/'.$this->params['mainAction'],";".$primaryKey.";");
+ break;
+ case 'link':
+ $this->itemList->addItem('associateForm',$this->_controller.'/'.$this->params['associateAction'],";".$primaryKey.";");
+ break;
+ case 'edit':
+ $this->itemList->addItem('editForm',$this->_controller.'/'.$this->params['modifyAction'],";".$primaryKey.";");
+ break;
+ case 'del':
+ $this->itemList->addItem('delForm',$this->_controller.'/'.$this->params['mainAction'],";".$primaryKey.";");
+ break;
+ case 'ledit':
+ $this->itemList->addItem('ledit',$this->_controller.'/'.$this->params['mainAction'].'/;'.$primaryKey.';','Edit','Edit');
+ break;
+ }
+ }
+ }
+
+ }
+
+ //initialize the form
+ //$queryType = insert/update
+ //$action: the action of the form (controller/action/queryString)
+ public function loadForm($queryType,$action,$method = 'POST',$enctype = null)
+ {
+ $this->queryType = $queryType;
+ $submitName = $this->model->getSubmitName($queryType);
+ $value = $this->params['postSubmitValue'];
+ $viewStatus = Url::createUrl(array_values($this->viewArgs));
+ $this->model->setForm($action.$viewStatus,array($submitName => $value),$method,$enctype);
+ $this->form = $this->model->form;
+ }
+
+ //function to obtain the values to use in the form
+ //$func = function to validate the values
+ //$id = the id of the record (used if $_POST[$this->m[$this->model]->identifierName] is not present)
+ public function getFormValues($func = 'sanitizeHtml',$id = null,$defaultValues = array(),$functionsIfFromDb = array())
+ {
+ if ($this->_type === 'form')
+ {
+ $this->values = $this->model->getFormValues($this->queryType,$func,$id,$defaultValues,$functionsIfFromDb);
+ }
+ }
+
+ //set the head of the table
+ //$columnsName: name of the columns. It has to be a comma-separated list of strings
+ public function setHead($columnsName)
+ {
+ $this->itemList->setHead($columnsName);
+ }
+
+ //method to set the type of the entries of the form
+ //$entries: string containing the list of the entries where each entry is separated by comma: entry1,entry2,entry3
+ //$entryType: associative array that describes the entries of the form. The key is the entry name while the value is the entry type (textarea,inputText,etc)
+ public function setFormEntries($entries = 'model',$entryType = array(),$optionsArray = array())
+ {
+ if ($this->_type === 'form')
+ {
+ if ($entries === 'model')
+ {
+ $this->entries = $this->model->fields;
+ if ($this->queryType === 'update')
+ {
+ $this->entries .= ','. $this->model->identifierName;
+ }
+ }
+ else
+ {
+ $this->entries = null;
+ }
+ $entriesArray = explode(',',$this->entries);
+ if (isset($this->form))
+ {
+ foreach ($entriesArray as $entry)
+ {
+ $type = isset($entryType[$entry]) ? $entryType[$entry] : 'InputText';
+ $options = isset($optionsArray[$entry]) ? $optionsArray[$entry] : null;
+ $this->form->setEntry($entry,$type,$options);
+ }
+ if ($this->queryType === 'update')
+ {
+ $this->form->setEntry($this->model->identifierName,'Hidden');
+ }
+ }
+ else
+ {
+ throw new Exception('form object has not been initialized. Call the <b>scaffold->loadForm</b> method before');
+ }
+ }
+ }
+
+ //add an item to the list of items
+ public function addItem($type, $action = '', $field = '', $name = '', $value = '', $title = '') {
+ if ($this->_type === 'main') {
+ $this->itemList->addItem($type, $action, $field, $name, $value, $title);
+ }
+ }
+
+ //update the table
+ public function update($methodsList = '',$id = null) {
+ $this->model->updateTable($methodsList,$id);
+ }
+
+ //method to create the HTML of the scaffold
+ //$values: the values to insert in the from entries
+ public function render($values = null,$subset = null)
+ {
+
+ if ($this->_type === 'main')
+ {
+
+ $recordNumber = $this->model->rowNumber();
+
+ if (isset($this->viewArgs[$this->params['pageVariable']]))
+ {
+ $page = $this->viewArgs[$this->params['pageVariable']];
+ }
+ else
+ {
+ $this->params['pageList'] = false;
+ }
+
+ $recordPerPage = $this->params['recordPerPage'];
+
+ if ($this->params['pageList'] === true)
+ {
+ $this->model->limit = $this->pageList->getLimit($page,$recordNumber,$recordPerPage);
+ $this->html['pageList'] = $this->pageList->render((int)($page-2),5);
+ $position = array($page,$this->pageList->getNumbOfPages());
+ }
+ else
+ {
+ $this->model->limit = null;
+ $this->html['pageList'] = null;
+ $position = array(1,1);
+ }
+
+ $values = $this->model->getTable($this->fields);
+
+ $primaryKey = $this->_primaryKey;
+
+ //pass the variable position
+ $this->itemList->position = $position;
+ $this->html['main'] = $this->itemList->render($values);
+
+ $this->html['menu'] = $this->mainMenu->render($this->params['mainMenu']);
+
+ $popupHtml = null;
+ if ($this->params['popup'] === true)
+ {
+ $this->html['popup'] = $this->popupMenu->render();
+ $popupHtml = "<div class='verticalMenu'>\n".$this->html['popup']."\n</div>\n";
+ }
+
+ $this->html['all'] = "<div class='mainMenu'>".$this->html['menu']."</div>\n".$this->model->notice."\n $popupHtml \n<div class='recordsBox'>\n".$this->html['main']."\n</div>\n"."<div class='viewFooter'>\n<div class='pageList'>\n<span class='page_list_legend'>".$this->strings->gtext('pages').":</span> ".$this->html['pageList']."</div>\n</div>\n\n";
+
+ }
+ else if ($this->_type === 'form')
+ {
+
+ $subset = (!isset($subset)) ? $this->entries : $subset;
+ $values = (!isset($values)) ? $this->values : $values;
+ $this->html['menu'] = $this->mainMenu->render($this->params['formMenu']);
+ $this->html['main'] = $this->form->render($values,$subset);
+ $this->html['all'] = "<div class='mainMenu'>\n".$this->html['menu']."\n</div>\n".$this->model->notice."\n<div class='scaffold_form'>\n".$this->html['main']."</div>\n";
+
+ }
+
+ return $this->html['all'];
+
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Strings/Functions.php b/h-source/Library/Strings/Functions.php
new file mode 100644
index 0000000..1ee17af
--- /dev/null
+++ b/h-source/Library/Strings/Functions.php
@@ -0,0 +1,47 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+
+function eg_strlen($string)
+{
+ return Params::$mbStringLoaded === true ? mb_strlen($string,DEFAULT_CHARSET) : strlen($string);
+}
+
+
+function eg_strtoupper($string)
+{
+ return Params::$mbStringLoaded === true ? mb_strtoupper($string,DEFAULT_CHARSET) : strtoupper($string);
+}
+
+
+function eg_strtolower($string)
+{
+ return Params::$mbStringLoaded === true ? mb_strtolower($string,DEFAULT_CHARSET) : strtolower($string);
+}
+
+
+// function eg_substr($string, $start, $length)
+// {
+// return Params::$mbStringLoaded === true ? mb_strtolower($string,DEFAULT_CHARSET) : strtolower($string);
+// } \ No newline at end of file
diff --git a/h-source/Library/Theme.php b/h-source/Library/Theme.php
new file mode 100755
index 0000000..a001631
--- /dev/null
+++ b/h-source/Library/Theme.php
@@ -0,0 +1,99 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Theme {
+
+ protected $_data = array();
+ protected $_viewFiles = array(); //view files to require
+ protected $_lastView = null;
+
+ public $baseUrl = null; //the base url of the website: http://domainname
+ public $baseUrlSrc = null; //the base url of the website (http://domainname) in the case MOD_REWRITE_MODULE has been set to false
+
+ public $viewArgs = array();
+ public $viewStatus = '';
+ public $controller = 'controller';
+ public $action = '';
+ public $currPage; //the URL of the current page
+
+ function __construct($controller) {
+ $this->controller = $controller;
+ $this->baseUrl = MOD_REWRITE_MODULE === true ? 'http://' . DOMAIN_NAME : 'http://' . DOMAIN_NAME . '/index.php';
+ $this->baseUrlSrc = 'http://' . DOMAIN_NAME;
+ }
+
+
+ public function set($values)
+ {
+ $this->_data = $values;
+ }
+
+ public function append($values)
+ {
+ $this->_data = array_merge($this->_data,$values);
+ }
+
+ //clean the $this->viewFiles array
+ public function clean() {
+ $this->_viewFiles = array();
+ $this->_lastView = null;
+ }
+
+ public function load($fileName,$option = 'none') {
+ if ((strcmp($option,'last') !== 0) and (strcmp($option,'none') !== 0)) {
+ throw new Exception('"'.$option. '" argument not allowed in '.__METHOD__.' method');
+ }
+ if ($option === 'last') {
+ $this->_lastView = $fileName;
+ } else {
+ $this->_viewFiles[] = $fileName;
+ }
+ }
+
+
+ public function render() {
+ extract($this->_data);
+
+ //find the View subfolder where to look for view files
+ $subfolder = isset(Params::$viewSubfolder) ? Params::$viewSubfolder . DS : null;
+
+ foreach ($this->_viewFiles as $file) {
+ if (file_exists(ROOT . DS . APPLICATION_PATH . DS . 'Views' . DS .$subfolder. ucwords($this->controller) . DS . $file . '.php')) {
+ include (ROOT . DS . APPLICATION_PATH . DS . 'Views' . DS .$subfolder. ucwords($this->controller) . DS . $file . '.php');
+ } else {
+ include (ROOT . DS . APPLICATION_PATH . DS . 'Views' . DS .$subfolder. $file . '.php');
+ }
+ }
+
+ if (isset($this->_lastView)) {
+ if (file_exists(ROOT . DS . APPLICATION_PATH . DS . 'Views' . DS .$subfolder. ucwords($this->controller) . DS . $this->_lastView . '.php')) {
+ include (ROOT . DS . APPLICATION_PATH . DS . 'Views' . DS .$subfolder. ucwords($this->controller) . DS . $this->_lastView . '.php');
+ } else {
+ include (ROOT . DS . APPLICATION_PATH . DS . 'Views' . DS .$subfolder. $this->_lastView . '.php');
+ }
+ }
+
+ }
+
+}
diff --git a/h-source/Library/Url.php b/h-source/Library/Url.php
new file mode 100755
index 0000000..9f73291
--- /dev/null
+++ b/h-source/Library/Url.php
@@ -0,0 +1,53 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Url {
+
+ //get the url starting from the root folder
+ public static function getRoot($pathFromRootFolder = null) {
+ $url = MOD_REWRITE_MODULE === true ? 'http://' . DOMAIN_NAME . '/' . $pathFromRootFolder : 'http://' . DOMAIN_NAME . '/index.php/' . $pathFromRootFolder;
+ return $url;
+ }
+
+ //create an url string (element1/element2/element4) from the values of the array $valuesArray considering only the elements indicated in the numeric string $numericString (in this case '1,2,4')
+ public function createUrl($valuesArray,$numericString = null) {
+ $elementsArray = explode(',',$numericString);
+ $valuesArray = array_values($valuesArray);
+ $urlString = null;
+ for ($i = 0; $i < count($valuesArray); $i++)
+ {
+ if (isset($numericString)) {
+ if (isset($valuesArray[$i]) and in_array($i,$elementsArray)) {
+ $urlString .= "/".$valuesArray[$i];
+ }
+ } else {
+ if (isset($valuesArray[$i])) {
+ $urlString .= "/".$valuesArray[$i];
+ }
+ }
+ }
+ return $urlString;
+ }
+
+}
diff --git a/h-source/Library/Users/CheckAdmin.php b/h-source/Library/Users/CheckAdmin.php
new file mode 100755
index 0000000..54deb2a
--- /dev/null
+++ b/h-source/Library/Users/CheckAdmin.php
@@ -0,0 +1,386 @@
+<?php
+
+// EasyGiant is a PHP framework for creating and managing dynamic content
+//
+// Copyright (C) 2009 - 2011 Antonio Gallo
+// See COPYRIGHT.txt and LICENSE.txt.
+//
+// This file is part of EasyGiant
+//
+// EasyGiant is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EasyGiant is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EasyGiant. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class Users_CheckAdmin {
+
+ public $status = array();
+
+ protected $_sessionsTable; //table containing all the sessions
+ protected $_usersTable; //table containing all the users
+ protected $_groupsTable; //table containing all the groups
+ protected $_manyToManyTable; //table for many to many relationships
+ protected $_accessesTable; //table containing all the accesses to admin side
+ protected $uid = null;
+ protected $_token = null; //token used in order to defense against CSRF (cross sire request forgeries)
+ protected $_login; //login action
+ protected $_main; //main action
+ protected $_retype; //retype (the password) action
+ protected $_db; //reference to the database layer class
+ protected $_params = array(); //the parameters of the object
+
+ public function __construct($params = null) {
+ $this->_params = $params;
+
+ $this->_sessionsTable = $params['sessionsTable'];
+ $this->_usersTable = $params['usersTable'];
+ $this->_groupsTable = $params['groupsTable'];
+ $this->_manyToManyTable = $params['manyToManyTable'];
+ $this->_accessesTable = $params['accessesTable'];
+ $this->_login = Url::getRoot(null) . $params['users_controller'] . '/' . $params['users_login_action'] ;
+ $this->_main = Url::getRoot(null) . $params['panel_controller'] . '/' . $params['panel_main_action'] ;
+ $this->_retype = Url::getRoot(null) . $params['users_controller'] . '/' . $params['hijacking_action'] ;
+ $this->_db = Factory_Db::getInstance($params['database_type']);
+ }
+
+ private function acquireCookie() { #obtain cookie
+ #cookie
+ $this->uid = NULL;
+ global $_COOKIE;
+ $this->uid = isset($_COOKIE[$this->_params['cookie_name']]) ? sanitizeAlnum($_COOKIE[$this->_params['cookie_name']]) : null;
+ }
+
+ private function cleanSessions()
+ {
+ #cancello le sessioni scadute
+ $row = $this->_db->select($this->_sessionsTable,'creation_date',"uid='".$this->uid."'");
+ if ($row)
+ {
+ if ($row[0][$this->_sessionsTable]['creation_date'])
+ {
+ if($row[0][$this->_sessionsTable]['creation_date'] + $this->_params['session_expire'] <= time())
+ {
+ setcookie($this->_params['cookie_name'],'',time()-3600,$this->_params['cookie_path']);
+ }
+ }
+ }
+ $this->_db->del($this->_sessionsTable,"creation_date + " . $this->_params['session_expire'] . " <= ".time());
+ }
+
+ public function checkStatus()
+ { #controlla se l'utente è già loggato
+ $this->acquireCookie(); #ottengo il cookie
+ $this->cleanSessions(); #elimino le sessioni vecchie
+ $row=$this->_db->select($this->_usersTable.','.$this->_sessionsTable,$this->_usersTable.'.id_user,username,token,user_agent',$this->_usersTable.".id_user=".$this->_sessionsTable.".id_user and uid='".$this->uid."'");
+ if (count($row) === 1 and $row !== false)
+ {
+ $this->status['user']=$row[0][$this->_usersTable]['username'];
+ $this->status['status']='logged';
+ $this->status['id_user']=$row[0][$this->_usersTable]['id_user'];
+ $this->status['user_agent'] = $row[0][$this->_sessionsTable]['user_agent'];
+ $this->status['token'] = $row[0][$this->_sessionsTable]['token'];
+ $this->obtainGroups();
+ } else {
+ $this->status['user']='sconosciuto';
+ $this->status['status']='not-logged';
+ $this->status['id_user']='';
+ $this->status['user_agent']='';
+ $this->status['token'] = '';
+ $this->status['groups'] = array();
+ }
+ }
+
+ public function redirect($val,$time = 3) { #fa il redirect dell'utente
+ if ($val === 'logged') {
+ header('Refresh: '.$time.';url='.$this->_main);
+ if ($time !== 0) echo "You are already logged, ".$this->status['user']."..";
+ } else if ($val === 'accepted') {
+ header('Refresh: '.$time.';url='.$this->_main);
+ if ($time !== 0) echo "Hi ".$this->status['user']."..";
+ } else if ($val === 'login-error') {
+ header('Refresh: '.$time.';url='.$this->_login);
+ if ($time !== 0) echo "Wrong username or password...";
+ } else if ($val === 'not-logged') {
+ header('Refresh: '.$time.';url='.$this->_login);
+ if ($time !== 0) echo "Limited access... sorry";
+ } else if ($val === 'not-authorized') {
+ header('Refresh: '.$time.';url='.$this->_main);
+ if ($time !== 0) echo "Your account doesn't allow you to manage this page.. sorry!";
+ } else if ($val === 'stolen') {
+ header('Refresh: '.$time.';url='.$this->_login);
+ if ($time !== 0) echo "Your session have been probably intercepted! Please login another time.";
+ } else if ($val === 'retype') {
+ header('Refresh: '.$time.';url='.$this->_retype);
+ if ($time !== 0) echo "Your session have been probably intercepted. Please type your password another time.";
+ } else if ($val === 'wait') {
+ header('Refresh: '.$time.';url='.$this->_login);
+ if ($time !== 0) echo "You have to wait ".$this->_params['time_after_failure']." seconds before you can try to login another time";
+ }
+ exit;
+ }
+
+ //obtain the group of the user
+ private function obtainGroups()
+ {
+ $tables = $this->_usersTable.','.$this->_groupsTable.','.$this->_manyToManyTable;
+ $fields = $this->_groupsTable.'.name';
+ $where = $this->_usersTable.'.id_user='.$this->_manyToManyTable.'.id_user and '.$this->_groupsTable.'.id_group='.$this->_manyToManyTable.'.id_group and '.$this->_usersTable.'.id_user='.$this->status['id_user'];
+ $groups = $this->_db->select($tables,$fields,$where);
+ $this->status['groups'] = array();
+ foreach ($groups as $group)
+ {
+ $this->status['groups'][] = $group[$this->_groupsTable]['name'];
+ }
+ }
+
+ //$groups: string with name of groups separated by comma; ex: base,root,users
+ public function checkAccess($groups)
+ {
+ $groupsArray = explode (',',$groups);
+ foreach ($this->status['groups'] as $group)
+ {
+ if (in_array($group,$groupsArray)) return true;
+ }
+ return false;
+ }
+
+ //check that the user is logged and, if present, check the group of the user (if loggeg)
+ //$groups: comma-separated list of groups whose users can access the page
+ //$time: time before the redirect is carried out
+ public function check($groups = null, $time = 3)
+ {
+ $this->checkStatus();
+ if (strcmp($this->status['status'],'not-logged') === 0)
+ {
+ $this->redirect('not-logged',$time);
+ }
+ else if (strcmp($this->status['status'],'logged') === 0)
+ {
+ if ($this->_params['hijacking_check'])
+ {
+ if (!$this->checkHijacking())
+ {
+ if ($this->_params['on_hijacking_event'] === 'forceout')
+ {
+ $this->logout();
+ $this->redirect('stolen',$time);
+ }
+ else if ($this->_params['on_hijacking_event'] === 'redirect')
+ {
+ $this->redirect('retype',$time);
+ }
+ }
+ }
+// $this->obtainGroups();
+ if (isset($groups))
+ {
+ $permission = $this->checkAccess($groups);
+ if (!$permission) $this->redirect('not-authorized',$time);
+ }
+ }
+ }
+
+ //check if someone have stolen your uid
+ private function checkHijacking()
+ {
+ if (array_key_exists('user_agent',$this->status))
+ {
+ if (strcmp($this->status['user_agent'],'') !== 0)
+ {
+ if (strcmp($this->status['user_agent'],getUserAgent()) === 0)
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ //check CSRF
+ //$token: token to check
+ public function checkCSRF($token)
+ {
+ if (strcmp($this->status['token'],'') !== 0)
+ {
+ if (strcmp($this->status['token'],$token) === 0)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ //get an array containing all the users currently logged
+ public function getUsersLogged()
+ {
+ $usersLogged = array();
+ $data=$this->_db->select($this->_usersTable.','.$this->_sessionsTable,'DISTINCT '.$this->_usersTable.'.username',$this->_usersTable.".id_user=".$this->_sessionsTable.".id_user");
+ foreach ($data as $row)
+ {
+ $usersLogged[] = $row[$this->_usersTable]['username'];
+ }
+ return $usersLogged;
+ }
+
+ //get the password of the current user
+ public function getPassword()
+ {
+ $row=$this->_db->select($this->_usersTable,'password',"id_user=".$this->status['id_user']);
+ if ($row !== false)
+ {
+ return $row[0][$this->_usersTable]['password'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ private function checkPassword($user,$pwd) { #check username and password
+
+ if (!in_array($this->_params['password_hash'],Params::$allowedHashFunc))
+ {
+ throw new Exception('Error in '.__METHOD__.' : the hash func has to be '.implode(' or ',Params::$allowedHashFunc));
+ }
+ //calculate the hash of the password
+ $pwd = call_user_func($this->_params['password_hash'],$pwd);
+
+ $row=$this->_db->select($this->_usersTable,$this->_usersTable.'.id_user,username,password',"username=\"".$user."\" and password=\"".$pwd."\" and has_confirmed=0");
+ if (count($row) === 1 and $row !== false)
+ {
+ $this->status['user'] = $row[0][$this->_usersTable]['username'];
+ $this->status['status'] = 'accepted';
+ $this->status['id_user'] = $row[0][$this->_usersTable]['id_user'];
+ }
+ else
+ {
+ $this->status['user'] = 'unknown';
+ $this->status['status'] = 'login-error';
+ $this->status['id_user'] = '';
+ if ($this->_db->recordExists($this->_usersTable,'username',$user))
+ {
+ $this->_db->update($this->_usersTable,'last_failure',array(time()),'username="'.$user.'"');
+ }
+ }
+ }
+
+ //check that enough time is passed since the last failure of the user
+ private function checkLastFailure($user)
+ {
+ //current time
+ $now = time();
+ //max time
+ $max = $now - $this->_params['time_after_failure'];
+ $data = $this->_db->select($this->_usersTable,'last_failure','username="'.$user.'"');
+ if (count($data) === 1 and $data !== false)
+ {
+ if ($data[0][$this->_usersTable]['last_failure'] < $max)
+ {
+ return true;
+ }
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+ public function login($user,$pwd)
+ {
+ $user = sanitizeAll($user);
+ $this->checkStatus();
+ //check if already logged
+ if ($this->status['status'] === 'logged')
+ {
+// $this->redirect('logged');
+ return 'logged';
+ }
+ else
+ {
+ if ($this->checkLastFailure($user))
+ {
+ $this->checkPassword($user,$pwd);
+ if ($this->status['status']==='accepted')
+ {
+ $this->uid = md5(randString(10).uniqid(mt_rand(),true));
+ $this->_token = md5(randString(12));
+ $userAgent = getUserAgent();
+ $this->_db->insert($this->_sessionsTable,'id_user,uid,token,creation_date,user_agent',array($this->status['id_user'],$this->uid,$this->_token,time(),$userAgent));
+ setcookie($this->_params['cookie_name'],$this->uid,0,$this->_params['cookie_path']); #magic cookie
+ $this->updateAccesses();
+
+ $this->_db->del($this->_sessionsTable,'id_user='.$this->status['id_user'].' AND uid != "'.$this->uid.'"');
+
+// $this->redirect('accepted');
+ return 'accepted';
+ }
+ else if ($this->status['status']==='login-error')
+ {
+// $this->redirect('login-error');
+ return 'login-error';
+ }
+ }
+ else
+ {
+// $this->redirect('wait');
+ return 'wait';
+ }
+ }
+// $this->redirect('login-error');
+ return 'login-error';
+ }
+
+ private function updateAccesses()
+ {
+ $ip=getIp(); #ip
+ $date=date('d'). "-" . date('m') . "-" . date('Y'); #date
+ $ora=date('H') . ":" . date('i'); #time
+ $values=array($ip,$date,$ora,$this->status['user']);
+ $res=$this->_db->insert($this->_accessesTable,'ip,data,ora,username',$values);
+ }
+
+ //force out an user
+ //$id: the id of the user
+ public function forceOut($id)
+ {
+ $id = (int)$id;
+ if ($this->_db->del($this->_sessionsTable,'id_user='.$id))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public function logout()
+ {
+ $this->checkStatus();
+ if ($this->status['status'] === 'logged')
+ {
+ setcookie ($this->_params['cookie_name'], "", time() - 3600,$this->_params['cookie_path']);
+ if ($this->_db->del($this->_sessionsTable,'id_user='.$this->status['id_user']))
+ {
+ return 'was-logged';
+ }
+ else
+ {
+ return 'error';
+ }
+ }
+ else
+ {
+ return 'not-logged';
+ }
+ }
+
+} \ No newline at end of file
diff --git a/h-source/Library/Users/index.html b/h-source/Library/Users/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/Users/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Library/index.html b/h-source/Library/index.html
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/h-source/Library/index.html
@@ -0,0 +1 @@
+
diff --git a/h-source/Public/Img/Icons/elementary_2_5/AUTHORS b/h-source/Public/Img/Icons/elementary_2_5/AUTHORS
new file mode 100755
index 0000000..dd652c4
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/AUTHORS
@@ -0,0 +1,28 @@
+####################
+ABOUT: #
+####################
+These icons are taken from the elementary theme. The delete.png file has been modified by Antonio Gallo (tonicucoz@yahoo.com)
+
+elementary is designed and developed by Daniel Foré <Daniel.p.Fore@gmail.com>
+
+GNOME icons, Humanity icons, and elementary icons are all licensed under the GPL.
+
+This package is licensed under GNU General Public License version 2.
+
+Icons based on GNOME and other GNOME projects are licensed GPL.
+ You can visit the GNOME website here:
+ http://www.gnome.org/
+
+Icons based on Tango sources or taken from the Tango project are public domain.
+ You can visit the Tango project website here:
+ http://tango.freedesktop.org/Tango_Desktop_Project
+
+Icons based on Humanity sources or taken from the elementary project are licensed GPL.
+ You can visit the Humanity website here:
+ http://launchpad.net/humanity
+
+####################
+Special Thanks: #
+####################
+
+The awesome Humanity team for their hard work!
diff --git a/h-source/Public/Img/Icons/elementary_2_5/CONTRIBUTORS b/h-source/Public/Img/Icons/elementary_2_5/CONTRIBUTORS
new file mode 100755
index 0000000..801c4cc
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/CONTRIBUTORS
@@ -0,0 +1,3 @@
+Sebastian Porta <sebastianporta@gmail.com>
+Oliver Scholtz <scholli_tz@yahoo.de>
+Dennis Fisher, for his amazing work with emblems to make them look beautiful.
diff --git a/h-source/Public/Img/Icons/elementary_2_5/COPYING b/h-source/Public/Img/Icons/elementary_2_5/COPYING
new file mode 100755
index 0000000..d60c31a
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/h-source/Public/Img/Icons/elementary_2_5/ChangeLog b/h-source/Public/Img/Icons/elementary_2_5/ChangeLog
new file mode 100755
index 0000000..2ba7169
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/ChangeLog
@@ -0,0 +1,6 @@
+Elementary icons 2.5 kde port - by jetpack, changelog:
+
+0.1
+===
+* Initial Version.
+* Elementary icons by Dan Rabbit v2.5 \ No newline at end of file
diff --git a/h-source/Public/Img/Icons/elementary_2_5/add.png b/h-source/Public/Img/Icons/elementary_2_5/add.png
new file mode 100755
index 0000000..e6c9c9c
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/add.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/clear_filter.png b/h-source/Public/Img/Icons/elementary_2_5/clear_filter.png
new file mode 100755
index 0000000..c4b47db
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/clear_filter.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/delete.png b/h-source/Public/Img/Icons/elementary_2_5/delete.png
new file mode 100755
index 0000000..c4b47db
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/delete.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/down.png b/h-source/Public/Img/Icons/elementary_2_5/down.png
new file mode 100755
index 0000000..21c6d58
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/down.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/edit.png b/h-source/Public/Img/Icons/elementary_2_5/edit.png
new file mode 100755
index 0000000..ed0d0ef
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/edit.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/find.png b/h-source/Public/Img/Icons/elementary_2_5/find.png
new file mode 100755
index 0000000..382cc98
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/find.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/left.png b/h-source/Public/Img/Icons/elementary_2_5/left.png
new file mode 100755
index 0000000..316d4c1
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/left.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/link.png b/h-source/Public/Img/Icons/elementary_2_5/link.png
new file mode 100755
index 0000000..625a1fb
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/link.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/panel.png b/h-source/Public/Img/Icons/elementary_2_5/panel.png
new file mode 100755
index 0000000..464149f
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/panel.png
Binary files differ
diff --git a/h-source/Public/Img/Icons/elementary_2_5/up.png b/h-source/Public/Img/Icons/elementary_2_5/up.png
new file mode 100755
index 0000000..14d3603
--- /dev/null
+++ b/h-source/Public/Img/Icons/elementary_2_5/up.png
Binary files differ