+
+
+
+HTML;
+
+ exit;
+
+ return true;
+
+ }
+
+ ##------------------------------------------------------------------##
+
+}
diff --git a/lib/site.lib.php b/lib/site.lib.php
new file mode 100644
index 0000000..d581cdb
--- /dev/null
+++ b/lib/site.lib.php
@@ -0,0 +1,657 @@
+SelectOne($sql);
+ if ( $db->_rowCount == 1 ) {
+ # if one record was returned then a user matching the credentials they
+ # supplied was found in the database. give them access.
+ $_SESSION['auth']['status'] = "access_granted";
+ $_SESSION['auth']['ipaddress'] = $_SERVER['REMOTE_ADDR'];
+
+ # dump all the users info into a session var, but unset the
+ # value of the password field
+ $_SESSION['user'] = $db->_row;
+ unset($_SESSION['user']['password']);
+
+ # determine the users age and put it in the session so that we don't have
+ # to calculate it over and over again as they view things. 31536000 is the
+ # number of seconds in a year.
+ $_SESSION['user']['age'] = floor((time() - $db->_row['birthday'])/31536000);
+ return true;
+ } else {
+ # not a valid user (not found in db)
+ $_SESSION['systemMsg'] = "Login incorrect.";
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# a simple function to check if a user is logged in which also verifies
+# that the request came from the same IP address as the original login
+function isLoggedIn() {
+
+ if (
+ isset($_SESSION['auth']) &&
+ ($_SESSION['auth']['status'] == "access_granted") &&
+ ($_SESSION['auth']['ipaddress'] == $_SERVER['REMOTE_ADDR'])
+ ) {
+ return true;
+ } else {
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# this function will check to see if a user is logged in, and if not will
+# redirect the user to the index page with an error. we could use the
+# isLoggedIn() function above directly, but that would require some if/thens
+# on the top of each script that required a login and then a rediction too.
+# this function just bundles all that into a neat package
+function loginRequired() {
+
+ global $config;
+
+ if ( isLoggedIn() ) {
+ return true;
+ } else {
+ header("Location: {$config->_rootUri}/");
+ exit;
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# get a food category's name based on that categories id in the database
+function getFoodCategoryName($category) {
+
+ global $db;
+
+ $sql = "
+ SELECT fdgrp_desc
+ FROM foodCats
+ WHERE fdgrp_cd = '$category'
+ ";
+ $db->SelectOne($sql);
+ if ( $db->_rowCount == 1 ) {
+ return $db->_row['fdgrp_desc'];
+ } else {
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# get a nutrients description based on that nutrients nutr_no in the database
+function getNutrientName($nutrient) {
+
+ global $db;
+
+ $sql = "
+ SELECT nutrdesc
+ FROM nutrientDefs
+ WHERE nutr_no = '$nutrient'
+ ";
+ $db->SelectOne($sql);
+ if ( $db->_rowCount == 1 ) {
+ return $db->_row['nutrdesc'];
+ } else {
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# get any favorite foods based on user id
+function getFavoriteFoods($user) {
+
+ global $db;
+
+ # if the user hasn't marked any foods as favorites to
+ # show in the left sidebar dropdown, then just grab the
+ # first 15, else grab just their favorites
+ $sql = "
+ SELECT count(*) AS favCount
+ FROM userFoods
+ WHERE favorite = '1'
+ ";
+ $db->SelectOne($sql);
+
+ if ( $db->_row['favCount'] == "0" ) {
+ $sql = "
+ SELECT * FROM userFoods
+ WHERE user = '$user'
+ ORDER BY description
+ LIMIT 15
+ ";
+ } else {
+ $sql = "
+ SELECT * FROM userFoods
+ WHERE user = '$user'
+ AND favorite = '1'
+ ORDER BY description
+ ";
+ }
+
+ $db->Select($sql);
+ if ( $db->_rowCount > 0 ) {
+ return $db->_rows;
+ } else {
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# get any favorite meals based on user id
+function getFavoriteMeals($user) {
+
+ global $db;
+
+ # if the user hasn't marked any meals as favorites to
+ # show in the left sidebar dropdown, then just grab the
+ # first 15, else grab just their favorites
+ $sql = "
+ SELECT count(*) AS favCount
+ FROM userMeals
+ WHERE favorite = '1'
+ ";
+ $db->SelectOne($sql);
+
+ if ( $db->_row['favCount'] == "0" ) {
+ $sql = "
+ SELECT * FROM userMeals
+ WHERE user = '$user'
+ ORDER BY description
+ LIMIT 15
+ ";
+ } else {
+ $sql = "
+ SELECT * FROM userMeals
+ WHERE user = '$user'
+ ORDER BY description
+ ";
+ }
+
+ $db->Select($sql);
+ if ( $db->_rowCount > 0 ) {
+ return $db->_rows;
+ } else {
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# get all meals based on user id
+function getUserMeals($user) {
+
+ global $db;
+
+ $sql = "
+ SELECT * FROM userMeals
+ WHERE user = '$user'
+ ORDER BY description
+ ";
+
+ $db->Select($sql);
+ if ( $db->_rowCount > 0 ) {
+ return $db->_rows;
+ } else {
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# get all diaries based on user id
+function getUserDiaries($user) {
+
+ global $db;
+
+ $sql = "
+ SELECT * FROM userDiaries
+ WHERE user = '$user'
+ ORDER BY description
+ ";
+
+ $db->Select($sql);
+ if ( $db->_rowCount > 0 ) {
+ return $db->_rows;
+ } else {
+ return false;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# removes an item from the current meal in $_SESSION['currentMeal']
+function removeCurrentMealItem($mealItem) {
+
+ $objResponse = new xajaxResponse();
+
+ # remove the selected meal item from the session
+ if ( array_key_exists($mealItem, $_SESSION['currentMeal']) ) {
+ unset($_SESSION['currentMeal'][$mealItem]);
+ $objResponse->addRemove("currentMealItem-$mealItem");
+ $objResponse->addAssign("systemMsgs", "innerHTML", "The meal item was successfully removed.");
+ # if the session is empty then let the user know and remove
+ # anything like links to "View meal", "Clear meal", etc.
+ if ( count($_SESSION['currentMeal']) == 0 ) {
+ $objResponse->addAssign("divCurrentMeal", "innerHTML", "No items in meal.");
+ }
+ } else {
+ $objResponse->addAssign("systemMsgs", "innerHTML", "The specified meal item doesn't exist.");
+ }
+
+ return $objResponse;
+
+}
+
+ ##------------------------------------------------------------------##
+
+# removes all meal items from the current meal ($_SESSION['currentMeal'])
+function clearCurrentMeal() {
+
+ $objResponse = new xajaxResponse();
+
+ # unset the current meal session variable
+ if ( isset($_SESSION['currentMeal']) ) {
+ unset($_SESSION['currentMeal']);
+ }
+
+ # if it's still set here, then something went terribly wrong, otherwise
+ # clear the div and let the user know.
+ if ( isset($_SESSION['currentMeal']) ) {
+ $objResponse->addAssign("systemMsgs", "innerHTML", "There was an error. The current meal was not cleared.");
+ } else {
+ $objResponse->addAssign("divCurrentMeal", "innerHTML", "No items in meal.");
+ $objResponse->addAssign("systemMsgs", "innerHTML", "The current meal was successfully cleared.");
+ }
+
+ return $objResponse;
+
+}
+
+ ##------------------------------------------------------------------##
+
+# create form for editing a meal
+function loadMealToEdit($meal) {
+
+ global $config, $db;
+
+ $objResponse = new xajaxResponse();
+
+ $mealToEdit = "";
+
+ $sql = sprintf ("
+ SELECT userMeals.*, userMeals.id AS mealId, userMeals.description as mealDesc,
+ userMealItems.*, userMealItems.id as itemId, userMealItems.description as itemDesc
+ FROM userMeals LEFT JOIN userMealItems
+ ON userMeals.id = userMealItems.meal
+ WHERE userMeals.id = '%s' AND user = '%s'
+ ",
+ $meal,
+ $_SESSION['user']['id']
+ );
+ $db->Select($sql);
+
+ if ( $db->_rowCount == 0 ) {
+ $mealToEdit = "The selected saved meal doesn't exist. \n<= Select a meal to edit.";
+ $objResponse->addAssign("editMeal","innerHTML", $mealToEdit);
+ return $objResponse;
+ } else {
+ $mealItems = $db->_rows;
+ $mealDesc = htmlspecialchars($mealItems[0]['mealDesc'], ENT_QUOTES);
+ $mealToEdit .= <<
+ Meal name:
+
+
+
+HTML;
+ # here we grab and add all the possible predefined quantites
+ # so that the user can change the quantity from, for example,
+ # '1 large banana (7")' to '2 medium banana (5")' or something
+ # to that effect
+ foreach ( $mealItems as $key => $mealItem ) {
+ $sql = sprintf ("
+ SELECT seq AS weight, msre_desc
+ FROM weights
+ WHERE ndb_no = '%s'
+ ",
+ $mealItem['food']
+ );
+ $db->Select($sql);
+ $itemQuantities = $db->_rows;
+ $mealItems[$key]['quantities'] = $itemQuantities;
+
+ # we will use this array later, in the Modify action below
+ # to identify which meal items we need to update.
+ $itemIds[] = $mealItem['itemId'];
+
+ $mealItemDesc = htmlspecialchars($mealItem['itemDesc'], ENT_QUOTES);
+ $mealToEdit .= <<
+
\n";
+ }
+ $foodToEdit .= <<
+
+
+
+
+
+
+
+HTML;
+ }
+
+ $objResponse->addAssign("editFood","innerHTML", $foodToEdit);
+
+ return $objResponse;
+
+}
+
+ ##------------------------------------------------------------------##
+
+# removes an item from a saved meal
+function removeMealItem($mealItem) {
+
+ global $db;
+
+ $objResponse = new xajaxResponse();
+
+ $sql = sprintf ("
+ DELETE userMealItems.*
+ FROM userMealItems INNER JOIN userMeals
+ ON userMealItems.meal = userMeals.id
+ INNER JOIN users
+ ON userMeals.user = users.id
+ WHERE users.id = '%s' AND userMealItems.id = '%s'
+ ",
+ $_SESSION['user']['id'],
+ $mealItem
+ );
+ $db->Modify($sql);
+
+ if ( $db->_affectedRows == "1" ) {
+ $objResponse->addRemove("mealItem-$mealItem");
+ $objResponse->addAssign("systemMsgs", "innerHTML", "The meal item was successfully removed.");
+ return $objResponse;
+ } else {
+ $objResponse->addAssign("systemMsgs", "innerHTML", "There was an error. The meal item was not meal.");
+ return $objResponse;
+ }
+
+}
+ ##------------------------------------------------------------------##
+
+# removes an item from a diary
+function removeDiaryItem($diaryItem) {
+
+ global $db;
+
+ $objResponse = new xajaxResponse();
+
+ $sql = sprintf ("
+ DELETE userDiaryItems.*
+ FROM userDiaryItems INNER JOIN userDiaries
+ ON userDiaryItems.diary = userDiaries.id
+ WHERE userDiaries.user = '%s'
+ AND userDiaryItems.id = '%s'
+ ",
+ $_SESSION['user']['id'],
+ $diaryItem
+ );
+ $db->Modify($sql);
+
+ if ( $db->_affectedRows == "1" ) {
+ $objResponse->addRemove("itemRow-$diaryItem");
+ $objResponse->addAssign("systemMsgs", "innerHTML", "The diary item was successfully deleted.");
+ return $objResponse;
+ } else {
+ $objResponse->addAssign("systemMsgs", "innerHTML", "There was an error. The diary item was not deleted.");
+ return $objResponse;
+ }
+
+}
+
+ ##------------------------------------------------------------------##
+
+# checks to see if a username already exists in the db during the registration process
+function usernameExists($username) {
+
+ global $db;
+
+ $objResponse = new xajaxResponse();
+
+ $sql = sprintf ("
+ SELECT username FROM users
+ WHERE username = '%s'
+ ",
+ trim($username)
+ );
+ $db->Select($sql);
+ if ( $db->_rowCount > 0 ) {
+ $alert = "The login name you selected is already in use. Please select another.";
+ $objResponse->addAlert($alert);
+ $objResponse->addScript("xajax.$('formRegisterUser').username.focus();");
+ $objResponse->addScript("return false;");
+ } else {
+ $objResponse->addScript("xajax.$('formRegisterUser').submit();");
+ }
+
+ return $objResponse;
+
+}
+
+ ##------------------------------------------------------------------##
+
+# increment the "popularity" counter for the supplied ndb_no.
+# table will be: foodDesc, userFoods, or userMeals ... we use it to determine
+# which counter to increment. the name corresponds to the relevant table
+# so we can just plug it into the query directly
+
+function incrementPopularityCounter($id, $table) {
+
+ global $db;
+
+ # we keep track of which items a user has selected during a given
+ # session and we only allow a popularity counter to be incremented
+ # for a given item once per session. this isn't fool-proof, but it
+ # should help to stem someone repeatedly clicking on the same item
+ # in order to raise it's popularity artificially .. at least it will
+ # be more of a hassle for someone to do it.
+ if ( ! empty($_SESSION['popularity']) && in_array("$id{$table}", $_SESSION['popularity']) ) {
+ # this user has already selected this item during this session
+ # so don't increment the popularity counter
+ return false;
+ }
+
+ switch ( $table ) {
+ case "foodDescs":
+ $idField = "ndb_no";
+ break;
+ case "userFoods":
+ $idField = "id";
+ break;
+ case "userMeals":
+ $idField = "id";
+ break;
+ default:
+ # the table isn't valid
+ return false;
+ }
+
+ $sql = sprintf ("
+ UPDATE %s
+ SET popularity = (popularity + 1)
+ WHERE %s = '%s'
+ ",
+ $table,
+ $idField,
+ $id
+ );
+ $db->Modify($sql);
+
+ # add this food to the list so that this user can't trigger another
+ # popularity increment for this food during this session.
+ $_SESSION['popularity'][] = "$id{$table}";
+
+ return true;
+
+}
+
+ ##------------------------------------------------------------------##
+
+?>
diff --git a/lib/standard.lib.php b/lib/standard.lib.php
new file mode 100644
index 0000000..503052e
--- /dev/null
+++ b/lib/standard.lib.php
@@ -0,0 +1,112 @@
+SelectOne($paginationSql);
+ $totalRecords = $db->_row['rowCount'];
+ $totalPages = ceil($totalRecords / $config->_recordsPerPage);
+
+ # if the total records are less than what we show per page, then
+ # just skip everything else below
+ if ( $totalRecords <= $config->_recordsPerPage ) {
+ $fromRecord = ($pageOffset + 1);
+ $pageNav .= <<
+ Displaying: $fromRecord to $totalRecords of $totalRecords results.
+HTML;
+
+ return $pageNav;
+ }
+
+ # either append the proper page with & or ? depending
+ # on whether the submitted URI already has a query
+ # string or not
+ if ( preg_match("/\?.+/", $uri) ) {
+ $uri = "$uri&";
+ } else {
+ $uri = "$uri?";
+ }
+
+ # create the navigation menu
+ if ( $page > 1 ) {
+ $pagePrev = ($page - 1);
+ # if the previous page isn't also the first page, show a link for first page.
+ if ( $pagePrev != 1 ) {
+ $pageNav .= " [First] \n";
+ }
+ $pageNav .= " Prev\n";
+ }
+
+ for ( $idx = 1; $idx <= $totalPages; $idx++ ) {
+ if ( $idx == $page ) {
+ $pageNav .= " $idx \n";
+ } else {
+ $pageNav .= " $idx \n";
+ }
+ }
+
+ if ( ($totalRecords - ($config->_recordsPerPage * $page)) > 0 ) {
+ $pageNext = ($page + 1);
+ $pageNav .= " Next\n";
+ # if the previous page isn't also the first page, show a link for first page.
+ if ( $pageNext != $totalPages ) {
+ $pageNav .= " [Last] \n";
+ }
+ }
+
+ $fromRecord = ($pageOffset + 1);
+ if ( $page == $totalPages ) {
+ $toRecord = $totalRecords;
+ } else {
+ $toRecord = ($pageOffset + $config->_recordsPerPage);
+ }
+
+ $pageNav .= <<
+ Displaying: $fromRecord to $toRecord of $totalRecords results.
+HTML;
+
+ return $pageNav;
+
+}
+
+?>
diff --git a/lib/xajax_0.2.4/LICENSE.txt b/lib/xajax_0.2.4/LICENSE.txt
new file mode 100755
index 0000000..54905a6
--- /dev/null
+++ b/lib/xajax_0.2.4/LICENSE.txt
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, 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 library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+ 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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+ If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be 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.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+ 9. 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 Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+ 11. 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 Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. 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.
+
+
+ Copyright (C)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/lib/xajax_0.2.4/README.txt b/lib/xajax_0.2.4/README.txt
new file mode 100644
index 0000000..c14ad80
--- /dev/null
+++ b/lib/xajax_0.2.4/README.txt
@@ -0,0 +1,106 @@
+====================================================================
+ xajax PHP Class Library
+ The easiest way to develop asynchronous Ajax applications with PHP
+
+ Version 0.2.4 (stable release)
+ README Text File
+
+ ------------------------------------------------------
+ | Release Notes: |
+ | http://wiki.xajaxproject.org/0.2.4_Release_Notes |
+ | |
+ | Lead Developers: |
+ | Jared White (jared@intuitivefuture.com) |
+ | J. Max Wilson (jmaxwilson@users.sourceforge.net) |
+ | Eion Robb (eion@bigfoot.com) |
+ ------------------------------------------------------
+====================================================================
+
+ :: To find out what's changed since the 0.2.3 release of xajax, ::
+ :: view the Release Notes in the link above. ::
+
+1. Introduction
+
+xajax is a PHP library that you can include in your PHP scripts
+to provide an easy way for Web pages to call PHP functions or
+object methods using Ajax (Asynchronous Javascript And XML). Simply
+register one or more functions/methods with the xajax object that
+return a proper XML response using the supplied response class, add
+a statement in your HTML header to print the Javascript include,
+and run a request processor prior to outputting any HTML. Then add
+some simple Javascript function calls to your HTML, and xajax takes
+care of the rest!
+
+xajax includes a Javascript object to facilitate the communication
+between the browser and the server, and it can also be used as a
+Javascript library directly to simplify certain DOM and event
+manipulations. However, you can definitely choose to use a
+dedicated Javascript "engine" of your liking and integrate it with
+xajax's client/server communication features in a number of ways.
+More tightly-coupled integration will be forthcoming in a future
+version of xajax.
+
+2. For More Information
+
+The official xajax Web site is located at:
+http://www.xajaxproject.org
+
+Visit the xajax Forums at:
+http://community.xajaxproject.org
+to keep track of the latest news and participate in the community
+discussion.
+
+There is also a wiki with documentation, tips & tricks, and other
+information located at:
+http://wiki.xajaxproject.org
+
+3. Installation
+
+To run xajax, you need:
+* Apache Web Server or IIS for Windows XP/2003 Server
+ (other servers may or may not work and are not supported at this
+ time)
+* PHP 4.3.x or PHP 5.x
+* Minimum supported browsers: Internet Explorer 5.5, Firefox 1.0 (or
+ equivalent Gecko-based browser), Safari 1.3, Opera 8.5 (older
+ versions only work with GET requests)
+
+To install xajax:
+Unpack the contents of this archive and copy them to your main Web
+site folder. Or if you wish, you can put all of the files in a
+dedicated "xajax" folder on your Web server (make sure that you
+know what that URL is relative your site pages so you can provide
+xajax with the correct installed folder URL). Note that the
+
+"thewall" folder in the "examples" folder needs to be writable by
+
+the Web server for that example to function.
+
+Within the main xajax folder there are two folders: "examples"
+and "tests". You should be able to view these PHP pages from your
+Web browser and see xajax working in action. If you can view the
+pages but the AJAX calls are not working, there may be something
+wrong with your server setup or perhaps your browser is not
+supported or configured correctly. If worst comes to worst, post
+a message in our forums and someone may be able to help you.
+
+4. Documentation
+
+Detailed documentation for the xajax PHP classes is available on
+our wiki (URL listed above in section 2), and more is on the way
+(particularly in regards to the Javascript component of xajax).
+Another good way of learning xajax is to look at the code for the
+examples and tests. If you need any help, pop in the forums and
+ask for assistance (and the more specific your questions are,
+the better the answers will be).
+
+5. Contributing to xajax
+
+xajax is released under the LGPL open source license. If you wish
+to contribute to the project or suggest new features, introduce
+yourself on the forums or you can e-mail the lead developers at
+the addresses listed at the top of this README.
+
+6. Good luck and enjoy!
+
+====================================================================
diff --git a/lib/xajax_0.2.4/examples/helloworld.php b/lib/xajax_0.2.4/examples/helloworld.php
new file mode 100644
index 0000000..5b422ba
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/helloworld.php
@@ -0,0 +1,65 @@
+addAssign("div1","innerHTML",$text);
+
+ return $objResponse;
+}
+
+function setColor($sColor)
+{
+ $objResponse = new xajaxResponse();
+ $objResponse->addAssign("div1","style.color", $sColor);
+
+ return $objResponse;
+}
+
+// Instantiate the xajax object. No parameters defaults requestURI to this page, method to POST, and debug to off
+$xajax = new xajax();
+
+//$xajax->debugOn(); // Uncomment this line to turn debugging on
+
+// Specify the PHP functions to wrap. The JavaScript wrappers will be named xajax_functionname
+$xajax->registerFunction("helloWorld");
+$xajax->registerFunction("setColor");
+
+// Process any requests. Because our requestURI is the same as our html page,
+// this must be called before any headers or HTML output have been sent
+$xajax->processRequests();
+?>
+
+
+
+ xajax example
+ printJavascript('../'); // output the xajax javascript. This must be called between the head tags ?>
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/examples/multiply/multiply.common.php b/lib/xajax_0.2.4/examples/multiply/multiply.common.php
new file mode 100644
index 0000000..59b6209
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/multiply/multiply.common.php
@@ -0,0 +1,11 @@
+registerFunction("multiply");
+?>
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/examples/multiply/multiply.php b/lib/xajax_0.2.4/examples/multiply/multiply.php
new file mode 100644
index 0000000..f38b979
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/multiply/multiply.php
@@ -0,0 +1,22 @@
+
+
+
+
+ xajax Multiplier
+ printJavascript('../../'); ?>
+
+
+ *
+ =
+
+
+
+
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/examples/multiply/multiply.server.php b/lib/xajax_0.2.4/examples/multiply/multiply.server.php
new file mode 100644
index 0000000..0934cce
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/multiply/multiply.server.php
@@ -0,0 +1,16 @@
+addAssign("z", "value", $x*$y);
+ return $objResponse;
+}
+
+require("multiply.common.php");
+$xajax->processRequests();
+?>
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/examples/signup/signup.common.php b/lib/xajax_0.2.4/examples/signup/signup.common.php
new file mode 100644
index 0000000..b6cc340
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/signup/signup.common.php
@@ -0,0 +1,13 @@
+registerFunction("processForm");
+?>
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/examples/signup/signup.php b/lib/xajax_0.2.4/examples/signup/signup.php
new file mode 100644
index 0000000..3c9674e
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/signup/signup.php
@@ -0,0 +1,60 @@
+
+
+
+
+ printJavascript('../../'); ?>
+
+
+
+
+
+
+
Create a New Account
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/examples/signup/signup.server.php b/lib/xajax_0.2.4/examples/signup/signup.server.php
new file mode 100644
index 0000000..4eda094
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/signup/signup.server.php
@@ -0,0 +1,111 @@
+addAlert("Please enter a username.");
+ $bError = true;
+ }
+ if (trim($aFormValues['newPass1']) == "")
+ {
+ $objResponse->addAlert("You may not have a blank password.");
+ $bError = true;
+ }
+ if ($aFormValues['newPass1'] != $aFormValues['newPass2'])
+ {
+ $objResponse->addAlert("Passwords do not match. Try again.");
+ $bError = true;
+ }
+
+ if (!$bError)
+ {
+ $_SESSION = array();
+ $_SESSION['newaccount']['username'] = trim($aFormValues['username']);
+ $_SESSION['newaccount']['password'] = trim($aFormValues['newPass1']);
+
+ $sForm = "";
+ $objResponse->addAssign("formDiv","innerHTML",$sForm);
+ $objResponse->addAssign("formWrapper","style.backgroundColor", "rgb(67,149,97)");
+ $objResponse->addAssign("outputDiv","innerHTML","\$_SESSION:
".var_export($_SESSION,true)."
");
+ }
+ else
+ {
+ $objResponse->addAssign("submitButton","value","continue ->");
+ $objResponse->addAssign("submitButton","disabled",false);
+ }
+
+ return $objResponse;
+}
+
+function processPersonalData($aFormValues)
+{
+ $objResponse = new xajaxResponse();
+
+ $bError = false;
+ if (trim($aFormValues['firstName']) == "")
+ {
+ $objResponse->addAlert("Please enter your first name.");
+ $bError = true;
+ }
+ if (trim($aFormValues['lastName']) == "")
+ {
+ $objResponse->addAlert("Please enter your last name.");
+ $bError = true;
+ }
+ if (!eregi("^[a-zA-Z0-9]+[_a-zA-Z0-9-]*(\.[_a-z0-9-]+)*@[a-z??????0-9]+(-[a-z??????0-9]+)*(\.[a-z??????0-9-]+)*(\.[a-z]{2,4})$", $aFormValues['email']))
+ {
+ $objResponse->addAlert("Please enter a valid email address.");
+ $bError = true;
+ }
+
+ if (!$bError)
+ {
+ $_SESSION['newaccount']['firstname'] = $aFormValues['firstName'];
+ $_SESSION['newaccount']['lastname'] = $aFormValues['lastName'];
+ $_SESSION['newaccount']['email'] = $aFormValues['email'];
+
+ $objResponse->addAssign("formDiv","style.textAlign","center");
+ $sForm = "Account created. Thank you.";
+ $objResponse->addAssign("formDiv","innerHTML",$sForm);
+ $objResponse->addAssign("formWrapper","style.backgroundColor", "rgb(67,97,149)");
+ $objResponse->addAssign("outputDiv","innerHTML","\$_SESSION:
".var_export($_SESSION,true)."
");
+ }
+ else
+ {
+ $objResponse->addAssign("submitButton","value","done");
+ $objResponse->addAssign("submitButton","disabled",false);
+ }
+
+ return $objResponse;
+}
+
+$xajax->processRequests();
+?>
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/examples/thewall/brick.jpg b/lib/xajax_0.2.4/examples/thewall/brick.jpg
new file mode 100644
index 0000000..6cb2509
Binary files /dev/null and b/lib/xajax_0.2.4/examples/thewall/brick.jpg differ
diff --git a/lib/xajax_0.2.4/examples/thewall/thewall.common.php b/lib/xajax_0.2.4/examples/thewall/thewall.common.php
new file mode 100644
index 0000000..0704206
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/thewall/thewall.common.php
@@ -0,0 +1,12 @@
+registerFunction("scribble");
+$xajax->registerFunction("updateWall");
+?>
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/examples/thewall/thewall.php b/lib/xajax_0.2.4/examples/thewall/thewall.php
new file mode 100644
index 0000000..3516013
--- /dev/null
+++ b/lib/xajax_0.2.4/examples/thewall/thewall.php
@@ -0,0 +1,70 @@
+
+
+
+
+ The Graffiti Wall
+ printJavascript('../../'); ?>
+
+
+
+
+
+
To see xajax's UTF-8 support, try posting words in other languages. You can copy and paste from here
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/tests/confirmTest.php b/lib/xajax_0.2.4/tests/confirmTest.php
new file mode 100644
index 0000000..c61637f
--- /dev/null
+++ b/lib/xajax_0.2.4/tests/confirmTest.php
@@ -0,0 +1,37 @@
+addAlert("Here is an alert.");
+ $objResponse->addConfirmCommands(2, "Are you sure you want to show two (2) more alerts?");
+ $objResponse->addAlert("This will only happen if the user presses OK.");
+ $objResponse->addAlert("This also will only happen if the user presses OK.");
+ $objResponse->addAlert("This will always happen.");
+ return $objResponse->getXML();
+}
+
+$xajax = new xajax();
+//$xajax->debugOn();
+$xajax->registerFunction("confirmTest");
+$xajax->processRequests();
+?>
+
+
+
+Confirm Commands Test | xajax Tests
+printJavascript("../") ?>
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/tests/myExternalFunction.js b/lib/xajax_0.2.4/tests/myExternalFunction.js
new file mode 100644
index 0000000..b35b810
--- /dev/null
+++ b/lib/xajax_0.2.4/tests/myExternalFunction.js
@@ -0,0 +1,4 @@
+function myFunction()
+{
+ alert('Congratulations!\n You have successfully included the\n myExternalFunction.js without reloading the page.');
+}
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/tests/myExternalFunction.php b/lib/xajax_0.2.4/tests/myExternalFunction.php
new file mode 100644
index 0000000..6d465e2
--- /dev/null
+++ b/lib/xajax_0.2.4/tests/myExternalFunction.php
@@ -0,0 +1,20 @@
+addAlert('External function successfully included and executed');
+ return $objResponse;
+}
+
+class myExternalClass
+{
+ function myMethod() // static (can't hardwire that in because of PHP 4)
+ {
+ $objResponse = new xajaxResponse();
+ $objResponse->addAlert('External class successfully included and method executed');
+ return $objResponse;
+ }
+}
+?>
+
This is some content that should be ignored by an asynchronous request
+ through xajax, but will show up if the file is otherwise included into the script.
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/tests/phpWhitespaceTest.php b/lib/xajax_0.2.4/tests/phpWhitespaceTest.php
new file mode 100644
index 0000000..75bb9c5
--- /dev/null
+++ b/lib/xajax_0.2.4/tests/phpWhitespaceTest.php
@@ -0,0 +1,39 @@
+
+
+
+addAlert("Hello");
+ return $objResponse;
+}
+$xajax = new xajax();
+//$xajax->debugOn();
+$xajax->registerFunction("showOutput");
+$xajax->processRequests();
+?>
+
+
+
+PHP Whitespace Test | xajax Tests
+printJavascript("../") ?>
+
+
+
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi fermentum.
+Phasellus non nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
+Nulla id ligula sit amet purus tristique dictum. Fusce at arcu. Maecenas ipsum leo, tincidunt eu, vehicula id,
+elementum feugiat, enim. Nam fringilla mi ac ligula. Quisque tempus,
+lacus ut molestie dignissim, massa ipsum sodales arcu, eget rhoncus sapien diam at velit.
+Morbi fermentum, dui vel tempus vestibulum, diam metus nonummy ligula, ac ultrices lacus est ac sapien.
+Pellentesque luctus dictum massa. Cras ullamcorper ullamcorper massa. Etiam erat odio, gravida eget, ornare vitae,
+dapibus nec, nunc. Phasellus ligula arcu, rutrum at, pellentesque et, varius feugiat, velit.
+Etiam erat magna, eleifend vel, vulputate eget, dignissim non, lectus. Nam at metus. Aenean mollis ligula viverra ipsum.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/tests/xajaxResponseTest.php b/lib/xajax_0.2.4/tests/xajaxResponseTest.php
new file mode 100644
index 0000000..7952000
--- /dev/null
+++ b/lib/xajax_0.2.4/tests/xajaxResponseTest.php
@@ -0,0 +1,44 @@
+addAlert("Hello");
+// $testResponseOutput = htmlspecialchars($testResponse->getXML());
+
+ $testResponse2 = new xajaxResponse();
+ $testResponse2->loadXML($testResponse->getXML());
+ $testResponse2->addReplace("this", "is", "a", "replacement");
+ $testResponseOutput = htmlspecialchars($testResponse2->getXML());
+
+ $objResponse = new xajaxResponse();
+ $objResponse->addAssign("submittedDiv", "innerHTML", $testResponseOutput);
+ return $objResponse;
+}
+$xajax = new xajax();
+//$xajax->debugOn();
+$xajax->registerFunction("showOutput");
+$xajax->processRequests();
+$xajax->autoCompressJavascript("../xajax_js/xajax.js");
+?>
+
+
+
+xajaxResponse Test | xajax Tests
+printJavascript("../") ?>
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/xajax.inc.php b/lib/xajax_0.2.4/xajax.inc.php
new file mode 100644
index 0000000..602a049
--- /dev/null
+++ b/lib/xajax_0.2.4/xajax.inc.php
@@ -0,0 +1,1239 @@
+aFunctions = array();
+ $this->aObjects = array();
+ $this->aFunctionIncludeFiles = array();
+ $this->sRequestURI = $sRequestURI;
+ if ($this->sRequestURI == "")
+ $this->sRequestURI = $this->_detectURI();
+ $this->sWrapperPrefix = $sWrapperPrefix;
+ $this->bDebug = $bDebug;
+ $this->bStatusMessages = false;
+ $this->bWaitCursor = true;
+ $this->bExitAllowed = true;
+ $this->bErrorHandler = false;
+ $this->sLogFile = "";
+ $this->bCleanBuffer = false;
+ $this->setCharEncoding($sEncoding);
+ $this->bDecodeUTF8Input = false;
+ $this->bOutputEntities = false;
+ }
+
+ /**
+ * Sets the URI to which requests will be made.
+ * Usage:$xajax->setRequestURI("http://www.xajaxproject.org");
+ *
+ * @param string the URI (can be absolute or relative) of the PHP script
+ * that will be accessed when an xajax request occurs
+ */
+ function setRequestURI($sRequestURI)
+ {
+ $this->sRequestURI = $sRequestURI;
+ }
+
+ /**
+ * Sets the prefix that will be appended to the Javascript wrapper
+ * functions (default is "xajax_").
+ *
+ * @param string
+ */
+ //
+ function setWrapperPrefix($sPrefix)
+ {
+ $this->sWrapperPrefix = $sPrefix;
+ }
+
+ /**
+ * Enables debug messages for xajax.
+ * */
+ function debugOn()
+ {
+ $this->bDebug = true;
+ }
+
+ /**
+ * Disables debug messages for xajax (default behavior).
+ */
+ function debugOff()
+ {
+ $this->bDebug = false;
+ }
+
+ /**
+ * Enables messages in the browser's status bar for xajax.
+ */
+ function statusMessagesOn()
+ {
+ $this->bStatusMessages = true;
+ }
+
+ /**
+ * Disables messages in the browser's status bar for xajax (default behavior).
+ */
+ function statusMessagesOff()
+ {
+ $this->bStatusMessages = false;
+ }
+
+ /**
+ * Enables the wait cursor to be displayed in the browser (default behavior).
+ */
+ function waitCursorOn()
+ {
+ $this->bWaitCursor = true;
+ }
+
+ /**
+ * Disables the wait cursor to be displayed in the browser.
+ */
+ function waitCursorOff()
+ {
+ $this->bWaitCursor = false;
+ }
+
+ /**
+ * Enables xajax to exit immediately after processing a request and
+ * sending the response back to the browser (default behavior).
+ */
+ function exitAllowedOn()
+ {
+ $this->bExitAllowed = true;
+ }
+
+ /**
+ * Disables xajax's default behavior of exiting immediately after
+ * processing a request and sending the response back to the browser.
+ */
+ function exitAllowedOff()
+ {
+ $this->bExitAllowed = false;
+ }
+
+ /**
+ * Turns on xajax's error handling system so that PHP errors that occur
+ * during a request are trapped and pushed to the browser in the form of
+ * a Javascript alert.
+ */
+ function errorHandlerOn()
+ {
+ $this->bErrorHandler = true;
+ }
+
+ /**
+ * Turns off xajax's error handling system (default behavior).
+ */
+ function errorHandlerOff()
+ {
+ $this->bErrorHandler = false;
+ }
+
+ /**
+ * Specifies a log file that will be written to by xajax during a request
+ * (used only by the error handling system at present). If you don't invoke
+ * this method, or you pass in "", then no log file will be written to.
+ * Usage:$xajax->setLogFile("/xajax_logs/errors.log");
+ */
+ function setLogFile($sFilename)
+ {
+ $this->sLogFile = $sFilename;
+ }
+
+ /**
+ * Causes xajax to clean out all output buffers before outputting a
+ * response (default behavior).
+ */
+ function cleanBufferOn()
+ {
+ $this->bCleanBuffer = true;
+ }
+ /**
+ * Turns off xajax's output buffer cleaning.
+ */
+ function cleanBufferOff()
+ {
+ $this->bCleanBuffer = false;
+ }
+
+ /**
+ * Sets the character encoding for the HTTP output based on
+ * $sEncoding, which is a string containing the character
+ * encoding to use. You don't need to use this method normally, since the
+ * character encoding for the response gets set automatically based on the
+ * XAJAX_DEFAULT_CHAR_ENCODING constant.
+ * Usage:$xajax->setCharEncoding("utf-8");
+ *
+ * @param string the encoding type to use (utf-8, iso-8859-1, etc.)
+ */
+ function setCharEncoding($sEncoding)
+ {
+ $this->sEncoding = $sEncoding;
+ }
+
+ /**
+ * Causes xajax to decode the input request args from UTF-8 to the current
+ * encoding if possible. Either the iconv or mb_string extension must be
+ * present for optimal functionality.
+ */
+ function decodeUTF8InputOn()
+ {
+ $this->bDecodeUTF8Input = true;
+ }
+
+ /**
+ * Turns off decoding the input request args from UTF-8 (default behavior).
+ */
+ function decodeUTF8InputOff()
+ {
+ $this->bDecodeUTF8Input = false;
+ }
+
+ /**
+ * Tells the response object to convert special characters to HTML entities
+ * automatically (only works if the mb_string extension is available).
+ */
+ function outputEntitiesOn()
+ {
+ $this->bOutputEntities = true;
+ }
+
+ /**
+ * Tells the response object to output special characters intact. (default
+ * behavior).
+ */
+ function outputEntitiesOff()
+ {
+ $this->bOutputEntities = false;
+ }
+
+ /**
+ * Registers a PHP function or method to be callable through xajax in your
+ * Javascript. If you want to register a function, pass in the name of that
+ * function. If you want to register a static class method, pass in an
+ * array like so:
+ * array("myFunctionName", "myClass", "myMethod")
+ * For an object instance method, use an object variable for the second
+ * array element (and in PHP 4 make sure you put an & before the variable
+ * to pass the object by reference). Note: the function name is what you
+ * call via Javascript, so it can be anything as long as it doesn't
+ * conflict with any other registered function name.
+ *
+ * Usage:$xajax->registerFunction("myFunction");
+ * or: $xajax->registerFunction(array("myFunctionName", &$myObject, "myMethod"));
+ *
+ * @param mixed contains the function name or an object callback array
+ * @param mixed request type (XAJAX_GET/XAJAX_POST) that should be used
+ * for this function. Defaults to XAJAX_POST.
+ */
+ function registerFunction($mFunction,$sRequestType=XAJAX_POST)
+ {
+ if (is_array($mFunction)) {
+ $this->aFunctions[$mFunction[0]] = 1;
+ $this->aFunctionRequestTypes[$mFunction[0]] = $sRequestType;
+ $this->aObjects[$mFunction[0]] = array_slice($mFunction, 1);
+ }
+ else {
+ $this->aFunctions[$mFunction] = 1;
+ $this->aFunctionRequestTypes[$mFunction] = $sRequestType;
+ }
+ }
+
+ /**
+ * Registers a PHP function to be callable through xajax which is located
+ * in some other file. If the function is requested the external file will
+ * be included to define the function before the function is called.
+ *
+ * Usage:$xajax->registerExternalFunction("myFunction","myFunction.inc.php",XAJAX_POST);
+ *
+ * @param string contains the function name or an object callback array
+ * ({@link xajax::registerFunction() see registerFunction} for
+ * more info on object callback arrays)
+ * @param string contains the path and filename of the include file
+ * @param mixed the RequestType (XAJAX_GET/XAJAX_POST) that should be used
+ * for this function. Defaults to XAJAX_POST.
+ */
+ function registerExternalFunction($mFunction,$sIncludeFile,$sRequestType=XAJAX_POST)
+ {
+ $this->registerFunction($mFunction, $sRequestType);
+
+ if (is_array($mFunction)) {
+ $this->aFunctionIncludeFiles[$mFunction[0]] = $sIncludeFile;
+ }
+ else {
+ $this->aFunctionIncludeFiles[$mFunction] = $sIncludeFile;
+ }
+ }
+
+ /**
+ * Registers a PHP function to be called when xajax cannot find the
+ * function being called via Javascript. Because this is technically
+ * impossible when using "wrapped" functions, the catch-all feature is
+ * only useful when you're directly using the xajax.call() Javascript
+ * method. Use the catch-all feature when you want more dynamic ability to
+ * intercept unknown calls and handle them in a custom way.
+ *
+ * Usage:$xajax->registerCatchAllFunction("myCatchAllFunction");
+ *
+ * @param string contains the function name or an object callback array
+ * ({@link xajax::registerFunction() see registerFunction} for
+ * more info on object callback arrays)
+ */
+ function registerCatchAllFunction($mFunction)
+ {
+ if (is_array($mFunction)) {
+ $this->sCatchAllFunction = $mFunction[0];
+ $this->aObjects[$mFunction[0]] = array_slice($mFunction, 1);
+ }
+ else {
+ $this->sCatchAllFunction = $mFunction;
+ }
+ }
+
+ /**
+ * Registers a PHP function to be called before xajax calls the requested
+ * function. xajax will automatically add the request function's response
+ * to the pre-function's response to create a single response. Another
+ * feature is the ability to return not just a response, but an array with
+ * the first element being false (a boolean) and the second being the
+ * response. In this case, the pre-function's response will be returned to
+ * the browser without xajax calling the requested function.
+ *
+ * Usage:$xajax->registerPreFunction("myPreFunction");
+ *
+ * @param string contains the function name or an object callback array
+ * ({@link xajax::registerFunction() see registerFunction} for
+ * more info on object callback arrays)
+ */
+ function registerPreFunction($mFunction)
+ {
+ if (is_array($mFunction)) {
+ $this->sPreFunction = $mFunction[0];
+ $this->aObjects[$mFunction[0]] = array_slice($mFunction, 1);
+ }
+ else {
+ $this->sPreFunction = $mFunction;
+ }
+ }
+
+ /**
+ * Returns true if xajax can process the request, false if otherwise.
+ * You can use this to determine if xajax needs to process the request or
+ * not.
+ *
+ * @return boolean
+ */
+ function canProcessRequests()
+ {
+ if ($this->getRequestMode() != -1) return true;
+ return false;
+ }
+
+ /**
+ * Returns the current request mode (XAJAX_GET or XAJAX_POST), or -1 if
+ * there is none.
+ *
+ * @return mixed
+ */
+ function getRequestMode()
+ {
+ if (!empty($_GET["xajax"]))
+ return XAJAX_GET;
+
+ if (!empty($_POST["xajax"]))
+ return XAJAX_POST;
+
+ return -1;
+ }
+
+ /**
+ * This is the main communications engine of xajax. The engine handles all
+ * incoming xajax requests, calls the apporiate PHP functions (or
+ * class/object methods) and passes the XML responses back to the
+ * Javascript response handler. If your RequestURI is the same as your Web
+ * page then this function should be called before any headers or HTML has
+ * been sent.
+ */
+ function processRequests()
+ {
+
+ $requestMode = -1;
+ $sFunctionName = "";
+ $bFoundFunction = true;
+ $bFunctionIsCatchAll = false;
+ $sFunctionNameForSpecial = "";
+ $aArgs = array();
+ $sPreResponse = "";
+ $bEndRequest = false;
+ $sResponse = "";
+
+ $requestMode = $this->getRequestMode();
+ if ($requestMode == -1) return;
+
+ if ($requestMode == XAJAX_POST)
+ {
+ $sFunctionName = $_POST["xajax"];
+
+ if (!empty($_POST["xajaxargs"]))
+ $aArgs = $_POST["xajaxargs"];
+ }
+ else
+ {
+ header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ header ("Cache-Control: no-cache, must-revalidate");
+ header ("Pragma: no-cache");
+
+ $sFunctionName = $_GET["xajax"];
+
+ if (!empty($_GET["xajaxargs"]))
+ $aArgs = $_GET["xajaxargs"];
+ }
+
+ // Use xajax error handler if necessary
+ if ($this->bErrorHandler) {
+ $GLOBALS['xajaxErrorHandlerText'] = "";
+ set_error_handler("xajaxErrorHandler");
+ }
+
+ if ($this->sPreFunction) {
+ if (!$this->_isFunctionCallable($this->sPreFunction)) {
+ $bFoundFunction = false;
+ $objResponse = new xajaxResponse();
+ $objResponse->addAlert("Unknown Pre-Function ". $this->sPreFunction);
+ $sResponse = $objResponse->getXML();
+ }
+ }
+ //include any external dependencies associated with this function name
+ if (array_key_exists($sFunctionName,$this->aFunctionIncludeFiles))
+ {
+ ob_start();
+ include_once($this->aFunctionIncludeFiles[$sFunctionName]);
+ ob_end_clean();
+ }
+
+ if ($bFoundFunction) {
+ $sFunctionNameForSpecial = $sFunctionName;
+ if (!array_key_exists($sFunctionName, $this->aFunctions))
+ {
+ if ($this->sCatchAllFunction) {
+ $sFunctionName = $this->sCatchAllFunction;
+ $bFunctionIsCatchAll = true;
+ }
+ else {
+ $bFoundFunction = false;
+ $objResponse = new xajaxResponse();
+ $objResponse->addAlert("Unknown Function $sFunctionName.");
+ $sResponse = $objResponse->getXML();
+ }
+ }
+ else if ($this->aFunctionRequestTypes[$sFunctionName] != $requestMode)
+ {
+ $bFoundFunction = false;
+ $objResponse = new xajaxResponse();
+ $objResponse->addAlert("Incorrect Request Type.");
+ $sResponse = $objResponse->getXML();
+ }
+ }
+
+ if ($bFoundFunction)
+ {
+ for ($i = 0; $i < sizeof($aArgs); $i++)
+ {
+ // If magic quotes is on, then we need to strip the slashes from the args
+ if (get_magic_quotes_gpc() == 1 && is_string($aArgs[$i])) {
+
+ $aArgs[$i] = stripslashes($aArgs[$i]);
+ }
+ if (stristr($aArgs[$i],"") != false)
+ {
+ $aArgs[$i] = $this->_xmlToArray("xjxobj",$aArgs[$i]);
+ }
+ else if (stristr($aArgs[$i],"") != false)
+ {
+ $aArgs[$i] = $this->_xmlToArray("xjxquery",$aArgs[$i]);
+ }
+ else if ($this->bDecodeUTF8Input)
+ {
+ $aArgs[$i] = $this->_decodeUTF8Data($aArgs[$i]);
+ }
+ }
+
+ if ($this->sPreFunction) {
+ $mPreResponse = $this->_callFunction($this->sPreFunction, array($sFunctionNameForSpecial, $aArgs));
+ if (is_array($mPreResponse) && $mPreResponse[0] === false) {
+ $bEndRequest = true;
+ $sPreResponse = $mPreResponse[1];
+ }
+ else {
+ $sPreResponse = $mPreResponse;
+ }
+ if (is_a($sPreResponse, "xajaxResponse")) {
+ $sPreResponse = $sPreResponse->getXML();
+ }
+ if ($bEndRequest) $sResponse = $sPreResponse;
+ }
+
+ if (!$bEndRequest) {
+ if (!$this->_isFunctionCallable($sFunctionName)) {
+ $objResponse = new xajaxResponse();
+ $objResponse->addAlert("The Registered Function $sFunctionName Could Not Be Found.");
+ $sResponse = $objResponse->getXML();
+ }
+ else {
+ if ($bFunctionIsCatchAll) {
+ $aArgs = array($sFunctionNameForSpecial, $aArgs);
+ }
+ $sResponse = $this->_callFunction($sFunctionName, $aArgs);
+ }
+ if (is_a($sResponse, "xajaxResponse")) {
+ $sResponse = $sResponse->getXML();
+ }
+ if (!is_string($sResponse) || strpos($sResponse, "") === FALSE) {
+ $objResponse = new xajaxResponse();
+ $objResponse->addAlert("No XML Response Was Returned By Function $sFunctionName.");
+ $sResponse = $objResponse->getXML();
+ }
+ else if ($sPreResponse != "") {
+ $sNewResponse = new xajaxResponse($this->sEncoding, $this->bOutputEntities);
+ $sNewResponse->loadXML($sPreResponse);
+ $sNewResponse->loadXML($sResponse);
+ $sResponse = $sNewResponse->getXML();
+ }
+ }
+ }
+
+ $sContentHeader = "Content-type: text/xml;";
+ if ($this->sEncoding && strlen(trim($this->sEncoding)) > 0)
+ $sContentHeader .= " charset=".$this->sEncoding;
+ header($sContentHeader);
+ if ($this->bErrorHandler && !empty( $GLOBALS['xajaxErrorHandlerText'] )) {
+ $sErrorResponse = new xajaxResponse();
+ $sErrorResponse->addAlert("** PHP Error Messages: **" . $GLOBALS['xajaxErrorHandlerText']);
+ if ($this->sLogFile) {
+ $fH = @fopen($this->sLogFile, "a");
+ if (!$fH) {
+ $sErrorResponse->addAlert("** Logging Error **\n\nxajax was unable to write to the error log file:\n" . $this->sLogFile);
+ }
+ else {
+ fwrite($fH, "** xajax Error Log - " . strftime("%b %e %Y %I:%M:%S %p") . " **" . $GLOBALS['xajaxErrorHandlerText'] . "\n\n\n");
+ fclose($fH);
+ }
+ }
+
+ $sErrorResponse->loadXML($sResponse);
+ $sResponse = $sErrorResponse->getXML();
+
+ }
+ if ($this->bCleanBuffer) while (@ob_end_clean());
+ print $sResponse;
+ if ($this->bErrorHandler) restore_error_handler();
+
+ if ($this->bExitAllowed)
+ exit();
+ }
+
+ /**
+ * Prints the xajax Javascript header and wrapper code into your page by
+ * printing the output of the getJavascript() method. It should only be
+ * called between the
tags in your HTML page.
+ * Remember, if you only want to obtain the result of this function, use
+ * {@link xajax::getJavascript()} instead.
+ *
+ * Usage:
+ *
+ *
+ * ...
+ * < ?php $xajax->printJavascript(); ? >
+ *
+ *
+ * @param string the relative address of the folder where xajax has been
+ * installed. For instance, if your PHP file is
+ * "http://www.myserver.com/myfolder/mypage.php"
+ * and xajax was installed in
+ * "http://www.myserver.com/anotherfolder", then $sJsURI
+ * should be set to "../anotherfolder". Defaults to assuming
+ * xajax is in the same folder as your PHP file.
+ * @param string the relative folder/file pair of the xajax Javascript
+ * engine located within the xajax installation folder.
+ * Defaults to xajax_js/xajax.js.
+ */
+ function printJavascript($sJsURI="", $sJsFile=NULL)
+ {
+ print $this->getJavascript($sJsURI, $sJsFile);
+ }
+
+ /**
+ * Returns the xajax Javascript code that should be added to your HTML page
+ * between the tags.
+ *
+ * Usage:
+ *
+ * < ?php $xajaxJSHead = $xajax->getJavascript(); ? >
+ *
+ * ...
+ * < ?php echo $xajaxJSHead; ? >
+ *
+ *
+ * @param string the relative address of the folder where xajax has been
+ * installed. For instance, if your PHP file is
+ * "http://www.myserver.com/myfolder/mypage.php"
+ * and xajax was installed in
+ * "http://www.myserver.com/anotherfolder", then $sJsURI
+ * should be set to "../anotherfolder". Defaults to assuming
+ * xajax is in the same folder as your PHP file.
+ * @param string the relative folder/file pair of the xajax Javascript
+ * engine located within the xajax installation folder.
+ * Defaults to xajax_js/xajax.js.
+ * @return string
+ */
+ function getJavascript($sJsURI="", $sJsFile=NULL)
+ {
+ $html = $this->getJavascriptConfig();
+ $html .= $this->getJavascriptInclude($sJsURI, $sJsFile);
+
+ return $html;
+ }
+
+ /**
+ * Returns a string containing inline Javascript that sets up the xajax
+ * runtime (typically called internally by xajax from get/printJavascript).
+ *
+ * @return string
+ */
+ function getJavascriptConfig()
+ {
+ $html = "\t\n";
+ return $html;
+ }
+
+ /**
+ * Returns a string containing a Javascript include of the xajax.js file
+ * along with a check to see if the file loaded after six seconds
+ * (typically called internally by xajax from get/printJavascript).
+ *
+ * @param string the relative address of the folder where xajax has been
+ * installed. For instance, if your PHP file is
+ * "http://www.myserver.com/myfolder/mypage.php"
+ * and xajax was installed in
+ * "http://www.myserver.com/anotherfolder", then $sJsURI
+ * should be set to "../anotherfolder". Defaults to assuming
+ * xajax is in the same folder as your PHP file.
+ * @param string the relative folder/file pair of the xajax Javascript
+ * engine located within the xajax installation folder.
+ * Defaults to xajax_js/xajax.js.
+ * @return string
+ */
+ function getJavascriptInclude($sJsURI="", $sJsFile=NULL)
+ {
+ if ($sJsFile == NULL) $sJsFile = "xajax_js/xajax.js";
+
+ if ($sJsURI != "" && substr($sJsURI, -1) != "/") $sJsURI .= "/";
+
+ $html = "\t\n";
+ $html .= "\t\n";
+ return $html;
+ }
+
+ /**
+ * This method can be used to create a new xajax.js file out of the
+ * xajax_uncompressed.js file (which will only happen if xajax.js doesn't
+ * already exist on the filesystem).
+ *
+ * @param string an optional argument containing the full server file path
+ * of xajax.js.
+ */
+ function autoCompressJavascript($sJsFullFilename=NULL)
+ {
+ $sJsFile = "xajax_js/xajax.js";
+
+ if ($sJsFullFilename) {
+ $realJsFile = $sJsFullFilename;
+ }
+ else {
+ $realPath = realpath(dirname(__FILE__));
+ $realJsFile = $realPath . "/". $sJsFile;
+ }
+
+ // Create a compressed file if necessary
+ if (!file_exists($realJsFile)) {
+ $srcFile = str_replace(".js", "_uncompressed.js", $realJsFile);
+ if (!file_exists($srcFile)) {
+ trigger_error("The xajax uncompressed Javascript file could not be found in the " . dirname($realJsFile) . " folder. Error ", E_USER_ERROR);
+ }
+ require(dirname(__FILE__)."/xajaxCompress.php");
+ $javaScript = implode('', file($srcFile));
+ $compressedScript = xajaxCompressJavascript($javaScript);
+ $fH = @fopen($realJsFile, "w");
+ if (!$fH) {
+ trigger_error("The xajax compressed javascript file could not be written in the " . dirname($realJsFile) . " folder. Error ", E_USER_ERROR);
+ }
+ else {
+ fwrite($fH, $compressedScript);
+ fclose($fH);
+ }
+ }
+ }
+
+ /**
+ * Returns the current URL based upon the SERVER vars.
+ *
+ * @access private
+ * @return string
+ */
+ function _detectURI() {
+ $aURL = array();
+
+ // Try to get the request URL
+ if (!empty($_SERVER['REQUEST_URI'])) {
+ $aURL = parse_url($_SERVER['REQUEST_URI']);
+ }
+
+ // Fill in the empty values
+ if (empty($aURL['scheme'])) {
+ if (!empty($_SERVER['HTTP_SCHEME'])) {
+ $aURL['scheme'] = $_SERVER['HTTP_SCHEME'];
+ } else {
+ $aURL['scheme'] = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http';
+ }
+ }
+
+ if (empty($aURL['host'])) {
+ if (!empty($_SERVER['HTTP_HOST'])) {
+ if (strpos($_SERVER['HTTP_HOST'], ':') > 0) {
+ list($aURL['host'], $aURL['port']) = explode(':', $_SERVER['HTTP_HOST']);
+ } else {
+ $aURL['host'] = $_SERVER['HTTP_HOST'];
+ }
+ } else if (!empty($_SERVER['SERVER_NAME'])) {
+ $aURL['host'] = $_SERVER['SERVER_NAME'];
+ } else {
+ print "xajax Error: xajax failed to automatically identify your Request URI.";
+ print "Please set the Request URI explicitly when you instantiate the xajax object.";
+ exit();
+ }
+ }
+
+ if (empty($aURL['port']) && !empty($_SERVER['SERVER_PORT'])) {
+ $aURL['port'] = $_SERVER['SERVER_PORT'];
+ }
+
+ if (empty($aURL['path'])) {
+ if (!empty($_SERVER['PATH_INFO'])) {
+ $sPath = parse_url($_SERVER['PATH_INFO']);
+ } else {
+ $sPath = parse_url($_SERVER['PHP_SELF']);
+ }
+ $aURL['path'] = $sPath['path'];
+ unset($sPath);
+ }
+
+ if (!empty($aURL['query'])) {
+ $aURL['query'] = '?'.$aURL['query'];
+ }
+
+ // Build the URL: Start with scheme, user and pass
+ $sURL = $aURL['scheme'].'://';
+ if (!empty($aURL['user'])) {
+ $sURL.= $aURL['user'];
+ if (!empty($aURL['pass'])) {
+ $sURL.= ':'.$aURL['pass'];
+ }
+ $sURL.= '@';
+ }
+
+ // Add the host
+ $sURL.= $aURL['host'];
+
+ // Add the port if needed
+ if (!empty($aURL['port']) && (($aURL['scheme'] == 'http' && $aURL['port'] != 80) || ($aURL['scheme'] == 'https' && $aURL['port'] != 443))) {
+ $sURL.= ':'.$aURL['port'];
+ }
+
+ // Add the path and the query string
+ $sURL.= $aURL['path'].@$aURL['query'];
+
+ // Clean up
+ unset($aURL);
+ return $sURL;
+ }
+
+ /**
+ * Returns true if the function name is associated with an object callback,
+ * false if not.
+ *
+ * @param string the name of the function
+ * @access private
+ * @return boolean
+ */
+ function _isObjectCallback($sFunction)
+ {
+ if (array_key_exists($sFunction, $this->aObjects)) return true;
+ return false;
+ }
+
+ /**
+ * Returns true if the function or object callback can be called, false if
+ * not.
+ *
+ * @param string the name of the function
+ * @access private
+ * @return boolean
+ */
+ function _isFunctionCallable($sFunction)
+ {
+ if ($this->_isObjectCallback($sFunction)) {
+ if (is_object($this->aObjects[$sFunction][0])) {
+ return method_exists($this->aObjects[$sFunction][0], $this->aObjects[$sFunction][1]);
+ }
+ else {
+ return is_callable($this->aObjects[$sFunction]);
+ }
+ }
+ else {
+ return function_exists($sFunction);
+ }
+ }
+
+ /**
+ * Calls the function, class method, or object method with the supplied
+ * arguments.
+ *
+ * @param string the name of the function
+ * @param array arguments to pass to the function
+ * @access private
+ * @return mixed the output of the called function or method
+ */
+ function _callFunction($sFunction, $aArgs)
+ {
+ if ($this->_isObjectCallback($sFunction)) {
+ $mReturn = call_user_func_array($this->aObjects[$sFunction], $aArgs);
+ }
+ else {
+ $mReturn = call_user_func_array($sFunction, $aArgs);
+ }
+ return $mReturn;
+ }
+
+ /**
+ * Generates the Javascript wrapper for the specified PHP function.
+ *
+ * @param string the name of the function
+ * @param mixed the request type
+ * @access private
+ * @return string
+ */
+ function _wrap($sFunction,$sRequestType=XAJAX_POST)
+ {
+ $js = "function ".$this->sWrapperPrefix."$sFunction(){return xajax.call(\"$sFunction\", arguments, ".$sRequestType.");}\n";
+ return $js;
+ }
+
+ /**
+ * Takes a string containing xajax xjxobj XML or xjxquery XML and builds an
+ * array representation of it to pass as an argument to the PHP function
+ * being called.
+ *
+ * @param string the root tag of the XML
+ * @param string XML to convert
+ * @access private
+ * @return array
+ */
+ function _xmlToArray($rootTag, $sXml)
+ {
+ $aArray = array();
+ $sXml = str_replace("<$rootTag>","<$rootTag>|~|",$sXml);
+ $sXml = str_replace("$rootTag>","$rootTag>|~|",$sXml);
+ $sXml = str_replace("","|~|",$sXml);
+ $sXml = str_replace("","|~|",$sXml);
+ $sXml = str_replace("","|~|",$sXml);
+ $sXml = str_replace("","|~||~|",$sXml);
+ $sXml = str_replace("","|~|",$sXml);
+ $sXml = str_replace("","|~||~|",$sXml);
+ $sXml = str_replace("","|~|",$sXml);
+ $sXml = str_replace("","|~||~|",$sXml);
+
+ $this->aObjArray = explode("|~|",$sXml);
+
+ $this->iPos = 0;
+ $aArray = $this->_parseObjXml($rootTag);
+
+ return $aArray;
+ }
+
+ /**
+ * A recursive function that generates an array from the contents of
+ * $this->aObjArray.
+ *
+ * @param string the root tag of the XML
+ * @access private
+ * @return array
+ */
+ function _parseObjXml($rootTag)
+ {
+ $aArray = array();
+
+ if ($rootTag == "xjxobj")
+ {
+ while(!stristr($this->aObjArray[$this->iPos],""))
+ {
+ $this->iPos++;
+ if(stristr($this->aObjArray[$this->iPos],""))
+ {
+ $key = "";
+ $value = null;
+
+ $this->iPos++;
+ while(!stristr($this->aObjArray[$this->iPos],""))
+ {
+ if(stristr($this->aObjArray[$this->iPos],""))
+ {
+ $this->iPos++;
+ while(!stristr($this->aObjArray[$this->iPos],""))
+ {
+ $key .= $this->aObjArray[$this->iPos];
+ $this->iPos++;
+ }
+ }
+ if(stristr($this->aObjArray[$this->iPos],""))
+ {
+ $this->iPos++;
+ while(!stristr($this->aObjArray[$this->iPos],""))
+ {
+ if(stristr($this->aObjArray[$this->iPos],""))
+ {
+ $value = $this->_parseObjXml("xjxobj");
+ $this->iPos++;
+ }
+ else
+ {
+ $value .= $this->aObjArray[$this->iPos];
+ if ($this->bDecodeUTF8Input)
+ {
+ $value = $this->_decodeUTF8Data($value);
+ }
+ }
+ $this->iPos++;
+ }
+ }
+ $this->iPos++;
+ }
+
+ $aArray[$key]=$value;
+ }
+ }
+ }
+
+ if ($rootTag == "xjxquery")
+ {
+ $sQuery = "";
+ $this->iPos++;
+ while(!stristr($this->aObjArray[$this->iPos],""))
+ {
+ if (stristr($this->aObjArray[$this->iPos],"") || stristr($this->aObjArray[$this->iPos],""))
+ {
+ $this->iPos++;
+ continue;
+ }
+ $sQuery .= $this->aObjArray[$this->iPos];
+ $this->iPos++;
+ }
+
+ parse_str($sQuery, $aArray);
+ if ($this->bDecodeUTF8Input)
+ {
+ foreach($aArray as $key => $value)
+ {
+ $aArray[$key] = $this->_decodeUTF8Data($value);
+ }
+ }
+ // If magic quotes is on, then we need to strip the slashes from the
+ // array values because of the parse_str pass which adds slashes
+ if (get_magic_quotes_gpc() == 1) {
+ $newArray = array();
+ foreach ($aArray as $sKey => $sValue) {
+ if (is_string($sValue))
+ $newArray[$sKey] = stripslashes($sValue);
+ else
+ $newArray[$sKey] = $sValue;
+ }
+ $aArray = $newArray;
+ }
+ }
+
+ return $aArray;
+ }
+
+ /**
+ * Decodes string data from UTF-8 to the current xajax encoding.
+ *
+ * @param string data to convert
+ * @access private
+ * @return string converted data
+ */
+ function _decodeUTF8Data($sData)
+ {
+ $sValue = $sData;
+ if ($this->bDecodeUTF8Input)
+ {
+ $sFuncToUse = NULL;
+
+ if (function_exists('iconv'))
+ {
+ $sFuncToUse = "iconv";
+ }
+ else if (function_exists('mb_convert_encoding'))
+ {
+ $sFuncToUse = "mb_convert_encoding";
+ }
+ else if ($this->sEncoding == "ISO-8859-1")
+ {
+ $sFuncToUse = "utf8_decode";
+ }
+ else
+ {
+ trigger_error("The incoming xajax data could not be converted from UTF-8", E_USER_NOTICE);
+ }
+
+ if ($sFuncToUse)
+ {
+ if (is_string($sValue))
+ {
+ if ($sFuncToUse == "iconv")
+ {
+ $sValue = iconv("UTF-8", $this->sEncoding.'//TRANSLIT', $sValue);
+ }
+ else if ($sFuncToUse == "mb_convert_encoding")
+ {
+ $sValue = mb_convert_encoding($sValue, $this->sEncoding, "UTF-8");
+ }
+ else
+ {
+ $sValue = utf8_decode($sValue);
+ }
+ }
+ }
+ }
+ return $sValue;
+ }
+
+}// end class xajax
+
+/**
+ * This function is registered with PHP's set_error_handler() function if
+ * the xajax error handling system is turned on.
+ */
+function xajaxErrorHandler($errno, $errstr, $errfile, $errline)
+{
+ $errorReporting = error_reporting();
+ if (($errno & $errorReporting) == 0) return;
+
+ if ($errno == E_NOTICE) {
+ $errTypeStr = "NOTICE";
+ }
+ else if ($errno == E_WARNING) {
+ $errTypeStr = "WARNING";
+ }
+ else if ($errno == E_USER_NOTICE) {
+ $errTypeStr = "USER NOTICE";
+ }
+ else if ($errno == E_USER_WARNING) {
+ $errTypeStr = "USER WARNING";
+ }
+ else if ($errno == E_USER_ERROR) {
+ $errTypeStr = "USER FATAL ERROR";
+ }
+ else if ($errno == E_STRICT) {
+ return;
+ }
+ else {
+ $errTypeStr = "UNKNOWN: $errno";
+ }
+ $GLOBALS['xajaxErrorHandlerText'] .= "\n----\n[$errTypeStr] $errstr\nerror in line $errline of file $errfile";
+}
+
+?>
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/xajaxCompress.php b/lib/xajax_0.2.4/xajaxCompress.php
new file mode 100644
index 0000000..327a92d
--- /dev/null
+++ b/lib/xajax_0.2.4/xajaxCompress.php
@@ -0,0 +1,182 @@
+
\ No newline at end of file
diff --git a/lib/xajax_0.2.4/xajaxResponse.inc.php b/lib/xajax_0.2.4/xajaxResponse.inc.php
new file mode 100644
index 0000000..1c0aeb6
--- /dev/null
+++ b/lib/xajax_0.2.4/xajaxResponse.inc.php
@@ -0,0 +1,580 @@
+
+ *
Assign - sets the specified attribute of an element in your page
+ *
Append - appends data to the end of the specified attribute of an
+ * element in your page
+ *
Prepend - prepends data to the beginning of the specified attribute of
+ * an element in your page
+ *
Replace - searches for and replaces data in the specified attribute of
+ * an element in your page
+ *
Script - runs the supplied JavaScript code
+ *
Alert - shows an alert box with the supplied message text
+ *
+ *
+ * Note: elements are identified by their HTML id, so if you don't see
+ * your browser HTML display changing from the request, make sure you're using
+ * the right id names in your response.
+ *
+ * @package xajax
+ */
+class xajaxResponse
+{
+ /**#@+
+ * @access protected
+ */
+ /**
+ * @var string internal XML storage
+ */
+ var $xml;
+ /**
+ * @var string the encoding type to use
+ */
+ var $sEncoding;
+ /**
+ * @var boolean if special characters in the XML should be converted to
+ * entities
+ */
+ var $bOutputEntities;
+
+ /**#@-*/
+
+ /**
+ * The constructor's main job is to set the character encoding for the
+ * response.
+ *
+ * Note: to change the character encoding for all of the
+ * responses, set the XAJAX_DEFAULT_ENCODING constant before you
+ * instantiate xajax.
+ *
+ * @param string contains the character encoding string to use
+ * @param boolean lets you set if you want special characters in the output
+ * converted to HTML entities
+ *
+ */
+ function xajaxResponse($sEncoding=XAJAX_DEFAULT_CHAR_ENCODING, $bOutputEntities=false)
+ {
+ $this->setCharEncoding($sEncoding);
+ $this->bOutputEntities = $bOutputEntities;
+ }
+
+ /**
+ * Sets the character encoding for the response based on $sEncoding, which
+ * is a string containing the character encoding to use. You don't need to
+ * use this method normally, since the character encoding for the response
+ * gets set automatically based on the XAJAX_DEFAULT_CHAR_ENCODING
+ * constant.
+ *
+ * @param string
+ */
+ function setCharEncoding($sEncoding)
+ {
+ $this->sEncoding = $sEncoding;
+ }
+
+ /**
+ * Tells the response object to convert special characters to HTML entities
+ * automatically (only works if the mb_string extension is available).
+ */
+ function outputEntitiesOn()
+ {
+ $this->bOutputEntities = true;
+ }
+
+ /**
+ * Tells the response object to output special characters intact. (default
+ * behavior)
+ */
+ function outputEntitiesOff()
+ {
+ $this->bOutputEntities = false;
+ }
+
+ /**
+ * Adds a confirm commands command message to the XML response.
+ *
+ * Usage:$objResponse->addConfirmCommands(1, "Do you want to preview the new data?");
+ *
+ * @param integer the number of commands to skip if the user presses
+ * Cancel in the browsers's confirm dialog
+ * @param string the message to show in the browser's confirm dialog
+ */
+ function addConfirmCommands($iCmdNumber, $sMessage)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"cc","t"=>$iCmdNumber),$sMessage);
+ }
+
+ /**
+ * Adds an assign command message to the XML response.
+ *
+ * Usage:$objResponse->addAssign("contentDiv", "innerHTML", "Some Text");
+ *
+ * @param string contains the id of an HTML element
+ * @param string the part of the element you wish to modify ("innerHTML",
+ * "value", etc.)
+ * @param string the data you want to set the attribute to
+ */
+ function addAssign($sTarget,$sAttribute,$sData)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"as","t"=>$sTarget,"p"=>$sAttribute),$sData);
+ }
+
+ /**
+ * Adds an append command message to the XML response.
+ *
+ * Usage:$objResponse->addAppend("contentDiv", "innerHTML", "Some New Text");
+ *
+ * @param string contains the id of an HTML element
+ * @param string the part of the element you wish to modify ("innerHTML",
+ * "value", etc.)
+ * @param string the data you want to append to the end of the attribute
+ */
+ function addAppend($sTarget,$sAttribute,$sData)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"ap","t"=>$sTarget,"p"=>$sAttribute),$sData);
+ }
+
+ /**
+ * Adds an prepend command message to the XML response.
+ *
+ * Usage:$objResponse->addPrepend("contentDiv", "innerHTML", "Some Starting Text");
+ *
+ * @param string contains the id of an HTML element
+ * @param string the part of the element you wish to modify ("innerHTML",
+ * "value", etc.)
+ * @param string the data you want to prepend to the beginning of the
+ * attribute
+ */
+ function addPrepend($sTarget,$sAttribute,$sData)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"pp","t"=>$sTarget,"p"=>$sAttribute),$sData);
+ }
+
+ /**
+ * Adds a replace command message to the XML response.
+ *
+ * Usage:$objResponse->addReplace("contentDiv", "innerHTML", "text", "text");
+ *
+ * @param string contains the id of an HTML element
+ * @param string the part of the element you wish to modify ("innerHTML",
+ * "value", etc.)
+ * @param string the string to search for
+ * @param string the string to replace the search string when found in the
+ * attribute
+ */
+ function addReplace($sTarget,$sAttribute,$sSearch,$sData)
+ {
+ $sDta = "";
+ $this->xml .= $this->_cmdXML(array("n"=>"rp","t"=>$sTarget,"p"=>$sAttribute),$sDta);
+ }
+
+ /**
+ * Adds a clear command message to the XML response.
+ *
+ * Usage:$objResponse->addClear("contentDiv", "innerHTML");
+ *
+ * @param string contains the id of an HTML element
+ * @param string the part of the element you wish to clear ("innerHTML",
+ * "value", etc.)
+ */
+ function addClear($sTarget,$sAttribute)
+ {
+ $this->addAssign($sTarget,$sAttribute,'');
+ }
+
+ /**
+ * Adds an alert command message to the XML response.
+ *
+ * Usage:$objResponse->addAlert("This is important information");
+ *
+ * @param string the text to be displayed in the Javascript alert box
+ */
+ function addAlert($sMsg)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"al"),$sMsg);
+ }
+
+ /**
+ * Uses the addScript() method to add a Javascript redirect to another URL.
+ *
+ * Usage:$objResponse->addRedirect("http://www.xajaxproject.org");
+ *
+ * @param string the URL to redirect the client browser to
+ */
+ function addRedirect($sURL)
+ {
+ //we need to parse the query part so that the values are rawurlencode()'ed
+ //can't just use parse_url() cos we could be dealing with a relative URL which
+ // parse_url() can't deal with.
+ $queryStart = strpos($sURL, '?', strrpos($sURL, '/'));
+ if ($queryStart !== FALSE)
+ {
+ $queryStart++;
+ $queryEnd = strpos($sURL, '#', $queryStart);
+ if ($queryEnd === FALSE)
+ $queryEnd = strlen($sURL);
+ $queryPart = substr($sURL, $queryStart, $queryEnd-$queryStart);
+ parse_str($queryPart, $queryParts);
+ $newQueryPart = "";
+ foreach($queryParts as $key => $value)
+ {
+ $newQueryPart .= rawurlencode($key).'='.rawurlencode($value).ini_get('arg_separator.output');
+ }
+ $sURL = str_replace($queryPart, $newQueryPart, $sURL);
+ }
+ $this->addScript('window.location = "'.$sURL.'";');
+ }
+
+ /**
+ * Adds a Javascript command message to the XML response.
+ *
+ * Usage:$objResponse->addScript("var x = prompt('get some text');");
+ *
+ * @param string contains Javascript code to be executed
+ */
+ function addScript($sJS)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"js"),$sJS);
+ }
+
+ /**
+ * Adds a Javascript function call command message to the XML response.
+ *
+ * Usage:$objResponse->addScriptCall("myJSFunction", "arg 1", "arg 2", 12345);
+ *
+ * @param string $sFunc the name of a Javascript function
+ * @param mixed $args,... optional arguments to pass to the Javascript function
+ */
+ function addScriptCall() {
+ $arguments = func_get_args();
+ $sFunc = array_shift($arguments);
+ $sData = $this->_buildObjXml($arguments);
+ $this->xml .= $this->_cmdXML(array("n"=>"jc","t"=>$sFunc),$sData);
+ }
+
+ /**
+ * Adds a remove element command message to the XML response.
+ *
+ * Usage:$objResponse->addRemove("Div2");
+ *
+ * @param string contains the id of an HTML element to be removed
+ */
+ function addRemove($sTarget)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"rm","t"=>$sTarget),'');
+ }
+
+ /**
+ * Adds a create element command message to the XML response.
+ *
+ * Usage:$objResponse->addCreate("parentDiv", "h3", "myid");
+ *
+ * @param string contains the id of an HTML element to to which the new
+ * element will be appended.
+ * @param string the tag to be added
+ * @param string the id to be assigned to the new element
+ * @param string deprecated, use the addCreateInput() method instead
+ */
+ function addCreate($sParent, $sTag, $sId, $sType="")
+ {
+ if ($sType)
+ {
+ trigger_error("The \$sType parameter of addCreate has been deprecated. Use the addCreateInput() method instead.", E_USER_WARNING);
+ return;
+ }
+ $this->xml .= $this->_cmdXML(array("n"=>"ce","t"=>$sParent,"p"=>$sId),$sTag);
+ }
+
+ /**
+ * Adds a insert element command message to the XML response.
+ *
+ * Usage:$objResponse->addInsert("childDiv", "h3", "myid");
+ *
+ * @param string contains the id of the child before which the new element
+ * will be inserted
+ * @param string the tag to be added
+ * @param string the id to be assigned to the new element
+ */
+ function addInsert($sBefore, $sTag, $sId)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"ie","t"=>$sBefore,"p"=>$sId),$sTag);
+ }
+
+ /**
+ * Adds a insert element command message to the XML response.
+ *
+ * Usage:$objResponse->addInsertAfter("childDiv", "h3", "myid");
+ *
+ * @param string contains the id of the child after which the new element
+ * will be inserted
+ * @param string the tag to be added
+ * @param string the id to be assigned to the new element
+ */
+ function addInsertAfter($sAfter, $sTag, $sId)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"ia","t"=>$sAfter,"p"=>$sId),$sTag);
+ }
+
+ /**
+ * Adds a create input command message to the XML response.
+ *
+ * Usage:$objResponse->addCreateInput("form1", "text", "username", "input1");
+ *
+ * @param string contains the id of an HTML element to which the new input
+ * will be appended
+ * @param string the type of input to be created (text, radio, checkbox,
+ * etc.)
+ * @param string the name to be assigned to the new input and the variable
+ * name when it is submitted
+ * @param string the id to be assigned to the new input
+ */
+ function addCreateInput($sParent, $sType, $sName, $sId)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"ci","t"=>$sParent,"p"=>$sId,"c"=>$sType),$sName);
+ }
+
+ /**
+ * Adds an insert input command message to the XML response.
+ *
+ * Usage:$objResponse->addInsertInput("input5", "text", "username", "input1");
+ *
+ * @param string contains the id of the child before which the new element
+ * will be inserted
+ * @param string the type of input to be created (text, radio, checkbox,
+ * etc.)
+ * @param string the name to be assigned to the new input and the variable
+ * name when it is submitted
+ * @param string the id to be assigned to the new input
+ */
+ function addInsertInput($sBefore, $sType, $sName, $sId)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"ii","t"=>$sBefore,"p"=>$sId,"c"=>$sType),$sName);
+ }
+
+ /**
+ * Adds an insert input command message to the XML response.
+ *
+ * Usage:$objResponse->addInsertInputAfter("input7", "text", "email", "input2");
+ *
+ * @param string contains the id of the child after which the new element
+ * will be inserted
+ * @param string the type of input to be created (text, radio, checkbox,
+ * etc.)
+ * @param string the name to be assigned to the new input and the variable
+ * name when it is submitted
+ * @param string the id to be assigned to the new input
+ */
+ function addInsertInputAfter($sAfter, $sType, $sName, $sId)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"iia","t"=>$sAfter,"p"=>$sId,"c"=>$sType),$sName);
+ }
+
+ /**
+ * Adds an event command message to the XML response.
+ *
+ * Usage:$objResponse->addEvent("contentDiv", "onclick", "alert(\'Hello World\');");
+ *
+ * @param string contains the id of an HTML element
+ * @param string the event you wish to set ("onclick", "onmouseover", etc.)
+ * @param string the Javascript string you want the event to invoke
+ */
+ function addEvent($sTarget,$sEvent,$sScript)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"ev","t"=>$sTarget,"p"=>$sEvent),$sScript);
+ }
+
+ /**
+ * Adds a handler command message to the XML response.
+ *
+ * Usage:$objResponse->addHandler("contentDiv", "onclick", "content_click");
+ *
+ * @param string contains the id of an HTML element
+ * @param string the event you wish to set ("onclick", "onmouseover", etc.)
+ * @param string the name of a Javascript function that will handle the
+ * event. Multiple handlers can be added for the same event
+ */
+ function addHandler($sTarget,$sEvent,$sHandler)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"ah","t"=>$sTarget,"p"=>$sEvent),$sHandler);
+ }
+
+ /**
+ * Adds a remove handler command message to the XML response.
+ *
+ * Usage:$objResponse->addRemoveHandler("contentDiv", "onclick", "content_click");
+ *
+ * @param string contains the id of an HTML element
+ * @param string the event you wish to remove ("onclick", "onmouseover",
+ * etc.)
+ * @param string the name of a Javascript handler function that you want to
+ * remove
+ */
+ function addRemoveHandler($sTarget,$sEvent,$sHandler)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"rh","t"=>$sTarget,"p"=>$sEvent),$sHandler);
+ }
+
+ /**
+ * Adds an include script command message to the XML response.
+ *
+ * Usage:$objResponse->addIncludeScript("functions.js");
+ *
+ * @param string URL of the Javascript file to include
+ */
+ function addIncludeScript($sFileName)
+ {
+ $this->xml .= $this->_cmdXML(array("n"=>"in"),$sFileName);
+ }
+
+ /**
+ * Returns the XML to be returned from your function to the xajax processor
+ * on your page. Since xajax 0.2, you can also return an xajaxResponse
+ * object from your function directly, and xajax will automatically request
+ * the XML using this method call.
+ *
+ * Usage:return $objResponse->getXML();
+ *
+ * @return string response XML data
+ */
+ function getXML()
+ {
+ $sXML = "sEncoding && strlen(trim($this->sEncoding)) > 0)
+ $sXML .= " encoding=\"".$this->sEncoding."\"";
+ $sXML .= " ?".">" . $this->xml . "";
+
+ return $sXML;
+ }
+
+ /**
+ * Adds the commands of the provided response XML output to this response
+ * object
+ *
+ * Usage:
+ * $r1 = $objResponse1->getXML();
+ * $objResponse2->loadXML($r1);
+ * return $objResponse2->getXML();
+ *
+ * @param string the response XML (returned from a getXML() method) to add
+ * to the end of this response object
+ */
+ function loadXML($mXML)
+ {
+ if (is_a($mXML, "xajaxResponse")) {
+ $mXML = $mXML->getXML();
+ }
+ $sNewXML = "";
+ $iStartPos = strpos($mXML, "") + 5;
+ $sNewXML = substr($mXML, $iStartPos);
+ $iEndPos = strpos($sNewXML, "");
+ $sNewXML = substr($sNewXML, 0, $iEndPos);
+ $this->xml .= $sNewXML;
+ }
+
+ /**
+ * Generates XML from command data
+ *
+ * @access private
+ * @param array associative array of attributes
+ * @param string data
+ * @return string XML command
+ */
+ function _cmdXML($aAttributes, $sData)
+ {
+ if ($this->bOutputEntities) {
+ if (function_exists('mb_convert_encoding')) {
+ $sData = call_user_func_array('mb_convert_encoding', array(&$sData, 'HTML-ENTITIES', $this->sEncoding));
+ }
+ else {
+ trigger_error("The xajax XML response output could not be converted to HTML entities because the mb_convert_encoding function is not available", E_USER_NOTICE);
+ }
+ }
+ $xml = " $sValue)
+ $xml .= " $sAttribute=\"$sValue\"";
+ if ($sData !== null && !stristr($sData,'";
+ else if ($sData !== null)
+ $xml .= ">$sData";
+ else
+ $xml .= ">";
+
+ return $xml;
+ }
+
+ /**
+ * Recursively serializes a data structure in XML so it can be sent to
+ * the client. It could be thought of as the opposite of
+ * {@link xajax::_parseObjXml()}.
+ *
+ * @access private
+ * @param mixed data structure to serialize to XML
+ * @return string serialized XML
+ */
+ function _buildObjXml($var) {
+ if (gettype($var) == "object") $var = get_object_vars($var);
+ if (!is_array($var)) {
+ return "";
+ }
+ else {
+ $data = "";
+ foreach ($var as $key => $value) {
+ $data .= "";
+ $data .= "" . htmlspecialchars($key) . "";
+ $data .= "" . $this->_buildObjXml($value) . "";
+ $data .= "";
+ }
+ $data .= "";
+ return $data;
+ }
+ }
+
+}// end class xajaxResponse
+?>
--
cgit v1.2.3